diff options
1628 files changed, 19196 insertions, 6710 deletions
diff --git a/.gitignore b/.gitignore index 4a625fb8580..a6baffc6a59 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ # ignore all apps except core ones /apps*/* +!/apps/dav !/apps/files !/apps/files_encryption !/apps/encryption diff --git a/.htaccess b/.htaccess index 35c478860d5..918fcbd18e8 100644 --- a/.htaccess +++ b/.htaccess @@ -1,4 +1,4 @@ -# Version: 8.2.0 +# Version: 9.0.0 <IfModule mod_headers.c> <IfModule mod_fcgid.c> <IfModule mod_setenvif.c> @@ -28,7 +28,7 @@ php_value mbstring.func_overload 0 php_value always_populate_raw_post_data -1 php_value default_charset 'UTF-8' - php_value output_buffering off + php_value output_buffering 0 <IfModule mod_env.c> SetEnv htaccessWorking true </IfModule> @@ -40,8 +40,6 @@ RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L] RewriteRule ^\.well-known/carddav /remote.php/carddav/ [R=301,L] RewriteRule ^\.well-known/caldav /remote.php/caldav/ [R=301,L] - RewriteRule ^apps/calendar/caldav\.php remote.php/caldav/ [QSA,L] - RewriteRule ^apps/contacts/carddav\.php remote.php/carddav/ [QSA,L] RewriteRule ^remote/(.*) remote.php [QSA,L] RewriteRule ^(build|tests|config|lib|3rdparty|templates)/.* - [R=404,L] RewriteRule ^(\.|autotest|occ|issue|indie|db_|console).* - [R=404,L] @@ -304,7 +304,7 @@ Robin Appelman <icewind@owncloud.com> Robin <robin@Amaya.(none)> Robin Appelman <icewind@owncloud.com> Robin Appelman <icewind1991@gmail.com> Robin Appelman <icewind@owncloud.com> Robin Appelman <icewind1991@gmail> Robin Appelman <icewind@owncloud.com> Robin Appelman <robin@icewind.nl> -Robin McCorkell <rmccorkell@karoshi.org.uk> +Robin McCorkell <rmccorkell@karoshi.org.uk> Robin McCorkell <rmccorkell@owncloud.com> Rodrigo Hjort <rodrigo.hjort@gmail.com> Roeland Jago Douma <roeland@famdouma.nl> rok <brejktru@gmail.com> diff --git a/.scrutinizer.yml b/.scrutinizer.yml index c788343e5d3..f91134ee995 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,3 +1,13 @@ +application: + environment: + php: + version: 5.4 + +build: + environment: + php: + version: 5.4 + filter: excluded_paths: - '3rdparty/*' diff --git a/.user.ini b/.user.ini index 66bf6484fe2..68ef3e8672c 100644 --- a/.user.ini +++ b/.user.ini @@ -4,4 +4,4 @@ memory_limit=512M mbstring.func_overload=0 always_populate_raw_post_data=-1 default_charset='UTF-8' -output_buffering=off
\ No newline at end of file +output_buffering=0 diff --git a/3rdparty b/3rdparty -Subproject 6b6575b04c01e30e5f38dbb373fd5166cce0ef5 +Subproject f67a9ebe4362986ff31643d84d442fedce1d140 diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml new file mode 100644 index 00000000000..c80af15a29b --- /dev/null +++ b/apps/dav/appinfo/info.xml @@ -0,0 +1,22 @@ +<?xml version="1.0"?> +<info> + <id>dav</id> + <name>WebDAV</name> + <description>ownCloud WebDAV endpoint</description> + <licence>AGPL</licence> + <author>owncloud.org</author> + <requiremin>9.0</requiremin> + <shipped>true</shipped> + <standalone/> + <default_enable/> + <types> + <filesystem/> + </types> + <remote> + <files>appinfo/v1/webdav.php</files> + <webdav>appinfo/v1/webdav.php</webdav> + </remote> + <public> + <webdav>appinfo/v1/publicwebdav.php</webdav> + </public> +</info> diff --git a/apps/files_sharing/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php index 773a15c888e..5bdfd94e658 100644 --- a/apps/files_sharing/publicwebdav.php +++ b/apps/dav/appinfo/v1/publicwebdav.php @@ -1,9 +1,8 @@ <?php /** - * @author Lukas Reschke <lukas@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -24,16 +23,16 @@ */ // load needed apps -$RUNTIME_APPTYPES = array('filesystem', 'authentication', 'logging'); +$RUNTIME_APPTYPES = ['filesystem', 'authentication', 'logging']; OC_App::loadApps($RUNTIME_APPTYPES); OC_Util::obEnd(); // Backends -$authBackend = new OCA\Files_Sharing\Connector\PublicAuth(\OC::$server->getConfig()); +$authBackend = new OCA\DAV\Connector\PublicAuth(\OC::$server->getConfig()); -$serverFactory = new \OC\Connector\Sabre\ServerFactory( +$serverFactory = new OCA\DAV\Connector\Sabre\ServerFactory( \OC::$server->getConfig(), \OC::$server->getLogger(), \OC::$server->getDatabaseConnection(), @@ -46,7 +45,8 @@ $serverFactory = new \OC\Connector\Sabre\ServerFactory( $requestUri = \OC::$server->getRequest()->getRequestUri(); $server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function () use ($authBackend) { - if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false) { + $isAjax = (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest'); + if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false && !$isAjax) { // this is what is thrown when trying to access a non-existing share throw new \Sabre\DAV\Exception\NotAuthenticated(); } diff --git a/apps/files/appinfo/remote.php b/apps/dav/appinfo/v1/webdav.php index 4d0d8b3e2ec..610230fc816 100644 --- a/apps/files/appinfo/remote.php +++ b/apps/dav/appinfo/v1/webdav.php @@ -33,7 +33,7 @@ set_time_limit(0); // Turn off output buffering to prevent memory problems \OC_Util::obEnd(); -$serverFactory = new \OC\Connector\Sabre\ServerFactory( +$serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory( \OC::$server->getConfig(), \OC::$server->getLogger(), \OC::$server->getDatabaseConnection(), @@ -44,7 +44,7 @@ $serverFactory = new \OC\Connector\Sabre\ServerFactory( ); // Backends -$authBackend = new \OC\Connector\Sabre\Auth(); +$authBackend = new \OCA\DAV\Connector\Sabre\Auth(); $requestUri = \OC::$server->getRequest()->getRequestUri(); $server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function() { diff --git a/apps/files_sharing/lib/connector/publicauth.php b/apps/dav/lib/connector/publicauth.php index b1c269867f5..f37be41402a 100644 --- a/apps/files_sharing/lib/connector/publicauth.php +++ b/apps/dav/lib/connector/publicauth.php @@ -5,6 +5,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -23,7 +24,7 @@ * */ -namespace OCA\Files_Sharing\Connector; +namespace OCA\DAV\Connector; class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic { @@ -82,10 +83,13 @@ class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic { } return true; + } else if (\OC::$server->getSession()->exists('public_link_authenticated') + && \OC::$server->getSession()->get('public_link_authenticated') === $linkItem['id']) { + return true; } else { return false; } - } elseif ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_REMOTE) { + } else if ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_REMOTE) { return true; } else { return false; diff --git a/lib/private/connector/sabre/appenabledplugin.php b/apps/dav/lib/connector/sabre/appenabledplugin.php index 696a9fcb81f..e70512d0fd1 100644 --- a/lib/private/connector/sabre/appenabledplugin.php +++ b/apps/dav/lib/connector/sabre/appenabledplugin.php @@ -21,7 +21,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\App\IAppManager; use Sabre\DAV\Exception\Forbidden; diff --git a/lib/private/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php index 8a6eaab5bf8..2e52a179d29 100644 --- a/lib/private/connector/sabre/auth.php +++ b/apps/dav/lib/connector/sabre/auth.php @@ -8,7 +8,6 @@ * @author Markus Goetz <markus@woboq.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * @@ -28,7 +27,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use Exception; use Sabre\DAV\Auth\Backend\AbstractBasic; diff --git a/lib/private/connector/sabre/blocklegacyclientplugin.php b/apps/dav/lib/connector/sabre/blocklegacyclientplugin.php index 9480cd1f06d..ed61f43a536 100644 --- a/lib/private/connector/sabre/blocklegacyclientplugin.php +++ b/apps/dav/lib/connector/sabre/blocklegacyclientplugin.php @@ -19,7 +19,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\IConfig; use Sabre\HTTP\RequestInterface; @@ -30,7 +30,7 @@ use Sabre\DAV\Exception; * Class BlockLegacyClientPlugin is used to detect old legacy sync clients and * returns a 403 status to those clients * - * @package OC\Connector\Sabre + * @package OCA\DAV\Connector\Sabre */ class BlockLegacyClientPlugin extends ServerPlugin { /** @var \Sabre\DAV\Server */ diff --git a/lib/private/connector/sabre/copyetagheaderplugin.php b/apps/dav/lib/connector/sabre/copyetagheaderplugin.php index 863d4cf3e10..b33b208adad 100644 --- a/lib/private/connector/sabre/copyetagheaderplugin.php +++ b/apps/dav/lib/connector/sabre/copyetagheaderplugin.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -20,7 +19,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use \Sabre\HTTP\RequestInterface; use \Sabre\HTTP\ResponseInterface; diff --git a/lib/private/connector/sabre/custompropertiesbackend.php b/apps/dav/lib/connector/sabre/custompropertiesbackend.php index 47f34909a08..ff35476319f 100644 --- a/lib/private/connector/sabre/custompropertiesbackend.php +++ b/apps/dav/lib/connector/sabre/custompropertiesbackend.php @@ -1,7 +1,6 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * @@ -22,7 +21,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\IDBConnection; use OCP\IUser; diff --git a/lib/private/connector/sabre/directory.php b/apps/dav/lib/connector/sabre/directory.php index 0261ab18047..8c736ea0108 100644 --- a/lib/private/connector/sabre/directory.php +++ b/apps/dav/lib/connector/sabre/directory.php @@ -26,15 +26,15 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; -use OC\Connector\Sabre\Exception\InvalidPath; -use OC\Connector\Sabre\Exception\FileLocked; +use OCA\DAV\Connector\Sabre\Exception\InvalidPath; +use OCA\DAV\Connector\Sabre\Exception\FileLocked; use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use Sabre\DAV\Exception\Locked; -class Directory extends \OC\Connector\Sabre\Node +class Directory extends \OCA\DAV\Connector\Sabre\Node implements \Sabre\DAV\ICollection, \Sabre\DAV\IQuota { /** @@ -110,7 +110,7 @@ class Directory extends \OC\Connector\Sabre\Node $path = $this->fileView->getAbsolutePath($this->path) . '/' . $name; // using a dummy FileInfo is acceptable here since it will be refreshed after the put is complete $info = new \OC\Files\FileInfo($path, null, null, array(), null); - $node = new \OC\Connector\Sabre\File($this->fileView, $info); + $node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info); $node->acquireLock(ILockingProvider::LOCK_SHARED); return $node->put($data); } catch (\OCP\Files\StorageNotAvailableException $e) { @@ -179,9 +179,9 @@ class Directory extends \OC\Connector\Sabre\Node } if ($info['mimetype'] == 'httpd/unix-directory') { - $node = new \OC\Connector\Sabre\Directory($this->fileView, $info); + $node = new \OCA\DAV\Connector\Sabre\Directory($this->fileView, $info); } else { - $node = new \OC\Connector\Sabre\File($this->fileView, $info); + $node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info); } return $node; } diff --git a/lib/private/connector/sabre/dummygetresponseplugin.php b/apps/dav/lib/connector/sabre/dummygetresponseplugin.php index 6f5a009d084..7c7a332fedd 100644 --- a/lib/private/connector/sabre/dummygetresponseplugin.php +++ b/apps/dav/lib/connector/sabre/dummygetresponseplugin.php @@ -19,7 +19,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use Sabre\HTTP\ResponseInterface; use Sabre\HTTP\RequestInterface; @@ -34,7 +34,7 @@ use Sabre\HTTP\RequestInterface; * * FIXME: Remove once clients are all compliant. * - * @package OC\Connector\Sabre + * @package OCA\DAV\Connector\Sabre */ class DummyGetResponsePlugin extends \Sabre\DAV\ServerPlugin { /** @var \Sabre\DAV\Server */ diff --git a/lib/private/connector/sabre/exception/entitytoolarge.php b/apps/dav/lib/connector/sabre/exception/entitytoolarge.php index e9699deeaf1..f5a7aa99c6d 100644 --- a/lib/private/connector/sabre/exception/entitytoolarge.php +++ b/apps/dav/lib/connector/sabre/exception/entitytoolarge.php @@ -20,7 +20,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Connector\Sabre\Exception; +namespace OCA\DAV\Connector\Sabre\Exception; /** * Entity Too Large diff --git a/lib/private/connector/sabre/exception/filelocked.php b/apps/dav/lib/connector/sabre/exception/filelocked.php index 1657a7ae376..1e1585edbda 100644 --- a/lib/private/connector/sabre/exception/filelocked.php +++ b/apps/dav/lib/connector/sabre/exception/filelocked.php @@ -22,7 +22,7 @@ * */ -namespace OC\Connector\Sabre\Exception; +namespace OCA\DAV\Connector\Sabre\Exception; use Exception; diff --git a/lib/private/connector/sabre/exception/invalidpath.php b/apps/dav/lib/connector/sabre/exception/invalidpath.php index 6d84078fb1c..608e427a5aa 100644 --- a/lib/private/connector/sabre/exception/invalidpath.php +++ b/apps/dav/lib/connector/sabre/exception/invalidpath.php @@ -19,7 +19,7 @@ * */ -namespace OC\Connector\Sabre\Exception; +namespace OCA\DAV\Connector\Sabre\Exception; use Sabre\DAV\Exception; diff --git a/lib/private/connector/sabre/exception/unsupportedmediatype.php b/apps/dav/lib/connector/sabre/exception/unsupportedmediatype.php index b7e8594427f..96b9b8332de 100644 --- a/lib/private/connector/sabre/exception/unsupportedmediatype.php +++ b/apps/dav/lib/connector/sabre/exception/unsupportedmediatype.php @@ -20,7 +20,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Connector\Sabre\Exception; +namespace OCA\DAV\Connector\Sabre\Exception; /** * Unsupported Media Type diff --git a/lib/private/connector/sabre/exceptionloggerplugin.php b/apps/dav/lib/connector/sabre/exceptionloggerplugin.php index 53a1f738ea6..64ec5cfda82 100644 --- a/lib/private/connector/sabre/exceptionloggerplugin.php +++ b/apps/dav/lib/connector/sabre/exceptionloggerplugin.php @@ -1,6 +1,7 @@ <?php /** * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * @@ -21,7 +22,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\ILogger; use Sabre\DAV\Exception; diff --git a/lib/private/connector/sabre/file.php b/apps/dav/lib/connector/sabre/file.php index 17659c96b07..9e515cdc687 100644 --- a/lib/private/connector/sabre/file.php +++ b/apps/dav/lib/connector/sabre/file.php @@ -30,12 +30,12 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; -use OC\Connector\Sabre\Exception\EntityTooLarge; -use OC\Connector\Sabre\Exception\FileLocked; -use OC\Connector\Sabre\Exception\UnsupportedMediaType; use OC\Files\Filesystem; +use OCA\DAV\Connector\Sabre\Exception\EntityTooLarge; +use OCA\DAV\Connector\Sabre\Exception\FileLocked; +use OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\Files\EntityTooLargeException; use OCP\Files\InvalidContentException; @@ -261,10 +261,13 @@ class File extends Node implements IFile { * @throws ServiceUnavailable */ public function get() { - //throw exception if encryption is disabled but files are still encrypted try { - return $this->fileView->fopen(ltrim($this->path, '/'), 'rb'); + $res = $this->fileView->fopen(ltrim($this->path, '/'), 'rb'); + if ($res === false) { + throw new ServiceUnavailable("Could not open file"); + } + return $res; } catch (GenericEncryptionException $e) { // returning 503 will allow retry of the operation at a later point in time throw new ServiceUnavailable("Encryption not ready: " . $e->getMessage()); diff --git a/lib/private/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php index 84620f454aa..c9fc78a795f 100644 --- a/lib/private/connector/sabre/filesplugin.php +++ b/apps/dav/lib/connector/sabre/filesplugin.php @@ -24,7 +24,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use Sabre\DAV\IFile; use \Sabre\DAV\PropFind; @@ -41,7 +41,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { const DOWNLOADURL_PROPERTYNAME = '{http://owncloud.org/ns}downloadURL'; const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size'; const GETETAG_PROPERTYNAME = '{DAV:}getetag'; - const GETLASTMODIFIED_PROPERTYNAME = '{DAV:}getlastmodified'; + const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified'; /** * Reference to main server object @@ -64,10 +64,20 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { private $isPublic; /** + * @var \OC\Files\View + */ + private $fileView; + + /** * @param \Sabre\DAV\Tree $tree + * @param \OC\Files\View $view + * @param bool $isPublic */ - public function __construct(\Sabre\DAV\Tree $tree, $isPublic = false) { + public function __construct(\Sabre\DAV\Tree $tree, + \OC\Files\View $view, + $isPublic = false) { $this->tree = $tree; + $this->fileView = $view; $this->isPublic = $isPublic; } @@ -91,7 +101,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { $server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME; // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH - $allowedProperties = ['{DAV:}getetag', '{DAV:}getlastmodified']; + $allowedProperties = ['{DAV:}getetag']; $server->protectedProperties = array_diff($server->protectedProperties, $allowedProperties); $this->server = $server; @@ -106,6 +116,26 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { fclose($body); } }); + $this->server->on('beforeMove', [$this, 'checkMove']); + } + + /** + * Plugin that checks if a move can actually be performed. + * @param string $source source path + * @param string $destination destination path + * @throws \Sabre\DAV\Exception\Forbidden + */ + function checkMove($source, $destination) { + list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($source); + list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination); + + if ($sourceDir !== $destinationDir) { + $sourceFileInfo = $this->fileView->getFileInfo($source); + + if (!$sourceFileInfo->isDeletable()) { + throw new \Sabre\DAV\Exception\Forbidden($source . " cannot be deleted"); + } + } } /** @@ -131,7 +161,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { */ public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node) { - if ($node instanceof \OC\Connector\Sabre\Node) { + if ($node instanceof \OCA\DAV\Connector\Sabre\Node) { $propFind->handle(self::FILEID_PROPERTYNAME, function() use ($node) { return $node->getFileId(); @@ -151,9 +181,9 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { }); } - if ($node instanceof \OC\Connector\Sabre\File) { + if ($node instanceof \OCA\DAV\Connector\Sabre\File) { $propFind->handle(self::DOWNLOADURL_PROPERTYNAME, function() use ($node) { - /** @var $node \OC\Connector\Sabre\File */ + /** @var $node \OCA\DAV\Connector\Sabre\File */ $directDownloadUrl = $node->getDirectDownload(); if (isset($directDownloadUrl['url'])) { return $directDownloadUrl['url']; @@ -162,7 +192,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { }); } - if ($node instanceof \OC\Connector\Sabre\Directory) { + if ($node instanceof \OCA\DAV\Connector\Sabre\Directory) { $propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) { return $node->getSize(); }); @@ -178,7 +208,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { * @return void */ public function handleUpdateProperties($path, PropPatch $propPatch) { - $propPatch->handle(self::GETLASTMODIFIED_PROPERTYNAME, function($time) use ($path) { + $propPatch->handle(self::LASTMODIFIED_PROPERTYNAME, function($time) use ($path) { if (empty($time)) { return false; } @@ -224,7 +254,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { return; } $node = $this->server->tree->getNodeForPath($filePath); - if ($node instanceof \OC\Connector\Sabre\Node) { + if ($node instanceof \OCA\DAV\Connector\Sabre\Node) { $fileId = $node->getFileId(); if (!is_null($fileId)) { $this->server->httpResponse->setHeader('OC-FileId', $fileId); diff --git a/lib/private/connector/sabre/listenerplugin.php b/apps/dav/lib/connector/sabre/listenerplugin.php index d0d40f4dc86..d537d0577c6 100644 --- a/lib/private/connector/sabre/listenerplugin.php +++ b/apps/dav/lib/connector/sabre/listenerplugin.php @@ -19,8 +19,11 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; +use OCP\AppFramework\Http; +use OCP\SabrePluginEvent; +use OCP\SabrePluginException; use Sabre\DAV\ServerPlugin; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -49,9 +52,16 @@ class ListenerPlugin extends ServerPlugin { * in case the system is in maintenance mode. * * @return bool + * @throws \Exception */ public function emitListener() { - $this->dispatcher->dispatch('OC\Connector\Sabre::beforeMethod'); + $event = new SabrePluginEvent(); + + $this->dispatcher->dispatch('OCA\DAV\Connector\Sabre::beforeMethod', $event); + + if ($event->getStatusCode() !== Http::STATUS_OK) { + throw new SabrePluginException($event->getMessage(), $event->getStatusCode()); + } return true; } diff --git a/lib/private/connector/sabre/lockplugin.php b/apps/dav/lib/connector/sabre/lockplugin.php index a3a7bb84e39..c564e066f8e 100644 --- a/lib/private/connector/sabre/lockplugin.php +++ b/apps/dav/lib/connector/sabre/lockplugin.php @@ -19,18 +19,16 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; -use OC\Connector\Sabre\Exception\FileLocked; +use OCA\DAV\Connector\Sabre\Exception\FileLocked; +use OCA\DAV\Connector\Sabre\Node; use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use Sabre\DAV\Exception\NotFound; -use \Sabre\DAV\PropFind; -use \Sabre\DAV\PropPatch; use Sabre\DAV\ServerPlugin; use Sabre\DAV\Tree; use Sabre\HTTP\RequestInterface; -use Sabre\HTTP\ResponseInterface; class LockPlugin extends ServerPlugin { /** diff --git a/lib/private/connector/sabre/maintenanceplugin.php b/apps/dav/lib/connector/sabre/maintenanceplugin.php index f886332418a..b9b261fbe05 100644 --- a/lib/private/connector/sabre/maintenanceplugin.php +++ b/apps/dav/lib/connector/sabre/maintenanceplugin.php @@ -1,6 +1,7 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -23,7 +24,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\IConfig; use Sabre\DAV\Exception\ServiceUnavailable; diff --git a/lib/private/connector/sabre/node.php b/apps/dav/lib/connector/sabre/node.php index 30faf9941bd..814aaceb077 100644 --- a/lib/private/connector/sabre/node.php +++ b/apps/dav/lib/connector/sabre/node.php @@ -28,18 +28,12 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; -use OC\Connector\Sabre\Exception\InvalidPath; +use OCA\DAV\Connector\Sabre\Exception\InvalidPath; abstract class Node implements \Sabre\DAV\INode { - /** - * Allow configuring the method used to generate Etags - * - * @var array(class_name, function_name) - */ - public static $ETagFunction = null; /** * @var \OC\Files\View diff --git a/lib/private/connector/sabre/objecttree.php b/apps/dav/lib/connector/sabre/objecttree.php index 18d3c1dcf23..80c0ef74610 100644 --- a/lib/private/connector/sabre/objecttree.php +++ b/apps/dav/lib/connector/sabre/objecttree.php @@ -23,10 +23,10 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; -use OC\Connector\Sabre\Exception\InvalidPath; -use OC\Connector\Sabre\Exception\FileLocked; +use OCA\DAV\Connector\Sabre\Exception\InvalidPath; +use OCA\DAV\Connector\Sabre\Exception\FileLocked; use OC\Files\FileInfo; use OC\Files\Mount\MoveableMount; use OCP\Files\StorageInvalidException; @@ -160,9 +160,9 @@ class ObjectTree extends \Sabre\DAV\Tree { } if ($info->getType() === 'dir') { - $node = new \OC\Connector\Sabre\Directory($this->fileView, $info); + $node = new \OCA\DAV\Connector\Sabre\Directory($this->fileView, $info); } else { - $node = new \OC\Connector\Sabre\File($this->fileView, $info); + $node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info); } $this->cache[$path] = $node; diff --git a/lib/private/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php index 9d81c4337d8..35215e1f63c 100644 --- a/lib/private/connector/sabre/principal.php +++ b/apps/dav/lib/connector/sabre/principal.php @@ -28,7 +28,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\IUserManager; use OCP\IConfig; diff --git a/lib/private/connector/sabre/quotaplugin.php b/apps/dav/lib/connector/sabre/quotaplugin.php index 22b687b3508..8340d489dc0 100644 --- a/lib/private/connector/sabre/quotaplugin.php +++ b/apps/dav/lib/connector/sabre/quotaplugin.php @@ -25,7 +25,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; /** * This plugin check user quota and deny creating files when they exceeds the quota. diff --git a/lib/private/connector/sabre/server.php b/apps/dav/lib/connector/sabre/server.php index 7a031f1d32a..eafe1b537f8 100644 --- a/lib/private/connector/sabre/server.php +++ b/apps/dav/lib/connector/sabre/server.php @@ -22,10 +22,10 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; /** - * Class \OC\Connector\Sabre\Server + * Class \OCA\DAV\Connector\Sabre\Server * * This class overrides some methods from @see \Sabre\DAV\Server. * diff --git a/lib/private/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php index 54470b0b8aa..b62f90ab802 100644 --- a/lib/private/connector/sabre/serverfactory.php +++ b/apps/dav/lib/connector/sabre/serverfactory.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -19,7 +20,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use OCP\Files\Mount\IMountManager; use OCP\IConfig; @@ -58,23 +59,22 @@ class ServerFactory { */ public function createServer($baseUri, $requestUri, BackendInterface $authBackend, callable $viewCallBack) { // Fire up server - $objectTree = new \OC\Connector\Sabre\ObjectTree(); - $server = new \OC\Connector\Sabre\Server($objectTree); + $objectTree = new \OCA\DAV\Connector\Sabre\ObjectTree(); + $server = new \OCA\DAV\Connector\Sabre\Server($objectTree); // Set URL explicitly due to reverse-proxy situations $server->httpRequest->setUrl($requestUri); $server->setBaseUri($baseUri); // Load plugins $defaults = new \OC_Defaults(); - $server->addPlugin(new \OC\Connector\Sabre\MaintenancePlugin($this->config)); - $server->addPlugin(new \OC\Connector\Sabre\BlockLegacyClientPlugin($this->config)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\MaintenancePlugin($this->config)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin($this->config)); $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName())); // FIXME: The following line is a workaround for legacy components relying on being able to send a GET to / - $server->addPlugin(new \OC\Connector\Sabre\DummyGetResponsePlugin()); - $server->addPlugin(new \OC\Connector\Sabre\FilesPlugin($objectTree)); - $server->addPlugin(new \OC\Connector\Sabre\ExceptionLoggerPlugin('webdav', $this->logger)); - $server->addPlugin(new \OC\Connector\Sabre\LockPlugin($objectTree)); - $server->addPlugin(new \OC\Connector\Sabre\ListenerPlugin($this->dispatcher)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\DummyGetResponsePlugin()); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin('webdav', $this->logger)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin($objectTree)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\ListenerPlugin($this->dispatcher)); // wait with registering these until auth is handled and the filesystem is setup $server->on('beforeMethod', function () use ($server, $objectTree, $viewCallBack) { @@ -84,20 +84,21 @@ class ServerFactory { // Create ownCloud Dir if ($rootInfo->getType() === 'dir') { - $root = new \OC\Connector\Sabre\Directory($view, $rootInfo); + $root = new \OCA\DAV\Connector\Sabre\Directory($view, $rootInfo); } else { - $root = new \OC\Connector\Sabre\File($view, $rootInfo); + $root = new \OCA\DAV\Connector\Sabre\File($view, $rootInfo); } $objectTree->init($root, $view, $this->mountManager); - $server->addPlugin(new \OC\Connector\Sabre\QuotaPlugin($view)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($objectTree, $view)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\QuotaPlugin($view)); if($this->userSession->isLoggedIn()) { - $server->addPlugin(new \OC\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager)); // custom properties plugin must be the last one $server->addPlugin( new \Sabre\DAV\PropertyStorage\Plugin( - new \OC\Connector\Sabre\CustomPropertiesBackend( + new \OCA\DAV\Connector\Sabre\CustomPropertiesBackend( $objectTree, $this->databaseConnection, $this->userSession->getUser() @@ -105,7 +106,7 @@ class ServerFactory { ) ); } - $server->addPlugin(new \OC\Connector\Sabre\CopyEtagHeaderPlugin()); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin()); }, 30); // priority 30: after auth (10) and acl(20), before lock(50) and handling the request return $server; } diff --git a/lib/private/connector/sabre/taglist.php b/apps/dav/lib/connector/sabre/taglist.php index 9fb34ba12d0..177cc23e805 100644 --- a/lib/private/connector/sabre/taglist.php +++ b/apps/dav/lib/connector/sabre/taglist.php @@ -20,7 +20,7 @@ * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; use Sabre\DAV; @@ -86,7 +86,7 @@ class TagList extends DAV\Property { * * @param \DOMElement $dom * @param array $propertyMap - * @return \OC\Connector\Sabre\TagList + * @return \OCA\DAV\Connector\Sabre\TagList */ static function unserialize(\DOMElement $dom, array $propertyMap) { diff --git a/lib/private/connector/sabre/tagsplugin.php b/apps/dav/lib/connector/sabre/tagsplugin.php index 7756eb45bda..7446d97790b 100644 --- a/lib/private/connector/sabre/tagsplugin.php +++ b/apps/dav/lib/connector/sabre/tagsplugin.php @@ -18,7 +18,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Connector\Sabre; +namespace OCA\DAV\Connector\Sabre; /** * ownCloud @@ -206,12 +206,12 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin PropFind $propFind, \Sabre\DAV\INode $node ) { - if (!($node instanceof \OC\Connector\Sabre\Node)) { + if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) { return; } // need prefetch ? - if ($node instanceof \OC\Connector\Sabre\Directory + if ($node instanceof \OCA\DAV\Connector\Sabre\Directory && $propFind->getDepth() !== 0 && (!is_null($propFind->getStatus(self::TAGS_PROPERTYNAME)) || !is_null($propFind->getStatus(self::FAVORITE_PROPERTYNAME)) diff --git a/tests/lib/connector/sabre/BlockLegacyClientPluginTest.php b/apps/dav/tests/unit/connector/sabre/BlockLegacyClientPluginTest.php index 05488d9716a..1e390cf15f7 100644 --- a/tests/lib/connector/sabre/BlockLegacyClientPluginTest.php +++ b/apps/dav/tests/unit/connector/sabre/BlockLegacyClientPluginTest.php @@ -21,7 +21,7 @@ namespace Test\Connector\Sabre; -use OC\Connector\Sabre\BlockLegacyClientPlugin; +use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin; use Test\TestCase; use OCP\IConfig; diff --git a/tests/lib/connector/sabre/DummyGetResponsePluginTest.php b/apps/dav/tests/unit/connector/sabre/DummyGetResponsePluginTest.php index 096c2c5f0d2..1fd89c84ff6 100644 --- a/tests/lib/connector/sabre/DummyGetResponsePluginTest.php +++ b/apps/dav/tests/unit/connector/sabre/DummyGetResponsePluginTest.php @@ -21,7 +21,7 @@ namespace Test\Connector\Sabre; -use OC\Connector\Sabre\DummyGetResponsePlugin; +use OCA\DAV\Connector\Sabre\DummyGetResponsePlugin; use Test\TestCase; /** diff --git a/tests/lib/connector/sabre/MaintenancePluginTest.php b/apps/dav/tests/unit/connector/sabre/MaintenancePluginTest.php index e5b50f71de6..c0acd4fc3de 100644 --- a/tests/lib/connector/sabre/MaintenancePluginTest.php +++ b/apps/dav/tests/unit/connector/sabre/MaintenancePluginTest.php @@ -21,7 +21,7 @@ namespace Test\Connector\Sabre; -use OC\Connector\Sabre\MaintenancePlugin; +use OCA\DAV\Connector\Sabre\MaintenancePlugin; use Test\TestCase; use OCP\IConfig; diff --git a/tests/lib/connector/sabre/copyetagheaderplugintest.php b/apps/dav/tests/unit/connector/sabre/copyetagheaderplugintest.php index 6b1b5e96fda..2080755cd51 100644 --- a/tests/lib/connector/sabre/copyetagheaderplugintest.php +++ b/apps/dav/tests/unit/connector/sabre/copyetagheaderplugintest.php @@ -11,14 +11,14 @@ namespace Tests\Connector\Sabre; class CopyEtagPluginTest extends \Test\TestCase { /** - * @var \OC\Connector\Sabre\CopyEtagHeaderPlugin + * @var \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin */ private $plugin; public function setUp() { parent::setUp(); $this->server = new \Sabre\DAV\Server(); - $this->plugin = new \OC\Connector\Sabre\CopyEtagHeaderPlugin(); + $this->plugin = new \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin(); $this->plugin->initialize($this->server); } diff --git a/tests/lib/connector/sabre/custompropertiesbackend.php b/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php index 212bece9402..973a5d4c27b 100644 --- a/tests/lib/connector/sabre/custompropertiesbackend.php +++ b/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php @@ -21,7 +21,7 @@ class CustomPropertiesBackend extends \Test\TestCase { private $tree; /** - * @var \OC\Connector\Sabre\CustomPropertiesBackend + * @var \OCA\DAV\Connector\Sabre\CustomPropertiesBackend */ private $plugin; @@ -44,7 +44,7 @@ class CustomPropertiesBackend extends \Test\TestCase { ->method('getUID') ->will($this->returnValue($userId)); - $this->plugin = new \OC\Connector\Sabre\CustomPropertiesBackend( + $this->plugin = new \OCA\DAV\Connector\Sabre\CustomPropertiesBackend( $this->tree, \OC::$server->getDatabaseConnection(), $this->user @@ -143,7 +143,7 @@ class CustomPropertiesBackend extends \Test\TestCase { * Test setting/getting properties */ public function testSetGetPropertiesForFile() { - $node = $this->createTestNode('\OC\Connector\Sabre\File'); + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); $this->tree->expects($this->any()) ->method('getNodeForPath') ->with('/dummypath') @@ -175,9 +175,9 @@ class CustomPropertiesBackend extends \Test\TestCase { * Test getting properties from directory */ public function testGetPropertiesForDirectory() { - $rootNode = $this->createTestNode('\OC\Connector\Sabre\Directory'); + $rootNode = $this->createTestNode('\OCA\DAV\Connector\Sabre\Directory'); - $nodeSub = $this->getMockBuilder('\OC\Connector\Sabre\File') + $nodeSub = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') ->disableOriginalConstructor() ->getMock(); $nodeSub->expects($this->any()) @@ -259,7 +259,7 @@ class CustomPropertiesBackend extends \Test\TestCase { * Test delete property */ public function testDeleteProperty() { - $node = $this->createTestNode('\OC\Connector\Sabre\File'); + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); $this->tree->expects($this->any()) ->method('getNodeForPath') ->with('/dummypath') diff --git a/tests/lib/connector/sabre/directory.php b/apps/dav/tests/unit/connector/sabre/directory.php index c846f109d87..d85290df80a 100644 --- a/tests/lib/connector/sabre/directory.php +++ b/apps/dav/tests/unit/connector/sabre/directory.php @@ -29,7 +29,7 @@ class Test_OC_Connector_Sabre_Directory extends \Test\TestCase { ->method('getPath') ->will($this->returnValue($path)); - return new \OC\Connector\Sabre\Directory($this->view, $this->info); + return new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); } /** @@ -124,7 +124,7 @@ class Test_OC_Connector_Sabre_Directory extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnValue('')); - $dir = new \OC\Connector\Sabre\Directory($this->view, $this->info); + $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); $nodes = $dir->getChildren(); $this->assertEquals(2, count($nodes)); @@ -142,12 +142,12 @@ class Test_OC_Connector_Sabre_Directory extends \Test\TestCase { ->method('getFileInfo') ->willThrowException(new \OCP\Files\StorageNotAvailableException()); - $dir = new \OC\Connector\Sabre\Directory($this->view, $this->info); + $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); $dir->getChild('.'); } /** - * @expectedException \OC\Connector\Sabre\Exception\InvalidPath + * @expectedException \OCA\DAV\Connector\Sabre\Exception\InvalidPath */ public function testGetChildThrowInvalidPath() { $this->view->expects($this->once()) @@ -156,7 +156,7 @@ class Test_OC_Connector_Sabre_Directory extends \Test\TestCase { $this->view->expects($this->never()) ->method('getFileInfo'); - $dir = new \OC\Connector\Sabre\Directory($this->view, $this->info); + $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); $dir->getChild('.'); } @@ -186,7 +186,7 @@ class Test_OC_Connector_Sabre_Directory extends \Test\TestCase { ->method('getStorage') ->will($this->returnValue($storage)); - $dir = new \OC\Connector\Sabre\Directory($this->view, $this->info); + $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); $this->assertEquals([200, 800], $dir->getQuotaInfo()); //200 used, 800 free } } diff --git a/tests/lib/connector/sabre/exception/invalidpathtest.php b/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php index d2d58887d62..4c0af58ffea 100644 --- a/tests/lib/connector/sabre/exception/invalidpathtest.php +++ b/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php @@ -2,7 +2,7 @@ namespace Test\Connector\Sabre\Exception; -use OC\Connector\Sabre\Exception\InvalidPath; +use OCA\DAV\Connector\Sabre\Exception\InvalidPath; /** * Copyright (c) 2015 Thomas Müller <deepdiver@owncloud.com> diff --git a/tests/lib/connector/sabre/exceptionloggerplugin.php b/apps/dav/tests/unit/connector/sabre/exceptionloggerplugin.php index 0662ba029d9..d85aa5a9cc3 100644 --- a/tests/lib/connector/sabre/exceptionloggerplugin.php +++ b/apps/dav/tests/unit/connector/sabre/exceptionloggerplugin.php @@ -9,8 +9,8 @@ namespace Test\Connector\Sabre; -use OC\Connector\Sabre\Exception\InvalidPath; -use OC\Connector\Sabre\ExceptionLoggerPlugin as PluginToTest; +use OCA\DAV\Connector\Sabre\Exception\InvalidPath; +use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin as PluginToTest; use OC\Log; use OCP\ILogger; use PHPUnit_Framework_MockObject_MockObject; diff --git a/tests/lib/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php index e5605dd7cc5..9171fc3b786 100644 --- a/tests/lib/connector/sabre/file.php +++ b/apps/dav/tests/unit/connector/sabre/file.php @@ -8,6 +8,7 @@ namespace Test\Connector\Sabre; +use OC\Files\Storage\Local; use Test\HookHelper; use OC\Files\Filesystem; use OCP\Lock\ILockingProvider; @@ -61,11 +62,11 @@ class File extends \Test\TestCase { ], [ new \OCP\Files\EntityTooLargeException(), - 'OC\Connector\Sabre\Exception\EntityTooLarge' + 'OCA\DAV\Connector\Sabre\Exception\EntityTooLarge' ], [ new \OCP\Files\InvalidContentException(), - 'OC\Connector\Sabre\Exception\UnsupportedMediaType' + 'OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType' ], [ new \OCP\Files\InvalidPathException(), @@ -73,11 +74,11 @@ class File extends \Test\TestCase { ], [ new \OCP\Files\LockNotAcquiredException('/test.txt', 1), - 'OC\Connector\Sabre\Exception\FileLocked' + 'OCA\DAV\Connector\Sabre\Exception\FileLocked' ], [ new \OCP\Lock\LockedException('/test.txt'), - 'OC\Connector\Sabre\Exception\FileLocked' + 'OCA\DAV\Connector\Sabre\Exception\FileLocked' ], [ new \OCP\Encryption\Exceptions\GenericEncryptionException(), @@ -137,7 +138,7 @@ class File extends \Test\TestCase { 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $caughtException = null; @@ -196,7 +197,7 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-0', null, null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // put first chunk $this->assertNull($file->put('test data one')); @@ -204,7 +205,7 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-1', null, null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $caughtException = null; @@ -249,7 +250,7 @@ class File extends \Test\TestCase { null ); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // beforeMethod locks $view->lockFile($path, ILockingProvider::LOCK_SHARED); @@ -436,7 +437,7 @@ class File extends \Test\TestCase { 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $thrown = false; @@ -469,7 +470,7 @@ class File extends \Test\TestCase { 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $thrown = false; @@ -481,7 +482,7 @@ class File extends \Test\TestCase { // afterMethod unlocks $view->unlockFile($info->getPath(), ILockingProvider::LOCK_SHARED); - } catch (\OC\Connector\Sabre\Exception\FileLocked $e) { + } catch (\OCA\DAV\Connector\Sabre\Exception\FileLocked $e) { $thrown = true; } @@ -503,19 +504,19 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-0', null, null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); $this->assertNull($file->put('test data one')); $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-1', null, null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $thrown = false; try { $file->put($this->getStream('test data')); - } catch (\OC\Connector\Sabre\Exception\FileLocked $e) { + } catch (\OCA\DAV\Connector\Sabre\Exception\FileLocked $e) { $thrown = true; } @@ -536,7 +537,7 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/*', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $thrown = false; @@ -548,7 +549,7 @@ class File extends \Test\TestCase { // afterMethod unlocks $view->unlockFile($info->getPath(), ILockingProvider::LOCK_SHARED); - } catch (\OC\Connector\Sabre\Exception\InvalidPath $e) { + } catch (\OCA\DAV\Connector\Sabre\Exception\InvalidPath $e) { $thrown = true; } @@ -559,7 +560,7 @@ class File extends \Test\TestCase { /** * Test setting name with setName() with invalid chars * - * @expectedException \OC\Connector\Sabre\Exception\InvalidPath + * @expectedException \OCA\DAV\Connector\Sabre\Exception\InvalidPath */ public function testSetNameInvalidChars() { // setup @@ -572,7 +573,7 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/*', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); $file->setName('/super*star.txt'); } @@ -600,7 +601,7 @@ class File extends \Test\TestCase { 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $thrown = false; @@ -636,7 +637,7 @@ class File extends \Test\TestCase { 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $file->delete(); @@ -654,7 +655,7 @@ class File extends \Test\TestCase { 'permissions' => 0 ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $file->delete(); @@ -677,7 +678,7 @@ class File extends \Test\TestCase { 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); // action $file->delete(); @@ -714,7 +715,7 @@ class File extends \Test\TestCase { null ); - $file = new \OC\Connector\Sabre\File($view, $info); + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); $this->assertFalse( $this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_SHARED), @@ -798,15 +799,34 @@ class File extends \Test\TestCase { } $files = []; list($storage, $internalPath) = $userView->resolvePath($path); - $realPath = $storage->getSourcePath($internalPath); - $dh = opendir($realPath); - while (($file = readdir($dh)) !== false) { - if (substr($file, strlen($file) - 5, 5) === '.part') { - $files[] = $file; + if($storage instanceof Local) { + $realPath = $storage->getSourcePath($internalPath); + $dh = opendir($realPath); + while (($file = readdir($dh)) !== false) { + if (substr($file, strlen($file) - 5, 5) === '.part') { + $files[] = $file; + } } + closedir($dh); } - closedir($dh); return $files; } + /** + * @expectedException \Sabre\DAV\Exception\ServiceUnavailable + */ + public function testGetFopenFails() { + $view = $this->getMock('\OC\Files\View', ['fopen'], array()); + $view->expects($this->atLeastOnce()) + ->method('fopen') + ->will($this->returnValue(false)); + + $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + 'permissions' => \OCP\Constants::PERMISSION_ALL + ), null); + + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); + + $file->get(); + } } diff --git a/tests/lib/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php index a4cf9f7bfb9..a91ca7a4ff7 100644 --- a/tests/lib/connector/sabre/filesplugin.php +++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php @@ -9,12 +9,12 @@ namespace Tests\Connector\Sabre; * See the COPYING-README file. */ class FilesPlugin extends \Test\TestCase { - const GETETAG_PROPERTYNAME = \OC\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME; - const FILEID_PROPERTYNAME = \OC\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME; - const SIZE_PROPERTYNAME = \OC\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME; - const PERMISSIONS_PROPERTYNAME = \OC\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME; - const GETLASTMODIFIED_PROPERTYNAME = \OC\Connector\Sabre\FilesPlugin::GETLASTMODIFIED_PROPERTYNAME; - const DOWNLOADURL_PROPERTYNAME = \OC\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME; + const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME; + const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME; + const SIZE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME; + const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME; + const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME; + const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME; /** * @var \Sabre\DAV\Server @@ -22,22 +22,33 @@ class FilesPlugin extends \Test\TestCase { private $server; /** - * @var \Sabre\DAV\ObjectTree + * @var \Sabre\DAV\Tree */ private $tree; /** - * @var \OC\Connector\Sabre\FilesPlugin + * @var \OCA\DAV\Connector\Sabre\FilesPlugin */ private $plugin; + /** + * @var \OC\Files\View + */ + private $view; + public function setUp() { parent::setUp(); - $this->server = new \Sabre\DAV\Server(); + $this->server = $this->getMockBuilder('\Sabre\DAV\Server') + ->disableOriginalConstructor() + ->getMock(); $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree') ->disableOriginalConstructor() ->getMock(); - $this->plugin = new \OC\Connector\Sabre\FilesPlugin($this->tree); + $this->view = $this->getMockBuilder('\OC\Files\View') + ->disableOriginalConstructor() + ->getMock(); + + $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view); $this->plugin->initialize($this->server); } @@ -70,7 +81,7 @@ class FilesPlugin extends \Test\TestCase { /** */ public function testGetPropertiesForFile() { - $node = $this->createTestNode('\OC\Connector\Sabre\File'); + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); $propFind = new \Sabre\DAV\PropFind( '/dummyPath', @@ -104,7 +115,7 @@ class FilesPlugin extends \Test\TestCase { } public function testGetPublicPermissions() { - $this->plugin = new \OC\Connector\Sabre\FilesPlugin($this->tree, true); + $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view, true); $this->plugin->initialize($this->server); $propFind = new \Sabre\DAV\PropFind( @@ -115,7 +126,7 @@ class FilesPlugin extends \Test\TestCase { 0 ); - $node = $this->createTestNode('\OC\Connector\Sabre\File'); + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); $node->expects($this->any()) ->method('getDavPermissions') ->will($this->returnValue('DWCKMSR')); @@ -129,7 +140,7 @@ class FilesPlugin extends \Test\TestCase { } public function testGetPropertiesForDirectory() { - $node = $this->createTestNode('\OC\Connector\Sabre\Directory'); + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\Directory'); $propFind = new \Sabre\DAV\PropFind( '/dummyPath', @@ -163,7 +174,7 @@ class FilesPlugin extends \Test\TestCase { } public function testUpdateProps() { - $node = $this->createTestNode('\OC\Connector\Sabre\File'); + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); $testDate = 'Fri, 13 Feb 2015 00:01:02 GMT'; @@ -179,7 +190,7 @@ class FilesPlugin extends \Test\TestCase { // properties to set $propPatch = new \Sabre\DAV\PropPatch(array( self::GETETAG_PROPERTYNAME => 'newetag', - self::GETLASTMODIFIED_PROPERTYNAME => $testDate + self::LASTMODIFIED_PROPERTYNAME => $testDate )); $this->plugin->handleUpdateProperties( @@ -192,8 +203,52 @@ class FilesPlugin extends \Test\TestCase { $this->assertEmpty($propPatch->getRemainingMutations()); $result = $propPatch->getResult(); - $this->assertEquals(200, $result[self::GETLASTMODIFIED_PROPERTYNAME]); + $this->assertEquals(200, $result[self::LASTMODIFIED_PROPERTYNAME]); $this->assertEquals(200, $result[self::GETETAG_PROPERTYNAME]); } + /** + * Testcase from https://github.com/owncloud/core/issues/5251 + * + * |-FolderA + * |-text.txt + * |-test.txt + * + * FolderA is an incomming shared folder and there are no delete permissions. + * Thus moving /FolderA/test.txt to /test.txt should fail already on that check + * + * @expectedException \Sabre\DAV\Exception\Forbidden + * @expectedExceptionMessage FolderA/test.txt cannot be deleted + */ + public function testMoveSrcNotDeletable() { + $fileInfoFolderATestTXT = $this->getMockBuilder('\OCP\Files\FileInfo') + ->disableOriginalConstructor() + ->getMock(); + $fileInfoFolderATestTXT->expects($this->once()) + ->method('isDeletable') + ->willReturn(false); + + $this->view->expects($this->once()) + ->method('getFileInfo') + ->with('FolderA/test.txt') + ->willReturn($fileInfoFolderATestTXT); + + $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); + } + + public function testMoveSrcDeletable() { + $fileInfoFolderATestTXT = $this->getMockBuilder('\OCP\Files\FileInfo') + ->disableOriginalConstructor() + ->getMock(); + $fileInfoFolderATestTXT->expects($this->once()) + ->method('isDeletable') + ->willReturn(true); + + $this->view->expects($this->once()) + ->method('getFileInfo') + ->with('FolderA/test.txt') + ->willReturn($fileInfoFolderATestTXT); + + $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); + } } diff --git a/tests/lib/connector/sabre/node.php b/apps/dav/tests/unit/connector/sabre/node.php index 3b3a6107813..a9610fd84b3 100644 --- a/tests/lib/connector/sabre/node.php +++ b/apps/dav/tests/unit/connector/sabre/node.php @@ -46,7 +46,7 @@ class Node extends \Test\TestCase { ->will($this->returnValue($type)); $view = $this->getMock('\OC\Files\View'); - $node = new \OC\Connector\Sabre\File($view, $info); + $node = new \OCA\DAV\Connector\Sabre\File($view, $info); $this->assertEquals($expected, $node->getDavPermissions()); } } diff --git a/tests/lib/connector/sabre/objecttree.php b/apps/dav/tests/unit/connector/sabre/objecttree.php index 1eaddf53a11..2691385c1c1 100644 --- a/tests/lib/connector/sabre/objecttree.php +++ b/apps/dav/tests/unit/connector/sabre/objecttree.php @@ -6,11 +6,11 @@ * See the COPYING-README file. */ -namespace Test\OC\Connector\Sabre; +namespace Test\OCA\DAV\Connector\Sabre; use OC\Files\FileInfo; -use OC\Connector\Sabre\Directory; +use OCA\DAV\Connector\Sabre\Directory; use OC\Files\Storage\Temporary; class TestDoubleFileView extends \OC\Files\View { @@ -62,7 +62,7 @@ class ObjectTree extends \Test\TestCase { /** * @dataProvider moveFailedInvalidCharsProvider - * @expectedException \OC\Connector\Sabre\Exception\InvalidPath + * @expectedException \OCA\DAV\Connector\Sabre\Exception\InvalidPath */ public function testMoveFailedInvalidChars($source, $destination, $updatables, $deletables) { $this->moveTest($source, $destination, $updatables, $deletables); @@ -104,7 +104,7 @@ class ObjectTree extends \Test\TestCase { $info = new FileInfo('', null, null, array(), null); $rootDir = new Directory($view, $info); - $objectTree = $this->getMock('\OC\Connector\Sabre\ObjectTree', + $objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree', array('nodeExists', 'getNodeForPath'), array($rootDir, $view)); @@ -113,7 +113,7 @@ class ObjectTree extends \Test\TestCase { ->with($this->identicalTo($source)) ->will($this->returnValue(false)); - /** @var $objectTree \OC\Connector\Sabre\ObjectTree */ + /** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */ $mountManager = \OC\Files\Filesystem::getMountManager(); $objectTree->init($rootDir, $view, $mountManager); $objectTree->move($source, $destination); @@ -134,7 +134,7 @@ class ObjectTree extends \Test\TestCase { $_SERVER['HTTP_OC_CHUNKED'] = true; } - $rootNode = $this->getMockBuilder('\OC\Connector\Sabre\Directory') + $rootNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); $mountManager = $this->getMock('\OC\Files\Mount\Manager'); @@ -152,7 +152,7 @@ class ObjectTree extends \Test\TestCase { ->with($fileInfoQueryPath) ->will($this->returnValue($fileInfo)); - $tree = new \OC\Connector\Sabre\ObjectTree(); + $tree = new \OCA\DAV\Connector\Sabre\ObjectTree(); $tree->init($rootNode, $view, $mountManager); $node = $tree->getNodeForPath($inputFileName); @@ -161,9 +161,9 @@ class ObjectTree extends \Test\TestCase { $this->assertEquals($outputFileName, $node->getName()); if ($type === 'file') { - $this->assertTrue($node instanceof \OC\Connector\Sabre\File); + $this->assertTrue($node instanceof \OCA\DAV\Connector\Sabre\File); } else { - $this->assertTrue($node instanceof \OC\Connector\Sabre\Directory); + $this->assertTrue($node instanceof \OCA\DAV\Connector\Sabre\Directory); } unset($_SERVER['HTTP_OC_CHUNKED']); @@ -239,7 +239,7 @@ class ObjectTree extends \Test\TestCase { } /** - * @expectedException \OC\Connector\Sabre\Exception\InvalidPath + * @expectedException \OCA\DAV\Connector\Sabre\Exception\InvalidPath */ public function testGetNodeForPathInvalidPath() { $path = '/foo\bar'; @@ -254,12 +254,12 @@ class ObjectTree extends \Test\TestCase { return [$storage, ltrim($path, '/')]; })); - $rootNode = $this->getMockBuilder('\OC\Connector\Sabre\Directory') + $rootNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); $mountManager = $this->getMock('\OC\Files\Mount\Manager'); - $tree = new \OC\Connector\Sabre\ObjectTree(); + $tree = new \OCA\DAV\Connector\Sabre\ObjectTree(); $tree->init($rootNode, $view, $mountManager); $tree->getNodeForPath($path); @@ -278,12 +278,12 @@ class ObjectTree extends \Test\TestCase { return [$storage, ltrim($path, '/')]; })); - $rootNode = $this->getMockBuilder('\OC\Connector\Sabre\Directory') + $rootNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); $mountManager = $this->getMock('\OC\Files\Mount\Manager'); - $tree = new \OC\Connector\Sabre\ObjectTree(); + $tree = new \OCA\DAV\Connector\Sabre\ObjectTree(); $tree->init($rootNode, $view, $mountManager); $this->assertInstanceOf('\Sabre\DAV\INode', $tree->getNodeForPath($path)); diff --git a/tests/lib/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php index 1841a79bec7..3c0abeac3f1 100644 --- a/tests/lib/connector/sabre/principal.php +++ b/apps/dav/tests/unit/connector/sabre/principal.php @@ -19,7 +19,7 @@ class Principal extends \Test\TestCase { private $userManager; /** @var IConfig */ private $config; - /** @var \OC\Connector\Sabre\Principal */ + /** @var \OCA\DAV\Connector\Sabre\Principal */ private $connector; public function setUp() { @@ -28,7 +28,7 @@ class Principal extends \Test\TestCase { $this->config = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor()->getMock(); - $this->connector = new \OC\Connector\Sabre\Principal($this->config, $this->userManager); + $this->connector = new \OCA\DAV\Connector\Sabre\Principal($this->config, $this->userManager); parent::setUp(); } diff --git a/tests/lib/connector/sabre/quotaplugin.php b/apps/dav/tests/unit/connector/sabre/quotaplugin.php index 3d9cd9b5da0..5d3364e1f8c 100644 --- a/tests/lib/connector/sabre/quotaplugin.php +++ b/apps/dav/tests/unit/connector/sabre/quotaplugin.php @@ -14,14 +14,14 @@ class Test_OC_Connector_Sabre_QuotaPlugin extends \Test\TestCase { private $server; /** - * @var \OC\Connector\Sabre\QuotaPlugin + * @var \OCA\DAV\Connector\Sabre\QuotaPlugin */ private $plugin; private function init($quota) { $view = $this->buildFileViewMock($quota); $this->server = new \Sabre\DAV\Server(); - $this->plugin = new \OC\Connector\Sabre\QuotaPlugin($view); + $this->plugin = new \OCA\DAV\Connector\Sabre\QuotaPlugin($view); $this->plugin->initialize($this->server); } diff --git a/tests/lib/connector/sabre/requesttest/auth.php b/apps/dav/tests/unit/connector/sabre/requesttest/auth.php index 7cab4da5264..41b554d11db 100644 --- a/tests/lib/connector/sabre/requesttest/auth.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/auth.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use Sabre\DAV\Auth\Backend\BackendInterface; diff --git a/tests/lib/connector/sabre/requesttest/downloadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php index 67dd9f52308..245deff3b31 100644 --- a/tests/lib/connector/sabre/requesttest/downloadtest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use OCP\AppFramework\Http; use OCP\Lock\ILockingProvider; @@ -24,7 +24,7 @@ class DownloadTest extends RequestTest { } /** - * @expectedException \OC\Connector\Sabre\Exception\FileLocked + * @expectedException \OCA\DAV\Connector\Sabre\Exception\FileLocked */ public function testDownloadWriteLocked() { $user = $this->getUniqueID(); diff --git a/tests/lib/connector/sabre/requesttest/encryptionuploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php index f1849c94760..ed1d6046d75 100644 --- a/tests/lib/connector/sabre/requesttest/encryptionuploadtest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use OC\Files\View; use Test\Traits\EncryptionTrait; diff --git a/tests/lib/connector/sabre/requesttest/exceptionplugin.php b/apps/dav/tests/unit/connector/sabre/requesttest/exceptionplugin.php index 2b9e5d6d46d..53cd186bbc8 100644 --- a/tests/lib/connector/sabre/requesttest/exceptionplugin.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/exceptionplugin.php @@ -6,11 +6,11 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use Sabre\DAV\Exception; -class ExceptionPlugin extends \OC\Connector\Sabre\ExceptionLoggerPlugin { +class ExceptionPlugin extends \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin { /** * @var \Exception[] */ diff --git a/tests/lib/connector/sabre/requesttest/requesttest.php b/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php index 4d4c8173caa..d90cf6e19bc 100644 --- a/tests/lib/connector/sabre/requesttest/requesttest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php @@ -6,10 +6,10 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; -use OC\Connector\Sabre\Server; -use OC\Connector\Sabre\ServerFactory; +use OCA\DAV\Connector\Sabre\Server; +use OCA\DAV\Connector\Sabre\ServerFactory; use OC\Files\Mount\MountPoint; use OC\Files\Storage\StorageFactory; use OC\Files\Storage\Temporary; @@ -25,7 +25,7 @@ abstract class RequestTest extends TestCase { use MountProviderTrait; /** - * @var \OC\Connector\Sabre\ServerFactory + * @var \OCA\DAV\Connector\Sabre\ServerFactory */ protected $serverFactory; diff --git a/tests/lib/connector/sabre/requesttest/sapi.php b/apps/dav/tests/unit/connector/sabre/requesttest/sapi.php index cda9fdb70f5..3af94010288 100644 --- a/tests/lib/connector/sabre/requesttest/sapi.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/sapi.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use Sabre\HTTP\Request; use Sabre\HTTP\Response; diff --git a/tests/lib/connector/sabre/requesttest/uploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php index 8f39aff81b9..9a067f230a3 100644 --- a/tests/lib/connector/sabre/requesttest/uploadtest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -namespace Test\Connector\Sabre\RequestTest; +namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use OC\AppFramework\Http; diff --git a/tests/lib/connector/sabre/tagsplugin.php b/apps/dav/tests/unit/connector/sabre/tagsplugin.php index f8af73fecfb..4731e770cfa 100644 --- a/tests/lib/connector/sabre/tagsplugin.php +++ b/apps/dav/tests/unit/connector/sabre/tagsplugin.php @@ -10,9 +10,9 @@ namespace Tests\Connector\Sabre; */ class TagsPlugin extends \Test\TestCase { - const TAGS_PROPERTYNAME = \OC\Connector\Sabre\TagsPlugin::TAGS_PROPERTYNAME; - const FAVORITE_PROPERTYNAME = \OC\Connector\Sabre\TagsPlugin::FAVORITE_PROPERTYNAME; - const TAG_FAVORITE = \OC\Connector\Sabre\TagsPlugin::TAG_FAVORITE; + const TAGS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\TagsPlugin::TAGS_PROPERTYNAME; + const FAVORITE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\TagsPlugin::FAVORITE_PROPERTYNAME; + const TAG_FAVORITE = \OCA\DAV\Connector\Sabre\TagsPlugin::TAG_FAVORITE; /** * @var \Sabre\DAV\Server @@ -35,7 +35,7 @@ class TagsPlugin extends \Test\TestCase { private $tagger; /** - * @var \OC\Connector\Sabre\TagsPlugin + * @var \OCA\DAV\Connector\Sabre\TagsPlugin */ private $plugin; @@ -51,7 +51,7 @@ class TagsPlugin extends \Test\TestCase { ->method('load') ->with('files') ->will($this->returnValue($this->tagger)); - $this->plugin = new \OC\Connector\Sabre\TagsPlugin($this->tree, $this->tagManager); + $this->plugin = new \OCA\DAV\Connector\Sabre\TagsPlugin($this->tree, $this->tagManager); $this->plugin->initialize($this->server); } @@ -59,7 +59,7 @@ class TagsPlugin extends \Test\TestCase { * @dataProvider tagsGetPropertiesDataProvider */ public function testGetProperties($tags, $requestedProperties, $expectedProperties) { - $node = $this->getMockBuilder('\OC\Connector\Sabre\Node') + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') ->disableOriginalConstructor() ->getMock(); $node->expects($this->any()) @@ -98,13 +98,13 @@ class TagsPlugin extends \Test\TestCase { * @dataProvider tagsGetPropertiesDataProvider */ public function testPreloadThenGetProperties($tags, $requestedProperties, $expectedProperties) { - $node1 = $this->getMockBuilder('\OC\Connector\Sabre\File') + $node1 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') ->disableOriginalConstructor() ->getMock(); $node1->expects($this->any()) ->method('getId') ->will($this->returnValue(111)); - $node2 = $this->getMockBuilder('\OC\Connector\Sabre\File') + $node2 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') ->disableOriginalConstructor() ->getMock(); $node2->expects($this->any()) @@ -119,7 +119,7 @@ class TagsPlugin extends \Test\TestCase { $expectedCallCount = 1; } - $node = $this->getMockBuilder('\OC\Connector\Sabre\Directory') + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); $node->expects($this->any()) @@ -184,7 +184,7 @@ class TagsPlugin extends \Test\TestCase { array(self::TAGS_PROPERTYNAME, self::FAVORITE_PROPERTYNAME), array( 200 => array( - self::TAGS_PROPERTYNAME => new \OC\Connector\Sabre\TagList(array('tag1', 'tag2')), + self::TAGS_PROPERTYNAME => new \OCA\DAV\Connector\Sabre\TagList(array('tag1', 'tag2')), self::FAVORITE_PROPERTYNAME => true, ) ) @@ -195,7 +195,7 @@ class TagsPlugin extends \Test\TestCase { array(self::TAGS_PROPERTYNAME), array( 200 => array( - self::TAGS_PROPERTYNAME => new \OC\Connector\Sabre\TagList(array('tag1', 'tag2')), + self::TAGS_PROPERTYNAME => new \OCA\DAV\Connector\Sabre\TagList(array('tag1', 'tag2')), ) ) ), @@ -223,7 +223,7 @@ class TagsPlugin extends \Test\TestCase { array(self::TAGS_PROPERTYNAME, self::FAVORITE_PROPERTYNAME), array( 200 => array( - self::TAGS_PROPERTYNAME => new \OC\Connector\Sabre\TagList(array()), + self::TAGS_PROPERTYNAME => new \OCA\DAV\Connector\Sabre\TagList(array()), self::FAVORITE_PROPERTYNAME => false, ) ) @@ -234,7 +234,7 @@ class TagsPlugin extends \Test\TestCase { public function testUpdateTags() { // this test will replace the existing tags "tagremove" with "tag1" and "tag2" // and keep "tagkeep" - $node = $this->getMockBuilder('\OC\Connector\Sabre\Node') + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') ->disableOriginalConstructor() ->getMock(); $node->expects($this->any()) @@ -266,7 +266,7 @@ class TagsPlugin extends \Test\TestCase { // properties to set $propPatch = new \Sabre\DAV\PropPatch(array( - self::TAGS_PROPERTYNAME => new \OC\Connector\Sabre\TagList(array('tag1', 'tag2', 'tagkeep')) + self::TAGS_PROPERTYNAME => new \OCA\DAV\Connector\Sabre\TagList(array('tag1', 'tag2', 'tagkeep')) )); $this->plugin->handleUpdateProperties( @@ -285,7 +285,7 @@ class TagsPlugin extends \Test\TestCase { } public function testUpdateTagsFromScratch() { - $node = $this->getMockBuilder('\OC\Connector\Sabre\Node') + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') ->disableOriginalConstructor() ->getMock(); $node->expects($this->any()) @@ -312,7 +312,7 @@ class TagsPlugin extends \Test\TestCase { // properties to set $propPatch = new \Sabre\DAV\PropPatch(array( - self::TAGS_PROPERTYNAME => new \OC\Connector\Sabre\TagList(array('tag1', 'tag2', 'tagkeep')) + self::TAGS_PROPERTYNAME => new \OCA\DAV\Connector\Sabre\TagList(array('tag1', 'tag2', 'tagkeep')) )); $this->plugin->handleUpdateProperties( @@ -333,7 +333,7 @@ class TagsPlugin extends \Test\TestCase { public function testUpdateFav() { // this test will replace the existing tags "tagremove" with "tag1" and "tag2" // and keep "tagkeep" - $node = $this->getMockBuilder('\OC\Connector\Sabre\Node') + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') ->disableOriginalConstructor() ->getMock(); $node->expects($this->any()) diff --git a/apps/encryption/appinfo/app.php b/apps/encryption/appinfo/app.php index 2eb12f638ed..1f336c05a8c 100644 --- a/apps/encryption/appinfo/app.php +++ b/apps/encryption/appinfo/app.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php index d89833a5ab2..812f1042a8f 100644 --- a/apps/encryption/appinfo/application.php +++ b/apps/encryption/appinfo/application.php @@ -2,8 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml index 536551e4841..2224f026e4d 100644 --- a/apps/encryption/appinfo/info.xml +++ b/apps/encryption/appinfo/info.xml @@ -14,18 +14,19 @@ <name>Default encryption module</name> <license>AGPL</license> <author>Bjoern Schiessle, Clark Tomlinson</author> - <requiremin>8</requiremin> <shipped>true</shipped> <documentation> <user>user-encryption</user> <admin>admin-encryption</admin> </documentation> <rememberlogin>false</rememberlogin> + <version>1.2.0</version> <types> <filesystem/> </types> <dependencies> <lib>openssl</lib> + <owncloud min-version="9.0" /> </dependencies> </info> diff --git a/apps/encryption/appinfo/register_command.php b/apps/encryption/appinfo/register_command.php index 0f03b63560a..4987ef24d61 100644 --- a/apps/encryption/appinfo/register_command.php +++ b/apps/encryption/appinfo/register_command.php @@ -1,7 +1,6 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/appinfo/routes.php b/apps/encryption/appinfo/routes.php index a73cc578437..8fa163d0751 100644 --- a/apps/encryption/appinfo/routes.php +++ b/apps/encryption/appinfo/routes.php @@ -2,8 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/appinfo/version b/apps/encryption/appinfo/version deleted file mode 100644 index 3eefcb9dd5b..00000000000 --- a/apps/encryption/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.0.0 diff --git a/apps/encryption/command/migratekeys.php b/apps/encryption/command/migratekeys.php index 7e320102172..89e2aa01610 100644 --- a/apps/encryption/command/migratekeys.php +++ b/apps/encryption/command/migratekeys.php @@ -1,7 +1,6 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/controller/recoverycontroller.php b/apps/encryption/controller/recoverycontroller.php index a92c49f539f..f1a2651443e 100644 --- a/apps/encryption/controller/recoverycontroller.php +++ b/apps/encryption/controller/recoverycontroller.php @@ -3,8 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/controller/settingscontroller.php b/apps/encryption/controller/settingscontroller.php index 8e6de19e784..e5bb79a1d40 100644 --- a/apps/encryption/controller/settingscontroller.php +++ b/apps/encryption/controller/settingscontroller.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/controller/statuscontroller.php b/apps/encryption/controller/statuscontroller.php index f330f726c0b..409fe1a258b 100644 --- a/apps/encryption/controller/statuscontroller.php +++ b/apps/encryption/controller/statuscontroller.php @@ -1,7 +1,6 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/encryption/hooks/contracts/ihook.php b/apps/encryption/hooks/contracts/ihook.php index 53217f8ac06..d4f20700d78 100644 --- a/apps/encryption/hooks/contracts/ihook.php +++ b/apps/encryption/hooks/contracts/ihook.php @@ -1,8 +1,6 @@ <?php /** * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/l10n/ca.js b/apps/encryption/l10n/ca.js index 9a318f2d4c2..b9ca7f97565 100644 --- a/apps/encryption/l10n/ca.js +++ b/apps/encryption/l10n/ca.js @@ -5,6 +5,8 @@ OC.L10N.register( "Could not enable recovery key. Please check your recovery key password!" : "No s'ha pogut activar la clau de recuperació. Comproveu contrasenya de la clau de recuperació!", "Recovery key successfully disabled" : "La clau de recuperació s'ha descativat", "Could not disable recovery key. Please check your recovery key password!" : "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!", + "Please provide a new recovery password" : "Siusplau proporcioneu una nova contrasenya de recuperació", + "Please repeat the new recovery password" : "Repetiu la nova contrasenya de recuperació", "Password successfully changed." : "La contrasenya s'ha canviat.", "Could not change the password. Maybe the old password was not correct." : "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.", "Private key password successfully updated." : "La contrasenya de la clau privada s'ha actualitzat.", diff --git a/apps/encryption/l10n/ca.json b/apps/encryption/l10n/ca.json index b172da4a0df..cedebee12c0 100644 --- a/apps/encryption/l10n/ca.json +++ b/apps/encryption/l10n/ca.json @@ -3,6 +3,8 @@ "Could not enable recovery key. Please check your recovery key password!" : "No s'ha pogut activar la clau de recuperació. Comproveu contrasenya de la clau de recuperació!", "Recovery key successfully disabled" : "La clau de recuperació s'ha descativat", "Could not disable recovery key. Please check your recovery key password!" : "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!", + "Please provide a new recovery password" : "Siusplau proporcioneu una nova contrasenya de recuperació", + "Please repeat the new recovery password" : "Repetiu la nova contrasenya de recuperació", "Password successfully changed." : "La contrasenya s'ha canviat.", "Could not change the password. Maybe the old password was not correct." : "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.", "Private key password successfully updated." : "La contrasenya de la clau privada s'ha actualitzat.", diff --git a/apps/encryption/l10n/de.js b/apps/encryption/l10n/de.js index 18e74fb9ed1..a5ba567fb59 100644 --- a/apps/encryption/l10n/de.js +++ b/apps/encryption/l10n/de.js @@ -25,6 +25,7 @@ OC.L10N.register( "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselung-App. Bitte aktualisiere Dein privates Schlüssel-Passwort, um den Zugriff auf Deine verschlüsselten Dateien wiederherzustellen.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melde Dich nochmals ab und wieder an.", "Encryption App is enabled and ready" : "Verschlüsselungs-App ist aktiviert und bereit", + "one-time password for server-side-encryption" : "Einmal-Passwort für serverseitige Verschlüsselung", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht entschlüsselt werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktiere den Eigentümer der Datei und bitte darum, die Datei noch einmal mit Dir zu teilen.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht gelesen werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktiere den Eigentümer der Datei und bitte darum, die Datei noch einmal mit Dir zu teilen.", "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.", diff --git a/apps/encryption/l10n/de.json b/apps/encryption/l10n/de.json index e15fe7e1cd1..dfac7ba8e9b 100644 --- a/apps/encryption/l10n/de.json +++ b/apps/encryption/l10n/de.json @@ -23,6 +23,7 @@ "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselung-App. Bitte aktualisiere Dein privates Schlüssel-Passwort, um den Zugriff auf Deine verschlüsselten Dateien wiederherzustellen.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melde Dich nochmals ab und wieder an.", "Encryption App is enabled and ready" : "Verschlüsselungs-App ist aktiviert und bereit", + "one-time password for server-side-encryption" : "Einmal-Passwort für serverseitige Verschlüsselung", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht entschlüsselt werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktiere den Eigentümer der Datei und bitte darum, die Datei noch einmal mit Dir zu teilen.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Diese Datei kann nicht gelesen werden, es handelt sich wahrscheinlich um eine geteilte Datei. Bitte kontaktiere den Eigentümer der Datei und bitte darum, die Datei noch einmal mit Dir zu teilen.", "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.", diff --git a/apps/encryption/l10n/es.js b/apps/encryption/l10n/es.js index cadedbcc0d4..6b49b3917fd 100644 --- a/apps/encryption/l10n/es.js +++ b/apps/encryption/l10n/es.js @@ -28,10 +28,10 @@ OC.L10N.register( "one-time password for server-side-encryption" : "Contraseña de un solo uso para el cifrado en el lado servidor", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede leer este archivo, probablemente sea un archivo compartido. Consulte con el propietario del mismo y que lo vuelva a compartir con usted.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.\n\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.\n\n", "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", "Cheers!" : "¡Saludos!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.<br><br>", "Enable recovery key" : "Activa la clave de recuperación", "Disable recovery key" : "Desactiva la clave de recuperación", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clave de recuperación es una clave de cifrado extra que se usa para cifrar ficheros. Permite la recuperación de los ficheros de un usuario si él o ella olvida su contraseña.", diff --git a/apps/encryption/l10n/es.json b/apps/encryption/l10n/es.json index 9bdad94cb6d..3f21b4c09a0 100644 --- a/apps/encryption/l10n/es.json +++ b/apps/encryption/l10n/es.json @@ -26,10 +26,10 @@ "one-time password for server-side-encryption" : "Contraseña de un solo uso para el cifrado en el lado servidor", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede leer este archivo, probablemente sea un archivo compartido. Consulte con el propietario del mismo y que lo vuelva a compartir con usted.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.\n\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.\n\n", "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", "Cheers!" : "¡Saludos!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.<br><br>", "Enable recovery key" : "Activa la clave de recuperación", "Disable recovery key" : "Desactiva la clave de recuperación", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clave de recuperación es una clave de cifrado extra que se usa para cifrar ficheros. Permite la recuperación de los ficheros de un usuario si él o ella olvida su contraseña.", diff --git a/apps/encryption/l10n/fa.js b/apps/encryption/l10n/fa.js index 706491f45a4..ac39a7fbe88 100644 --- a/apps/encryption/l10n/fa.js +++ b/apps/encryption/l10n/fa.js @@ -1,17 +1,37 @@ OC.L10N.register( "encryption", { + "Missing recovery key password" : "فاقد رمزعبور کلید بازیابی", + "Please repeat the recovery key password" : "لطفا رمز کلید بازیابی را تکرار کنید", "Recovery key successfully enabled" : "کلید بازیابی با موفقیت فعال شده است.", "Could not enable recovery key. Please check your recovery key password!" : "کلید بازیابی نمی تواند فعال شود. لطفا رمزعبور کلید بازیابی خود را بررسی نمایید!", "Recovery key successfully disabled" : "کلید بازیابی با موفقیت غیر فعال شده است.", "Could not disable recovery key. Please check your recovery key password!" : "کلید بازیابی را نمی تواند غیرفعال نماید. لطفا رمزعبور کلید بازیابی خود را بررسی کنید!", + "Missing parameters" : "پارامترهای فراموش شده", + "Please provide the old recovery password" : "لطفا رمز بازیابی قدیمی را وارد کنید", + "Please provide a new recovery password" : "لطفا رمز بازیابی جدید را وارد کنید", + "Please repeat the new recovery password" : "لطفا رمز بازیابی جدید را مجددا وارد کنید", "Password successfully changed." : "رمزعبور با موفقیت تغییر یافت.", "Could not change the password. Maybe the old password was not correct." : "رمزعبور را نمیتواند تغییر دهد. شاید رمزعبورقدیمی صحیح نمی باشد.", + "Recovery Key disabled" : "کلید بازیابی غیرفعال شد", + "Recovery Key enabled" : "کلید بازیابی فعال شد", + "Could not enable the recovery key, please try again or contact your administrator" : "امکان فعالسازی کلید بازیابی وجود ندارد، لطفا مجددا تلاش کرده و یا با مدیر تماس بگیرید", + "Could not update the private key password." : "امکان بروزرسانی رمزعبور کلید خصوصی وجود ندارد.", + "The old password was not correct, please try again." : "رمزعبور قدیمی اشتباه است، لطفا مجددا تلاش کنید.", "Private key password successfully updated." : "رمزعبور کلید خصوصی با موفقیت به روز شد.", + "Encryption App is enabled and ready" : "برنامه رمزگذاری فعال و آماده است", + "The share will expire on %s." : "اشتراکگذاری در %s منقضی خواهد شد.", "Cheers!" : "سلامتی!", + "Enable recovery key" : "فعالسازی کلید بازیابی", + "Disable recovery key" : "غیرفعالسازی کلید بازیابی", "Recovery key password" : "رمزعبور کلید بازیابی", + "Repeat recovery key password" : "تکرار رمزعبور کلید بازیابی", "Change recovery key password:" : "تغییر رمزعبور کلید بازیابی:", + "Old recovery key password" : "رمزعبور قدیمی کلید بازیابی", + "New recovery key password" : "رمزعبور جدید کلید بازیابی", + "Repeat new recovery key password" : "تکرار رمزعبور جدید کلید بازیابی", "Change Password" : "تغییر رمزعبور", + "ownCloud basic encryption module" : "ماژول پایه رمزگذاری ownCloud", " If you don't remember your old password you can ask your administrator to recover your files." : "اگر رمزعبور قدیمی را فراموش کرده اید میتوانید از مدیر خود برای بازیابی فایل هایتان درخواست نمایید.", "Old log-in password" : "رمزعبور قدیمی", "Current log-in password" : "رمزعبور فعلی", diff --git a/apps/encryption/l10n/fa.json b/apps/encryption/l10n/fa.json index 1071fd6e110..1a6e7d16275 100644 --- a/apps/encryption/l10n/fa.json +++ b/apps/encryption/l10n/fa.json @@ -1,15 +1,35 @@ { "translations": { + "Missing recovery key password" : "فاقد رمزعبور کلید بازیابی", + "Please repeat the recovery key password" : "لطفا رمز کلید بازیابی را تکرار کنید", "Recovery key successfully enabled" : "کلید بازیابی با موفقیت فعال شده است.", "Could not enable recovery key. Please check your recovery key password!" : "کلید بازیابی نمی تواند فعال شود. لطفا رمزعبور کلید بازیابی خود را بررسی نمایید!", "Recovery key successfully disabled" : "کلید بازیابی با موفقیت غیر فعال شده است.", "Could not disable recovery key. Please check your recovery key password!" : "کلید بازیابی را نمی تواند غیرفعال نماید. لطفا رمزعبور کلید بازیابی خود را بررسی کنید!", + "Missing parameters" : "پارامترهای فراموش شده", + "Please provide the old recovery password" : "لطفا رمز بازیابی قدیمی را وارد کنید", + "Please provide a new recovery password" : "لطفا رمز بازیابی جدید را وارد کنید", + "Please repeat the new recovery password" : "لطفا رمز بازیابی جدید را مجددا وارد کنید", "Password successfully changed." : "رمزعبور با موفقیت تغییر یافت.", "Could not change the password. Maybe the old password was not correct." : "رمزعبور را نمیتواند تغییر دهد. شاید رمزعبورقدیمی صحیح نمی باشد.", + "Recovery Key disabled" : "کلید بازیابی غیرفعال شد", + "Recovery Key enabled" : "کلید بازیابی فعال شد", + "Could not enable the recovery key, please try again or contact your administrator" : "امکان فعالسازی کلید بازیابی وجود ندارد، لطفا مجددا تلاش کرده و یا با مدیر تماس بگیرید", + "Could not update the private key password." : "امکان بروزرسانی رمزعبور کلید خصوصی وجود ندارد.", + "The old password was not correct, please try again." : "رمزعبور قدیمی اشتباه است، لطفا مجددا تلاش کنید.", "Private key password successfully updated." : "رمزعبور کلید خصوصی با موفقیت به روز شد.", + "Encryption App is enabled and ready" : "برنامه رمزگذاری فعال و آماده است", + "The share will expire on %s." : "اشتراکگذاری در %s منقضی خواهد شد.", "Cheers!" : "سلامتی!", + "Enable recovery key" : "فعالسازی کلید بازیابی", + "Disable recovery key" : "غیرفعالسازی کلید بازیابی", "Recovery key password" : "رمزعبور کلید بازیابی", + "Repeat recovery key password" : "تکرار رمزعبور کلید بازیابی", "Change recovery key password:" : "تغییر رمزعبور کلید بازیابی:", + "Old recovery key password" : "رمزعبور قدیمی کلید بازیابی", + "New recovery key password" : "رمزعبور جدید کلید بازیابی", + "Repeat new recovery key password" : "تکرار رمزعبور جدید کلید بازیابی", "Change Password" : "تغییر رمزعبور", + "ownCloud basic encryption module" : "ماژول پایه رمزگذاری ownCloud", " If you don't remember your old password you can ask your administrator to recover your files." : "اگر رمزعبور قدیمی را فراموش کرده اید میتوانید از مدیر خود برای بازیابی فایل هایتان درخواست نمایید.", "Old log-in password" : "رمزعبور قدیمی", "Current log-in password" : "رمزعبور فعلی", diff --git a/apps/encryption/l10n/fr.js b/apps/encryption/l10n/fr.js index 3ee1c05ffa7..f6016cc3ce6 100644 --- a/apps/encryption/l10n/fr.js +++ b/apps/encryption/l10n/fr.js @@ -28,10 +28,10 @@ OC.L10N.register( "one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier : il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le partager à nouveau avec vous.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le repartager avec vous. ", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Bonjour,\n\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe '%s'.\n\nVeuillez vous connecter dans l'interface web et aller dans la section \"Module de chiffrement de base d'ownCloud\" de vos paramètres personnels. De là, mettez à jour votre mot de passe de chiffrement en entrant le mot de passe fourni dans ce message dans le champ \"Ancien mot de passe de connexion\", et votre mot de passe de connexion actuel.\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Bonjour,\n\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe suivant :\n\n%s\n\nVeuillez suivre ces instructions :\n\n1. Connectez-vous à l'interface web et trouvez la section \"Module de chiffrement de base d'ownCloud\" dans vos paramètres personnels;\n\n2. Entrez le mot de passe fourni ci-dessus dans le champ \"Ancien mot de passe de connexion\";\n\n3. Entrez le mot de passe que vous utilisez actuellement pour vous connecter dans le champ \"Actuel mot de passe de connexion\";\n\n4. Validez en cliquant sur le bouton \"Mettre à jour le mot de passe de votre clef privée\".\n", "The share will expire on %s." : "Le partage expirera le %s.", "Cheers!" : "À bientôt !", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Bonjour,<br><br>L'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe <strong>%s</strong>.<br><br>\nVeuillez vous connecter dans l'interface web et aller dans la section \"Module de chiffrement de base d'ownCloud\" de vos paramètres personnels. De là, mettez à jour votre mot de passe de chiffrement en entrant le mot de passe fourni dans ce message dans le champ \"Ancien mot de passe de connexion\", et votre mot de passe de connexion actuel.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Bonjour,\n<br><br>\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe suivant :\n\n<p style=\"font-family: monospace;\"><b>%s</b></p>\n\n<p>\nVeuillez suivre ces instructions :\n<ol>\n<li>Connectez-vous à l'interface web et trouvez la section <em>\"Module de chiffrement de base d'ownCloud\"</em> dans vos paramètres personnels;</li>\n<li>Entrez le mot de passe fourni ci-dessus dans le champ <em>\"Ancien mot de passe de connexion\"</em>;</li>\n<li>Entrez le mot de passe que vous utilisez actuellement pour vous connecter dans le champ <em>\"Actuel mot de passe de connexion\"</em>;</li>\n<li>Validez en cliquant sur le bouton <em>\"Mettre à jour le mot de passe de votre clef privée\"</em>.</li>\n</ol>\n</p>", "Enable recovery key" : "Activer la clé de récupération", "Disable recovery key" : "Désactiver la clé de récupération", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clé de récupération est une clé supplémentaire utilisée pour chiffrer les fichiers. Elle permet de récupérer les fichiers des utilisateurs s'ils oublient leur mot de passe.", diff --git a/apps/encryption/l10n/fr.json b/apps/encryption/l10n/fr.json index 3694682d8bc..54a7431db30 100644 --- a/apps/encryption/l10n/fr.json +++ b/apps/encryption/l10n/fr.json @@ -26,10 +26,10 @@ "one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier : il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le partager à nouveau avec vous.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le repartager avec vous. ", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Bonjour,\n\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe '%s'.\n\nVeuillez vous connecter dans l'interface web et aller dans la section \"Module de chiffrement de base d'ownCloud\" de vos paramètres personnels. De là, mettez à jour votre mot de passe de chiffrement en entrant le mot de passe fourni dans ce message dans le champ \"Ancien mot de passe de connexion\", et votre mot de passe de connexion actuel.\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Bonjour,\n\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe suivant :\n\n%s\n\nVeuillez suivre ces instructions :\n\n1. Connectez-vous à l'interface web et trouvez la section \"Module de chiffrement de base d'ownCloud\" dans vos paramètres personnels;\n\n2. Entrez le mot de passe fourni ci-dessus dans le champ \"Ancien mot de passe de connexion\";\n\n3. Entrez le mot de passe que vous utilisez actuellement pour vous connecter dans le champ \"Actuel mot de passe de connexion\";\n\n4. Validez en cliquant sur le bouton \"Mettre à jour le mot de passe de votre clef privée\".\n", "The share will expire on %s." : "Le partage expirera le %s.", "Cheers!" : "À bientôt !", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Bonjour,<br><br>L'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe <strong>%s</strong>.<br><br>\nVeuillez vous connecter dans l'interface web et aller dans la section \"Module de chiffrement de base d'ownCloud\" de vos paramètres personnels. De là, mettez à jour votre mot de passe de chiffrement en entrant le mot de passe fourni dans ce message dans le champ \"Ancien mot de passe de connexion\", et votre mot de passe de connexion actuel.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Bonjour,\n<br><br>\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe suivant :\n\n<p style=\"font-family: monospace;\"><b>%s</b></p>\n\n<p>\nVeuillez suivre ces instructions :\n<ol>\n<li>Connectez-vous à l'interface web et trouvez la section <em>\"Module de chiffrement de base d'ownCloud\"</em> dans vos paramètres personnels;</li>\n<li>Entrez le mot de passe fourni ci-dessus dans le champ <em>\"Ancien mot de passe de connexion\"</em>;</li>\n<li>Entrez le mot de passe que vous utilisez actuellement pour vous connecter dans le champ <em>\"Actuel mot de passe de connexion\"</em>;</li>\n<li>Validez en cliquant sur le bouton <em>\"Mettre à jour le mot de passe de votre clef privée\"</em>.</li>\n</ol>\n</p>", "Enable recovery key" : "Activer la clé de récupération", "Disable recovery key" : "Désactiver la clé de récupération", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clé de récupération est une clé supplémentaire utilisée pour chiffrer les fichiers. Elle permet de récupérer les fichiers des utilisateurs s'ils oublient leur mot de passe.", diff --git a/apps/encryption/l10n/it.js b/apps/encryption/l10n/it.js index c0d42e17f74..9f94b409f57 100644 --- a/apps/encryption/l10n/it.js +++ b/apps/encryption/l10n/it.js @@ -1,17 +1,17 @@ OC.L10N.register( "encryption", { - "Missing recovery key password" : "Manca la password della chiave di recupero", - "Please repeat the recovery key password" : "Ripeti la password della chiave di recupero", - "Repeated recovery key password does not match the provided recovery key password" : "La password della chiave di recupero ripetuta non corrisponde alla password della chiave di recupero fornita", - "Recovery key successfully enabled" : "Chiave di recupero abilitata correttamente", + "Missing recovery key password" : "Manca la password della chiave di ripristino", + "Please repeat the recovery key password" : "Ripeti la password della chiave di ripristino", + "Repeated recovery key password does not match the provided recovery key password" : "La password della chiave di ripristino ripetuta non corrisponde alla password della chiave di ripristino fornita", + "Recovery key successfully enabled" : "Chiave di ripristino abilitata correttamente", "Could not enable recovery key. Please check your recovery key password!" : "Impossibile abilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", - "Recovery key successfully disabled" : "Chiave di recupero disabilitata correttamente", - "Could not disable recovery key. Please check your recovery key password!" : "Impossibile disabilitare la chiave di recupero. Verifica la password della chiave di recupero.", + "Recovery key successfully disabled" : "Chiave di ripristino disabilitata correttamente", + "Could not disable recovery key. Please check your recovery key password!" : "Impossibile disabilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", "Missing parameters" : "Parametri mancanti", - "Please provide the old recovery password" : "Fornisci la vecchia password di recupero", - "Please provide a new recovery password" : "Fornisci una nuova password di recupero", - "Please repeat the new recovery password" : "Ripeti la nuova password di recupero", + "Please provide the old recovery password" : "Fornisci la vecchia password di ripristino", + "Please provide a new recovery password" : "Fornisci una nuova password di ripristino", + "Please repeat the new recovery password" : "Ripeti la nuova password di ripristino", "Password successfully changed." : "Password modificata correttamente.", "Could not change the password. Maybe the old password was not correct." : "Impossibile cambiare la password. Forse la vecchia password non era corretta.", "Recovery Key disabled" : "Chiave di ripristino disabilitata", @@ -35,9 +35,9 @@ OC.L10N.register( "Enable recovery key" : "Abilita chiave di ripristino", "Disable recovery key" : "Disabilita chiave di ripristino", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La chiave di ripristino è una chiave di cifratura aggiuntiva utilizzata per cifrare i file. Consente di ripristinare i file di un utente se l'utente dimentica la propria password.", - "Recovery key password" : "Password della chiave di recupero", + "Recovery key password" : "Password della chiave di ripristino", "Repeat recovery key password" : "Ripeti la password della chiave di ripristino", - "Change recovery key password:" : "Cambia la password della chiave di recupero:", + "Change recovery key password:" : "Cambia la password della chiave di ripristino:", "Old recovery key password" : "Vecchia password della chiave di ripristino", "New recovery key password" : "Nuova password della chiave di ripristino", "Repeat new recovery key password" : "Ripeti la nuova password della chiave di ripristino", diff --git a/apps/encryption/l10n/it.json b/apps/encryption/l10n/it.json index ee3f487c54f..a117af8a317 100644 --- a/apps/encryption/l10n/it.json +++ b/apps/encryption/l10n/it.json @@ -1,15 +1,15 @@ { "translations": { - "Missing recovery key password" : "Manca la password della chiave di recupero", - "Please repeat the recovery key password" : "Ripeti la password della chiave di recupero", - "Repeated recovery key password does not match the provided recovery key password" : "La password della chiave di recupero ripetuta non corrisponde alla password della chiave di recupero fornita", - "Recovery key successfully enabled" : "Chiave di recupero abilitata correttamente", + "Missing recovery key password" : "Manca la password della chiave di ripristino", + "Please repeat the recovery key password" : "Ripeti la password della chiave di ripristino", + "Repeated recovery key password does not match the provided recovery key password" : "La password della chiave di ripristino ripetuta non corrisponde alla password della chiave di ripristino fornita", + "Recovery key successfully enabled" : "Chiave di ripristino abilitata correttamente", "Could not enable recovery key. Please check your recovery key password!" : "Impossibile abilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", - "Recovery key successfully disabled" : "Chiave di recupero disabilitata correttamente", - "Could not disable recovery key. Please check your recovery key password!" : "Impossibile disabilitare la chiave di recupero. Verifica la password della chiave di recupero.", + "Recovery key successfully disabled" : "Chiave di ripristino disabilitata correttamente", + "Could not disable recovery key. Please check your recovery key password!" : "Impossibile disabilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", "Missing parameters" : "Parametri mancanti", - "Please provide the old recovery password" : "Fornisci la vecchia password di recupero", - "Please provide a new recovery password" : "Fornisci una nuova password di recupero", - "Please repeat the new recovery password" : "Ripeti la nuova password di recupero", + "Please provide the old recovery password" : "Fornisci la vecchia password di ripristino", + "Please provide a new recovery password" : "Fornisci una nuova password di ripristino", + "Please repeat the new recovery password" : "Ripeti la nuova password di ripristino", "Password successfully changed." : "Password modificata correttamente.", "Could not change the password. Maybe the old password was not correct." : "Impossibile cambiare la password. Forse la vecchia password non era corretta.", "Recovery Key disabled" : "Chiave di ripristino disabilitata", @@ -33,9 +33,9 @@ "Enable recovery key" : "Abilita chiave di ripristino", "Disable recovery key" : "Disabilita chiave di ripristino", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La chiave di ripristino è una chiave di cifratura aggiuntiva utilizzata per cifrare i file. Consente di ripristinare i file di un utente se l'utente dimentica la propria password.", - "Recovery key password" : "Password della chiave di recupero", + "Recovery key password" : "Password della chiave di ripristino", "Repeat recovery key password" : "Ripeti la password della chiave di ripristino", - "Change recovery key password:" : "Cambia la password della chiave di recupero:", + "Change recovery key password:" : "Cambia la password della chiave di ripristino:", "Old recovery key password" : "Vecchia password della chiave di ripristino", "New recovery key password" : "Nuova password della chiave di ripristino", "Repeat new recovery key password" : "Ripeti la nuova password della chiave di ripristino", diff --git a/apps/encryption/l10n/ko.js b/apps/encryption/l10n/ko.js index 8bf099b6b36..50dd5857692 100644 --- a/apps/encryption/l10n/ko.js +++ b/apps/encryption/l10n/ko.js @@ -28,10 +28,10 @@ OC.L10N.register( "one-time password for server-side-encryption" : "서버 측 암호화용 일회용 암호", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 복호화할 수 없습니다. 공유된 파일일 수도 있습니다. 파일 소유자에게 공유를 다시 요청하십시오.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 읽을 수 없습니다. 공유된 파일이라면 파일 소유자에게 연락하여 다시 공유해 달라고 요청하십시오.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "안녕하세요,\n\n시스템 관리자가 서버 측 암호화를 활성화하였습니다. 저장된 파일이 암호 '%s'으(로) 암호화되었습니다.\n\n웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.\n\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "안녕하세요,\n\n시스템 관리자가 서버 측 암호화를 활성화했습니다. 저장된 파일이 암호 '%s'으(로) 암호화되었습니다.\n\n웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.\n\n", "The share will expire on %s." : "이 공유는 %s 까지 유지됩니다.", "Cheers!" : "감사합니다!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "안녕하세요,<br><br>시스템 관리자가 서버 측 암호화를 활성화하였습니다. 저장된 파일이 암호 <strong>%s</strong>으(로) 암호화되었습니다.<br><br>웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "안녕하세요,<br><br>시스템 관리자가 서버 측 암호화를 활성화했습니다. 저장된 파일이 암호 <strong>%s</strong>으(로) 암호화되었습니다.<br><br>웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.<br><br>", "Enable recovery key" : "복구 키 활성화", "Disable recovery key" : "복구 키 비활성화", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "복구 키는 파일을 암호화하는 추가 키입니다. 사용자가 암호를 잊었을 때 복구할 수 있도록 해 줍니다.", diff --git a/apps/encryption/l10n/ko.json b/apps/encryption/l10n/ko.json index a6843bdda45..88eab7837b8 100644 --- a/apps/encryption/l10n/ko.json +++ b/apps/encryption/l10n/ko.json @@ -26,10 +26,10 @@ "one-time password for server-side-encryption" : "서버 측 암호화용 일회용 암호", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 복호화할 수 없습니다. 공유된 파일일 수도 있습니다. 파일 소유자에게 공유를 다시 요청하십시오.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 읽을 수 없습니다. 공유된 파일이라면 파일 소유자에게 연락하여 다시 공유해 달라고 요청하십시오.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "안녕하세요,\n\n시스템 관리자가 서버 측 암호화를 활성화하였습니다. 저장된 파일이 암호 '%s'으(로) 암호화되었습니다.\n\n웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.\n\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "안녕하세요,\n\n시스템 관리자가 서버 측 암호화를 활성화했습니다. 저장된 파일이 암호 '%s'으(로) 암호화되었습니다.\n\n웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.\n\n", "The share will expire on %s." : "이 공유는 %s 까지 유지됩니다.", "Cheers!" : "감사합니다!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "안녕하세요,<br><br>시스템 관리자가 서버 측 암호화를 활성화하였습니다. 저장된 파일이 암호 <strong>%s</strong>으(로) 암호화되었습니다.<br><br>웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "안녕하세요,<br><br>시스템 관리자가 서버 측 암호화를 활성화했습니다. 저장된 파일이 암호 <strong>%s</strong>으(로) 암호화되었습니다.<br><br>웹 인터페이스에 로그인하여 개인 설정의 'ownCloud 기본 암호화 모듈'로 이동한 다음, '이전 로그인 암호' 필드에 위 암호를 입력하고 현재 로그인 암호로 변경하여 암호화 암호를 업데이트하십시오.<br><br>", "Enable recovery key" : "복구 키 활성화", "Disable recovery key" : "복구 키 비활성화", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "복구 키는 파일을 암호화하는 추가 키입니다. 사용자가 암호를 잊었을 때 복구할 수 있도록 해 줍니다.", diff --git a/apps/encryption/l10n/ru.js b/apps/encryption/l10n/ru.js index 2b64fa66ed9..b326b71456d 100644 --- a/apps/encryption/l10n/ru.js +++ b/apps/encryption/l10n/ru.js @@ -25,10 +25,13 @@ OC.L10N.register( "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите заново", "Encryption App is enabled and ready" : "Приложение шифрования включено и готово", + "one-time password for server-side-encryption" : "одноразовый пароль для шифрования на стороне сервера", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удалось расшифровать файл, возможно это опубликованный файл. Попросите владельца файла повторно открыть к нему доступ.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удается прочитать файл, возможно это публичный файл. Пожалуйста попросите владельца открыть доступ снова.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Привет,\n\nадминистратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы с помощью пароля '%s'.\n\nПожалуйста войдите в веб-приложение, в разделе 'ownCloud простой модуль шифрования' в личных настройках вам нужно обновить пароль шифрования.\n\n", "The share will expire on %s." : "Доступ будет закрыт %s", "Cheers!" : "Всего наилучшего!", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Привет,<br><br>администратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы с помощью пароля <strong>%s</strong>.<br><br>Пожалуйста войдите в веб-приложение, в разделе \"ownCloud простой модуль шифрования\" в личных настройках вам нужно обновить пароль шифрования.<br><br>", "Enable recovery key" : "Включить ключ восстановления", "Disable recovery key" : "Отключить ключ восстановления", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Ключ восстановления это дополнительный ключ, который используется для шифрования файлов. Он позволяет восстановить пользовательские файлы в случае утери пароля.", diff --git a/apps/encryption/l10n/ru.json b/apps/encryption/l10n/ru.json index 229d4e32dee..f4a14cb841f 100644 --- a/apps/encryption/l10n/ru.json +++ b/apps/encryption/l10n/ru.json @@ -23,10 +23,13 @@ "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите заново", "Encryption App is enabled and ready" : "Приложение шифрования включено и готово", + "one-time password for server-side-encryption" : "одноразовый пароль для шифрования на стороне сервера", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удалось расшифровать файл, возможно это опубликованный файл. Попросите владельца файла повторно открыть к нему доступ.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удается прочитать файл, возможно это публичный файл. Пожалуйста попросите владельца открыть доступ снова.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Привет,\n\nадминистратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы с помощью пароля '%s'.\n\nПожалуйста войдите в веб-приложение, в разделе 'ownCloud простой модуль шифрования' в личных настройках вам нужно обновить пароль шифрования.\n\n", "The share will expire on %s." : "Доступ будет закрыт %s", "Cheers!" : "Всего наилучшего!", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Привет,<br><br>администратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы с помощью пароля <strong>%s</strong>.<br><br>Пожалуйста войдите в веб-приложение, в разделе \"ownCloud простой модуль шифрования\" в личных настройках вам нужно обновить пароль шифрования.<br><br>", "Enable recovery key" : "Включить ключ восстановления", "Disable recovery key" : "Отключить ключ восстановления", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Ключ восстановления это дополнительный ключ, который используется для шифрования файлов. Он позволяет восстановить пользовательские файлы в случае утери пароля.", diff --git a/apps/encryption/l10n/sq.js b/apps/encryption/l10n/sq.js index 9a9230e86fb..d18e8bcbbfd 100644 --- a/apps/encryption/l10n/sq.js +++ b/apps/encryption/l10n/sq.js @@ -1,9 +1,57 @@ OC.L10N.register( "encryption", { - "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Çelësi privat për Aplikacionin e Shifrimit është i pavlefshëm. Ju lutem përditësoni fjalëkalimin e çelësit tuaj privat në parametrat tuaj për të rimarrë qasje në skedarët tuaj të shifruar.", - "The share will expire on %s." : "Ndarja do të skadojë në %s.", - "Cheers!" : "Gjithë të mirat", - "Enabled" : "Aktivizuar" + "Missing recovery key password" : "Mungon fjalëkalim kyçi rimarrjesh", + "Please repeat the recovery key password" : "Ju lutemi, rijepni fjalëkalimin për kyç rimarrjesh", + "Repeated recovery key password does not match the provided recovery key password" : "Fjalëkalimi i ridhënë për kyç rimarrjesh s’përputhet me fjalëkalimin e dhënë për kyç rimarrjesh", + "Recovery key successfully enabled" : "Kyçi i rimarrjeve u aktivizua me sukses", + "Could not enable recovery key. Please check your recovery key password!" : "S’u aktivizua dot kyçi i rimarrjeve. Ju lutemi, kontrolloni fjalëkalimin për kyç rimarrjesh!", + "Recovery key successfully disabled" : "Kyçi i rimarrjeve u çaktivizua me sukses", + "Could not disable recovery key. Please check your recovery key password!" : "S’u çaktivizua dot kyçi i rimarrjeve. Ju lutemi, kontrolloni fjalëkalimin për kyç rimarrjesh!", + "Missing parameters" : "Mungojnë parametra", + "Please provide the old recovery password" : "Ju lutemi, jepni fjalëkalimin e vjetër të rimarrjes", + "Please provide a new recovery password" : "Ju lutemi, jepni fjalëkalimin e ri të rimarrjes", + "Please repeat the new recovery password" : "Ju lutemi, rijepni fjalëkalimin e ri të rimarrjes", + "Password successfully changed." : "Fjalëkalimi u ndryshua me sukses.", + "Could not change the password. Maybe the old password was not correct." : "Fjalëkalimi s’u ndryshua dot. Ndoshta fjalëkalimi i vjetër s’qe i saktë.", + "Recovery Key disabled" : "Kyçi i Rimarrjeve u çaktivizua", + "Recovery Key enabled" : "Kyçi i Rimarrjeve u aktivizua", + "Could not enable the recovery key, please try again or contact your administrator" : "S’u aktivizua dot kyçi i rimarrjeve. ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj", + "Could not update the private key password." : "Fjalëkalimi për kyçin privat s’u përditësua dot.", + "The old password was not correct, please try again." : "Fjalëkalimi i vjetër s’qe i saktë, ju lutemi, riprovoni.", + "The current log-in password was not correct, please try again." : "Fjalëkalimi i tanishëm i hyrjeve s’qe i saktë, ju lutemi, riprovoni.", + "Private key password successfully updated." : "Fjalëkalimi për kyçin privat u përditësua me sukses.", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Lypset të kaloni kyçet tuaj të fshehtëzimeve nga versioni i vjetër i fshehtëzimeve (ownCloud <= 8.0) te i riu. Ju lutemi, ekzekutoni run 'occ encryption:migrate' ose lidhuni me përgjegjësin tuaj", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Kyç privat i pavlefshëm për aplikacionin e fshehtëzimeve. Ju lutemi, përditësoni fjalëkalimin tuaj të kyçit privat te rregullimet tuaja personale që të rimerrni hyrje te kartelat tuaja të fshehtëzuara.", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacioni i fshehtëzimeve është i aktivizuar, por kyçet tuaj s’janë vënë në punë, ju lutemi, dilni dhe ribëni hyrjen", + "Encryption App is enabled and ready" : "Aplikacioni i Fshehtëzimeve u aktivizua dhe është gati", + "one-time password for server-side-encryption" : "fjalëkalim vetëm për një herë, për fshehtëzim-më-anë-shërbyesi", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nuk shfshehtëzohet dot kjo kartelë, ndoshta është kartelë e ndarë me të tjerët. Ju lutemi, kërkojini të zotit të kartelës ta rindajë kartelën me ju.", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "S’lexohet dot kjo kartelë, ndoshta është kartelë e ndarë me të tjerët. Ju lutemi, kërkojini të zotit të kartelës ta rindajë kartelën me ju.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Njatjeta,\n\npërgjegjësi aktivizoi fshehtëzim më anë shërbyesi. Kartelat tuaja qenë fshehtëzuar duke përdorur fjalëkalimin '%s'.\n\nJu lutemi, bëni hyrjen te ndërfaqja web, kaloni te ndarja 'modul i thjeshtë ownCloud për fshehtëzime' e rregullimeve tuaja personale dhe përditësoni fjalëkalimin tuaj për fshehtëzime duke dhënë këtë fjalëkalim te fusha 'old log-in password' dhe fjalëkalimin tuaj të tanishëm për hyrjet.\n\n", + "The share will expire on %s." : "Ndarja do të skadojë më %s.", + "Cheers!" : "Gëzuar!", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Njatjeta,<br><br>përgjegjësi aktivizoi fshehtëzim më anë shërbyesi. Kartelat tuaja qenë fshehtëzuar duke përdorur fjalëkalimin <strong>%s</strong>.<br><br>Ju lutemi, bëni hyrjen te ndërfaqja web, kaloni te ndarja \"modul i thjeshtë ownCloud për fshehtëzime\" e rregullimeve tuaja personale dhe përditësoni fjalëkalimin tuaj për fshehtëzime duke dhënë këtë fjalëkalim te fusha \"old log-in password\" dhe fjalëkalimin tuaj të tanishëm për hyrjet.<br><br>", + "Enable recovery key" : "Aktivizo kyç rimarrjesh", + "Disable recovery key" : "Çaktivizo kyç rimarrjesh", + "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kyçi i rimarrjeve është një kyç ekstra fshehtëzimesh që përdoret për të fshehtëzuar kartela. Ai lejon rimarrjen e një kartele të përdoruesit, nëse përdoruesi harron fjalëkalimin e vet.", + "Recovery key password" : "Fjalëkalim kyçi rimarrjesh", + "Repeat recovery key password" : "Rijepni fjalëkalim kyçi rimarrjesh", + "Change recovery key password:" : "Ndryshoni fjalëkalim kyçi rimarrjesh:", + "Old recovery key password" : "Fjalëkalimi i vjetër kyçi rimarrjesh", + "New recovery key password" : "Fjalëkalimi i ri kyçi rimarrjesh", + "Repeat new recovery key password" : "Rijepni fjalëkalimin e ri kyçi rimarrjesh", + "Change Password" : "Ndryshoni Fjalëkalimin", + "ownCloud basic encryption module" : "modul i thjeshtë ownCloud fshehtëzimesh", + "Your private key password no longer matches your log-in password." : "Fjalëkalimi juaj për kyçe privatë s’përputhet më me fjalëkalimin për hyrjet.", + "Set your old private key password to your current log-in password:" : "Fjalëkalimit të vjetër të kyçit privat jepini vlerën e fjalëkalimit tuaj të tanishëm për hyrjet:", + " If you don't remember your old password you can ask your administrator to recover your files." : " Nëse s’e mbani mend fjalëkalimin tuaj të vjetër, mund t’i kërkoni përgjegjësit tuaj të rimarrë kartelat tuaja.", + "Old log-in password" : "Fjalëkalimi i vjetër për hyrjet", + "Current log-in password" : "Fjalëkalimi i tanishëm për hyrjet", + "Update Private Key Password" : "Përditësoni Fjalëkalim Kyçi Privat", + "Enable password recovery:" : "Aktivizo rimarrje fjalëkalimesh:", + "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aktivizimi i kësaj mundësie do t’ju lejojë të rifitoni hyrje te kartelat tuaja të fshehtëzuara në rast humbjeje fjalëkalimi", + "Enabled" : "E aktivizuar", + "Disabled" : "E çaktivizuar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/encryption/l10n/sq.json b/apps/encryption/l10n/sq.json index 87481aa3349..7415195f955 100644 --- a/apps/encryption/l10n/sq.json +++ b/apps/encryption/l10n/sq.json @@ -1,7 +1,55 @@ { "translations": { - "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Çelësi privat për Aplikacionin e Shifrimit është i pavlefshëm. Ju lutem përditësoni fjalëkalimin e çelësit tuaj privat në parametrat tuaj për të rimarrë qasje në skedarët tuaj të shifruar.", - "The share will expire on %s." : "Ndarja do të skadojë në %s.", - "Cheers!" : "Gjithë të mirat", - "Enabled" : "Aktivizuar" + "Missing recovery key password" : "Mungon fjalëkalim kyçi rimarrjesh", + "Please repeat the recovery key password" : "Ju lutemi, rijepni fjalëkalimin për kyç rimarrjesh", + "Repeated recovery key password does not match the provided recovery key password" : "Fjalëkalimi i ridhënë për kyç rimarrjesh s’përputhet me fjalëkalimin e dhënë për kyç rimarrjesh", + "Recovery key successfully enabled" : "Kyçi i rimarrjeve u aktivizua me sukses", + "Could not enable recovery key. Please check your recovery key password!" : "S’u aktivizua dot kyçi i rimarrjeve. Ju lutemi, kontrolloni fjalëkalimin për kyç rimarrjesh!", + "Recovery key successfully disabled" : "Kyçi i rimarrjeve u çaktivizua me sukses", + "Could not disable recovery key. Please check your recovery key password!" : "S’u çaktivizua dot kyçi i rimarrjeve. Ju lutemi, kontrolloni fjalëkalimin për kyç rimarrjesh!", + "Missing parameters" : "Mungojnë parametra", + "Please provide the old recovery password" : "Ju lutemi, jepni fjalëkalimin e vjetër të rimarrjes", + "Please provide a new recovery password" : "Ju lutemi, jepni fjalëkalimin e ri të rimarrjes", + "Please repeat the new recovery password" : "Ju lutemi, rijepni fjalëkalimin e ri të rimarrjes", + "Password successfully changed." : "Fjalëkalimi u ndryshua me sukses.", + "Could not change the password. Maybe the old password was not correct." : "Fjalëkalimi s’u ndryshua dot. Ndoshta fjalëkalimi i vjetër s’qe i saktë.", + "Recovery Key disabled" : "Kyçi i Rimarrjeve u çaktivizua", + "Recovery Key enabled" : "Kyçi i Rimarrjeve u aktivizua", + "Could not enable the recovery key, please try again or contact your administrator" : "S’u aktivizua dot kyçi i rimarrjeve. ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj", + "Could not update the private key password." : "Fjalëkalimi për kyçin privat s’u përditësua dot.", + "The old password was not correct, please try again." : "Fjalëkalimi i vjetër s’qe i saktë, ju lutemi, riprovoni.", + "The current log-in password was not correct, please try again." : "Fjalëkalimi i tanishëm i hyrjeve s’qe i saktë, ju lutemi, riprovoni.", + "Private key password successfully updated." : "Fjalëkalimi për kyçin privat u përditësua me sukses.", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Lypset të kaloni kyçet tuaj të fshehtëzimeve nga versioni i vjetër i fshehtëzimeve (ownCloud <= 8.0) te i riu. Ju lutemi, ekzekutoni run 'occ encryption:migrate' ose lidhuni me përgjegjësin tuaj", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Kyç privat i pavlefshëm për aplikacionin e fshehtëzimeve. Ju lutemi, përditësoni fjalëkalimin tuaj të kyçit privat te rregullimet tuaja personale që të rimerrni hyrje te kartelat tuaja të fshehtëzuara.", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacioni i fshehtëzimeve është i aktivizuar, por kyçet tuaj s’janë vënë në punë, ju lutemi, dilni dhe ribëni hyrjen", + "Encryption App is enabled and ready" : "Aplikacioni i Fshehtëzimeve u aktivizua dhe është gati", + "one-time password for server-side-encryption" : "fjalëkalim vetëm për një herë, për fshehtëzim-më-anë-shërbyesi", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nuk shfshehtëzohet dot kjo kartelë, ndoshta është kartelë e ndarë me të tjerët. Ju lutemi, kërkojini të zotit të kartelës ta rindajë kartelën me ju.", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "S’lexohet dot kjo kartelë, ndoshta është kartelë e ndarë me të tjerët. Ju lutemi, kërkojini të zotit të kartelës ta rindajë kartelën me ju.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Njatjeta,\n\npërgjegjësi aktivizoi fshehtëzim më anë shërbyesi. Kartelat tuaja qenë fshehtëzuar duke përdorur fjalëkalimin '%s'.\n\nJu lutemi, bëni hyrjen te ndërfaqja web, kaloni te ndarja 'modul i thjeshtë ownCloud për fshehtëzime' e rregullimeve tuaja personale dhe përditësoni fjalëkalimin tuaj për fshehtëzime duke dhënë këtë fjalëkalim te fusha 'old log-in password' dhe fjalëkalimin tuaj të tanishëm për hyrjet.\n\n", + "The share will expire on %s." : "Ndarja do të skadojë më %s.", + "Cheers!" : "Gëzuar!", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Njatjeta,<br><br>përgjegjësi aktivizoi fshehtëzim më anë shërbyesi. Kartelat tuaja qenë fshehtëzuar duke përdorur fjalëkalimin <strong>%s</strong>.<br><br>Ju lutemi, bëni hyrjen te ndërfaqja web, kaloni te ndarja \"modul i thjeshtë ownCloud për fshehtëzime\" e rregullimeve tuaja personale dhe përditësoni fjalëkalimin tuaj për fshehtëzime duke dhënë këtë fjalëkalim te fusha \"old log-in password\" dhe fjalëkalimin tuaj të tanishëm për hyrjet.<br><br>", + "Enable recovery key" : "Aktivizo kyç rimarrjesh", + "Disable recovery key" : "Çaktivizo kyç rimarrjesh", + "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kyçi i rimarrjeve është një kyç ekstra fshehtëzimesh që përdoret për të fshehtëzuar kartela. Ai lejon rimarrjen e një kartele të përdoruesit, nëse përdoruesi harron fjalëkalimin e vet.", + "Recovery key password" : "Fjalëkalim kyçi rimarrjesh", + "Repeat recovery key password" : "Rijepni fjalëkalim kyçi rimarrjesh", + "Change recovery key password:" : "Ndryshoni fjalëkalim kyçi rimarrjesh:", + "Old recovery key password" : "Fjalëkalimi i vjetër kyçi rimarrjesh", + "New recovery key password" : "Fjalëkalimi i ri kyçi rimarrjesh", + "Repeat new recovery key password" : "Rijepni fjalëkalimin e ri kyçi rimarrjesh", + "Change Password" : "Ndryshoni Fjalëkalimin", + "ownCloud basic encryption module" : "modul i thjeshtë ownCloud fshehtëzimesh", + "Your private key password no longer matches your log-in password." : "Fjalëkalimi juaj për kyçe privatë s’përputhet më me fjalëkalimin për hyrjet.", + "Set your old private key password to your current log-in password:" : "Fjalëkalimit të vjetër të kyçit privat jepini vlerën e fjalëkalimit tuaj të tanishëm për hyrjet:", + " If you don't remember your old password you can ask your administrator to recover your files." : " Nëse s’e mbani mend fjalëkalimin tuaj të vjetër, mund t’i kërkoni përgjegjësit tuaj të rimarrë kartelat tuaja.", + "Old log-in password" : "Fjalëkalimi i vjetër për hyrjet", + "Current log-in password" : "Fjalëkalimi i tanishëm për hyrjet", + "Update Private Key Password" : "Përditësoni Fjalëkalim Kyçi Privat", + "Enable password recovery:" : "Aktivizo rimarrje fjalëkalimesh:", + "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aktivizimi i kësaj mundësie do t’ju lejojë të rifitoni hyrje te kartelat tuaja të fshehtëzuara në rast humbjeje fjalëkalimi", + "Enabled" : "E aktivizuar", + "Disabled" : "E çaktivizuar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/encryption/l10n/tr.js b/apps/encryption/l10n/tr.js index 96db8f91209..e1fcb526d06 100644 --- a/apps/encryption/l10n/tr.js +++ b/apps/encryption/l10n/tr.js @@ -28,10 +28,10 @@ OC.L10N.register( "one-time password for server-side-encryption" : "sunucu tarafında şifleme için tek kullanımlık parola", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan şifrelemesi kaldırılamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan okunamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Selam,\n\nsistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız '%s' parolası kullanılarak şifrelendi.\n\nLütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girerek şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.\n\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Selam,\n\nSistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız '%s' parolası kullanılarak şifrelendi.\n\nLütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.\n\n", "The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.", "Cheers!" : "Hoşçakalın!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girerek şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.<br><br>", "Enable recovery key" : "Kurtarma anahtarını etkinleştir", "Disable recovery key" : "Kurtarma anahtarını devre dışı bırak", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kurtarma anahtarı, dosyaların şifrelenmesi için daha fazla \nşifreleme sunar. Bu kullanıcının dosyasının şifresini unuttuğunda kurtarmasına imkan verir.", diff --git a/apps/encryption/l10n/tr.json b/apps/encryption/l10n/tr.json index be6f6a5dfdd..743d3e7d15c 100644 --- a/apps/encryption/l10n/tr.json +++ b/apps/encryption/l10n/tr.json @@ -26,10 +26,10 @@ "one-time password for server-side-encryption" : "sunucu tarafında şifleme için tek kullanımlık parola", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan şifrelemesi kaldırılamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan okunamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Selam,\n\nsistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız '%s' parolası kullanılarak şifrelendi.\n\nLütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girerek şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.\n\n", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Selam,\n\nSistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız '%s' parolası kullanılarak şifrelendi.\n\nLütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.\n\n", "The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.", "Cheers!" : "Hoşçakalın!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girerek şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.<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 \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Selam,<br><br>Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız <strong>%s</strong> parolası kullanılarak şifrelendi.<br><br>Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.<br><br>", "Enable recovery key" : "Kurtarma anahtarını etkinleştir", "Disable recovery key" : "Kurtarma anahtarını devre dışı bırak", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kurtarma anahtarı, dosyaların şifrelenmesi için daha fazla \nşifreleme sunar. Bu kullanıcının dosyasının şifresini unuttuğunda kurtarmasına imkan verir.", diff --git a/apps/encryption/l10n/uk.js b/apps/encryption/l10n/uk.js index 553478a7f4c..aa1821729ef 100644 --- a/apps/encryption/l10n/uk.js +++ b/apps/encryption/l10n/uk.js @@ -24,6 +24,7 @@ OC.L10N.register( "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невірний закритий ключ для доданку шифрування. Оновіть пароль до вашого закритого ключа в особистих налаштуваннях.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову", "Encryption App is enabled and ready" : "Додаток кодування дозволений і готовий", + "one-time password for server-side-encryption" : "одноразовий пароль для шифрування на сервері", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.", "The share will expire on %s." : "Спільний доступ закінчиться %s.", "Cheers!" : "Будьмо!", diff --git a/apps/encryption/l10n/uk.json b/apps/encryption/l10n/uk.json index e474e25cea4..cf54cadc708 100644 --- a/apps/encryption/l10n/uk.json +++ b/apps/encryption/l10n/uk.json @@ -22,6 +22,7 @@ "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невірний закритий ключ для доданку шифрування. Оновіть пароль до вашого закритого ключа в особистих налаштуваннях.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову", "Encryption App is enabled and ready" : "Додаток кодування дозволений і готовий", + "one-time password for server-side-encryption" : "одноразовий пароль для шифрування на сервері", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.", "The share will expire on %s." : "Спільний доступ закінчиться %s.", "Cheers!" : "Будьмо!", diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php index 5d1bb92460a..c55fb00f838 100644 --- a/apps/encryption/lib/crypto/crypt.php +++ b/apps/encryption/lib/crypto/crypt.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/encryption/lib/crypto/decryptall.php b/apps/encryption/lib/crypto/decryptall.php index 599cd82aa4d..1daf3699d13 100644 --- a/apps/encryption/lib/crypto/decryptall.php +++ b/apps/encryption/lib/crypto/decryptall.php @@ -84,13 +84,16 @@ class DecryptAll { $recoveryKeyId = $this->keyManager->getRecoveryKeyId(); if (!empty($user)) { + $output->writeln('You can only decrypt the users files if you know'); + $output->writeln('the users password or if he activated the recovery key.'); + $output->writeln(''); $questionUseLoginPassword = new ConfirmationQuestion( 'Do you want to use the users login password to decrypt all files? (y/n) ', false ); $useLoginPassword = $this->questionHelper->ask($input, $output, $questionUseLoginPassword); if ($useLoginPassword) { - $question = new Question('Please enter the users login password: '); + $question = new Question('Please enter the user\'s login password: '); } else if ($this->util->isRecoveryEnabledForUser($user) === false) { $output->writeln('No recovery key available for user ' . $user); return false; @@ -98,6 +101,9 @@ class DecryptAll { $user = $recoveryKeyId; } } else { + $output->writeln('You can only decrypt the files of all users if the'); + $output->writeln('recovery key is enabled by the admin and activated by the users.'); + $output->writeln(''); $user = $recoveryKeyId; } diff --git a/apps/encryption/lib/crypto/encryptall.php b/apps/encryption/lib/crypto/encryptall.php index a0c69c13fdd..8e97fe341b4 100644 --- a/apps/encryption/lib/crypto/encryptall.php +++ b/apps/encryption/lib/crypto/encryptall.php @@ -280,6 +280,12 @@ class EncryptAll { $newPasswords[] = [$uid, $password]; } } + + if (empty($newPasswords)) { + $this->output->writeln("\nAll users already had a key-pair, no further action needed.\n"); + return; + } + $table->setRows($newPasswords); $table->render(); diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php index fde4a2c4a9c..1a05277e20d 100644 --- a/apps/encryption/lib/crypto/encryption.php +++ b/apps/encryption/lib/crypto/encryption.php @@ -5,7 +5,6 @@ * @author Jan-Christoph Borchardt <hey@jancborchardt.net> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/encryption/lib/hookmanager.php b/apps/encryption/lib/hookmanager.php index 0fea1b0f9f2..ab059369333 100644 --- a/apps/encryption/lib/hookmanager.php +++ b/apps/encryption/lib/hookmanager.php @@ -2,9 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/lib/migration.php b/apps/encryption/lib/migration.php index 5396a7db627..1a7c2e9877d 100644 --- a/apps/encryption/lib/migration.php +++ b/apps/encryption/lib/migration.php @@ -1,7 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/lib/recovery.php b/apps/encryption/lib/recovery.php index b22e3265628..e7b20e2c4af 100644 --- a/apps/encryption/lib/recovery.php +++ b/apps/encryption/lib/recovery.php @@ -2,8 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/lib/session.php b/apps/encryption/lib/session.php index 1d0c3711487..2c83319d71e 100644 --- a/apps/encryption/lib/session.php +++ b/apps/encryption/lib/session.php @@ -3,8 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/lib/users/setup.php b/apps/encryption/lib/users/setup.php index d4f7c374547..99368cab080 100644 --- a/apps/encryption/lib/users/setup.php +++ b/apps/encryption/lib/users/setup.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/encryption/lib/util.php b/apps/encryption/lib/util.php index e9f916eff38..a162dcde305 100644 --- a/apps/encryption/lib/util.php +++ b/apps/encryption/lib/util.php @@ -2,8 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/controller/RecoveryControllerTest.php b/apps/encryption/tests/controller/RecoveryControllerTest.php index d122b992ef0..6c554c97ae9 100644 --- a/apps/encryption/tests/controller/RecoveryControllerTest.php +++ b/apps/encryption/tests/controller/RecoveryControllerTest.php @@ -1,7 +1,6 @@ <?php /** * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/controller/SettingsControllerTest.php b/apps/encryption/tests/controller/SettingsControllerTest.php index 34aa5a27a75..724a01522af 100644 --- a/apps/encryption/tests/controller/SettingsControllerTest.php +++ b/apps/encryption/tests/controller/SettingsControllerTest.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/hooks/UserHooksTest.php b/apps/encryption/tests/hooks/UserHooksTest.php index 0b0222ce861..ada0081f649 100644 --- a/apps/encryption/tests/hooks/UserHooksTest.php +++ b/apps/encryption/tests/hooks/UserHooksTest.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/lib/HookManagerTest.php b/apps/encryption/tests/lib/HookManagerTest.php index b1d511cb89b..288b27b5d8b 100644 --- a/apps/encryption/tests/lib/HookManagerTest.php +++ b/apps/encryption/tests/lib/HookManagerTest.php @@ -2,8 +2,6 @@ /** * @author Clark Tomlinson <fallen013@gmail.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/lib/KeyManagerTest.php b/apps/encryption/tests/lib/KeyManagerTest.php index 8f1da623efb..35ae8ad6ca0 100644 --- a/apps/encryption/tests/lib/KeyManagerTest.php +++ b/apps/encryption/tests/lib/KeyManagerTest.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/encryption/tests/lib/MigrationTest.php b/apps/encryption/tests/lib/MigrationTest.php index bb1f0a310a2..be37020660c 100644 --- a/apps/encryption/tests/lib/MigrationTest.php +++ b/apps/encryption/tests/lib/MigrationTest.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -63,6 +62,8 @@ class MigrationTest extends \Test\TestCase { } protected function createDummyShareKeys($uid) { + $this->loginAsUser($uid); + $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/folder3/file3'); $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/file2'); $this->view->mkdir($uid . '/files_encryption/keys/folder1/file.1'); @@ -88,6 +89,8 @@ class MigrationTest extends \Test\TestCase { } protected function createDummyUserKeys($uid) { + $this->loginAsUser($uid); + $this->view->mkdir($uid . '/files_encryption/'); $this->view->mkdir('/files_encryption/public_keys'); $this->view->file_put_contents($uid . '/files_encryption/' . $uid . '.privateKey', 'privateKey'); @@ -95,6 +98,8 @@ class MigrationTest extends \Test\TestCase { } protected function createDummyFileKeys($uid) { + $this->loginAsUser($uid); + $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/folder3/file3'); $this->view->mkdir($uid . '/files_encryption/keys/folder1/folder2/file2'); $this->view->mkdir($uid . '/files_encryption/keys/folder1/file.1'); @@ -106,6 +111,8 @@ class MigrationTest extends \Test\TestCase { } protected function createDummyFiles($uid) { + $this->loginAsUser($uid); + $this->view->mkdir($uid . '/files/folder1/folder2/folder3/file3'); $this->view->mkdir($uid . '/files/folder1/folder2/file2'); $this->view->mkdir($uid . '/files/folder1/file.1'); @@ -117,6 +124,8 @@ class MigrationTest extends \Test\TestCase { } protected function createDummyFilesInTrash($uid) { + $this->loginAsUser($uid); + $this->view->mkdir($uid . '/files_trashbin/keys/file1.d5457864'); $this->view->mkdir($uid . '/files_trashbin/keys/folder1.d7437648723/file2'); $this->view->file_put_contents($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); @@ -166,6 +175,7 @@ class MigrationTest extends \Test\TestCase { $this->createDummySystemWideKeys(); + /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Encryption\Migration $m */ $m = $this->getMockBuilder('OCA\Encryption\Migration') ->setConstructorArgs( [ @@ -177,27 +187,38 @@ class MigrationTest extends \Test\TestCase { )->setMethods(['getSystemMountPoints'])->getMock(); $m->expects($this->any())->method('getSystemMountPoints') - ->willReturn([['mountpoint' => 'folder1'], ['mountpoint' => 'folder2']]); + ->will($this->returnValue([['mountpoint' => 'folder1'], ['mountpoint' => 'folder2']])); $m->reorganizeFolderStructure(); // even if it runs twice folder should always move only once $m->reorganizeFolderStructure(); + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->assertTrue( $this->view->file_exists( self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey') ); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->assertTrue( $this->view->file_exists( self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey') ); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER3); + $this->assertTrue( $this->view->file_exists( self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey') ); + + $this->loginAsUser(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->assertTrue( $this->view->file_exists( '/files_encryption/' . $this->moduleId . '/systemwide_1.publicKey') @@ -218,6 +239,8 @@ class MigrationTest extends \Test\TestCase { } protected function verifyFilesInTrash($uid) { + $this->loginAsUser($uid); + // share keys $this->assertTrue( $this->view->file_exists($uid . '/files_encryption/keys/files_trashbin/file1.d5457864/' . $this->moduleId . '/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey') @@ -245,6 +268,7 @@ class MigrationTest extends \Test\TestCase { protected function verifyNewKeyPath($uid) { // private key if ($uid !== '') { + $this->loginAsUser($uid); $this->assertTrue($this->view->file_exists($uid . '/files_encryption/' . $this->moduleId . '/'. $uid . '.privateKey')); } // file keys diff --git a/apps/encryption/tests/lib/RecoveryTest.php b/apps/encryption/tests/lib/RecoveryTest.php index c0624a36be9..0cdd76d6b44 100644 --- a/apps/encryption/tests/lib/RecoveryTest.php +++ b/apps/encryption/tests/lib/RecoveryTest.php @@ -3,8 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/lib/SessionTest.php b/apps/encryption/tests/lib/SessionTest.php index 0fa48666d70..1cc0d89a93d 100644 --- a/apps/encryption/tests/lib/SessionTest.php +++ b/apps/encryption/tests/lib/SessionTest.php @@ -1,5 +1,6 @@ <?php /** + * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * diff --git a/apps/encryption/tests/lib/UtilTest.php b/apps/encryption/tests/lib/UtilTest.php index 9988ff93f43..723cc9fb910 100644 --- a/apps/encryption/tests/lib/UtilTest.php +++ b/apps/encryption/tests/lib/UtilTest.php @@ -2,8 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/lib/crypto/cryptTest.php b/apps/encryption/tests/lib/crypto/cryptTest.php index c6f16e952d7..cad34761840 100644 --- a/apps/encryption/tests/lib/crypto/cryptTest.php +++ b/apps/encryption/tests/lib/crypto/cryptTest.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/lib/crypto/encryptionTest.php b/apps/encryption/tests/lib/crypto/encryptionTest.php index 9e0cb2f09d1..f76bdfb6d61 100644 --- a/apps/encryption/tests/lib/crypto/encryptionTest.php +++ b/apps/encryption/tests/lib/crypto/encryptionTest.php @@ -2,8 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/encryption/tests/lib/users/SetupTest.php b/apps/encryption/tests/lib/users/SetupTest.php index bca3ff58b07..022bf5dc466 100644 --- a/apps/encryption/tests/lib/users/SetupTest.php +++ b/apps/encryption/tests/lib/users/SetupTest.php @@ -1,8 +1,7 @@ <?php /** + * @author Björn Schießle <schiessle@owncloud.com> * @author Clark Tomlinson <fallen013@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files/admin.php b/apps/files/admin.php index 349c27ff742..786a8edf2a6 100644 --- a/apps/files/admin.php +++ b/apps/files/admin.php @@ -7,6 +7,7 @@ * @author Michael Göhler <somebody.here@gmx.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php index 19129e9de11..6cfa04b49d6 100644 --- a/apps/files/ajax/list.php +++ b/apps/files/ajax/list.php @@ -1,6 +1,5 @@ <?php /** - * @author Jakob Sack <mail@jakobsack.de> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php index 7d47a538fa1..491adaa9b88 100644 --- a/apps/files/ajax/scan.php +++ b/apps/files/ajax/scan.php @@ -4,6 +4,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 7ff02d8db8e..a784642728f 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -5,6 +5,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Florian Pritz <bluewind@xinu.at> * @author Frank Karlitschek <frank@owncloud.org> + * @author Individual IT Services <info@individual-it.net> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index 8586c6794f2..ba8bb62494e 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -5,17 +5,16 @@ <description>File Management</description> <licence>AGPL</licence> <author>Robin Appelman, Vincent Petry</author> - <requiremin>4.93</requiremin> <shipped>true</shipped> <standalone/> <default_enable/> + <version>1.3.0</version> <types> <filesystem/> </types> - <remote> - <files>appinfo/remote.php</files> - <webdav>appinfo/remote.php</webdav> - </remote> + <dependencies> + <owncloud min-version="9.0" /> + </dependencies> <documentation> <user>user-files</user> </documentation> diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index d1b8954d5ce..41aeec6a152 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -2,7 +2,6 @@ /** * @author Bart Visscher <bartv@thisnet.nl> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Tobias Kaminsky <tobias@kaminsky.me> * @author Tom Needham <tom@owncloud.com> diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php index ff1369bb1a5..6084435fa5a 100644 --- a/apps/files/appinfo/update.php +++ b/apps/files/appinfo/update.php @@ -2,6 +2,7 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files/appinfo/version b/apps/files/appinfo/version deleted file mode 100644 index 9ee1f786d50..00000000000 --- a/apps/files/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.1.11 diff --git a/apps/files/controller/apicontroller.php b/apps/files/controller/apicontroller.php index 494d97db7a6..ea5ee81a9f6 100644 --- a/apps/files/controller/apicontroller.php +++ b/apps/files/controller/apicontroller.php @@ -4,6 +4,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Roeland Jago Douma <roeland@famdouma.nl> + * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Tobias Kaminsky <tobias@kaminsky.me> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files/css/detailsView.css b/apps/files/css/detailsView.css index ea9d48b470c..485c20e6865 100644 --- a/apps/files/css/detailsView.css +++ b/apps/files/css/detailsView.css @@ -32,12 +32,18 @@ #app-sidebar .image .thumbnail { width:100%; display:block; - height: 250px; background-repeat: no-repeat; background-position: center; background-size: 100%; float: none; margin: 0; + height: auto; +} + +#app-sidebar .image .thumbnail .stretcher { + content: ''; + display: block; + padding-bottom: 56.25%; /* sets height of .thumbnail to 9/16 of the width */ } #app-sidebar .image.portrait .thumbnail { @@ -71,17 +77,14 @@ #app-sidebar .fileName h3 { max-width: 300px; - float:left; + display: inline-block; padding: 5px 0; margin: -5px 0; } #app-sidebar .file-details { - margin-top: 3px; - margin-bottom: 15px; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; opacity: .5; - float:left; } #app-sidebar .action-favorite { vertical-align: text-bottom; diff --git a/apps/files/css/files.css b/apps/files/css/files.css index c0701fb18b8..9588faebc3b 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -35,13 +35,15 @@ } /* FILE TABLE */ - #filestable { position: relative; - top: 44px; width: 100%; } +#filestable.has-controls { + top: 44px; +} + /* make sure there's enough room for the file actions */ #body-user #filestable { min-width: 688px; /* 768 (mobile break) - 80 (nav width) */ @@ -85,19 +87,6 @@ background-image: url('../img/delete.svg'); } -/* move Deleted Files to bottom of sidebar */ -.nav-trashbin { - position: fixed !important; - bottom: 44px; - width: inherit !important; - background-color: #fff; - border-right: 1px solid #eee; -} -/* double padding to account for Deleted files entry, issue with Firefox */ -.app-files #app-navigation > ul li:nth-last-child(2) { - margin-bottom: 44px; -} - #app-navigation .nav-files a.nav-icon-files { width: auto; } @@ -186,9 +175,15 @@ table th .sort-indicator { filter: alpha(opacity=30); opacity: .3; } -.sort-indicator.hidden { +.sort-indicator.hidden, +.multiselect .sort-indicator, +table.multiselect th:hover .sort-indicator.hidden, +table.multiselect th:focus .sort-indicator.hidden { visibility: hidden; } +.multiselect .sort, .multiselect .sort span { + cursor: default; +} table th:hover .sort-indicator.hidden, table th:focus .sort-indicator.hidden { visibility: visible; @@ -324,10 +319,6 @@ table td.filename .nametext { max-width: 800px; height: 100%; } -/* IE8 text-overflow: ellipsis support */ -.ie8 table td.filename .nametext { - min-width: 50%; -} .has-favorites #fileList td.filename a.name { left: 50px; margin-right: 50px; @@ -340,13 +331,6 @@ table td.filename .nametext .innernametext { display: inline-block; vertical-align: top; } -/* IE8 text-overflow: ellipsis support */ -.ie8 table td.filename .nametext .innernametext { - white-space: nowrap; - word-wrap: normal; - -ms-text-overflow: ellipsis; - max-width: 47%; -} @media only screen and (min-width: 1500px) { table td.filename .nametext .innernametext { @@ -416,20 +400,37 @@ table td.filename .uploadtext { } /* File checkboxes */ -#fileList tr td.filename>.selectCheckBox + label:before { +html:not(.ie8) #fileList tr td.filename>.selectCheckBox + label:before { opacity: 0; position: absolute; bottom: 4px; right: 0; z-index: 10; } +html.ie8 #fileList tr td.filename>.selectCheckBox { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + float: left; + top: 0; + margin: 32px 0 4px 32px; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ +} /* Show checkbox when hovering, checked, or selected */ -#fileList tr:hover td.filename>.selectCheckBox + label:before, -#fileList tr:focus td.filename>.selectCheckBox + label:before, -#fileList tr td.filename>.selectCheckBox:checked + label:before, -#fileList tr.selected td.filename>.selectCheckBox + label:before { +html.ie8 #fileList tr:hover td.filename>.selectCheckBox, +html.ie8 #fileList tr:focus td.filename>.selectCheckBox, +html.ie8 #fileList tr td.filename>.selectCheckBox:checked, +html.ie8 #fileList tr.selected td.filename>.selectCheckBox, +html:not(.ie8) #fileList tr:hover td.filename>.selectCheckBox + label:before, +html:not(.ie8) #fileList tr:focus td.filename>.selectCheckBox + label:before, +html:not(.ie8) #fileList tr td.filename>.selectCheckBox:checked + label:before, +html:not(.ie8) #fileList tr.selected td.filename>.selectCheckBox + label:before { opacity: 1; +} +html.ie8 #fileList tr:hover td.filename>.selectCheckBox, +html.ie8 #fileList tr:focus td.filename>.selectCheckBox, +html.ie8 #fileList tr td.filename>.selectCheckBox[checked=checked], +html.ie8 #fileList tr.selected td.filename>.selectCheckBox { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); } @@ -452,6 +453,7 @@ table td.filename .uploadtext { .select-all + label { top: 0; } +.ie8 .select-all, .select-all + label:before { position: absolute; top: 18px; @@ -557,6 +559,10 @@ a.action > img { margin-bottom: -1px; } +html.ie8 .column-mtime .selectedActions { + top: -95px; +} + #fileList a.action { display: inline; padding: 17px 8px; @@ -574,6 +580,9 @@ a.action > img { #fileList .popovermenu { margin-right: 21px; } +.ie8 #fileList .popovermenu { + margin-top: -10px; +} .ie8 #fileList a.action img, #fileList tr:hover a.action, @@ -725,6 +734,10 @@ table.dragshadow td.size { margin: -10px; } +html.ie8 #controls .button.new { + padding-right: 0; +} + .newFileMenu { width: 140px; margin-left: -56px; @@ -746,6 +759,12 @@ table.dragshadow td.size { margin: 0; } +.newFileMenu.popovermenu a.menuitem.active { + opacity: 1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); +} + .newFileMenu.bubble:after { left: 75px; right: auto; @@ -770,3 +789,4 @@ table.dragshadow td.size { color: #000; padding: 0; } + diff --git a/apps/files/js/detailsview.js b/apps/files/js/detailsview.js index 3a775c29ec6..f04adcf1292 100644 --- a/apps/files/js/detailsview.js +++ b/apps/files/js/detailsview.js @@ -84,7 +84,7 @@ }, _onClose: function(event) { - OC.Apps.hideAppSidebar(); + OC.Apps.hideAppSidebar(this.$el); event.preventDefault(); }, @@ -132,16 +132,22 @@ closeLabel: t('files', 'Close') }; - if (this._tabViews.length > 1) { - // only render headers if there is more than one available - templateVars.tabHeaders = _.map(this._tabViews, function(tabView, i) { - return { - tabId: tabView.id, - tabIndex: i, - label: tabView.getLabel() - }; - }); - } + this._tabViews = this._tabViews.sort(function(tabA, tabB) { + var orderA = tabA.order || 0; + var orderB = tabB.order || 0; + if (orderA === orderB) { + return OC.Util.naturalSortCompare(tabA.getLabel(), tabB.getLabel()); + } + return orderA - orderB; + }); + + templateVars.tabHeaders = _.map(this._tabViews, function(tabView, i) { + return { + tabId: tabView.id, + tabIndex: i, + label: tabView.getLabel() + }; + }); this.$el.html(this.template(templateVars)); @@ -158,6 +164,8 @@ this.selectTab(this._currentTabId); + this._updateTabVisibilities(); + this._dirty = false; }, @@ -216,6 +224,8 @@ if (this._dirty) { this.render(); + } else { + this._updateTabVisibilities(); } if (this._currentTabId) { @@ -233,6 +243,37 @@ }, /** + * Update tab headers based on the current model + */ + _updateTabVisibilities: function() { + // update tab header visibilities + var self = this; + var deselect = false; + var countVisible = 0; + var $tabHeaders = this.$el.find('.tabHeaders li'); + _.each(this._tabViews, function(tabView) { + var isVisible = tabView.canDisplay(self.model); + if (isVisible) { + countVisible += 1; + } + if (!isVisible && self._currentTabId === tabView.id) { + deselect = true; + } + $tabHeaders.filterAttr('data-tabid', tabView.id).toggleClass('hidden', !isVisible); + }); + + // hide the whole container if there is only one tab + this.$el.find('.tabHeaders').toggleClass('hidden', countVisible <= 1); + + if (deselect) { + // select the first visible tab instead + var visibleTabId = this.$el.find('.tabHeader:not(.hidden):first').attr('data-tabid'); + this.selectTab(visibleTabId); + } + + }, + + /** * Returns the file info. * * @return {OCA.Files.FileInfoModel} file info diff --git a/apps/files/js/detailtabview.js b/apps/files/js/detailtabview.js index 449047cf252..0bd34a88188 100644 --- a/apps/files/js/detailtabview.js +++ b/apps/files/js/detailtabview.js @@ -29,11 +29,15 @@ _template: null, - initialize: function() { + initialize: function(options) { + options = options || {}; if (!this.id) { this.id = 'detailTabView' + DetailTabView._TAB_COUNT; DetailTabView._TAB_COUNT++; } + if (options.order) { + this.order = options.order || 0; + } }, /** @@ -91,6 +95,17 @@ */ nextPage: function() { // load the next page, if applicable + }, + + /** + * Returns whether the current tab is able to display + * the given file info, for example based on mime type. + * + * @param {OCA.Files.FileInfoModel} fileInfo file info model + * @return {bool} whether to display this tab + */ + canDisplay: function(fileInfo) { + return true; } }); DetailTabView._TAB_COUNT = 0; diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 17f0f777169..77b85ecd7da 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -18,7 +18,7 @@ * - TODO music upload button */ -/* global Files, FileList, jQuery, oc_requesttoken, humanFileSize, getUniqueName */ +/* global jQuery, oc_requesttoken, humanFileSize */ /** * Function that will allow us to know if Ajax uploads are supported @@ -75,6 +75,9 @@ OC.Upload = { this._uploads.push(jqXHR); } }, + showUploadCancelMessage: _.debounce(function() { + OC.Notification.showTemporary(t('files', 'Upload cancelled.'), {timeout: 10}); + }, 500), /** * Checks the currently known uploads. * returns true if any hxr has the state 'pending' @@ -139,6 +142,9 @@ OC.Upload = { if (data.data) { data.data.append('resolution', 'replace'); } else { + if (!data.formData) { + data.formData = []; + } data.formData.push({name:'resolution', value:'replace'}); //hack for ie8 } data.submit(); @@ -152,6 +158,9 @@ OC.Upload = { if (data.data) { data.data.append('resolution', 'autorename'); } else { + if (!data.formData) { + data.formData = []; + } data.formData.push({name:'resolution', value:'autorename'}); //hack for ie8 } data.submit(); @@ -164,8 +173,9 @@ OC.Upload = { } }, /** - * TODO checks the list of existing files prior to uploading and shows a simple dialog to choose + * checks the list of existing files prior to uploading and shows a simple dialog to choose * skip all, replace all or choose which files to keep + * * @param {array} selection of files to upload * @param {object} callbacks - object with several callback methods * @param {function} callbacks.onNoConflicts @@ -175,14 +185,37 @@ OC.Upload = { * @param {function} callbacks.onCancel */ checkExistingFiles: function (selection, callbacks) { - /* - $.each(selection.uploads, function(i, upload) { - var $row = OCA.Files.App.fileList.findFileEl(upload.files[0].name); - if ($row) { - // TODO check filelist before uploading and show dialog on conflicts, use callbacks + var fileList = OCA.Files.App.fileList; + var conflicts = []; + // only keep non-conflicting uploads + selection.uploads = _.filter(selection.uploads, function(upload) { + var fileInfo = fileList.findFile(upload.files[0].name); + if (fileInfo) { + conflicts.push([ + // original + _.extend(fileInfo, { + directory: fileInfo.directory || fileInfo.path || fileList.getCurrentDirectory() + }), + // replacement (File object) + upload + ]); + return false; } + return true; }); - */ + if (conflicts.length) { + // wait for template loading + OC.dialogs.fileexists(null, null, null, OC.Upload).done(function() { + _.each(conflicts, function(conflictData) { + OC.dialogs.fileexists(conflictData[1], conflictData[0], conflictData[1].files[0], OC.Upload); + }); + }); + } + + // upload non-conflicting files + // note: when reaching the server they might still meet conflicts + // if the folder was concurrently modified, these will get added + // to the already visible dialog, if applicable callbacks.onNoConflicts(selection); }, @@ -368,27 +401,27 @@ OC.Upload = { }, submit: function(e, data) { OC.Upload.rememberUpload(data); - if ( ! data.formData ) { - var fileDirectory = ''; - if(typeof data.files[0].relativePath !== 'undefined') { - fileDirectory = data.files[0].relativePath; - } - // noone set update parameters, we set the minimum - data.formData = { - requesttoken: oc_requesttoken, - dir: data.targetDir || FileList.getCurrentDirectory(), - file_directory: fileDirectory - }; + if (!data.formData) { + data.formData = []; + } + + var fileDirectory = ''; + if(typeof data.files[0].relativePath !== 'undefined') { + fileDirectory = data.files[0].relativePath; } + // FIXME: prevent re-adding the same + data.formData.push({name: 'requesttoken', value: oc_requesttoken}); + data.formData.push({name: 'dir', value: data.targetDir || FileList.getCurrentDirectory()}); + data.formData.push({name: 'file_directory', value: fileDirectory}); }, fail: function(e, data) { OC.Upload.log('fail', e, data); if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) { if (data.textStatus === 'abort') { - OC.Notification.show(t('files', 'Upload cancelled.')); + OC.Upload.showUploadCancelMessage(); } else { // HTTP connection problem - OC.Notification.show(data.errorThrown); + OC.Notification.showTemporary(data.errorThrown, {timeout: 10}); if (data.result) { var result = JSON.parse(data.result); if (result && result[0] && result[0].data && result[0].data.code === 'targetnotfound') { @@ -397,10 +430,6 @@ OC.Upload = { } } } - //hide notification after 10 sec - setTimeout(function() { - OC.Notification.hide(); - }, 10000); } OC.Upload.deleteUpload(data); }, diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index f3f137a0537..079c5330ec2 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -141,9 +141,11 @@ name: name, displayName: action.displayName, mime: mime, + order: action.order || 0, icon: action.icon, permissions: action.permissions, - type: action.type || FileActions.TYPE_DROPDOWN + type: action.type || FileActions.TYPE_DROPDOWN, + altText: action.altText || '' }; if (_.isUndefined(action.displayName)) { actionSpec.displayName = t('files', name); @@ -565,6 +567,7 @@ this.registerAction({ name: 'Download', displayName: t('files', 'Download'), + order: -20, mime: 'all', permissions: OC.PERMISSION_READ, icon: function () { @@ -594,7 +597,9 @@ this.registerAction({ name: 'Rename', + displayName: t('files', 'Rename'), mime: 'all', + order: -30, permissions: OC.PERMISSION_UPDATE, icon: function() { return OC.imagePath('core', 'actions/rename'); @@ -614,7 +619,9 @@ this.registerAction({ name: 'Delete', + displayName: t('files', 'Delete'), mime: 'all', + order: 1000, // permission is READ because we show a hint instead if there is no permission permissions: OC.PERMISSION_DELETE, icon: function() { diff --git a/apps/files/js/fileactionsmenu.js b/apps/files/js/fileactionsmenu.js index 5ab0e42f93e..67cbb48c965 100644 --- a/apps/files/js/fileactionsmenu.js +++ b/apps/files/js/fileactionsmenu.js @@ -100,6 +100,14 @@ (!defaultAction || actionSpec.name !== defaultAction.name) ); }); + items = items.sort(function(actionA, actionB) { + var orderA = actionA.order || 0; + var orderB = actionB.order || 0; + if (orderB === orderA) { + return OC.Util.naturalSortCompare(actionA.displayName, actionB.displayName); + } + return orderA - orderB; + }); items = _.map(items, function(item) { item.nameLowerCase = item.name.toLowerCase(); return item; diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 2af5be73d96..4f5fdf242d9 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -226,26 +226,24 @@ } this.breadcrumb = new OCA.Files.BreadCrumb(breadcrumbOptions); - this.$el.find('#controls').prepend(this.breadcrumb.$el); + var $controls = this.$el.find('#controls'); + if ($controls.length > 0) { + $controls.prepend(this.breadcrumb.$el); + this.$table.addClass('has-controls'); + } this._renderNewButton(); this.$el.find('thead th .columntitle').click(_.bind(this._onClickHeader, this)); this._onResize = _.debounce(_.bind(this._onResize, this), 100); + $('#app-content').on('appresized', this._onResize); $(window).resize(this._onResize); this.$el.on('show', this._onResize); this.updateSearch(); - this.$el.on('click', function(event) { - var $target = $(event.target); - // click outside file row ? - if (!$target.closest('tbody').length && !$target.closest('#app-sidebar').length) { - self._updateDetailsView(null); - } - }); this.$fileList.on('click','td.filename>a.name', _.bind(this._onClickFile, this)); this.$fileList.on('change', 'td.filename>.selectCheckBox', _.bind(this._onClickFileCheckbox, this)); this.$el.on('urlChanged', _.bind(this._onUrlChanged, this)); @@ -278,10 +276,14 @@ if (this._newButton) { this._newButton.remove(); } + if (this._detailsView) { + this._detailsView.remove(); + } // TODO: also unregister other event handlers this.fileActions.off('registerAction', this._onFileActionsUpdated); this.fileActions.off('setDefault', this._onFileActionsUpdated); OC.Plugins.detach('OCA.Files.FileList', this); + $('#app-content').off('appresized', this._onResize); }, /** @@ -300,12 +302,13 @@ if (this._detailsView) { this.fileActions.registerAction({ name: 'Details', + displayName: t('files', 'Details'), mime: 'all', + order: -50, icon: OC.imagePath('core', 'actions/details'), permissions: OC.PERMISSION_READ, actionHandler: function(fileName, context) { self._updateDetailsView(fileName); - OC.Apps.showAppSidebar(); } }); } @@ -380,7 +383,7 @@ if (tabId) { this._detailsView.selectTab(tabId); } - OC.Apps.showAppSidebar(); + OC.Apps.showAppSidebar(this._detailsView.$el); }, /** @@ -406,9 +409,14 @@ this._currentFileModel.off(); } this._currentFileModel = null; + OC.Apps.hideAppSidebar(this._detailsView.$el); return; } + if (this._detailsView.$el.hasClass('disappear')) { + OC.Apps.showAppSidebar(this._detailsView.$el); + } + var $tr = this.findFileEl(fileName); var model = this.getModelForFile($tr); @@ -435,6 +443,8 @@ this.breadcrumb.setMaxWidth(containerWidth - actionsWidth - 10); + this.$table.find('>thead').width($('#app-content').width() - OC.Util.getScrollBarWidth()); + this.updateSearch(); }, @@ -451,10 +461,10 @@ * Selected/deselects the given file element and updated * the internal selection cache. * - * @param $tr single file row element - * @param state true to select, false to deselect + * @param {Object} $tr single file row element + * @param {bool} state true to select, false to deselect */ - _selectFileEl: function($tr, state) { + _selectFileEl: function($tr, state, showDetailsView) { var $checkbox = $tr.find('td.filename>.selectCheckBox'); var oldData = !!this._selectedFiles[$tr.data('id')]; var data; @@ -473,11 +483,8 @@ delete this._selectedFiles[$tr.data('id')]; this._selectionSummary.remove(data); } - if (this._selectionSummary.getTotal() === 1) { + if (this._detailsView && this._selectionSummary.getTotal() === 1 && !this._detailsView.$el.hasClass('disappear')) { this._updateDetailsView(_.values(this._selectedFiles)[0].name); - } else { - // show nothing when multiple files are selected - this._updateDetailsView(null); } this.$el.find('.select-all').prop('checked', this._selectionSummary.getTotal() === this.files.length); }, @@ -487,6 +494,9 @@ */ _onClickFile: function(event) { var $tr = $(event.target).closest('tr'); + if ($tr.hasClass('dragging')) { + return; + } if (this._allowSelection && (event.ctrlKey || event.shiftKey)) { event.preventDefault(); if (event.shiftKey) { @@ -550,9 +560,13 @@ */ _onClickFileCheckbox: function(e) { var $tr = $(e.target).closest('tr'); - this._selectFileEl($tr, !$tr.hasClass('selected')); + var state = !$tr.hasClass('selected'); + this._selectFileEl($tr, state); this._lastChecked = $tr; this.updateSelectionSummary(); + if (state) { + this._updateDetailsView($tr.attr('data-file')); + } }, /** @@ -622,6 +636,9 @@ * Event handler when clicking on a table header */ _onClickHeader: function(e) { + if (this.$table.hasClass('multiselect')) { + return; + } var $target = $(e.target); var sort; if (!$target.is('a')) { @@ -717,8 +734,23 @@ return true; }, /** - * Returns the tr element for a given file name - * @param fileName file name + * Returns the file info for the given file name from the internal collection. + * + * @param {string} fileName file name + * @return {OCA.Files.FileInfo} file info or null if it was not found + * + * @since 8.2 + */ + findFile: function(fileName) { + return _.find(this.files, function(aFile) { + return (aFile.name === fileName); + }) || null; + }, + /** + * Returns the tr element for a given file name, but only if it was already rendered. + * + * @param {string} fileName file name + * @return {Object} jQuery object of the matching row */ findFileEl: function(fileName){ // use filterAttr to avoid escaping issues @@ -924,7 +956,7 @@ if (this._allowSelection) { td.append( '<input id="select-' + this.id + '-' + fileData.id + - '" type="checkbox" class="selectCheckBox"/><label for="select-' + this.id + '-' + fileData.id + '">' + + '" type="checkbox" class="selectCheckBox checkbox"/><label for="select-' + this.id + '-' + fileData.id + '">' + '<div class="thumbnail" style="background-image:url(' + icon + '); background-size: 32px;"></div>' + '<span class="hidden-visually">' + t('files', 'Select') + '</span>' + '</label>' @@ -1303,8 +1335,10 @@ sortdirection: this._sortDirection } }); - // close sidebar - this._updateDetailsView(null); + if (this._detailsView) { + // close sidebar + this._updateDetailsView(null); + } var callBack = this.reloadCallback.bind(this); return this._reloadCall.then(callBack, callBack); }, @@ -1320,7 +1354,7 @@ ) { OC.redirect(OC.generateUrl('apps/files')); } - OC.Notification.show(result.data.message); + OC.Notification.showTemporary(result.data.message); return false; } @@ -1328,7 +1362,7 @@ if (result.status === 403) { // Go home this.changeDirectory('/'); - OC.Notification.show(t('files', 'This operation is forbidden')); + OC.Notification.showTemporary(t('files', 'This operation is forbidden')); return false; } @@ -1336,7 +1370,7 @@ if (result.status === 500) { // Go home this.changeDirectory('/'); - OC.Notification.show(t('files', 'This directory is unavailable, please check the logs or contact the administrator')); + OC.Notification.showTemporary(t('files', 'This directory is unavailable, please check the logs or contact the administrator')); return false; } @@ -1385,15 +1419,15 @@ generatePreviewUrl: function(urlSpec) { urlSpec = urlSpec || {}; if (!urlSpec.x) { - urlSpec.x = this.$table.data('preview-x') || 36; + urlSpec.x = this.$table.data('preview-x') || 32; } if (!urlSpec.y) { - urlSpec.y = this.$table.data('preview-y') || 36; + urlSpec.y = this.$table.data('preview-y') || 32; } urlSpec.x *= window.devicePixelRatio; urlSpec.y *= window.devicePixelRatio; - urlSpec.x = Math.floor(urlSpec.x); - urlSpec.y = Math.floor(urlSpec.y); + urlSpec.x = Math.ceil(urlSpec.x); + urlSpec.y = Math.ceil(urlSpec.y); urlSpec.forceIcon = 0; return OC.generateUrl('/core/preview.png?') + $.param(urlSpec); }, @@ -1511,11 +1545,12 @@ remove: function(name, options){ options = options || {}; var fileEl = this.findFileEl(name); + var fileId = fileEl.data('id'); var index = fileEl.index(); if (!fileEl.length) { return null; } - if (this._selectedFiles[fileEl.data('id')]) { + if (this._selectedFiles[fileId]) { // remove from selection first this._selectFileEl(fileEl, false); this.updateSelectionSummary(); @@ -1525,6 +1560,14 @@ fileEl.find('td.filename').draggable('destroy'); } this.files.splice(index, 1); + if (this._currentFileModel && this._currentFileModel.get('id') === fileId) { + // Note: in the future we should call destroy() directly on the model + // and the model will take care of the deletion. + // Here we only trigger the event to notify listeners that + // the file was removed. + this._currentFileModel.trigger('destroy'); + this._updateDetailsView(null); + } fileEl.remove(); // TODO: improve performance on batch update this.isEmpty = !this.files.length; @@ -1601,15 +1644,11 @@ } else { OC.Notification.hide(); if (result.status === 'error' && result.data.message) { - OC.Notification.show(result.data.message); + OC.Notification.showTemporary(result.data.message); } else { - OC.Notification.show(t('files', 'Error moving file.')); + OC.Notification.showTemporary(t('files', 'Error moving file.')); } - // hide notification after 10 sec - setTimeout(function() { - OC.Notification.hide(); - }, 10000); } } else { OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); @@ -1744,7 +1783,7 @@ } } catch (error) { input.attr('title', error); - input.tooltip({placement: 'left', trigger: 'manual'}); + input.tooltip({placement: 'right', trigger: 'manual'}); input.tooltip('show'); input.addClass('error'); } @@ -1758,7 +1797,7 @@ input.removeClass('error'); } catch (error) { input.attr('title', error); - input.tooltip({placement: 'left', trigger: 'manual'}); + input.tooltip({placement: 'right', trigger: 'manual'}); input.tooltip('show'); input.addClass('error'); } @@ -1875,7 +1914,7 @@ * @return {bool} true if the file exists in the list, false otherwise */ inList:function(file) { - return this.findFileEl(file).length; + return this.findFile(file); }, /** @@ -1972,17 +2011,15 @@ self.fileSummary.update(); self.updateSelectionSummary(); self.updateStorageStatistics(); + // in case there was a "storage full" permanent notification + OC.Notification.hide(); } else { if (result.status === 'error' && result.data.message) { - OC.Notification.show(result.data.message); + OC.Notification.showTemporary(result.data.message); } else { - OC.Notification.show(t('files', 'Error deleting file.')); + OC.Notification.showTemporary(t('files', 'Error deleting file.')); } - // hide notification after 10 sec - setTimeout(function() { - OC.Notification.hide(); - }, 10000); if (params.allfiles) { // reload the page as we don't know what files were deleted // and which ones remain @@ -2223,11 +2260,7 @@ */ _showPermissionDeniedNotification: function() { var message = t('core', 'You don’t have permission to upload or create files here'); - OC.Notification.show(message); - //hide notification after 10 sec - setTimeout(function() { - OC.Notification.hide(); - }, 5000); + OC.Notification.showTemporary(message); }, /** @@ -2536,8 +2569,9 @@ }, _renderNewButton: function() { - // if an upload button (legacy) already exists, skip - if ($('#controls .button.upload').length) { + // if an upload button (legacy) already exists or no actions container exist, skip + var $actionsContainer = this.$el.find('#controls .actions'); + if (!$actionsContainer.length || this.$el.find('.button.upload').length) { return; } if (!this._addButtonTemplate) { @@ -2548,7 +2582,7 @@ iconUrl: OC.imagePath('core', 'actions/add') })); - $('#controls .actions').prepend($newButton); + $actionsContainer.prepend($newButton); $newButton.tooltip({'placement': 'bottom'}); $newButton.click(_.bind(this._onClickNewButton, this)); @@ -2580,14 +2614,18 @@ * Register a tab view to be added to all views */ registerTabView: function(tabView) { - this._detailsView.addTabView(tabView); + if (this._detailsView) { + this._detailsView.addTabView(tabView); + } }, /** * Register a detail view to be added to all views */ registerDetailView: function(detailView) { - this._detailsView.addDetailView(detailView); + if (this._detailsView) { + this._detailsView.addDetailView(detailView); + } } }; diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 4fdc9eb2110..9ab7609cc40 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -356,7 +356,7 @@ var createDragShadow = function(event) { var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked'); if (!isDragSelected) { //select dragged file - FileList._selectFileEl($(event.target).parents('tr:first'), true); + FileList._selectFileEl($(event.target).parents('tr:first'), true, false); } // do not show drag shadow for too many files @@ -365,7 +365,7 @@ var createDragShadow = function(event) { if (!isDragSelected && selectedFiles.length === 1) { //revert the selection - FileList._selectFileEl($(event.target).parents('tr:first'), false); + FileList._selectFileEl($(event.target).parents('tr:first'), false, false); } // build dragshadow @@ -413,22 +413,17 @@ var dragOptions={ cursor: 'move', start: function(event, ui){ var $selectedFiles = $('td.filename input:checkbox:checked'); - if($selectedFiles.length > 1){ - $selectedFiles.parents('tr').fadeTo(250, 0.2); - } - else{ - $(this).fadeTo(250, 0.2); + if (!$selectedFiles.length) { + $selectedFiles = $(this); } + $selectedFiles.closest('tr').fadeTo(250, 0.2).addClass('dragging'); }, stop: function(event, ui) { var $selectedFiles = $('td.filename input:checkbox:checked'); - if($selectedFiles.length > 1){ - $selectedFiles.parents('tr').fadeTo(250, 1); - } - else{ - $(this).fadeTo(250, 1); + if (!$selectedFiles.length) { + $selectedFiles = $(this); } - $('#fileList tr td.filename').addClass('ui-draggable'); + $selectedFiles.closest('tr').fadeTo(250, 1).removeClass('dragging'); } }; // sane browsers support using the distance option diff --git a/apps/files/js/mainfileinfodetailview.js b/apps/files/js/mainfileinfodetailview.js index 830f074f3f1..abf7da52ff4 100644 --- a/apps/files/js/mainfileinfodetailview.js +++ b/apps/files/js/mainfileinfodetailview.js @@ -10,14 +10,13 @@ (function() { var TEMPLATE = - '<div class="thumbnailContainer"><a href="#" class="thumbnail action-default"></a></div>' + + '<div class="thumbnailContainer"><a href="#" class="thumbnail action-default"><div class="stretcher"/></a></div>' + '<div class="file-details-container">' + '<div class="fileName"><h3 title="{{name}}" class="ellipsis">{{name}}</h3></div>' + ' <div class="file-details ellipsis">' + ' <a href="#" ' + - ' alt="{{starAltText}}"' + ' class="action action-favorite favorite">' + - ' <img class="svg" src="{{starIcon}}" />' + + ' <img class="svg" alt="{{starAltText}}" src="{{starIcon}}" />' + ' </a>' + ' {{#if hasSize}}<span class="size" title="{{altSize}}">{{size}}</span>, {{/if}}<span class="date" title="{{altDate}}">{{date}}</span>' + ' </div>' + @@ -66,10 +65,10 @@ this._fileList = options.fileList; this._fileActions = options.fileActions; if (!this._fileList) { - throw 'Missing requird parameter "fileList"'; + throw 'Missing required parameter "fileList"'; } if (!this._fileActions) { - throw 'Missing requird parameter "fileActions"'; + throw 'Missing required parameter "fileActions"'; } }, @@ -131,6 +130,7 @@ } else { // TODO: special icons / shared / external $iconDiv.css('background-image', 'url("' + OC.MimeType.getIconUrl('dir') + '")'); + OC.Util.scaleFixForIE8($iconDiv); } this.$el.find('[title]').tooltip({placement: 'bottom'}); } else { @@ -140,13 +140,18 @@ }, loadPreview: function(path, mime, etag, $iconDiv, $container, isImage) { - var maxImageHeight = ($container.parent().width() + 50) / (16/9); // 30px for negative margin + var maxImageWidth = $container.parent().width() + 50; // 50px for negative margins + var maxImageHeight = maxImageWidth / (16/9); var smallPreviewSize = 75; var isLandscape = function(img) { return img.width > (img.height * 1.2); }; + var isSmall = function(img) { + return (img.width * 1.1) < (maxImageWidth * window.devicePixelRatio); + }; + var getTargetHeight = function(img) { if(isImage) { var targetHeight = img.height / window.devicePixelRatio; @@ -159,13 +164,23 @@ } }; + var getTargetRatio = function(img){ + var ratio = img.width / img.height; + if (ratio > 16/9) { + return ratio; + } else { + return 16/9; + } + }; + this._fileList.lazyLoadPreview({ path: path, mime: mime, etag: etag, y: isImage ? maxImageHeight : smallPreviewSize, - x: isImage ? 99999 /* only limit on y */ : smallPreviewSize, + x: isImage ? maxImageWidth : smallPreviewSize, a: isImage ? 1 : null, + mode: isImage ? 'cover' : null, callback: function (previewUrl, img) { $iconDiv.previewImg = previewUrl; @@ -176,9 +191,7 @@ $iconDiv.removeClass('icon-loading icon-32'); var targetHeight = getTargetHeight(img); if (this.model.isImage() && targetHeight > smallPreviewSize) { - if (!isLandscape(img)) { - $container.addClass('portrait'); - } + $container.addClass((isLandscape(img) && !isSmall(img))? 'landscape': 'portrait'); $container.addClass('image'); } @@ -186,7 +199,13 @@ // when we dont have a preview we show the mime icon in the error handler $iconDiv.css({ 'background-image': 'url("' + previewUrl + '")', - 'height': targetHeight + height: (targetHeight > smallPreviewSize)? 'auto': targetHeight, + 'max-height': isSmall(img)? targetHeight: null + }); + + var targetRatio = getTargetRatio(img); + $iconDiv.find('.stretcher').css({ + 'padding-bottom': (100 / targetRatio) + '%' }); }.bind(this), error: function () { @@ -195,6 +214,7 @@ $iconDiv.css({ 'background-image': 'url("' + $iconDiv.previewImg + '")' }); + OC.Util.scaleFixForIE8($iconDiv); }.bind(this) }); } diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js index 4c021e6b873..0a67aba202b 100644 --- a/apps/files/js/newfilemenu.js +++ b/apps/files/js/newfilemenu.js @@ -84,6 +84,8 @@ OC.hideMenus(); } else { event.preventDefault(); + this.$el.find('.menuitem.active').removeClass('active'); + $target.addClass('active'); this._promptFileName($target); } }, @@ -210,6 +212,7 @@ fileType: 'folder' }] })); + OC.Util.scaleFixForIE8(this.$('.svg')); }, /** diff --git a/apps/files/js/tagsplugin.js b/apps/files/js/tagsplugin.js index 9f45da9a6e2..23945d52603 100644 --- a/apps/files/js/tagsplugin.js +++ b/apps/files/js/tagsplugin.js @@ -78,7 +78,7 @@ // register "star" action fileActions.registerAction({ name: 'Favorite', - displayName: 'Favorite', + displayName: t('files', 'Favorite'), mime: 'all', permissions: OC.PERMISSION_READ, type: OCA.Files.FileActions.TYPE_INLINE, diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 6dab5f6ba27..0e20f237022 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -1,9 +1,16 @@ OC.L10N.register( "files", { + "Storage not available" : "وحدة التخزين غير متوفرة ", + "Storage invalid" : "وحدة تخزين غير صالحه ", "Unknown error" : "خطأ غير معروف. ", "Could not move %s - File with this name already exists" : "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم", "Could not move %s" : "فشل في نقل %s", + "Permission denied" : "تم رفض الاذن ", + "The target folder has been moved or deleted." : "المجلد المطلوب قد تم نقله او حذفه ", + "The name %s is already used in the folder %s. Please choose a different name." : "هذا الاسم %s مستخدم مسبقا في المجلد %s . فضلا اختر اسم مختلف .", + "Error when creating the file" : "خطأ اثناء انشاء الملف ", + "Error when creating the folder" : "خطأ اثناء انشاء المجلد ", "Unable to set upload directory." : "غير قادر على تحميل المجلد", "Invalid Token" : "علامة غير صالحة", "No file was uploaded. Unknown error" : "لم يتم رفع أي ملف , خطأ غير معروف", @@ -24,31 +31,52 @@ OC.L10N.register( "Home" : "البيت", "Close" : "إغلاق", "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت", + "Total file size {size1} exceeds upload limit {size2}" : "حجم الملف الكلي {size1} تجاوز الحد المسموح للرفع {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، انت تقوم برفع {size1} ولكن المساحه المتوفره هي {size2}.", "Upload cancelled." : "تم إلغاء عملية رفع الملفات .", "Could not get result from server." : "تعذر الحصول على نتيجة من الخادم", "File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", "Actions" : "* تطبيقات.\n* أنشطة.", "Download" : "تحميل", + "Rename" : "إعادة التسمية", + "Delete" : "حذف ", + "Details" : "تفاصيل", + "Select" : "اختار", "Pending" : "قيد الانتظار", + "Unable to determine date" : "تعذر تحديد التاريخ", + "This operation is forbidden" : "هذة العملية ممنوعة ", + "Error moving file." : "خطأ اثناء نقل الملف ", "Error moving file" : "حدث خطأ أثناء نقل الملف", "Error" : "خطأ", "{new_name} already exists" : "{new_name} موجود مسبقا", + "Could not rename file" : "لا يستطيع اعادة تسمية الملف", + "Could not create file" : "لا يستطيع انشاء ملف ", + "Could not create folder" : "لا يستطيع انشاء مجلد ", + "Error deleting file." : "خطأ اثناء حذف الملف ", + "No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'", "Name" : "اسم", "Size" : "حجم", "Modified" : "معدل", "_%n folder_::_%n folders_" : ["لا يوجد مجلدات %n","1 مجلد %n","2 مجلد %n","عدد قليل من مجلدات %n","عدد كبير من مجلدات %n","مجلدات %n"], "_%n file_::_%n files_" : ["لا يوجد ملفات %n","ملف %n","2 ملف %n","قليل من ملفات %n","الكثير من ملفات %n"," ملفات %n"], "{dirs} and {files}" : "{dirs} و {files}", + "You don’t have permission to upload or create files here" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ", "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"], "New" : "جديد", + "\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .", "File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا", - "Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكم تحديث ملفاتك أو مزامنتها بعد الآن !", + "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}%)" : "مساحتك التخزينية امتلأت تقريبا ", "Favorite" : "المفضلة", + "{newname} already exists" : "{newname} موجود مسبقاً", "Upload" : "رفع", - "Text file" : "ملف", + "Text file" : "ملف نصي", + "New text file.txt" : "ملف نصي جديد fille.txt", "Folder" : "مجلد", "New folder" : "مجلد جديد", + "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags", "A new file or folder has been <strong>created</strong>" : "تم <strong> إنشاء</strong> ملف جديد أو مجلد ", "A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد", "A file or folder has been <strong>deleted</strong>" : "تم <strong>حذف </strong> ملف أو مجلد", @@ -62,18 +90,28 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s حذف %1$s", "You restored %1$s" : "لقد قمت باستعادة %1$s", "%2$s restored %1$s" : "%2$s مستعاد %1$s", + "%s could not be renamed as it has been deleted" : "%s لا يمكن اعادة تسميته فقد تم حذفه ", "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ", + "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ", "File handling" : "التعامل مع الملف", "Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها", "max. possible: " : "الحد الأقصى المسموح به", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "بستخدام PHP-FPM هذه القيمة سوف تحتاج الي 5 دقائق حتي تُتِم عملها بعد الحفظ ", "Save" : "حفظ", + "Can not be edited from here due to insufficient permissions." : "لا يمكن التعديل من هنا نظرا لعدم توفر الصلاحيات الكافيه ", "Settings" : "إعدادات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>", "Cancel upload" : "إلغاء الرفع", - "Delete" : "إلغاء", + "No files in here" : "لا يوجد ملفات هنا ", + "Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !", + "No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ", + "Select all" : "تحديد الكل ", "Upload too large" : "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.", - "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات ." + "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .", + "Currently scanning" : "حالياً يقوم بالفحص", + "No favorites" : "لا يوجد مفضلات ", + "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا " }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 745d82dc19b..e1b2eb3af1b 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -1,7 +1,14 @@ { "translations": { + "Storage not available" : "وحدة التخزين غير متوفرة ", + "Storage invalid" : "وحدة تخزين غير صالحه ", "Unknown error" : "خطأ غير معروف. ", "Could not move %s - File with this name already exists" : "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم", "Could not move %s" : "فشل في نقل %s", + "Permission denied" : "تم رفض الاذن ", + "The target folder has been moved or deleted." : "المجلد المطلوب قد تم نقله او حذفه ", + "The name %s is already used in the folder %s. Please choose a different name." : "هذا الاسم %s مستخدم مسبقا في المجلد %s . فضلا اختر اسم مختلف .", + "Error when creating the file" : "خطأ اثناء انشاء الملف ", + "Error when creating the folder" : "خطأ اثناء انشاء المجلد ", "Unable to set upload directory." : "غير قادر على تحميل المجلد", "Invalid Token" : "علامة غير صالحة", "No file was uploaded. Unknown error" : "لم يتم رفع أي ملف , خطأ غير معروف", @@ -22,31 +29,52 @@ "Home" : "البيت", "Close" : "إغلاق", "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت", + "Total file size {size1} exceeds upload limit {size2}" : "حجم الملف الكلي {size1} تجاوز الحد المسموح للرفع {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، انت تقوم برفع {size1} ولكن المساحه المتوفره هي {size2}.", "Upload cancelled." : "تم إلغاء عملية رفع الملفات .", "Could not get result from server." : "تعذر الحصول على نتيجة من الخادم", "File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", "Actions" : "* تطبيقات.\n* أنشطة.", "Download" : "تحميل", + "Rename" : "إعادة التسمية", + "Delete" : "حذف ", + "Details" : "تفاصيل", + "Select" : "اختار", "Pending" : "قيد الانتظار", + "Unable to determine date" : "تعذر تحديد التاريخ", + "This operation is forbidden" : "هذة العملية ممنوعة ", + "Error moving file." : "خطأ اثناء نقل الملف ", "Error moving file" : "حدث خطأ أثناء نقل الملف", "Error" : "خطأ", "{new_name} already exists" : "{new_name} موجود مسبقا", + "Could not rename file" : "لا يستطيع اعادة تسمية الملف", + "Could not create file" : "لا يستطيع انشاء ملف ", + "Could not create folder" : "لا يستطيع انشاء مجلد ", + "Error deleting file." : "خطأ اثناء حذف الملف ", + "No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'", "Name" : "اسم", "Size" : "حجم", "Modified" : "معدل", "_%n folder_::_%n folders_" : ["لا يوجد مجلدات %n","1 مجلد %n","2 مجلد %n","عدد قليل من مجلدات %n","عدد كبير من مجلدات %n","مجلدات %n"], "_%n file_::_%n files_" : ["لا يوجد ملفات %n","ملف %n","2 ملف %n","قليل من ملفات %n","الكثير من ملفات %n"," ملفات %n"], "{dirs} and {files}" : "{dirs} و {files}", + "You don’t have permission to upload or create files here" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ", "_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"], "New" : "جديد", + "\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .", "File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا", - "Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكم تحديث ملفاتك أو مزامنتها بعد الآن !", + "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}%)" : "مساحتك التخزينية امتلأت تقريبا ", "Favorite" : "المفضلة", + "{newname} already exists" : "{newname} موجود مسبقاً", "Upload" : "رفع", - "Text file" : "ملف", + "Text file" : "ملف نصي", + "New text file.txt" : "ملف نصي جديد fille.txt", "Folder" : "مجلد", "New folder" : "مجلد جديد", + "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags", "A new file or folder has been <strong>created</strong>" : "تم <strong> إنشاء</strong> ملف جديد أو مجلد ", "A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد", "A file or folder has been <strong>deleted</strong>" : "تم <strong>حذف </strong> ملف أو مجلد", @@ -60,18 +88,28 @@ "%2$s deleted %1$s" : "%2$s حذف %1$s", "You restored %1$s" : "لقد قمت باستعادة %1$s", "%2$s restored %1$s" : "%2$s مستعاد %1$s", + "%s could not be renamed as it has been deleted" : "%s لا يمكن اعادة تسميته فقد تم حذفه ", "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ", + "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ", "File handling" : "التعامل مع الملف", "Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها", "max. possible: " : "الحد الأقصى المسموح به", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "بستخدام PHP-FPM هذه القيمة سوف تحتاج الي 5 دقائق حتي تُتِم عملها بعد الحفظ ", "Save" : "حفظ", + "Can not be edited from here due to insufficient permissions." : "لا يمكن التعديل من هنا نظرا لعدم توفر الصلاحيات الكافيه ", "Settings" : "إعدادات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>", "Cancel upload" : "إلغاء الرفع", - "Delete" : "إلغاء", + "No files in here" : "لا يوجد ملفات هنا ", + "Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !", + "No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ", + "Select all" : "تحديد الكل ", "Upload too large" : "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.", - "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات ." + "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .", + "Currently scanning" : "حالياً يقوم بالفحص", + "No favorites" : "لا يوجد مفضلات ", + "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا " },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js index 33bf5e37c0a..ffba40ec793 100644 --- a/apps/files/l10n/ast.js +++ b/apps/files/l10n/ast.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.", "Actions" : "Aiciones", "Download" : "Descargar", + "Rename" : "Renomar", + "Delete" : "Desaniciar", + "Details" : "Detalles", "Select" : "Esbillar", "Pending" : "Pendiente", "Unable to determine date" : "Imposible determinar la fecha", @@ -92,7 +95,6 @@ OC.L10N.register( "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>", "Cancel upload" : "Encaboxar xuba", - "Delete" : "Desaniciar", "Upload too large" : "La xuba ye abondo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.", "Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.", diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json index 601bf2d85f1..353511d5586 100644 --- a/apps/files/l10n/ast.json +++ b/apps/files/l10n/ast.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.", "Actions" : "Aiciones", "Download" : "Descargar", + "Rename" : "Renomar", + "Delete" : "Desaniciar", + "Details" : "Detalles", "Select" : "Esbillar", "Pending" : "Pendiente", "Unable to determine date" : "Imposible determinar la fecha", @@ -90,7 +93,6 @@ "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>", "Cancel upload" : "Encaboxar xuba", - "Delete" : "Desaniciar", "Upload too large" : "La xuba ye abondo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.", "Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.", diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js index 54b17d6df55..b278fad62b1 100644 --- a/apps/files/l10n/az.js +++ b/apps/files/l10n/az.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.", "Actions" : "İşlər", "Download" : "Yüklə", + "Rename" : "Adı dəyiş", + "Delete" : "Sil", + "Details" : "Detallar", "Select" : "Seç", "Pending" : "Gözləmə", "Unable to determine date" : "Tarixi təyin etmək mümkün olmadı", @@ -110,7 +113,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!", "No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı", "Select all" : "Hamısıı seç", - "Delete" : "Sil", "Upload too large" : "Yüklənmə şox böyükdür", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.", "Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.", diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json index 14d728f248a..8603939790d 100644 --- a/apps/files/l10n/az.json +++ b/apps/files/l10n/az.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.", "Actions" : "İşlər", "Download" : "Yüklə", + "Rename" : "Adı dəyiş", + "Delete" : "Sil", + "Details" : "Detallar", "Select" : "Seç", "Pending" : "Gözləmə", "Unable to determine date" : "Tarixi təyin etmək mümkün olmadı", @@ -108,7 +111,6 @@ "Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!", "No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı", "Select all" : "Hamısıı seç", - "Delete" : "Sil", "Upload too large" : "Yüklənmə şox böyükdür", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.", "Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.", diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js index f21c5de9dc1..98e0e2bd4b9 100644 --- a/apps/files/l10n/bg_BG.js +++ b/apps/files/l10n/bg_BG.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.", "Actions" : "Действия", "Download" : "Изтегли", + "Rename" : "Преименуване", + "Delete" : "Изтрий", + "Details" : "Подробности", "Select" : "Избери", "Pending" : "Чакащо", "Unable to determine date" : "Неуспешно установяване на дата", @@ -100,7 +103,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Качи съдържание или синхронизирай с твоите устройства!", "No entries found in this folder" : "Няма намерени записи в тази папка", "Select all" : "Избери всички", - "Delete" : "Изтрий", "Upload too large" : "Прекалено голям файл за качване.", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json index 6778eff6da8..48d6729232b 100644 --- a/apps/files/l10n/bg_BG.json +++ b/apps/files/l10n/bg_BG.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.", "Actions" : "Действия", "Download" : "Изтегли", + "Rename" : "Преименуване", + "Delete" : "Изтрий", + "Details" : "Подробности", "Select" : "Избери", "Pending" : "Чакащо", "Unable to determine date" : "Неуспешно установяване на дата", @@ -98,7 +101,6 @@ "Upload some content or sync with your devices!" : "Качи съдържание или синхронизирай с твоите устройства!", "No entries found in this folder" : "Няма намерени записи в тази папка", "Select all" : "Избери всички", - "Delete" : "Изтрий", "Upload too large" : "Прекалено голям файл за качване.", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js index 1272966209b..bc8d7ce8d5c 100644 --- a/apps/files/l10n/bn_BD.js +++ b/apps/files/l10n/bn_BD.js @@ -29,6 +29,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।", "Actions" : "পদক্ষেপসমূহ", "Download" : "ডাউনলোড", + "Rename" : "পূনঃনামকরণ", + "Delete" : "মুছে", + "Details" : "বিস্তারিত", "Pending" : "মুলতুবি", "Error moving file." : "ফাইল সরাতে সমস্যা হলো।", "Error moving file" : "ফাইল সরাতে সমস্যা হলো", @@ -65,7 +68,6 @@ OC.L10N.register( "Settings" : "নিয়ামকসমূহ", "WebDAV" : "WebDAV", "Cancel upload" : "আপলোড বাতিল কর", - "Delete" : "মুছে", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।" diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json index 472aae78865..43ebbc8ad96 100644 --- a/apps/files/l10n/bn_BD.json +++ b/apps/files/l10n/bn_BD.json @@ -27,6 +27,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।", "Actions" : "পদক্ষেপসমূহ", "Download" : "ডাউনলোড", + "Rename" : "পূনঃনামকরণ", + "Delete" : "মুছে", + "Details" : "বিস্তারিত", "Pending" : "মুলতুবি", "Error moving file." : "ফাইল সরাতে সমস্যা হলো।", "Error moving file" : "ফাইল সরাতে সমস্যা হলো", @@ -63,7 +66,6 @@ "Settings" : "নিয়ামকসমূহ", "WebDAV" : "WebDAV", "Cancel upload" : "আপলোড বাতিল কর", - "Delete" : "মুছে", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।" diff --git a/apps/files/l10n/bn_IN.js b/apps/files/l10n/bn_IN.js index 995c9ad45d1..d7f61133133 100644 --- a/apps/files/l10n/bn_IN.js +++ b/apps/files/l10n/bn_IN.js @@ -16,6 +16,8 @@ OC.L10N.register( "Files" : "ফাইলস", "Close" : "বন্ধ", "Download" : "ডাউনলোড করুন", + "Rename" : "পুনঃনামকরণ", + "Delete" : "মুছে ফেলা", "Pending" : "মুলতুবি", "Error" : "ভুল", "Name" : "নাম", @@ -32,7 +34,6 @@ OC.L10N.register( "You deleted %1$s" : "আপনি %1$s কে মুছেছেন", "%2$s deleted %1$s" : "%2$s মুছেছে %1$s কে", "Save" : "সেভ", - "Settings" : "সেটিংস", - "Delete" : "মুছে ফেলা" + "Settings" : "সেটিংস" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bn_IN.json b/apps/files/l10n/bn_IN.json index 17ce39d023a..f2d5d9fbf74 100644 --- a/apps/files/l10n/bn_IN.json +++ b/apps/files/l10n/bn_IN.json @@ -14,6 +14,8 @@ "Files" : "ফাইলস", "Close" : "বন্ধ", "Download" : "ডাউনলোড করুন", + "Rename" : "পুনঃনামকরণ", + "Delete" : "মুছে ফেলা", "Pending" : "মুলতুবি", "Error" : "ভুল", "Name" : "নাম", @@ -30,7 +32,6 @@ "You deleted %1$s" : "আপনি %1$s কে মুছেছেন", "%2$s deleted %1$s" : "%2$s মুছেছে %1$s কে", "Save" : "সেভ", - "Settings" : "সেটিংস", - "Delete" : "মুছে ফেলা" + "Settings" : "সেটিংস" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js index f10c87bfef8..6ca6ebe90c5 100644 --- a/apps/files/l10n/bs.js +++ b/apps/files/l10n/bs.js @@ -38,6 +38,8 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", "Download" : "Preuzmi", + "Rename" : "Preimenuj", + "Delete" : "Izbriši", "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Nemoguće odrediti datum", @@ -81,7 +83,6 @@ OC.L10N.register( "Cancel upload" : "Prekini učitavanje", "Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!", "Select all" : "Označi sve", - "Delete" : "Izbriši", "Upload too large" : "Učitavanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.", "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json index 7d8a87f6398..553662622f2 100644 --- a/apps/files/l10n/bs.json +++ b/apps/files/l10n/bs.json @@ -36,6 +36,8 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", "Download" : "Preuzmi", + "Rename" : "Preimenuj", + "Delete" : "Izbriši", "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Nemoguće odrediti datum", @@ -79,7 +81,6 @@ "Cancel upload" : "Prekini učitavanje", "Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!", "Select all" : "Označi sve", - "Delete" : "Izbriši", "Upload too large" : "Učitavanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.", "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index f8388534802..b5cd0beedfe 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", "Actions" : "Accions", "Download" : "Baixa", + "Rename" : "Reanomena", + "Delete" : "Esborra", + "Details" : "Detalls", "Select" : "Selecciona", "Pending" : "Pendent", "Unable to determine date" : "No s'ha pogut determinar la data", @@ -103,7 +106,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.", "No entries found in this folder" : "No hi ha entrades en aquesta carpeta", "Select all" : "Seleccionar tot", - "Delete" : "Esborra", "Upload too large" : "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", "Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu", diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 10a39fc941a..7558821627f 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", "Actions" : "Accions", "Download" : "Baixa", + "Rename" : "Reanomena", + "Delete" : "Esborra", + "Details" : "Detalls", "Select" : "Selecciona", "Pending" : "Pendent", "Unable to determine date" : "No s'ha pogut determinar la data", @@ -101,7 +104,6 @@ "Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.", "No entries found in this folder" : "No hi ha entrades en aquesta carpeta", "Select all" : "Seleccionar tot", - "Delete" : "Esborra", "Upload too large" : "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", "Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu", diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js index a5c1449e995..10f9d49984f 100644 --- a/apps/files/l10n/cs_CZ.js +++ b/apps/files/l10n/cs_CZ.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.", "Actions" : "Činnosti", "Download" : "Stáhnout", + "Rename" : "Přejmenovat", + "Delete" : "Smazat", + "Details" : "Podrobnosti", "Select" : "Vybrat", "Pending" : "Nevyřízené", "Unable to determine date" : "Nelze určit datum", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s smazal(a) %1$s", "You restored %1$s" : "Obnovili jste %1$s", "%2$s restored %1$s" : "%2$s obnovil(a) %1$s", + "Changed by %2$s" : "Změněno uživatelem %2$s", + "Deleted by %2$s" : "Smazáno uživatelem %2$s", + "Restored by %2$s" : "Obnoveno uživatelem %2$s", "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán", "%s could not be renamed" : "%s nemůže být přejmenován", "Upload (max. %s)" : "Nahrát (max. %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!", "No entries found in this folder" : "V této složce nebylo nic nalezeno", "Select all" : "Vybrat vše", - "Delete" : "Smazat", "Upload too large" : "Odesílaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json index 1da4bfb8868..cc475fbfd5c 100644 --- a/apps/files/l10n/cs_CZ.json +++ b/apps/files/l10n/cs_CZ.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.", "Actions" : "Činnosti", "Download" : "Stáhnout", + "Rename" : "Přejmenovat", + "Delete" : "Smazat", + "Details" : "Podrobnosti", "Select" : "Vybrat", "Pending" : "Nevyřízené", "Unable to determine date" : "Nelze určit datum", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s smazal(a) %1$s", "You restored %1$s" : "Obnovili jste %1$s", "%2$s restored %1$s" : "%2$s obnovil(a) %1$s", + "Changed by %2$s" : "Změněno uživatelem %2$s", + "Deleted by %2$s" : "Smazáno uživatelem %2$s", + "Restored by %2$s" : "Obnoveno uživatelem %2$s", "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán", "%s could not be renamed" : "%s nemůže být přejmenován", "Upload (max. %s)" : "Nahrát (max. %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!", "No entries found in this folder" : "V této složce nebylo nic nalezeno", "Select all" : "Vybrat vše", - "Delete" : "Smazat", "Upload too large" : "Odesílaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js index bdf61e20f24..2f64d032f01 100644 --- a/apps/files/l10n/cy_GB.js +++ b/apps/files/l10n/cy_GB.js @@ -20,6 +20,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.", "Actions" : "Gweithredoedd", "Download" : "Llwytho i lawr", + "Rename" : "Ailenwi", + "Delete" : "Dileu", + "Details" : "Manylion", "Pending" : "I ddod", "Error" : "Gwall", "{new_name} already exists" : "{new_name} yn bodoli'n barod", @@ -39,7 +42,6 @@ OC.L10N.register( "Save" : "Cadw", "Settings" : "Gosodiadau", "Cancel upload" : "Diddymu llwytho i fyny", - "Delete" : "Dileu", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio." diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json index eb66c24ec62..602cc780abe 100644 --- a/apps/files/l10n/cy_GB.json +++ b/apps/files/l10n/cy_GB.json @@ -18,6 +18,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.", "Actions" : "Gweithredoedd", "Download" : "Llwytho i lawr", + "Rename" : "Ailenwi", + "Delete" : "Dileu", + "Details" : "Manylion", "Pending" : "I ddod", "Error" : "Gwall", "{new_name} already exists" : "{new_name} yn bodoli'n barod", @@ -37,7 +40,6 @@ "Save" : "Cadw", "Settings" : "Gosodiadau", "Cancel upload" : "Diddymu llwytho i fyny", - "Delete" : "Dileu", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio." diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js index cc7aac18351..84d342e85d9 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.", "Actions" : "Handlinger", "Download" : "Download", + "Rename" : "Omdøb", + "Delete" : "Slet", + "Details" : "Detaljer", "Select" : "Vælg", "Pending" : "Afventer", "Unable to determine date" : "Kan ikke fastslå datoen", @@ -110,7 +113,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!", "No entries found in this folder" : "Der blev ikke fundet poster i denne mappe", "Select all" : "Vælg alle", - "Delete" : "Slet", "Upload too large" : "Upload er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index b77937420f4..53de8656af2 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.", "Actions" : "Handlinger", "Download" : "Download", + "Rename" : "Omdøb", + "Delete" : "Slet", + "Details" : "Detaljer", "Select" : "Vælg", "Pending" : "Afventer", "Unable to determine date" : "Kan ikke fastslå datoen", @@ -108,7 +111,6 @@ "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!", "No entries found in this folder" : "Der blev ikke fundet poster i denne mappe", "Select all" : "Vælg alle", - "Delete" : "Slet", "Upload too large" : "Upload er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index 5e22e05f80d..b6f3711617a 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.", "Actions" : "Aktionen", "Download" : "Herunterladen", + "Rename" : "Umbenennen", + "Delete" : "Löschen", + "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", "Unable to determine date" : "Datum konnte nicht ermittelt werden", @@ -72,8 +75,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", + "{newname} already exists" : "{newname} existiert bereits", "Upload" : "Hochladen", "Text file" : "Textdatei", + "New text file.txt" : "Neue Textdatei.txt", "Folder" : "Ordner", "New folder" : "Neuer Ordner", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", @@ -91,12 +96,16 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s hat %1$s gelöscht", "You restored %1$s" : "Du hast %1$s wiederhergestellt", "%2$s restored %1$s" : "%2$s wiederhergestellt %1$s", + "Changed by %2$s" : "Geändert von %2$s", + "Deleted by %2$s" : "Gelöscht von %2$s", + "Restored by %2$s" : "Wiederhergestellt von %2$s", "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.", "Save" : "Speichern", "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.", "Settings" : "Einstellungen", @@ -107,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!", "No entries found in this folder" : "Keine Einträge in diesem Ordner", "Select all" : "Alle auswählen", - "Delete" : "Löschen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index 5e93d2b3856..d0cfab4929e 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.", "Actions" : "Aktionen", "Download" : "Herunterladen", + "Rename" : "Umbenennen", + "Delete" : "Löschen", + "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", "Unable to determine date" : "Datum konnte nicht ermittelt werden", @@ -70,8 +73,10 @@ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", + "{newname} already exists" : "{newname} existiert bereits", "Upload" : "Hochladen", "Text file" : "Textdatei", + "New text file.txt" : "Neue Textdatei.txt", "Folder" : "Ordner", "New folder" : "Neuer Ordner", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", @@ -89,12 +94,16 @@ "%2$s deleted %1$s" : "%2$s hat %1$s gelöscht", "You restored %1$s" : "Du hast %1$s wiederhergestellt", "%2$s restored %1$s" : "%2$s wiederhergestellt %1$s", + "Changed by %2$s" : "Geändert von %2$s", + "Deleted by %2$s" : "Gelöscht von %2$s", + "Restored by %2$s" : "Wiederhergestellt von %2$s", "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.", "Save" : "Speichern", "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.", "Settings" : "Einstellungen", @@ -105,7 +114,6 @@ "Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!", "No entries found in this folder" : "Keine Einträge in diesem Ordner", "Select all" : "Alle auswählen", - "Delete" : "Löschen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js index 70adef6bb08..4f5296dc11f 100644 --- a/apps/files/l10n/de_AT.js +++ b/apps/files/l10n/de_AT.js @@ -4,6 +4,8 @@ OC.L10N.register( "Unknown error" : "Unbekannter Fehler", "Files" : "Dateien", "Download" : "Herunterladen", + "Delete" : "Löschen", + "Details" : "Details", "Error" : "Fehler", "Upload" : "Hochladen", "New folder" : "Neuer Ordner", @@ -18,7 +20,6 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s löschte %1$s", "Save" : "Speichern", "Settings" : "Einstellungen", - "Cancel upload" : "Hochladen abbrechen", - "Delete" : "Löschen" + "Cancel upload" : "Hochladen abbrechen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json index 8766f264741..91ec7e5e4e1 100644 --- a/apps/files/l10n/de_AT.json +++ b/apps/files/l10n/de_AT.json @@ -2,6 +2,8 @@ "Unknown error" : "Unbekannter Fehler", "Files" : "Dateien", "Download" : "Herunterladen", + "Delete" : "Löschen", + "Details" : "Details", "Error" : "Fehler", "Upload" : "Hochladen", "New folder" : "Neuer Ordner", @@ -16,7 +18,6 @@ "%2$s deleted %1$s" : "%2$s löschte %1$s", "Save" : "Speichern", "Settings" : "Einstellungen", - "Cancel upload" : "Hochladen abbrechen", - "Delete" : "Löschen" + "Cancel upload" : "Hochladen abbrechen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 34c6c8fb4a6..9a75b417ace 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", "Actions" : "Aktionen", "Download" : "Herunterladen", + "Rename" : "Umbenennen", + "Delete" : "Löschen", + "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", "Unable to determine date" : "Datum konnte nicht ermittelt werden", @@ -105,7 +108,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!", "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Select all" : "Alle auswählen", - "Delete" : "Löschen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 390e5e0e575..910ad9ac6aa 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", "Actions" : "Aktionen", "Download" : "Herunterladen", + "Rename" : "Umbenennen", + "Delete" : "Löschen", + "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", "Unable to determine date" : "Datum konnte nicht ermittelt werden", @@ -103,7 +106,6 @@ "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!", "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Select all" : "Alle auswählen", - "Delete" : "Löschen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index fe65869c3bb..063c9f0fe44 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.", "Actions" : "Ενέργειες", "Download" : "Λήψη", + "Rename" : "Μετονομασία", + "Delete" : "Διαγραφή", + "Details" : "Λεπτομέρειες", "Select" : "Επιλογή", "Pending" : "Εκκρεμεί", "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "Ο %2$s διέγραψε %1$s", "You restored %1$s" : "Επαναφέρατε %1$s", "%2$s restored %1$s" : "%2$s επανέφερε %1$s", + "Changed by %2$s" : "Άλλαξε από %2$s", + "Deleted by %2$s" : "Διαγράφηκε από %2$s", + "Restored by %2$s" : "Επαναφορά απο %2$s", "%s could not be renamed as it has been deleted" : "%s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί", "%s could not be renamed" : "Αδυναμία μετονομασίας του %s", "Upload (max. %s)" : "Διαμοιρασμός (max. %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!", "No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο", "Select all" : "Επιλογή όλων", - "Delete" : "Διαγραφή", "Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.", "Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 37ff95b406e..b374964c8b6 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.", "Actions" : "Ενέργειες", "Download" : "Λήψη", + "Rename" : "Μετονομασία", + "Delete" : "Διαγραφή", + "Details" : "Λεπτομέρειες", "Select" : "Επιλογή", "Pending" : "Εκκρεμεί", "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "Ο %2$s διέγραψε %1$s", "You restored %1$s" : "Επαναφέρατε %1$s", "%2$s restored %1$s" : "%2$s επανέφερε %1$s", + "Changed by %2$s" : "Άλλαξε από %2$s", + "Deleted by %2$s" : "Διαγράφηκε από %2$s", + "Restored by %2$s" : "Επαναφορά απο %2$s", "%s could not be renamed as it has been deleted" : "%s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί", "%s could not be renamed" : "Αδυναμία μετονομασίας του %s", "Upload (max. %s)" : "Διαμοιρασμός (max. %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!", "No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο", "Select all" : "Επιλογή όλων", - "Delete" : "Διαγραφή", "Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.", "Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index decfe4dcd83..5109eb0743b 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "File upload is in progress. Leaving the page now will cancel the upload.", "Actions" : "Actions", "Download" : "Download", + "Rename" : "Rename", + "Delete" : "Delete", + "Details" : "Details", "Select" : "Select", "Pending" : "Pending", "Unable to determine date" : "Unable to determine date", @@ -101,7 +104,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Upload some content or sync with your devices!", "No entries found in this folder" : "No entries found in this folder", "Select all" : "Select all", - "Delete" : "Delete", "Upload too large" : "Upload too large", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.", "Files are being scanned, please wait." : "Files are being scanned, please wait.", diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index cf06affa55e..1f9acabeda3 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "File upload is in progress. Leaving the page now will cancel the upload.", "Actions" : "Actions", "Download" : "Download", + "Rename" : "Rename", + "Delete" : "Delete", + "Details" : "Details", "Select" : "Select", "Pending" : "Pending", "Unable to determine date" : "Unable to determine date", @@ -99,7 +102,6 @@ "Upload some content or sync with your devices!" : "Upload some content or sync with your devices!", "No entries found in this folder" : "No entries found in this folder", "Select all" : "Select all", - "Delete" : "Delete", "Upload too large" : "Upload too large", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.", "Files are being scanned, please wait." : "Files are being scanned, please wait.", diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index 3c208a6bc17..b881c3d9d01 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -31,6 +31,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", "Actions" : "Agoj", "Download" : "Elŝuti", + "Rename" : "Alinomigi", + "Delete" : "Forigi", + "Details" : "Detaloj", "Select" : "Elekti", "Pending" : "Traktotaj", "Error moving file" : "Eraris movo de dosiero", @@ -76,7 +79,6 @@ OC.L10N.register( "Cancel upload" : "Nuligi alŝuton", "No files in here" : "Neniu dosiero estas ĉi tie", "Select all" : "Elekti ĉion", - "Delete" : "Forigi", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi." diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index bf69b68d883..93f3bdbede1 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -29,6 +29,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", "Actions" : "Agoj", "Download" : "Elŝuti", + "Rename" : "Alinomigi", + "Delete" : "Forigi", + "Details" : "Detaloj", "Select" : "Elekti", "Pending" : "Traktotaj", "Error moving file" : "Eraris movo de dosiero", @@ -74,7 +77,6 @@ "Cancel upload" : "Nuligi alŝuton", "No files in here" : "Neniu dosiero estas ĉi tie", "Select all" : "Elekti ĉion", - "Delete" : "Forigi", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi." diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 318a86e5884..15062395e40 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", "Download" : "Descargar", + "Rename" : "Renombrar", + "Delete" : "Eliminar", + "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendiente", "Unable to determine date" : "No se pudo determinar la fecha", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s ha eliminado %1$s", "You restored %1$s" : "Usted restauró %1$s", "%2$s restored %1$s" : "%2$s recuperó %1$s", + "Changed by %2$s" : "Cambiado por %2$s", + "Deleted by %2$s" : "Eliminado por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado", "%s could not be renamed" : "%s no pudo ser renombrado", "Upload (max. %s)" : "Subida (máx. %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.", "No entries found in this folder" : "No hay entradas en esta carpeta", "Select all" : "Seleccionar todo", - "Delete" : "Eliminar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.", diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 26761bf2073..4ce106ea4b5 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", "Download" : "Descargar", + "Rename" : "Renombrar", + "Delete" : "Eliminar", + "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendiente", "Unable to determine date" : "No se pudo determinar la fecha", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s ha eliminado %1$s", "You restored %1$s" : "Usted restauró %1$s", "%2$s restored %1$s" : "%2$s recuperó %1$s", + "Changed by %2$s" : "Cambiado por %2$s", + "Deleted by %2$s" : "Eliminado por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado", "%s could not be renamed" : "%s no pudo ser renombrado", "Upload (max. %s)" : "Subida (máx. %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.", "No entries found in this folder" : "No hay entradas en esta carpeta", "Select all" : "Seleccionar todo", - "Delete" : "Eliminar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.", diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js index f99464401b6..f81f0e6bed1 100644 --- a/apps/files/l10n/es_AR.js +++ b/apps/files/l10n/es_AR.js @@ -31,6 +31,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.", "Actions" : "Acciones", "Download" : "Descargar", + "Rename" : "Cambiar nombre", + "Delete" : "Borrar", + "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendientes", "Error moving file" : "Error moviendo el archivo", @@ -75,7 +78,6 @@ OC.L10N.register( "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>", "Cancel upload" : "Cancelar subida", - "Delete" : "Borrar", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá." diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json index 43dc9d35c3c..a9d5c8ece30 100644 --- a/apps/files/l10n/es_AR.json +++ b/apps/files/l10n/es_AR.json @@ -29,6 +29,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.", "Actions" : "Acciones", "Download" : "Descargar", + "Rename" : "Cambiar nombre", + "Delete" : "Borrar", + "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendientes", "Error moving file" : "Error moviendo el archivo", @@ -73,7 +76,6 @@ "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>", "Cancel upload" : "Cancelar subida", - "Delete" : "Borrar", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá." diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js index c6269cdafd1..9b0929f50af 100644 --- a/apps/files/l10n/es_CL.js +++ b/apps/files/l10n/es_CL.js @@ -4,6 +4,8 @@ OC.L10N.register( "Unknown error" : "Error desconocido", "Files" : "Archivos", "Download" : "Descargar", + "Rename" : "Renombrar", + "Details" : "detalles", "Error" : "Error", "Upload" : "Subir", "New folder" : "Nuevo directorio", diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json index 75215c9cb7f..57c23a61ea7 100644 --- a/apps/files/l10n/es_CL.json +++ b/apps/files/l10n/es_CL.json @@ -2,6 +2,8 @@ "Unknown error" : "Error desconocido", "Files" : "Archivos", "Download" : "Descargar", + "Rename" : "Renombrar", + "Details" : "detalles", "Error" : "Error", "Upload" : "Subir", "New folder" : "Nuevo directorio", diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index b58037005aa..5502733d2e2 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -31,6 +31,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", "Download" : "Descargar", + "Rename" : "Renombrar", + "Delete" : "Eliminar", + "Details" : "Detalles", "Pending" : "Pendiente", "Error moving file" : "Error moviendo archivo", "Error" : "Error", @@ -56,6 +59,9 @@ OC.L10N.register( "Text file" : "Archivo de texto", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", + "You created %1$s" : "Has creado %1$s", + "You changed %1$s" : "Has cambiado %1$s", + "You deleted %1$s" : "Has eliminado %1$s", "%s could not be renamed" : "%s no pudo ser renombrado", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", @@ -65,7 +71,6 @@ OC.L10N.register( "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>", "Cancel upload" : "Cancelar subida", - "Delete" : "Eliminar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere." diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 5655fd4bf09..22918fae182 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -29,6 +29,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", "Download" : "Descargar", + "Rename" : "Renombrar", + "Delete" : "Eliminar", + "Details" : "Detalles", "Pending" : "Pendiente", "Error moving file" : "Error moviendo archivo", "Error" : "Error", @@ -54,6 +57,9 @@ "Text file" : "Archivo de texto", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", + "You created %1$s" : "Has creado %1$s", + "You changed %1$s" : "Has cambiado %1$s", + "You deleted %1$s" : "Has eliminado %1$s", "%s could not be renamed" : "%s no pudo ser renombrado", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", @@ -63,7 +69,6 @@ "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>", "Cancel upload" : "Cancelar subida", - "Delete" : "Eliminar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere." diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index 173c6d5503a..86bda48300b 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", "Actions" : "Tegevused", "Download" : "Lae alla", + "Rename" : "Nimeta ümber", + "Delete" : "Kustuta", + "Details" : "Üksikasjad", "Select" : "Vali", "Pending" : "Ootel", "Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud", @@ -106,7 +109,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!", "No entries found in this folder" : "Selles kaustast ei leitud kirjeid", "Select all" : "Vali kõik", - "Delete" : "Kustuta", "Upload too large" : "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", "Files are being scanned, please wait." : "Faile skannitakse, palun oota.", diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index d880d3d4720..a95de6cf039 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", "Actions" : "Tegevused", "Download" : "Lae alla", + "Rename" : "Nimeta ümber", + "Delete" : "Kustuta", + "Details" : "Üksikasjad", "Select" : "Vali", "Pending" : "Ootel", "Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud", @@ -104,7 +107,6 @@ "Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!", "No entries found in this folder" : "Selles kaustast ei leitud kirjeid", "Select all" : "Vali kõik", - "Delete" : "Kustuta", "Upload too large" : "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", "Files are being scanned, please wait." : "Faile skannitakse, palun oota.", diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index 249e73b1871..c01afc96c55 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", "Actions" : "Ekintzak", "Download" : "Deskargatu", + "Rename" : "Berrizendatu", + "Delete" : "Ezabatu", + "Details" : "Xehetasunak", "Select" : "hautatu", "Pending" : "Zain", "Unable to determine date" : "Ezin izan da data zehaztu", @@ -96,7 +99,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!", "No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan", "Select all" : "Hautatu dena", - "Delete" : "Ezabatu", "Upload too large" : "Igoera handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", "Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.", diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index 5e610f3f4fa..997e8bf73cf 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", "Actions" : "Ekintzak", "Download" : "Deskargatu", + "Rename" : "Berrizendatu", + "Delete" : "Ezabatu", + "Details" : "Xehetasunak", "Select" : "hautatu", "Pending" : "Zain", "Unable to determine date" : "Ezin izan da data zehaztu", @@ -94,7 +97,6 @@ "Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!", "No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan", "Select all" : "Hautatu dena", - "Delete" : "Ezabatu", "Upload too large" : "Igoera handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", "Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.", diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index 984c53c3740..b053d4af79b 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -1,9 +1,16 @@ OC.L10N.register( "files", { + "Storage not available" : "فضای ذخیره سازی موجود نیست", + "Storage invalid" : "فضای ذخیرهسازی نامعتبر", "Unknown error" : "خطای نامشخص", "Could not move %s - File with this name already exists" : "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ", "Could not move %s" : "%s نمی تواند حرکت کند ", + "Permission denied" : "رد دسترسی", + "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.", + "The name %s is already used in the folder %s. Please choose a different name." : "نام %s هماکنون در پوشه %s مورد استفاده قرار گرفته شده است. لطفا نام دیگری انتخاب کنید.", + "Error when creating the file" : "خطا در حین ایجاد فایل", + "Error when creating the folder" : "خطا در حین ایجاد پوشه", "Unable to set upload directory." : "قادر به تنظیم پوشه آپلود نمی باشد.", "Invalid Token" : "رمز نامعتبر", "No file was uploaded. Unknown error" : "هیچ فایلی آپلود نشد.خطای ناشناس", @@ -15,30 +22,65 @@ OC.L10N.register( "Missing a temporary folder" : "یک پوشه موقت گم شده", "Failed to write to disk" : "نوشتن بر روی دیسک سخت ناموفق بود", "Not enough storage available" : "فضای کافی در دسترس نیست", + "Upload failed. Could not find uploaded file" : "خطا در آپلود. امکان یافتن فایلهای آپلود شده وجود ندارد", + "Upload failed. Could not get file info." : "خطای آپلود. امکان دریافت جزئیات فایل وجود ندارد.", "Invalid directory." : "فهرست راهنما نامعتبر می باشد.", "Files" : "پروندهها", + "All files" : "تمامی فایلها", "Favorites" : "موارد محبوب", "Home" : "خانه", "Close" : "بستن", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشهای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد", + "Total file size {size1} exceeds upload limit {size2}" : "مجموع سایز {size1} بیشتر از محدودیت آپلود {size2} است", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "ظرفیت لازم وجود ندارد، شما آپلودی با حجم {size1} را انجام میدهید اما تنها {size2} فضا باقی مانده است", "Upload cancelled." : "بار گذاری لغو شد", + "Could not get result from server." : "امکان دریافت نتایج از سرور وجود ندارد.", "File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", "Actions" : "فعالیت ها", "Download" : "دانلود", + "Rename" : "تغییرنام", + "Delete" : "حذف", + "Details" : "جزئیات", + "Select" : "انتخاب", "Pending" : "در انتظار", + "Unable to determine date" : "امکان تعیین تاریخ وجود ندارد", + "This operation is forbidden" : "این عملیات غیرمجاز است", + "This directory is unavailable, please check the logs or contact the administrator" : "پوشه در دسترس نیست، لطفا لاگها را بررسی کنید یا به مدیر سیستم اطلاع دهید", + "Error moving file." : "خطا در انتقال فایل.", + "Error moving file" : "خطا در انتقال فایل", "Error" : "خطا", "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.", + "Could not rename file" : "امکان تغییر نام وجود ندارد", + "Could not create file" : "امکان ایجاد فایل وجود ندارد", + "Could not create folder" : "امکان ایجاد پوشه وجود ندارد", + "Error deleting file." : "خطا در حذف فایل.", + "No entries in this folder match '{filter}'" : "هیچ ورودیای با '{filter}' تطبیق ندارد", "Name" : "نام", "Size" : "اندازه", "Modified" : "تاریخ", + "_%n folder_::_%n folders_" : ["%n پوشه"], + "_%n file_::_%n files_" : ["%n فایل"], + "{dirs} and {files}" : "{dirs} و {files}", + "You don’t have permission to upload or create files here" : "شما دسترسی مجاز برای آپلود یا ایجاد فایل در اینجا را ندارید", "_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل"], "New" : "جدید", + "\"{name}\" is an invalid file name." : "\"{name}\" نامی نامعتبر برای فایل است.", "File name cannot be empty." : "نام پرونده نمی تواند خالی باشد.", + "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}'"], + "Path" : "مسیر", + "_%n byte_::_%n bytes_" : ["%n بایت"], + "Favorited" : "برگزیده شده", + "Favorite" : "برگزیده", + "{newname} already exists" : "{newname} هماکنون وجود دارد", "Upload" : "بارگزاری", "Text file" : "فایل متنی", "Folder" : "پوشه", "New folder" : "پوشه جدید", + "An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسبها رخ داده است", "A new file or folder has been <strong>created</strong>" : "فایل یا پوشه ای <strong>ایجاد</strong> شد", "A file or folder has been <strong>changed</strong>" : "فایل یا پوشه ای به <strong>تغییر</strong> یافت", "A file or folder has been <strong>deleted</strong>" : "فایل یا پوشه ای به <strong>حذف</strong> شد", @@ -52,18 +94,30 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s مورد %1$s را حذف کرد", "You restored %1$s" : "شما %1$s را بازگردانی کردید", "%2$s restored %1$s" : "%2$s %1$s را بازگردانی کرد", + "Changed by %2$s" : "تغییریافته توسط %2$s", + "Deleted by %2$s" : "حذف شده توسط %2$s", + "Restored by %2$s" : "بازگردانی شده توسط %2$s", + "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد", "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", + "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", "File handling" : "اداره پرونده ها", "Maximum upload size" : "حداکثر اندازه بارگزاری", "max. possible: " : "حداکثرمقدارممکن:", "Save" : "ذخیره", + "Can not be edited from here due to insufficient permissions." : "با توجه به دسترسی محدود، امکان ویرایش از اینجا وجود ندارد.", "Settings" : "تنظیمات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایلهای خود توسط WebDAV دسترسی پیدا کنید</a>", "Cancel upload" : "متوقف کردن بار گذاری", - "Delete" : "حذف", + "No files in here" : "هیچ فایلی اینجا وجود ندارد", + "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگامسازی کنید!", + "No entries found in this folder" : "هیچ ورودیای در این پوشه وجود ندارد", + "Select all" : "انتخاب همه", "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", - "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید" + "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید", + "Currently scanning" : "در حال اسکن", + "No favorites" : "هیچ برگزیده", + "Files and folders you mark as favorite will show up here" : "فایلها و پوشههای انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده میشود" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index 361dbee1a1f..0f745e7f243 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -1,7 +1,14 @@ { "translations": { + "Storage not available" : "فضای ذخیره سازی موجود نیست", + "Storage invalid" : "فضای ذخیرهسازی نامعتبر", "Unknown error" : "خطای نامشخص", "Could not move %s - File with this name already exists" : "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ", "Could not move %s" : "%s نمی تواند حرکت کند ", + "Permission denied" : "رد دسترسی", + "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.", + "The name %s is already used in the folder %s. Please choose a different name." : "نام %s هماکنون در پوشه %s مورد استفاده قرار گرفته شده است. لطفا نام دیگری انتخاب کنید.", + "Error when creating the file" : "خطا در حین ایجاد فایل", + "Error when creating the folder" : "خطا در حین ایجاد پوشه", "Unable to set upload directory." : "قادر به تنظیم پوشه آپلود نمی باشد.", "Invalid Token" : "رمز نامعتبر", "No file was uploaded. Unknown error" : "هیچ فایلی آپلود نشد.خطای ناشناس", @@ -13,30 +20,65 @@ "Missing a temporary folder" : "یک پوشه موقت گم شده", "Failed to write to disk" : "نوشتن بر روی دیسک سخت ناموفق بود", "Not enough storage available" : "فضای کافی در دسترس نیست", + "Upload failed. Could not find uploaded file" : "خطا در آپلود. امکان یافتن فایلهای آپلود شده وجود ندارد", + "Upload failed. Could not get file info." : "خطای آپلود. امکان دریافت جزئیات فایل وجود ندارد.", "Invalid directory." : "فهرست راهنما نامعتبر می باشد.", "Files" : "پروندهها", + "All files" : "تمامی فایلها", "Favorites" : "موارد محبوب", "Home" : "خانه", "Close" : "بستن", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشهای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد", + "Total file size {size1} exceeds upload limit {size2}" : "مجموع سایز {size1} بیشتر از محدودیت آپلود {size2} است", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "ظرفیت لازم وجود ندارد، شما آپلودی با حجم {size1} را انجام میدهید اما تنها {size2} فضا باقی مانده است", "Upload cancelled." : "بار گذاری لغو شد", + "Could not get result from server." : "امکان دریافت نتایج از سرور وجود ندارد.", "File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", "Actions" : "فعالیت ها", "Download" : "دانلود", + "Rename" : "تغییرنام", + "Delete" : "حذف", + "Details" : "جزئیات", + "Select" : "انتخاب", "Pending" : "در انتظار", + "Unable to determine date" : "امکان تعیین تاریخ وجود ندارد", + "This operation is forbidden" : "این عملیات غیرمجاز است", + "This directory is unavailable, please check the logs or contact the administrator" : "پوشه در دسترس نیست، لطفا لاگها را بررسی کنید یا به مدیر سیستم اطلاع دهید", + "Error moving file." : "خطا در انتقال فایل.", + "Error moving file" : "خطا در انتقال فایل", "Error" : "خطا", "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.", + "Could not rename file" : "امکان تغییر نام وجود ندارد", + "Could not create file" : "امکان ایجاد فایل وجود ندارد", + "Could not create folder" : "امکان ایجاد پوشه وجود ندارد", + "Error deleting file." : "خطا در حذف فایل.", + "No entries in this folder match '{filter}'" : "هیچ ورودیای با '{filter}' تطبیق ندارد", "Name" : "نام", "Size" : "اندازه", "Modified" : "تاریخ", + "_%n folder_::_%n folders_" : ["%n پوشه"], + "_%n file_::_%n files_" : ["%n فایل"], + "{dirs} and {files}" : "{dirs} و {files}", + "You don’t have permission to upload or create files here" : "شما دسترسی مجاز برای آپلود یا ایجاد فایل در اینجا را ندارید", "_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل"], "New" : "جدید", + "\"{name}\" is an invalid file name." : "\"{name}\" نامی نامعتبر برای فایل است.", "File name cannot be empty." : "نام پرونده نمی تواند خالی باشد.", + "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}'"], + "Path" : "مسیر", + "_%n byte_::_%n bytes_" : ["%n بایت"], + "Favorited" : "برگزیده شده", + "Favorite" : "برگزیده", + "{newname} already exists" : "{newname} هماکنون وجود دارد", "Upload" : "بارگزاری", "Text file" : "فایل متنی", "Folder" : "پوشه", "New folder" : "پوشه جدید", + "An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسبها رخ داده است", "A new file or folder has been <strong>created</strong>" : "فایل یا پوشه ای <strong>ایجاد</strong> شد", "A file or folder has been <strong>changed</strong>" : "فایل یا پوشه ای به <strong>تغییر</strong> یافت", "A file or folder has been <strong>deleted</strong>" : "فایل یا پوشه ای به <strong>حذف</strong> شد", @@ -50,18 +92,30 @@ "%2$s deleted %1$s" : "%2$s مورد %1$s را حذف کرد", "You restored %1$s" : "شما %1$s را بازگردانی کردید", "%2$s restored %1$s" : "%2$s %1$s را بازگردانی کرد", + "Changed by %2$s" : "تغییریافته توسط %2$s", + "Deleted by %2$s" : "حذف شده توسط %2$s", + "Restored by %2$s" : "بازگردانی شده توسط %2$s", + "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد", "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", + "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", "File handling" : "اداره پرونده ها", "Maximum upload size" : "حداکثر اندازه بارگزاری", "max. possible: " : "حداکثرمقدارممکن:", "Save" : "ذخیره", + "Can not be edited from here due to insufficient permissions." : "با توجه به دسترسی محدود، امکان ویرایش از اینجا وجود ندارد.", "Settings" : "تنظیمات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایلهای خود توسط WebDAV دسترسی پیدا کنید</a>", "Cancel upload" : "متوقف کردن بار گذاری", - "Delete" : "حذف", + "No files in here" : "هیچ فایلی اینجا وجود ندارد", + "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگامسازی کنید!", + "No entries found in this folder" : "هیچ ورودیای در این پوشه وجود ندارد", + "Select all" : "انتخاب همه", "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", - "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید" + "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید", + "Currently scanning" : "در حال اسکن", + "No favorites" : "هیچ برگزیده", + "Files and folders you mark as favorite will show up here" : "فایلها و پوشههای انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده میشود" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index c6615a61234..cf4bb0f5792 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", "Actions" : "Toiminnot", "Download" : "Lataa", + "Rename" : "Nimeä uudelleen", + "Delete" : "Poista", + "Details" : "Tiedot", "Select" : "Valitse", "Pending" : "Odottaa", "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s poisti kohteen %1$s", "You restored %1$s" : "Palautit kohteen %1$s", "%2$s restored %1$s" : "%2$s palautti kohteen %1$s", + "Changed by %2$s" : "Muuttanut %2$s", + "Deleted by %2$s" : "Poistanut %2$s", + "Restored by %2$s" : "Palauttanut %2$s", "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu", "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui", "Upload (max. %s)" : "Lähetys (enintään %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!", "No entries found in this folder" : "Ei kohteita tässä kansiossa", "Select all" : "Valitse kaikki", - "Delete" : "Poista", "Upload too large" : "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index 9be7c66d37a..56417b3c74d 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", "Actions" : "Toiminnot", "Download" : "Lataa", + "Rename" : "Nimeä uudelleen", + "Delete" : "Poista", + "Details" : "Tiedot", "Select" : "Valitse", "Pending" : "Odottaa", "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s poisti kohteen %1$s", "You restored %1$s" : "Palautit kohteen %1$s", "%2$s restored %1$s" : "%2$s palautti kohteen %1$s", + "Changed by %2$s" : "Muuttanut %2$s", + "Deleted by %2$s" : "Poistanut %2$s", + "Restored by %2$s" : "Palauttanut %2$s", "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu", "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui", "Upload (max. %s)" : "Lähetys (enintään %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!", "No entries found in this folder" : "Ei kohteita tässä kansiossa", "Select all" : "Valitse kaikki", - "Delete" : "Poista", "Upload too large" : "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 3b84a6c0c53..0b290eb160a 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", "Actions" : "Actions", "Download" : "Télécharger", + "Rename" : "Renommer", + "Delete" : "Supprimer", + "Details" : "Détails", "Select" : "Sélectionner", "Pending" : "En attente", "Unable to determine date" : "Impossible de déterminer la date", @@ -75,7 +78,7 @@ OC.L10N.register( "{newname} already exists" : "{newname} existe déjà", "Upload" : "Chargement", "Text file" : "Fichier texte", - "New text file.txt" : "Nouveau fichier texte \"file.txt\"", + "New text file.txt" : "Nouveau fichier texte.txt", "Folder" : "Dossier", "New folder" : "Nouveau dossier", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s a supprimé %1$s", "You restored %1$s" : "Vous avez restauré %1$s", "%2$s restored %1$s" : "%2$s a restauré %1$s", + "Changed by %2$s" : "Modifié par %2$s", + "Deleted by %2$s" : "Supprimé par %2$s", + "Restored by %2$s" : "Restauré par %2$s", "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", @@ -106,11 +112,10 @@ OC.L10N.register( "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>", "Cancel upload" : "Annuler l'envoi", - "No files in here" : "Aucun fichier ici", + "No files in here" : "Aucun fichier", "Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !", "No entries found in this folder" : "Aucune entrée trouvée dans ce dossier", "Select all" : "Tout sélectionner", - "Delete" : "Supprimer", "Upload too large" : "Téléversement trop volumineux", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.", "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 4d05b5a42c3..5f51bdee302 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", "Actions" : "Actions", "Download" : "Télécharger", + "Rename" : "Renommer", + "Delete" : "Supprimer", + "Details" : "Détails", "Select" : "Sélectionner", "Pending" : "En attente", "Unable to determine date" : "Impossible de déterminer la date", @@ -73,7 +76,7 @@ "{newname} already exists" : "{newname} existe déjà", "Upload" : "Chargement", "Text file" : "Fichier texte", - "New text file.txt" : "Nouveau fichier texte \"file.txt\"", + "New text file.txt" : "Nouveau fichier texte.txt", "Folder" : "Dossier", "New folder" : "Nouveau dossier", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s a supprimé %1$s", "You restored %1$s" : "Vous avez restauré %1$s", "%2$s restored %1$s" : "%2$s a restauré %1$s", + "Changed by %2$s" : "Modifié par %2$s", + "Deleted by %2$s" : "Supprimé par %2$s", + "Restored by %2$s" : "Restauré par %2$s", "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", @@ -104,11 +110,10 @@ "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>", "Cancel upload" : "Annuler l'envoi", - "No files in here" : "Aucun fichier ici", + "No files in here" : "Aucun fichier", "Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !", "No entries found in this folder" : "Aucune entrée trouvée dans ce dossier", "Select all" : "Tout sélectionner", - "Delete" : "Supprimer", "Upload too large" : "Téléversement trop volumineux", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.", "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index 4293b3ab9ba..2910ab97ea4 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.", "Actions" : "Accións", "Download" : "Descargar", + "Rename" : "Renomear", + "Delete" : "Eliminar", + "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendentes", "Unable to determine date" : "Non é posíbel determinar a data", @@ -107,7 +110,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!", "No entries found in this folder" : "Non se atoparon entradas neste cartafol", "Select all" : "Seleccionar todo", - "Delete" : "Eliminar", "Upload too large" : "Envío grande de máis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor", "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index 34eeaa6a369..386df1569a9 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.", "Actions" : "Accións", "Download" : "Descargar", + "Rename" : "Renomear", + "Delete" : "Eliminar", + "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendentes", "Unable to determine date" : "Non é posíbel determinar a data", @@ -105,7 +108,6 @@ "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!", "No entries found in this folder" : "Non se atoparon entradas neste cartafol", "Select all" : "Seleccionar todo", - "Delete" : "Eliminar", "Upload too large" : "Envío grande de máis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor", "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index 94956cbff0e..1eaf54aad71 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -24,6 +24,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", "Actions" : "פעולות", "Download" : "הורדה", + "Rename" : "שינוי שם", + "Delete" : "מחיקה", + "Details" : "פרטים", "Select" : "בחר", "Pending" : "ממתין", "Error" : "שגיאה", @@ -57,7 +60,6 @@ OC.L10N.register( "Settings" : "הגדרות", "WebDAV" : "WebDAV", "Cancel upload" : "ביטול ההעלאה", - "Delete" : "מחיקה", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין." diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index 8dfc57f3276..fe56eef25c2 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -22,6 +22,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", "Actions" : "פעולות", "Download" : "הורדה", + "Rename" : "שינוי שם", + "Delete" : "מחיקה", + "Details" : "פרטים", "Select" : "בחר", "Pending" : "ממתין", "Error" : "שגיאה", @@ -55,7 +58,6 @@ "Settings" : "הגדרות", "WebDAV" : "WebDAV", "Cancel upload" : "ביטול ההעלאה", - "Delete" : "מחיקה", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין." diff --git a/apps/files/l10n/hi.js b/apps/files/l10n/hi.js index c040105875d..2a546af9b1e 100644 --- a/apps/files/l10n/hi.js +++ b/apps/files/l10n/hi.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Files" : "फाइलें ", "Close" : "बंद करें ", + "Details" : "विवरण ", "Error" : "त्रुटि", "Upload" : "अपलोड ", "New folder" : "नया फ़ोल्डर", diff --git a/apps/files/l10n/hi.json b/apps/files/l10n/hi.json index 70db8f9d7f1..47830eca416 100644 --- a/apps/files/l10n/hi.json +++ b/apps/files/l10n/hi.json @@ -1,6 +1,7 @@ { "translations": { "Files" : "फाइलें ", "Close" : "बंद करें ", + "Details" : "विवरण ", "Error" : "त्रुटि", "Upload" : "अपलोड ", "New folder" : "नया फ़ोल्डर", diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js index 379d43f4dbd..d6e48d1da13 100644 --- a/apps/files/l10n/hr.js +++ b/apps/files/l10n/hr.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", "Download" : "Preuzimanje", + "Rename" : "Preimenujte", + "Delete" : "Izbrišite", + "Details" : "Detalji", "Select" : "Selektiraj", "Pending" : "Na čekanju", "Unable to determine date" : "Nemogucnost odredjivanja datuma", @@ -96,7 +99,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Aplodujte neki sadrzaj ili sinkronizirajte sa vasim uredjajem!", "No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ", "Select all" : "Selektiraj sve", - "Delete" : "Izbrišite", "Upload too large" : "Unos je prevelik", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.", "Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.", diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json index a8d935848ea..99f7737b66c 100644 --- a/apps/files/l10n/hr.json +++ b/apps/files/l10n/hr.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", "Download" : "Preuzimanje", + "Rename" : "Preimenujte", + "Delete" : "Izbrišite", + "Details" : "Detalji", "Select" : "Selektiraj", "Pending" : "Na čekanju", "Unable to determine date" : "Nemogucnost odredjivanja datuma", @@ -94,7 +97,6 @@ "Upload some content or sync with your devices!" : "Aplodujte neki sadrzaj ili sinkronizirajte sa vasim uredjajem!", "No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ", "Select all" : "Selektiraj sve", - "Delete" : "Izbrišite", "Upload too large" : "Unos je prevelik", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.", "Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.", diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js index 8b9b7c17f15..5eff7a8f842 100644 --- a/apps/files/l10n/hu_HU.js +++ b/apps/files/l10n/hu_HU.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.", "Actions" : "Műveletek", "Download" : "Letöltés", + "Rename" : "Átnevezés", + "Delete" : "Törlés", + "Details" : "Részletek", "Select" : "Kiválaszt", "Pending" : "Folyamatban", "Unable to determine date" : "Nem lehet meghatározni a dátumot", @@ -93,9 +96,12 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s törölte: %1$s", "You restored %1$s" : "Visszatöltötted %1$s", "%2$s restored %1$s" : "%1$s visszatöltötte %2$s", + "Changed by %2$s" : "Megváltoztatta: %2$s", + "Deleted by %2$s" : "Törölte: %2$s", + "Restored by %2$s" : "Visszaállította: %2$s", "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett", "%s could not be renamed" : "%s átnevezése nem sikerült", - "Upload (max. %s)" : "Feltöltés (max. %s)", + "Upload (max. %s)" : "Feltöltés (max.: %s)", "File handling" : "Fájlkezelés", "Maximum upload size" : "Maximális feltölthető fájlméret", "max. possible: " : "max. lehetséges: ", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel!", "No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban", "Select all" : "Összes kijelölése", - "Delete" : "Törlés", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.", "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json index 6d82cd60413..da5eed09733 100644 --- a/apps/files/l10n/hu_HU.json +++ b/apps/files/l10n/hu_HU.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.", "Actions" : "Műveletek", "Download" : "Letöltés", + "Rename" : "Átnevezés", + "Delete" : "Törlés", + "Details" : "Részletek", "Select" : "Kiválaszt", "Pending" : "Folyamatban", "Unable to determine date" : "Nem lehet meghatározni a dátumot", @@ -91,9 +94,12 @@ "%2$s deleted %1$s" : "%2$s törölte: %1$s", "You restored %1$s" : "Visszatöltötted %1$s", "%2$s restored %1$s" : "%1$s visszatöltötte %2$s", + "Changed by %2$s" : "Megváltoztatta: %2$s", + "Deleted by %2$s" : "Törölte: %2$s", + "Restored by %2$s" : "Visszaállította: %2$s", "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett", "%s could not be renamed" : "%s átnevezése nem sikerült", - "Upload (max. %s)" : "Feltöltés (max. %s)", + "Upload (max. %s)" : "Feltöltés (max.: %s)", "File handling" : "Fájlkezelés", "Maximum upload size" : "Maximális feltölthető fájlméret", "max. possible: " : "max. lehetséges: ", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel!", "No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban", "Select all" : "Összes kijelölése", - "Delete" : "Törlés", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.", "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", diff --git a/apps/files/l10n/hy.js b/apps/files/l10n/hy.js index 9ddfc91b18b..62bc84d6c7b 100644 --- a/apps/files/l10n/hy.js +++ b/apps/files/l10n/hy.js @@ -1,9 +1,18 @@ OC.L10N.register( "files", { + "Files" : "Ֆայլեր", "Close" : "Փակել", "Download" : "Բեռնել", + "Rename" : "Վերանվանել", + "Delete" : "Ջնջել", + "Select" : "Նշել", + "Name" : "Անուն", + "Size" : "Չափս", + "New" : "Նոր", + "Folder" : "Պանակ", + "New folder" : "Նոր պանակ", "Save" : "Պահպանել", - "Delete" : "Ջնջել" + "Select all" : "Նշել բոլորը" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hy.json b/apps/files/l10n/hy.json index 2c9d1859b12..c5afd306272 100644 --- a/apps/files/l10n/hy.json +++ b/apps/files/l10n/hy.json @@ -1,7 +1,16 @@ { "translations": { + "Files" : "Ֆայլեր", "Close" : "Փակել", "Download" : "Բեռնել", + "Rename" : "Վերանվանել", + "Delete" : "Ջնջել", + "Select" : "Նշել", + "Name" : "Անուն", + "Size" : "Չափս", + "New" : "Նոր", + "Folder" : "Պանակ", + "New folder" : "Նոր պանակ", "Save" : "Պահպանել", - "Delete" : "Ջնջել" + "Select all" : "Նշել բոլորը" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js index 9b5d321937e..84f3b4d8c45 100644 --- a/apps/files/l10n/ia.js +++ b/apps/files/l10n/ia.js @@ -9,6 +9,7 @@ OC.L10N.register( "Home" : "Domo", "Close" : "Clauder", "Download" : "Discargar", + "Delete" : "Deler", "Error" : "Error", "Name" : "Nomine", "Size" : "Dimension", @@ -36,7 +37,6 @@ OC.L10N.register( "Maximum upload size" : "Dimension maxime de incargamento", "Save" : "Salveguardar", "Settings" : "Configurationes", - "Delete" : "Deler", "Upload too large" : "Incargamento troppo longe" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json index 461634d526a..2843f8789ac 100644 --- a/apps/files/l10n/ia.json +++ b/apps/files/l10n/ia.json @@ -7,6 +7,7 @@ "Home" : "Domo", "Close" : "Clauder", "Download" : "Discargar", + "Delete" : "Deler", "Error" : "Error", "Name" : "Nomine", "Size" : "Dimension", @@ -34,7 +35,6 @@ "Maximum upload size" : "Dimension maxime de incargamento", "Save" : "Salveguardar", "Settings" : "Configurationes", - "Delete" : "Deler", "Upload too large" : "Incargamento troppo longe" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index e41d94643a9..f02a6d79c4d 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.", "Actions" : "Tindakan", "Download" : "Unduh", + "Rename" : "Ubah nama", + "Delete" : "Hapus", + "Details" : "Rincian", "Select" : "Pilih", "Pending" : "Tertunda", "Unable to determine date" : "Tidak dapat menentukan tanggal", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s menghapus %1$s", "You restored %1$s" : "Anda memulihkan %1$s", "%2$s restored %1$s" : "%2$s memulihkan %1$s", + "Changed by %2$s" : "Diubah oleh %2$s", + "Deleted by %2$s" : "Dihapus oleh %2$s", + "Restored by %2$s" : "Dipulihkan oleh %2$s", "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus", "%s could not be renamed" : "%s tidak dapat diubah nama", "Upload (max. %s)" : "Unggah (maks. %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!", "No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini", "Select all" : "Pilih Semua", - "Delete" : "Hapus", "Upload too large" : "Yang diunggah terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.", "Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.", diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index 6be0c1a226c..773f6b8f5a7 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.", "Actions" : "Tindakan", "Download" : "Unduh", + "Rename" : "Ubah nama", + "Delete" : "Hapus", + "Details" : "Rincian", "Select" : "Pilih", "Pending" : "Tertunda", "Unable to determine date" : "Tidak dapat menentukan tanggal", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s menghapus %1$s", "You restored %1$s" : "Anda memulihkan %1$s", "%2$s restored %1$s" : "%2$s memulihkan %1$s", + "Changed by %2$s" : "Diubah oleh %2$s", + "Deleted by %2$s" : "Dihapus oleh %2$s", + "Restored by %2$s" : "Dipulihkan oleh %2$s", "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus", "%s could not be renamed" : "%s tidak dapat diubah nama", "Upload (max. %s)" : "Unggah (maks. %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!", "No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini", "Select all" : "Pilih Semua", - "Delete" : "Hapus", "Upload too large" : "Yang diunggah terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.", "Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.", diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 7ac24eba462..780dbe4301f 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -17,6 +17,8 @@ OC.L10N.register( "Upload cancelled." : "Hætt við innsendingu.", "File upload is in progress. Leaving the page now will cancel the upload." : "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.", "Download" : "Niðurhal", + "Rename" : "Endurskýra", + "Delete" : "Eyða", "Select" : "Velja", "Pending" : "Bíður", "Error" : "Villa", @@ -38,7 +40,6 @@ OC.L10N.register( "Cancel upload" : "Hætta við innsendingu", "No entries found in this folder" : "Engar skrár fundust í þessari möppu", "Select all" : "Velja allt", - "Delete" : "Eyða", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu." diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index 8e723d963a7..aed9568f7d0 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -15,6 +15,8 @@ "Upload cancelled." : "Hætt við innsendingu.", "File upload is in progress. Leaving the page now will cancel the upload." : "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.", "Download" : "Niðurhal", + "Rename" : "Endurskýra", + "Delete" : "Eyða", "Select" : "Velja", "Pending" : "Bíður", "Error" : "Villa", @@ -36,7 +38,6 @@ "Cancel upload" : "Hætta við innsendingu", "No entries found in this folder" : "Engar skrár fundust í þessari möppu", "Select all" : "Velja allt", - "Delete" : "Eyða", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu." diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index aa92ffc0f70..c8286c66a57 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", "Actions" : "Azioni", "Download" : "Scarica", + "Rename" : "Rinomina", + "Delete" : "Elimina", + "Details" : "Dettagli", "Select" : "Seleziona", "Pending" : "In corso", "Unable to determine date" : "Impossibile determinare la data", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s ha eliminato %1$s", "You restored %1$s" : "Hai ripristinato %1$s", "%2$s restored %1$s" : "%2$s ha ripristinato %1$s", + "Changed by %2$s" : "Modificata da %2$s", + "Deleted by %2$s" : "Eliminata da %2$s", + "Restored by %2$s" : "Ripristinata da %2$s", "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato", "%s could not be renamed" : "%s non può essere rinominato", "Upload (max. %s)" : "Carica (massimo %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!", "No entries found in this folder" : "Nessuna voce trovata in questa cartella", "Select all" : "Seleziona tutto", - "Delete" : "Elimina", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 8f18858b2eb..6f6092c5c15 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", "Actions" : "Azioni", "Download" : "Scarica", + "Rename" : "Rinomina", + "Delete" : "Elimina", + "Details" : "Dettagli", "Select" : "Seleziona", "Pending" : "In corso", "Unable to determine date" : "Impossibile determinare la data", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s ha eliminato %1$s", "You restored %1$s" : "Hai ripristinato %1$s", "%2$s restored %1$s" : "%2$s ha ripristinato %1$s", + "Changed by %2$s" : "Modificata da %2$s", + "Deleted by %2$s" : "Eliminata da %2$s", + "Restored by %2$s" : "Ripristinata da %2$s", "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato", "%s could not be renamed" : "%s non può essere rinominato", "Upload (max. %s)" : "Carica (massimo %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!", "No entries found in this folder" : "Nessuna voce trovata in questa cartella", "Select all" : "Seleziona tutto", - "Delete" : "Elimina", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index 91e75e6e76a..28e0b124a0a 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -30,14 +30,17 @@ OC.L10N.register( "Favorites" : "お気に入り", "Home" : "ホーム", "Close" : "閉じる", + "Upload cancelled." : "アップロードはキャンセルされました。", "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリもしくは0バイトのため {filename} をアップロードできません", "Total file size {size1} exceeds upload limit {size2}" : "合計ファイルサイズ {size1} はアップロード制限 {size2} を超過しています。", "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。", - "Upload cancelled." : "アップロードはキャンセルされました。", "Could not get result from server." : "サーバーから結果を取得できませんでした。", "File upload is in progress. Leaving the page now will cancel the upload." : "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。", "Actions" : "アクション", "Download" : "ダウンロード", + "Rename" : "名前の変更", + "Delete" : "削除", + "Details" : "詳細", "Select" : "選択", "Pending" : "中断", "Unable to determine date" : "更新日不明", @@ -72,8 +75,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n バイト"], "Favorited" : "お気に入り済", "Favorite" : "お気に入り", + "{newname} already exists" : "{newname} はすでに存在します", "Upload" : "アップロード", "Text file" : "テキストファイル", + "New text file.txt" : "新規のテキストファイル作成", "Folder" : "フォルダー", "New folder" : "新しいフォルダー", "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました", @@ -108,7 +113,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。", "No entries found in this folder" : "このフォルダーにはエントリーがありません", "Select all" : "すべて選択", - "Delete" : "削除", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index 7c0c94c0348..46265c531b9 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -28,14 +28,17 @@ "Favorites" : "お気に入り", "Home" : "ホーム", "Close" : "閉じる", + "Upload cancelled." : "アップロードはキャンセルされました。", "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリもしくは0バイトのため {filename} をアップロードできません", "Total file size {size1} exceeds upload limit {size2}" : "合計ファイルサイズ {size1} はアップロード制限 {size2} を超過しています。", "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。", - "Upload cancelled." : "アップロードはキャンセルされました。", "Could not get result from server." : "サーバーから結果を取得できませんでした。", "File upload is in progress. Leaving the page now will cancel the upload." : "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。", "Actions" : "アクション", "Download" : "ダウンロード", + "Rename" : "名前の変更", + "Delete" : "削除", + "Details" : "詳細", "Select" : "選択", "Pending" : "中断", "Unable to determine date" : "更新日不明", @@ -70,8 +73,10 @@ "_%n byte_::_%n bytes_" : ["%n バイト"], "Favorited" : "お気に入り済", "Favorite" : "お気に入り", + "{newname} already exists" : "{newname} はすでに存在します", "Upload" : "アップロード", "Text file" : "テキストファイル", + "New text file.txt" : "新規のテキストファイル作成", "Folder" : "フォルダー", "New folder" : "新しいフォルダー", "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました", @@ -106,7 +111,6 @@ "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。", "No entries found in this folder" : "このフォルダーにはエントリーがありません", "Select all" : "すべて選択", - "Delete" : "削除", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js index 33135feb7cc..c76e75864f9 100644 --- a/apps/files/l10n/ka_GE.js +++ b/apps/files/l10n/ka_GE.js @@ -22,6 +22,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას", "Actions" : "მოქმედებები", "Download" : "ჩამოტვირთვა", + "Rename" : "გადარქმევა", + "Delete" : "წაშლა", + "Details" : "დეტალური ინფორმაცია", "Pending" : "მოცდის რეჟიმში", "Error" : "შეცდომა", "{new_name} already exists" : "{new_name} უკვე არსებობს", @@ -44,7 +47,6 @@ OC.L10N.register( "Settings" : "პარამეტრები", "WebDAV" : "WebDAV", "Cancel upload" : "ატვირთვის გაუქმება", - "Delete" : "წაშლა", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ." diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json index ef3f109d306..058bee2618b 100644 --- a/apps/files/l10n/ka_GE.json +++ b/apps/files/l10n/ka_GE.json @@ -20,6 +20,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას", "Actions" : "მოქმედებები", "Download" : "ჩამოტვირთვა", + "Rename" : "გადარქმევა", + "Delete" : "წაშლა", + "Details" : "დეტალური ინფორმაცია", "Pending" : "მოცდის რეჟიმში", "Error" : "შეცდომა", "{new_name} already exists" : "{new_name} უკვე არსებობს", @@ -42,7 +45,6 @@ "Settings" : "პარამეტრები", "WebDAV" : "WebDAV", "Cancel upload" : "ატვირთვის გაუქმება", - "Delete" : "წაშლა", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ." diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js index 6b8517e7229..030bdd35eda 100644 --- a/apps/files/l10n/km.js +++ b/apps/files/l10n/km.js @@ -10,6 +10,9 @@ OC.L10N.register( "Close" : "បិទ", "Upload cancelled." : "បានបោះបង់ការផ្ទុកឡើង។", "Download" : "ទាញយក", + "Rename" : "ប្ដូរឈ្មោះ", + "Delete" : "លុប", + "Details" : "ព័ត៌មានលម្អិត", "Pending" : "កំពុងរង់ចាំ", "Error" : "កំហុស", "{new_name} already exists" : "មានឈ្មោះ {new_name} រួចហើយ", @@ -33,7 +36,6 @@ OC.L10N.register( "Settings" : "ការកំណត់", "WebDAV" : "WebDAV", "Cancel upload" : "បោះបង់ការផ្ទុកឡើង", - "Delete" : "លុប", "Upload too large" : "ផ្ទុកឡើងធំពេក" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json index ebbb9a8b4ab..679787a5ce2 100644 --- a/apps/files/l10n/km.json +++ b/apps/files/l10n/km.json @@ -8,6 +8,9 @@ "Close" : "បិទ", "Upload cancelled." : "បានបោះបង់ការផ្ទុកឡើង។", "Download" : "ទាញយក", + "Rename" : "ប្ដូរឈ្មោះ", + "Delete" : "លុប", + "Details" : "ព័ត៌មានលម្អិត", "Pending" : "កំពុងរង់ចាំ", "Error" : "កំហុស", "{new_name} already exists" : "មានឈ្មោះ {new_name} រួចហើយ", @@ -31,7 +34,6 @@ "Settings" : "ការកំណត់", "WebDAV" : "WebDAV", "Cancel upload" : "បោះបង់ការផ្ទុកឡើង", - "Delete" : "លុប", "Upload too large" : "ផ្ទុកឡើងធំពេក" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js index 9bd8982fdaf..7538d9b033e 100644 --- a/apps/files/l10n/kn.js +++ b/apps/files/l10n/kn.js @@ -29,6 +29,8 @@ OC.L10N.register( "Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.", "Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.", "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", + "Rename" : "ಮರುಹೆಸರಿಸು", + "Delete" : "ಅಳಿಸಿ", "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", "Pending" : "ಬಾಕಿ ಇದೆ", "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", @@ -64,7 +66,6 @@ OC.L10N.register( "WebDAV" : "WebDAV", "Cancel upload" : "ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ", "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", - "Delete" : "ಅಳಿಸಿ", "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.", "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json index 803b1c87cf4..b9f55d4151a 100644 --- a/apps/files/l10n/kn.json +++ b/apps/files/l10n/kn.json @@ -27,6 +27,8 @@ "Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.", "Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.", "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", + "Rename" : "ಮರುಹೆಸರಿಸು", + "Delete" : "ಅಳಿಸಿ", "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", "Pending" : "ಬಾಕಿ ಇದೆ", "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", @@ -62,7 +64,6 @@ "WebDAV" : "WebDAV", "Cancel upload" : "ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ", "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", - "Delete" : "ಅಳಿಸಿ", "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.", "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index 709e0faa0cb..67b5e869e5e 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -14,7 +14,7 @@ OC.L10N.register( "Unable to set upload directory." : "업로드 디렉터리를 설정할 수 없습니다.", "Invalid Token" : "잘못된 토큰", "No file was uploaded. Unknown error" : "파일이 업로드 되지 않았습니다. 알 수 없는 오류입니다", - "There is no error, the file uploaded with success" : "파일 업로드에 성공하였습니다.", + "There is no error, the file uploaded with success" : "파일 업로드에 성공했습니다.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "업로드한 파일 크기가 HTML 폼의 MAX_FILE_SIZE보다 큼", "The uploaded file was only partially uploaded" : "파일의 일부분만 업로드됨", @@ -30,14 +30,17 @@ OC.L10N.register( "Favorites" : "즐겨찾기", "Home" : "가정", "Close" : "닫기", + "Upload cancelled." : "업로드가 취소되었습니다.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.", "Total file size {size1} exceeds upload limit {size2}" : "총 파일 크기 {size1}이(가) 업로드 제한 {size2}을(를) 초과함", "Not enough free space, you are uploading {size1} but only {size2} is left" : "빈 공간이 부족합니다. 업로드할 파일 크기는 {size1}이지만 현재 {size2}만큼 비었습니다", - "Upload cancelled." : "업로드가 취소되었습니다.", "Could not get result from server." : "서버에서 결과를 가져올 수 없습니다.", "File upload is in progress. Leaving the page now will cancel the upload." : "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.", "Actions" : "작업", "Download" : "다운로드", + "Rename" : "이름 바꾸기", + "Delete" : "삭제", + "Details" : "자세한 정보", "Select" : "선택", "Pending" : "대기 중", "Unable to determine date" : "날짜를 결정할 수 없음", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s 님이 %1$s을(를) 삭제함", "You restored %1$s" : "내가 %1$s을(를) 복원함", "%2$s restored %1$s" : "%2$s 님이 %1$s을(를) 복원함", + "Changed by %2$s" : "%2$s 님이 변경함", + "Deleted by %2$s" : "%2$s 님이 삭제함", + "Restored by %2$s" : "%2$s 님이 복원함", "%s could not be renamed as it has been deleted" : "%s이(가) 삭제되었기 때문에 이름을 변경할 수 없습니다", "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다", "Upload (max. %s)" : "업로드(최대 %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!", "No entries found in this folder" : "이 폴더에 항목 없음", "Select all" : "모두 선택", - "Delete" : "삭제", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", "Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.", diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index e8f89a5c142..3c88e502b1f 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -12,7 +12,7 @@ "Unable to set upload directory." : "업로드 디렉터리를 설정할 수 없습니다.", "Invalid Token" : "잘못된 토큰", "No file was uploaded. Unknown error" : "파일이 업로드 되지 않았습니다. 알 수 없는 오류입니다", - "There is no error, the file uploaded with success" : "파일 업로드에 성공하였습니다.", + "There is no error, the file uploaded with success" : "파일 업로드에 성공했습니다.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "업로드한 파일 크기가 HTML 폼의 MAX_FILE_SIZE보다 큼", "The uploaded file was only partially uploaded" : "파일의 일부분만 업로드됨", @@ -28,14 +28,17 @@ "Favorites" : "즐겨찾기", "Home" : "가정", "Close" : "닫기", + "Upload cancelled." : "업로드가 취소되었습니다.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.", "Total file size {size1} exceeds upload limit {size2}" : "총 파일 크기 {size1}이(가) 업로드 제한 {size2}을(를) 초과함", "Not enough free space, you are uploading {size1} but only {size2} is left" : "빈 공간이 부족합니다. 업로드할 파일 크기는 {size1}이지만 현재 {size2}만큼 비었습니다", - "Upload cancelled." : "업로드가 취소되었습니다.", "Could not get result from server." : "서버에서 결과를 가져올 수 없습니다.", "File upload is in progress. Leaving the page now will cancel the upload." : "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.", "Actions" : "작업", "Download" : "다운로드", + "Rename" : "이름 바꾸기", + "Delete" : "삭제", + "Details" : "자세한 정보", "Select" : "선택", "Pending" : "대기 중", "Unable to determine date" : "날짜를 결정할 수 없음", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s 님이 %1$s을(를) 삭제함", "You restored %1$s" : "내가 %1$s을(를) 복원함", "%2$s restored %1$s" : "%2$s 님이 %1$s을(를) 복원함", + "Changed by %2$s" : "%2$s 님이 변경함", + "Deleted by %2$s" : "%2$s 님이 삭제함", + "Restored by %2$s" : "%2$s 님이 복원함", "%s could not be renamed as it has been deleted" : "%s이(가) 삭제되었기 때문에 이름을 변경할 수 없습니다", "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다", "Upload (max. %s)" : "업로드(최대 %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!", "No entries found in this folder" : "이 폴더에 항목 없음", "Select all" : "모두 선택", - "Delete" : "삭제", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", "Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.", diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js index 513d802c1e4..047aac2dbb3 100644 --- a/apps/files/l10n/lb.js +++ b/apps/files/l10n/lb.js @@ -15,6 +15,9 @@ OC.L10N.register( "Upload cancelled." : "Upload ofgebrach.", "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", "Download" : "Download", + "Rename" : "Ëmbenennen", + "Delete" : "Läschen", + "Details" : "Detailer", "Select" : "Auswielen", "Error" : "Fehler", "Name" : "Numm", @@ -33,7 +36,6 @@ OC.L10N.register( "Cancel upload" : "Upload ofbriechen", "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", "Select all" : "All auswielen", - "Delete" : "Läschen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg." diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json index fb586a90991..f298444a35f 100644 --- a/apps/files/l10n/lb.json +++ b/apps/files/l10n/lb.json @@ -13,6 +13,9 @@ "Upload cancelled." : "Upload ofgebrach.", "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", "Download" : "Download", + "Rename" : "Ëmbenennen", + "Delete" : "Läschen", + "Details" : "Detailer", "Select" : "Auswielen", "Error" : "Fehler", "Name" : "Numm", @@ -31,7 +34,6 @@ "Cancel upload" : "Upload ofbriechen", "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", "Select all" : "All auswielen", - "Delete" : "Läschen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg." diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index 26fb351f50d..063789aae5b 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.", "Actions" : "Veiksmai", "Download" : "Atsisiųsti", + "Rename" : "Pervadinti", + "Delete" : "Ištrinti", + "Details" : "Informacija", "Select" : "Pasirinkiti", "Pending" : "Laukiantis", "Unable to determine date" : "Nepavyksta nustatyti datos", @@ -105,7 +108,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!", "No entries found in this folder" : "Nerasta įrašų šiame aplanke", "Select all" : "Pažymėti viską", - "Delete" : "Ištrinti", "Upload too large" : "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje", "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index ee8fb0480c2..d7aa2cc9c35 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.", "Actions" : "Veiksmai", "Download" : "Atsisiųsti", + "Rename" : "Pervadinti", + "Delete" : "Ištrinti", + "Details" : "Informacija", "Select" : "Pasirinkiti", "Pending" : "Laukiantis", "Unable to determine date" : "Nepavyksta nustatyti datos", @@ -103,7 +106,6 @@ "Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!", "No entries found in this folder" : "Nerasta įrašų šiame aplanke", "Select all" : "Pažymėti viską", - "Delete" : "Ištrinti", "Upload too large" : "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje", "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index e86b2d335e7..fa5ddf4f402 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.", "Actions" : "Darbības", "Download" : "Lejupielādēt", + "Rename" : "Pārsaukt", + "Delete" : "Dzēst", + "Details" : "Detaļas", "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", "Unable to determine date" : "Neizdevās noteikt datumu", @@ -98,7 +101,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!", "No entries found in this folder" : "Šajā mapē nekas nav atrasts", "Select all" : "Atzīmēt visu", - "Delete" : "Dzēst", "Upload too large" : "Datne ir par lielu, lai to augšupielādētu", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu", "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index 7a5a53c1305..b164c88e381 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.", "Actions" : "Darbības", "Download" : "Lejupielādēt", + "Rename" : "Pārsaukt", + "Delete" : "Dzēst", + "Details" : "Detaļas", "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", "Unable to determine date" : "Neizdevās noteikt datumu", @@ -96,7 +99,6 @@ "Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!", "No entries found in this folder" : "Šajā mapē nekas nav atrasts", "Select all" : "Atzīmēt visu", - "Delete" : "Dzēst", "Upload too large" : "Datne ir par lielu, lai to augšupielādētu", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu", "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index b9225ac6708..e6265c851e8 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -28,6 +28,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", "Actions" : "Акции", "Download" : "Преземи", + "Rename" : "Преименувај", + "Delete" : "Избриши", + "Details" : "Детали:", "Select" : "Избери", "Pending" : "Чека", "Error moving file" : "Грешка при префрлање на датотека", @@ -63,7 +66,6 @@ OC.L10N.register( "Settings" : "Подесувања", "WebDAV" : "WebDAV", "Cancel upload" : "Откажи прикачување", - "Delete" : "Избриши", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте." diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index e6ce76ecb45..0806f7d0966 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -26,6 +26,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", "Actions" : "Акции", "Download" : "Преземи", + "Rename" : "Преименувај", + "Delete" : "Избриши", + "Details" : "Детали:", "Select" : "Избери", "Pending" : "Чека", "Error moving file" : "Грешка при префрлање на датотека", @@ -61,7 +64,6 @@ "Settings" : "Подесувања", "WebDAV" : "WebDAV", "Cancel upload" : "Откажи прикачување", - "Delete" : "Избриши", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте." diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js index 0bbbe400b28..7ef2afeb84e 100644 --- a/apps/files/l10n/ms_MY.js +++ b/apps/files/l10n/ms_MY.js @@ -13,6 +13,8 @@ OC.L10N.register( "Close" : "Tutup", "Upload cancelled." : "Muatnaik dibatalkan.", "Download" : "Muat turun", + "Rename" : "Namakan", + "Delete" : "Padam", "Pending" : "Dalam proses", "Error" : "Ralat", "Name" : "Nama", @@ -31,7 +33,6 @@ OC.L10N.register( "Save" : "Simpan", "Settings" : "Tetapan", "Cancel upload" : "Batal muat naik", - "Delete" : "Padam", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar." diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json index 071fab23194..aec2dd50949 100644 --- a/apps/files/l10n/ms_MY.json +++ b/apps/files/l10n/ms_MY.json @@ -11,6 +11,8 @@ "Close" : "Tutup", "Upload cancelled." : "Muatnaik dibatalkan.", "Download" : "Muat turun", + "Rename" : "Namakan", + "Delete" : "Padam", "Pending" : "Dalam proses", "Error" : "Ralat", "Name" : "Nama", @@ -29,7 +31,6 @@ "Save" : "Simpan", "Settings" : "Tetapan", "Cancel upload" : "Batal muat naik", - "Delete" : "Padam", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar." diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js index c91f212cf23..3d27173708d 100644 --- a/apps/files/l10n/nb_NO.js +++ b/apps/files/l10n/nb_NO.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.", "Actions" : "Handlinger", "Download" : "Last ned", + "Rename" : "Gi nytt navn", + "Delete" : "Slett", + "Details" : "Detaljer", "Select" : "Velg", "Pending" : "Ventende", "Unable to determine date" : "Kan ikke fastslå datoen", @@ -110,7 +113,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!", "No entries found in this folder" : "Ingen oppføringer funnet i denne mappen", "Select all" : "Velg alle", - "Delete" : "Slett", "Upload too large" : "Filen er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.", "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json index cd476ef3bcf..a7e0cf33b83 100644 --- a/apps/files/l10n/nb_NO.json +++ b/apps/files/l10n/nb_NO.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.", "Actions" : "Handlinger", "Download" : "Last ned", + "Rename" : "Gi nytt navn", + "Delete" : "Slett", + "Details" : "Detaljer", "Select" : "Velg", "Pending" : "Ventende", "Unable to determine date" : "Kan ikke fastslå datoen", @@ -108,7 +111,6 @@ "Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!", "No entries found in this folder" : "Ingen oppføringer funnet i denne mappen", "Select all" : "Velg alle", - "Delete" : "Slett", "Upload too large" : "Filen er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.", "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", diff --git a/apps/files/l10n/nds.js b/apps/files/l10n/nds.js index 7988332fa91..9b28220ae43 100644 --- a/apps/files/l10n/nds.js +++ b/apps/files/l10n/nds.js @@ -1,9 +1,10 @@ OC.L10N.register( "files", { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] + "Files" : "Dateien", + "Delete" : "Löschen", + "Name" : "Name", + "Settings" : "Einstellungen", + "WebDAV" : "WebDAV" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nds.json b/apps/files/l10n/nds.json index ef5fc586755..4ab8de68b35 100644 --- a/apps/files/l10n/nds.json +++ b/apps/files/l10n/nds.json @@ -1,7 +1,8 @@ { "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] + "Files" : "Dateien", + "Delete" : "Löschen", + "Name" : "Name", + "Settings" : "Einstellungen", + "WebDAV" : "WebDAV" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 3470d011dc6..53ec6c1d804 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", "Actions" : "Acties", "Download" : "Downloaden", + "Rename" : "Naam wijzigen", + "Delete" : "Verwijderen", + "Details" : "Details", "Select" : "Selecteer", "Pending" : "In behandeling", "Unable to determine date" : "Kon datum niet vaststellen", @@ -92,6 +95,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s verwijderde %1$s", "You restored %1$s" : "U herstelde %1$s", "%2$s restored %1$s" : "%2$s herstelde %1$s", + "Changed by %2$s" : "Gewijzigd door %2$s", + "Deleted by %2$s" : "Verwijderd door %2$s", + "Restored by %2$s" : "Hersteld door %2$s", "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is", "%s could not be renamed" : "%s kon niet worden hernoemd", "Upload (max. %s)" : "Upload (max. %s)", @@ -109,7 +115,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!", "No entries found in this folder" : "Niets", "Select all" : "Alles selecteren", - "Delete" : "Verwijderen", "Upload too large" : "Upload is te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 04c0b7916b5..6a077b1cc1a 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", "Actions" : "Acties", "Download" : "Downloaden", + "Rename" : "Naam wijzigen", + "Delete" : "Verwijderen", + "Details" : "Details", "Select" : "Selecteer", "Pending" : "In behandeling", "Unable to determine date" : "Kon datum niet vaststellen", @@ -90,6 +93,9 @@ "%2$s deleted %1$s" : "%2$s verwijderde %1$s", "You restored %1$s" : "U herstelde %1$s", "%2$s restored %1$s" : "%2$s herstelde %1$s", + "Changed by %2$s" : "Gewijzigd door %2$s", + "Deleted by %2$s" : "Verwijderd door %2$s", + "Restored by %2$s" : "Hersteld door %2$s", "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is", "%s could not be renamed" : "%s kon niet worden hernoemd", "Upload (max. %s)" : "Upload (max. %s)", @@ -107,7 +113,6 @@ "Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!", "No entries found in this folder" : "Niets", "Select all" : "Alles selecteren", - "Delete" : "Verwijderen", "Upload too large" : "Upload is te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js index cc993f5ca6d..924670d596b 100644 --- a/apps/files/l10n/nn_NO.js +++ b/apps/files/l10n/nn_NO.js @@ -28,6 +28,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.", "Actions" : "Handlingar", "Download" : "Last ned", + "Rename" : "Endra namn", + "Delete" : "Slett", + "Details" : "Detaljar", "Pending" : "Under vegs", "Error moving file" : "Feil ved flytting av fil", "Error" : "Feil", @@ -66,7 +69,6 @@ OC.L10N.register( "Settings" : "Innstillingar", "WebDAV" : "WebDAV", "Cancel upload" : "Avbryt opplasting", - "Delete" : "Slett", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent." diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json index 62d1cfb2c50..05e6f0a9d2d 100644 --- a/apps/files/l10n/nn_NO.json +++ b/apps/files/l10n/nn_NO.json @@ -26,6 +26,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.", "Actions" : "Handlingar", "Download" : "Last ned", + "Rename" : "Endra namn", + "Delete" : "Slett", + "Details" : "Detaljar", "Pending" : "Under vegs", "Error moving file" : "Feil ved flytting av fil", "Error" : "Feil", @@ -64,7 +67,6 @@ "Settings" : "Innstillingar", "WebDAV" : "WebDAV", "Cancel upload" : "Avbryt opplasting", - "Delete" : "Slett", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent." diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js index 75bceacac3b..4e1c7e0a011 100644 --- a/apps/files/l10n/oc.js +++ b/apps/files/l10n/oc.js @@ -30,14 +30,17 @@ OC.L10N.register( "Favorites" : "Favorits", "Home" : "Mos fichièrs", "Close" : "Tampar", + "Upload cancelled." : "Mandadís anullat.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible de mandar {filename} perque s'agís d'un repertòri o d'un fichièr de talha nulla", "Total file size {size1} exceeds upload limit {size2}" : "La talha totala del fichièr {size1} excedís la talha maximala de mandadís {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espaci liure insufisent : ensajatz de mandar {size1} mas solament {size2} son disponibles", - "Upload cancelled." : "Mandadís anullat.", "Could not get result from server." : "Pòt pas recebre los resultats del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "Lo mandadís del fichièr es en cors. Quitar aquesta pagina ara anullarà lo mandadís del fichièr.", "Actions" : "Accions", "Download" : "Telecargar", + "Rename" : "Renomenar", + "Delete" : "Suprimir", + "Details" : "Detalhs", "Select" : "Seleccionar", "Pending" : "En espèra", "Unable to determine date" : "Impossible de determinar la data", @@ -68,6 +71,7 @@ OC.L10N.register( "Favorite" : "Favorit", "Upload" : "Cargament", "Text file" : "Fichièr tèxte", + "New text file.txt" : "Novèl fichièr tèxte .txt", "Folder" : "Dorsièr", "New folder" : "Novèl dorsièr", "An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas", @@ -101,7 +105,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !", "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr", "Select all" : "Seleccionar tot", - "Delete" : "Suprimir", "Upload too large" : "Mandadís tròp voluminós", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.", "Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.", diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json index 20b690a2ed8..108bc5d9de9 100644 --- a/apps/files/l10n/oc.json +++ b/apps/files/l10n/oc.json @@ -28,14 +28,17 @@ "Favorites" : "Favorits", "Home" : "Mos fichièrs", "Close" : "Tampar", + "Upload cancelled." : "Mandadís anullat.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible de mandar {filename} perque s'agís d'un repertòri o d'un fichièr de talha nulla", "Total file size {size1} exceeds upload limit {size2}" : "La talha totala del fichièr {size1} excedís la talha maximala de mandadís {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espaci liure insufisent : ensajatz de mandar {size1} mas solament {size2} son disponibles", - "Upload cancelled." : "Mandadís anullat.", "Could not get result from server." : "Pòt pas recebre los resultats del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "Lo mandadís del fichièr es en cors. Quitar aquesta pagina ara anullarà lo mandadís del fichièr.", "Actions" : "Accions", "Download" : "Telecargar", + "Rename" : "Renomenar", + "Delete" : "Suprimir", + "Details" : "Detalhs", "Select" : "Seleccionar", "Pending" : "En espèra", "Unable to determine date" : "Impossible de determinar la data", @@ -66,6 +69,7 @@ "Favorite" : "Favorit", "Upload" : "Cargament", "Text file" : "Fichièr tèxte", + "New text file.txt" : "Novèl fichièr tèxte .txt", "Folder" : "Dorsièr", "New folder" : "Novèl dorsièr", "An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas", @@ -99,7 +103,6 @@ "Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !", "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr", "Select all" : "Seleccionar tot", - "Delete" : "Suprimir", "Upload too large" : "Mandadís tròp voluminós", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.", "Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.", diff --git a/apps/files/l10n/pa.js b/apps/files/l10n/pa.js index c92f4473ccb..dfb7c392837 100644 --- a/apps/files/l10n/pa.js +++ b/apps/files/l10n/pa.js @@ -4,10 +4,12 @@ OC.L10N.register( "Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ", "Files" : "ਫਾਇਲਾਂ", "Download" : "ਡਾਊਨਲੋਡ", + "Rename" : "ਨਾਂ ਬਦਲੋ", + "Delete" : "ਹਟਾਓ", + "Details" : "ਵੇਰਵ", "Error" : "ਗਲਤੀ", "Upload" : "ਅੱਪਲੋਡ", "Settings" : "ਸੈਟਿੰਗ", - "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ", - "Delete" : "ਹਟਾਓ" + "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/pa.json b/apps/files/l10n/pa.json index 438a0cdb313..c1f4dae97fa 100644 --- a/apps/files/l10n/pa.json +++ b/apps/files/l10n/pa.json @@ -2,10 +2,12 @@ "Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ", "Files" : "ਫਾਇਲਾਂ", "Download" : "ਡਾਊਨਲੋਡ", + "Rename" : "ਨਾਂ ਬਦਲੋ", + "Delete" : "ਹਟਾਓ", + "Details" : "ਵੇਰਵ", "Error" : "ਗਲਤੀ", "Upload" : "ਅੱਪਲੋਡ", "Settings" : "ਸੈਟਿੰਗ", - "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ", - "Delete" : "ਹਟਾਓ" + "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index c64f9c97d60..5cba43675dd 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.", "Actions" : "Akcje", "Download" : "Pobierz", + "Rename" : "Zmień nazwę", + "Delete" : "Usuń", + "Details" : "Szczegóły", "Select" : "Wybierz", "Pending" : "Oczekujące", "Unable to determine date" : "Nie można ustalić daty", @@ -97,7 +100,6 @@ OC.L10N.register( "Cancel upload" : "Anuluj wysyłanie", "No entries found in this folder" : "Brak wpisów w tym folderze", "Select all" : "Wybierz wszystko", - "Delete" : "Usuń", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", "Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.", diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index d5a3c33e698..5b09f326134 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.", "Actions" : "Akcje", "Download" : "Pobierz", + "Rename" : "Zmień nazwę", + "Delete" : "Usuń", + "Details" : "Szczegóły", "Select" : "Wybierz", "Pending" : "Oczekujące", "Unable to determine date" : "Nie można ustalić daty", @@ -95,7 +98,6 @@ "Cancel upload" : "Anuluj wysyłanie", "No entries found in this folder" : "Brak wpisów w tym folderze", "Select all" : "Wybierz wszystko", - "Delete" : "Usuń", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", "Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 7f154cbbf5e..70d38e747ba 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.", "Actions" : "Ações", "Download" : "Baixar", + "Rename" : "Renomear", + "Delete" : "Excluir", + "Details" : "Detalhes", "Select" : "Selecionar", "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s eliminou %1$s", "You restored %1$s" : "Você restaurou %1$s", "%2$s restored %1$s" : "%2$s restaurou %1$s", + "Changed by %2$s" : "Modificado por %2$s", + "Deleted by %2$s" : "Deletado por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado", "%s could not be renamed" : "%s não pode ser renomeado", "Upload (max. %s)" : "Envio (max. %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!", "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Select all" : "Selecionar tudo", - "Delete" : "Excluir", "Upload too large" : "Arquivo muito grande para envio", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 81c76bb2b84..d0023e7d5be 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.", "Actions" : "Ações", "Download" : "Baixar", + "Rename" : "Renomear", + "Delete" : "Excluir", + "Details" : "Detalhes", "Select" : "Selecionar", "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s eliminou %1$s", "You restored %1$s" : "Você restaurou %1$s", "%2$s restored %1$s" : "%2$s restaurou %1$s", + "Changed by %2$s" : "Modificado por %2$s", + "Deleted by %2$s" : "Deletado por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado", "%s could not be renamed" : "%s não pode ser renomeado", "Upload (max. %s)" : "Envio (max. %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!", "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Select all" : "Selecionar tudo", - "Delete" : "Excluir", "Upload too large" : "Arquivo muito grande para envio", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js index 92ce9bd6d10..b395fdd1cd9 100644 --- a/apps/files/l10n/pt_PT.js +++ b/apps/files/l10n/pt_PT.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Envio de ficheiro em progresso. Se deixar a página agora, irá cancelar o envio.", "Actions" : "Ações", "Download" : "Descarregar", + "Rename" : "Renomear", + "Delete" : "Apagar", + "Details" : "Detalhes", "Select" : "Selecionar", "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", @@ -110,7 +113,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com os seus aparelhos!", "No entries found in this folder" : "Não foram encontradas entradas nesta pasta", "Select all" : "Seleccionar todos", - "Delete" : "Apagar", "Upload too large" : "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.", "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json index 99718047020..afa8a67a5d7 100644 --- a/apps/files/l10n/pt_PT.json +++ b/apps/files/l10n/pt_PT.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Envio de ficheiro em progresso. Se deixar a página agora, irá cancelar o envio.", "Actions" : "Ações", "Download" : "Descarregar", + "Rename" : "Renomear", + "Delete" : "Apagar", + "Details" : "Detalhes", "Select" : "Selecionar", "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", @@ -108,7 +111,6 @@ "Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com os seus aparelhos!", "No entries found in this folder" : "Não foram encontradas entradas nesta pasta", "Select all" : "Seleccionar todos", - "Delete" : "Apagar", "Upload too large" : "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.", "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 35753e97da8..83593b4ba8a 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.", "Actions" : "Acțiuni", "Download" : "Descarcă", + "Rename" : "Redenumește", + "Delete" : "Șterge", + "Details" : "Detalii", "Select" : "Alege", "Pending" : "În așteptare", "Error moving file." : "Eroare la mutarea fișierului.", @@ -91,7 +94,6 @@ OC.L10N.register( "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>", "Cancel upload" : "Anulează încărcarea", "Select all" : "Selectează tot", - "Delete" : "Șterge", "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", "Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.", diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index 22d66f8dbf0..a2544bba28d 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.", "Actions" : "Acțiuni", "Download" : "Descarcă", + "Rename" : "Redenumește", + "Delete" : "Șterge", + "Details" : "Detalii", "Select" : "Alege", "Pending" : "În așteptare", "Error moving file." : "Eroare la mutarea fișierului.", @@ -89,7 +92,6 @@ "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>", "Cancel upload" : "Anulează încărcarea", "Select all" : "Selectează tot", - "Delete" : "Șterge", "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", "Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.", diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index 962698709c3..270cc3c6a85 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.", "Actions" : "Действия", "Download" : "Скачать", + "Rename" : "Переименовать", + "Delete" : "Удалить", + "Details" : "Подробно", "Select" : "Выбрать", "Pending" : "Ожидание", "Unable to determine date" : "Невозможно определить дату", @@ -72,8 +75,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"], "Favorited" : "Избранное", "Favorite" : "Избранное", + "{newname} already exists" : "{newname} уже существует", "Upload" : "Загрузить", "Text file" : "Текстовый файл", + "New text file.txt" : "Новый текстовый документ.txt", "Folder" : "Каталог", "New folder" : "Новый каталог", "An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка", @@ -91,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s удалил %1$s", "You restored %1$s" : "Вы восстановили %1$s", "%2$s restored %1$s" : "%2$s восстановил %1$s", + "Changed by %2$s" : "Изменено %2$s", + "Deleted by %2$s" : "Удалено %2$s", + "Restored by %2$s" : "Восстановлено %2$s", "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.", "%s could not be renamed" : "%s не может быть переименован", "Upload (max. %s)" : "Загрузка (максимум %s)", @@ -108,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!", "No entries found in this folder" : "Ничего не найдено", "Select all" : "Выбрать все", - "Delete" : "Удалить", "Upload too large" : "Файл слишком велик", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.", "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 410ef1d9cbe..36aae3834a9 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.", "Actions" : "Действия", "Download" : "Скачать", + "Rename" : "Переименовать", + "Delete" : "Удалить", + "Details" : "Подробно", "Select" : "Выбрать", "Pending" : "Ожидание", "Unable to determine date" : "Невозможно определить дату", @@ -70,8 +73,10 @@ "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"], "Favorited" : "Избранное", "Favorite" : "Избранное", + "{newname} already exists" : "{newname} уже существует", "Upload" : "Загрузить", "Text file" : "Текстовый файл", + "New text file.txt" : "Новый текстовый документ.txt", "Folder" : "Каталог", "New folder" : "Новый каталог", "An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка", @@ -89,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s удалил %1$s", "You restored %1$s" : "Вы восстановили %1$s", "%2$s restored %1$s" : "%2$s восстановил %1$s", + "Changed by %2$s" : "Изменено %2$s", + "Deleted by %2$s" : "Удалено %2$s", + "Restored by %2$s" : "Восстановлено %2$s", "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.", "%s could not be renamed" : "%s не может быть переименован", "Upload (max. %s)" : "Загрузка (максимум %s)", @@ -106,7 +114,6 @@ "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!", "No entries found in this folder" : "Ничего не найдено", "Select all" : "Выбрать все", - "Delete" : "Удалить", "Upload too large" : "Файл слишком велик", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.", "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", diff --git a/apps/files/l10n/si_LK.js b/apps/files/l10n/si_LK.js index ea63cda82dc..60cd10813d9 100644 --- a/apps/files/l10n/si_LK.js +++ b/apps/files/l10n/si_LK.js @@ -14,6 +14,8 @@ OC.L10N.register( "Upload cancelled." : "උඩුගත කිරීම අත් හරින්න ලදී", "File upload is in progress. Leaving the page now will cancel the upload." : "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", "Download" : "බාන්න", + "Rename" : "නැවත නම් කරන්න", + "Delete" : "මකා දමන්න", "Select" : "තෝරන්න", "Error" : "දෝෂයක්", "Name" : "නම", @@ -33,7 +35,6 @@ OC.L10N.register( "Save" : "සුරකින්න", "Settings" : "සිටුවම්", "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", - "Delete" : "මකා දමන්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න" diff --git a/apps/files/l10n/si_LK.json b/apps/files/l10n/si_LK.json index 6cfbe30ff4a..2f910f1d90b 100644 --- a/apps/files/l10n/si_LK.json +++ b/apps/files/l10n/si_LK.json @@ -12,6 +12,8 @@ "Upload cancelled." : "උඩුගත කිරීම අත් හරින්න ලදී", "File upload is in progress. Leaving the page now will cancel the upload." : "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", "Download" : "බාන්න", + "Rename" : "නැවත නම් කරන්න", + "Delete" : "මකා දමන්න", "Select" : "තෝරන්න", "Error" : "දෝෂයක්", "Name" : "නම", @@ -31,7 +33,6 @@ "Save" : "සුරකින්න", "Settings" : "සිටුවම්", "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", - "Delete" : "මකා දමන්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න" diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js index ebe1973a9ed..e2fbf695f81 100644 --- a/apps/files/l10n/sk_SK.js +++ b/apps/files/l10n/sk_SK.js @@ -38,10 +38,14 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", "Actions" : "Akcie", "Download" : "Sťahovanie", + "Rename" : "Premenovať", + "Delete" : "Zmazať", + "Details" : "Podrobnosti", "Select" : "Vybrať", "Pending" : "Čaká", "Unable to determine date" : "Nemožno určiť dátum", "This operation is forbidden" : "Táto operácia je zakázaná", + "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu", "Error moving file." : "Chyba pri presune súboru.", "Error moving file" : "Chyba pri presúvaní súboru", "Error" : "Chyba", @@ -62,18 +66,25 @@ OC.L10N.register( "New" : "Nový", "\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.", "File name cannot be empty." : "Meno súboru nemôže byť prázdne", + "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.", "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!", + "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Vaše úložisko je takmer plné ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'"], + "Path" : "Cesta", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"], "Favorited" : "Pridané k obľúbeným", "Favorite" : "Obľúbené", + "{newname} already exists" : "{newname} už existuje", "Upload" : "Nahrať", "Text file" : "Textový súbor", + "New text file.txt" : "Nový text file.txt", "Folder" : "Priečinok", "New folder" : "Nový priečinok", "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe", "A new file or folder has been <strong>created</strong>" : "Nový súbor alebo priečinok bol <strong>vytvorený</strong>", "A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Obmedzte upozornenia na vytvorenie a zmeny na vaše <strong>obľúbené súbory</strong> <em>(Len streamy)</em>", "A file or folder has been <strong>deleted</strong>" : "Súbor alebo priečinok bol <strong>odstránený</strong>", "A file or folder has been <strong>restored</strong>" : "Súbor alebo priečinok bol <strong>obnovený</strong>", "You created %1$s" : "Vytvorili ste %1$s", @@ -91,7 +102,9 @@ OC.L10N.register( "File handling" : "Nastavenie správania sa k súborom", "Maximum upload size" : "Maximálna veľkosť odosielaného súboru", "max. possible: " : "najväčšie možné:", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.", "Save" : "Uložiť", + "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.", "Settings" : "Nastavenia", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>", @@ -100,7 +113,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!", "No entries found in this folder" : "V tomto priečinku nebolo nič nájdené", "Select all" : "Vybrať všetko", - "Delete" : "Zmazať", "Upload too large" : "Nahrávanie je príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", "Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.", diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json index ccd7a045699..e5748baa4c8 100644 --- a/apps/files/l10n/sk_SK.json +++ b/apps/files/l10n/sk_SK.json @@ -36,10 +36,14 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", "Actions" : "Akcie", "Download" : "Sťahovanie", + "Rename" : "Premenovať", + "Delete" : "Zmazať", + "Details" : "Podrobnosti", "Select" : "Vybrať", "Pending" : "Čaká", "Unable to determine date" : "Nemožno určiť dátum", "This operation is forbidden" : "Táto operácia je zakázaná", + "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu", "Error moving file." : "Chyba pri presune súboru.", "Error moving file" : "Chyba pri presúvaní súboru", "Error" : "Chyba", @@ -60,18 +64,25 @@ "New" : "Nový", "\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.", "File name cannot be empty." : "Meno súboru nemôže byť prázdne", + "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.", "Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!", + "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Vaše úložisko je takmer plné ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'"], + "Path" : "Cesta", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"], "Favorited" : "Pridané k obľúbeným", "Favorite" : "Obľúbené", + "{newname} already exists" : "{newname} už existuje", "Upload" : "Nahrať", "Text file" : "Textový súbor", + "New text file.txt" : "Nový text file.txt", "Folder" : "Priečinok", "New folder" : "Nový priečinok", "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe", "A new file or folder has been <strong>created</strong>" : "Nový súbor alebo priečinok bol <strong>vytvorený</strong>", "A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Obmedzte upozornenia na vytvorenie a zmeny na vaše <strong>obľúbené súbory</strong> <em>(Len streamy)</em>", "A file or folder has been <strong>deleted</strong>" : "Súbor alebo priečinok bol <strong>odstránený</strong>", "A file or folder has been <strong>restored</strong>" : "Súbor alebo priečinok bol <strong>obnovený</strong>", "You created %1$s" : "Vytvorili ste %1$s", @@ -89,7 +100,9 @@ "File handling" : "Nastavenie správania sa k súborom", "Maximum upload size" : "Maximálna veľkosť odosielaného súboru", "max. possible: " : "najväčšie možné:", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.", "Save" : "Uložiť", + "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.", "Settings" : "Nastavenia", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>", @@ -98,7 +111,6 @@ "Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!", "No entries found in this folder" : "V tomto priečinku nebolo nič nájdené", "Select all" : "Vybrať všetko", - "Delete" : "Zmazať", "Upload too large" : "Nahrávanie je príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", "Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.", diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 2d296468d69..7ce39724a98 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.", "Actions" : "Dejanja", "Download" : "Prejmi", + "Rename" : "Preimenuj", + "Delete" : "Izbriši", + "Details" : "Podrobnosti", "Select" : "Izberi", "Pending" : "V čakanju ...", "Unable to determine date" : "Ni mogoče določiti datuma", @@ -103,7 +106,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!", "No entries found in this folder" : "V tej mapi ni najdenih predmetov.", "Select all" : "izberi vse", - "Delete" : "Izbriši", "Upload too large" : "Prekoračenje omejitve velikosti", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.", "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index 0cb69f5f7a1..b4b28f95bf1 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.", "Actions" : "Dejanja", "Download" : "Prejmi", + "Rename" : "Preimenuj", + "Delete" : "Izbriši", + "Details" : "Podrobnosti", "Select" : "Izberi", "Pending" : "V čakanju ...", "Unable to determine date" : "Ni mogoče določiti datuma", @@ -101,7 +104,6 @@ "Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!", "No entries found in this folder" : "V tej mapi ni najdenih predmetov.", "Select all" : "izberi vse", - "Delete" : "Izbriši", "Upload too large" : "Prekoračenje omejitve velikosti", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.", "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js index 2b87c39d968..8f19800cd2a 100644 --- a/apps/files/l10n/sq.js +++ b/apps/files/l10n/sq.js @@ -1,95 +1,125 @@ OC.L10N.register( "files", { - "Storage not available" : "Hapësira e memorizimit nuk është e disponueshme", - "Storage invalid" : "Hapësirë memorizimi e pavlefshme", - "Unknown error" : "Gabim panjohur", - "Could not move %s - File with this name already exists" : "E pa mundur zhvendosja e %s - ekziston nje skedar me te njetin emer", - "Could not move %s" : "Nuk mund të zhvendoset %s", - "Permission denied" : "Nuk ka të drejtë", - "The target folder has been moved or deleted." : "Dosja e destinacionit është zhvendosur ose fshirë.", - "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s është i përdorur në dosjen %s. Ju lutem zgjidhni një emër tjetër.", - "Error when creating the file" : "Gabim gjatë krijimit të skedarit", + "Storage not available" : "Pa depozitë gati", + "Storage invalid" : "Depozitë e pavlefshme", + "Unknown error" : "Gabim i panjohur", + "Could not move %s - File with this name already exists" : "S’u zhvendos dot %s - Ka tashmë kartelë me këtë", + "Could not move %s" : "S’u zhvendos dot %s", + "Permission denied" : "Leje e mohuar", + "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.", + "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s tashmë është i përdorur në dosjen %s. Ju lutemi, zgjidhni një emër tjetër.", + "Error when creating the file" : "Gabim gjatë krijimit të kartelës", "Error when creating the folder" : "Gabim gjatë krijimit të dosjes", - "Unable to set upload directory." : "E pa mundur të vendoset dosja e ngarkimit", - "Invalid Token" : "Shenjë e gabuar", - "No file was uploaded. Unknown error" : "Asnjë skedar nuk u dërgua. Gabim i pa njohur", - "There is no error, the file uploaded with success" : "Skedari u ngarkua me sukses", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Skedari i ngarkuar tejkalon limitin hapsirës së lejuar në php.ini", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Skedari i ngarkuar tejlakon vlerën MAX_FILE_SIZE të përcaktuar në formën HTML", - "The uploaded file was only partially uploaded" : "Skedari është ngakruar vetëm pjesërisht", - "No file was uploaded" : "Asnjë skedar nuk është ngarkuar", - "Missing a temporary folder" : "Mungon dosja e përkohshme", + "Unable to set upload directory." : "S’arrihet të caktohet drejtori ngarkimesh", + "Invalid Token" : "Token i pavlefshëm", + "No file was uploaded. Unknown error" : "S’u ngarkua ndonjë kartelë. Gabim i panjohur", + "There is no error, the file uploaded with success" : "S’pati gabim, kartela u ngarkua me sukses", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Kartela e ngarkuar tejkalon udhëzimin upload_max_filesize directive te php.ini: ", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Kartela e ngarkuar tejkalon udhëzimin MAX_FILE_SIZE që qe përcaktuar te formulari HTML", + "The uploaded file was only partially uploaded" : "Kartela në fjalë u ngarkua vetëm pjesërisht", + "No file was uploaded" : "S’u ngarkua kartelë", + "Missing a temporary folder" : "Mungon një dosje e përkohshme", "Failed to write to disk" : "Dështoi shkrimi në disk", - "Not enough storage available" : "Hapsira e arkivimit e pamjaftueshme", - "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. Nuk mund të gjendet skedari i ngarkuar", - "Upload failed. Could not get file info." : "Ngarkimi dështoi. Nuk mund të gjej informacion mbi skedarin.", - "Invalid directory." : "Dosje e pavlefshme", - "Files" : "Skedarë", - "All files" : "Të gjithë", - "Home" : "Shtëpi", - "Close" : "Mbyll", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nuk mund të ngarkohet {filename} sepse është dosje ose ka 0 byte", - "Total file size {size1} exceeds upload limit {size2}" : "Përmasa totale {size1} e skedarit tejkalon limitin e ngarkimit {size2}", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, ju po ngarkoni {size1} por vetëm {size2} është e lirë", - "Upload cancelled." : "Ngarkimi u anullua", - "Could not get result from server." : "Nuk mund të merret ndonjë rezultat nga serveri.", - "File upload is in progress. Leaving the page now will cancel the upload." : "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin", - "Download" : "Shkarko", - "Pending" : "Në vijim", - "Error moving file." : "Gabim në lëvizjen e skedarëve.", - "Error moving file" : "Gabim lëvizjen dokumentave", + "Not enough storage available" : "S’ka depozitë të mjaftueshme", + "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. S’u gjet dot kartela e ngarkuar", + "Upload failed. Could not get file info." : "Ngarkoi dështoi. S’u morën dot të dhëna kartele.", + "Invalid directory." : "Drejtori e pavlefshme.", + "Files" : "Kartela", + "All files" : "Krejt kartelat", + "Favorites" : "Të parapëlqyera", + "Home" : "Kreu", + "Close" : "Mbylle", + "Upload cancelled." : "Ngarkimi u anulua.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "S’arrihet të ngarkohet {filename}, ngaqë është drejtori ose ka 0 bajte", + "Total file size {size1} exceeds upload limit {size2}" : "Madhësia gjithsej e kartelës {size1} e tejkalon kufirin {size2} për ngarkimet", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, po ngarkoni {size1}, por ka vetëm {size2} të lira", + "Could not get result from server." : "S’mori dot përfundime nga shërbyesi.", + "File upload is in progress. Leaving the page now will cancel the upload." : "Ngarkimi i kartelës është në punë e sipër. Largimi nga faqja do të anulojë ngarkimin.", + "Actions" : "Veprime", + "Download" : "Shkarkoje", + "Rename" : "Riemërtojeni", + "Delete" : "Fshije", + "Details" : "Hollësi", + "Select" : "Përzgjidhe", + "Pending" : "Në pritje", + "Unable to determine date" : "S’arrihet të përcaktohet data", + "This operation is forbidden" : "Ky veprim është i ndaluar", + "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin", + "Error moving file." : "Gabim në lëvizjen e kartelës.", + "Error moving file" : "Gabim në lëvizjen e kartelës", "Error" : "Gabim", - "{new_name} already exists" : "{new_name} është ekzistues ", - "Could not rename file" : "Riemërtimi i skedarit nuk është i mundur", - "Could not create file" : "Skedari nuk mund të krijohet", - "Could not create folder" : "I pamundur krijimi i kartelës", - "Error deleting file." : "Gabim gjatë fshirjes së skedarit.", - "Name" : "Emri", - "Size" : "Madhësia", - "Modified" : "Ndryshuar", + "{new_name} already exists" : "{new_name} ekziston tashmtë", + "Could not rename file" : "Kartela s’u riemërtua dot", + "Could not create file" : "Kartela s’u krijua dot", + "Could not create folder" : "Dosja s’u krijua dot", + "Error deleting file." : "Gabim gjatë fshirjes së kartelës.", + "No entries in this folder match '{filter}'" : "Në këtë dosje s’ka zëra me përputhje me '{filter}'", + "Name" : "Emër", + "Size" : "Madhësi", + "Modified" : "Ndryshuar më", "_%n folder_::_%n folders_" : ["%n dosje","%n dosje"], - "_%n file_::_%n files_" : ["%n skedar","%n skedarë"], + "_%n file_::_%n files_" : ["%n kartelë","%n kartela"], "{dirs} and {files}" : "{dirs} dhe {files}", - "You don’t have permission to upload or create files here" : "Ju nuk keni të drejta për të ngarkuar apo krijuar skedarë këtu", - "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkoj %n skedar","Po ngarkoj %n skedarë"], + "You don’t have permission to upload or create files here" : "S’keni leje për të ngarkuar apo krijuar kartela këtu", + "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkohet %n kartelë","Po ngarkohen %n kartela"], "New" : "E re", - "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm.", - "File name cannot be empty." : "Emri i skedarit nuk mund të jetë bosh.", - "Your storage is full, files can not be updated or synced anymore!" : "Hapsira juaj e arkivimit është plot, skedarët nuk mund të përditësohen ose sinkronizohen!", - "Your storage is almost full ({usedSpacePercent}%)" : "Hapsira juaj e arkivimit është pothuajse në fund ({usedSpacePercent}%)", - "Upload" : "Ngarko", - "Text file" : "Skedar tekst", + "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm kartele.", + "File name cannot be empty." : "Emri i kartelës s’mund të jetë i zbrazët.", + "Storage of {owner} is full, files can not be updated or synced anymore!" : "Depozita e {owner} është plot, kartelat s’mund të përditësohen ose njëkohësohen më!", + "Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose njëkohësohen më!", + "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Depozita e {owner} është thuasje plot ({usedSpacePercent}%)", + "Your storage is almost full ({usedSpacePercent}%)" : "Depozita juaj është thuajse plot ({usedSpacePercent}%)", + "Path" : "Shteg", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"], + "Favorited" : "U kalua e parapëlqyer", + "Favorite" : "E parapëlqyer", + "{newname} already exists" : "Ka tashmë një {newname}", + "Upload" : "Ngarkoje", + "Text file" : "Kartelë tekst", + "New text file.txt" : "Kartelë e re file.txt", "Folder" : "Dosje", - "New folder" : "Dosje e're", - "A new file or folder has been <strong>created</strong>" : "Një skedar ose një dosje e re është <strong>krijuar</strong>", - "A file or folder has been <strong>changed</strong>" : "Një skedar ose një dosje ka <strong>ndryshuar</strong>", - "A file or folder has been <strong>deleted</strong>" : "Një skedar ose një dosje është <strong>fshirë</strong>", - "A file or folder has been <strong>restored</strong>" : "Një skedar ose dosje është <strong>rikthyer</strong>", - "You created %1$s" : "Ju krijuat %1$s", - "%2$s created %1$s" : "%2$s krijuar %1$s", - "%1$s was created in a public folder" : "%1$s është krijuar në një dosje publike", - "You changed %1$s" : "Ju ndryshuat %1$s", - "%2$s changed %1$s" : "%2$s ndryshuar %1$s", - "You deleted %1$s" : "Ju fshitë %1$s", - "%2$s deleted %1$s" : "%2$s fshirë %1$s", - "You restored %1$s" : "Ju rikthyet %1$s", + "New folder" : "Dosje e re", + "An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat", + "A new file or folder has been <strong>created</strong>" : "<strong>U krijua</strong> një kartelë ose dosje e re", + "A file or folder has been <strong>changed</strong>" : "<strong>U ndryshua</strong> një kartelë ose dosje", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Kufizojini njoftimet mbi krijim dhe ndryshim kartelash vetëm për <strong>kartelat tuaja të parapëlqyera</strong> <em>(Vetëm te rrjedha)</em>", + "A file or folder has been <strong>deleted</strong>" : "<strong>U fshi</strong> një kartelë ose dosje", + "A file or folder has been <strong>restored</strong>" : "<strong>U rikthye</strong> një kartelë ose dosje", + "You created %1$s" : "Krijuat %1$s", + "%2$s created %1$s" : "%2$s krijoi %1$s", + "%1$s was created in a public folder" : "%1$s u krijua në një dosje publike", + "You changed %1$s" : "Ndryshuat %1$s", + "%2$s changed %1$s" : "%2$s ndryshoi %1$s", + "You deleted %1$s" : "Fshitë %1$s", + "%2$s deleted %1$s" : "%2$s fshiu %1$s", + "You restored %1$s" : "Rikthyet %1$s", "%2$s restored %1$s" : "%2$s riktheu %1$s", - "%s could not be renamed as it has been deleted" : "%s nuk mund të riemërtohet sepse është fshirë", - "%s could not be renamed" : "Nuk është i mundur riemërtimi i %s", - "Upload (max. %s)" : "Ngarko (maks. %s)", - "File handling" : "Trajtimi i Skedarëve", - "Maximum upload size" : "Madhësia maksimale e nagarkimit", - "max. possible: " : "maks i mundshëm", - "Save" : "Ruaj", - "Settings" : "Konfigurime", + "Changed by %2$s" : "Ndryshuar nga %2$s", + "Deleted by %2$s" : "Fshirë nga %2$s", + "Restored by %2$s" : "Rikthyer nga %2$s", + "%s could not be renamed as it has been deleted" : "%s s’riemërtohet dot, sepse është fshirë", + "%s could not be renamed" : "%s s’riemërtohet dot", + "Upload (max. %s)" : "Ngarkim (max. %s)", + "File handling" : "Trajtim kartele", + "Maximum upload size" : "Madhësi maksimale ngarkimi", + "max. possible: " : "maks. i mundshëm: ", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Me PHP-FPM kjo vlerë mund të dojë deri në 5 minuta të hyjë në fuqi, pasi të ruhet.", + "Save" : "Ruaje", + "Can not be edited from here due to insufficient permissions." : "S’mund të përpunohet që këtu, për shkak lejesh të pamjaftueshme.", + "Settings" : "Rregullime", "WebDAV" : "WebDAV", - "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">qasje në skedarët tuaj me anë të WebDAV</a>", - "Cancel upload" : "Anullo ngarkimin", - "Delete" : "Fshi", - "Upload too large" : "Ngarkimi shumë i madh", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.", - "Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni.", - "Currently scanning" : "Duke skanuar" + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>", + "Cancel upload" : "Anuloje ngarkimin", + "No files in here" : "S’ka kartela këtu", + "Upload some content or sync with your devices!" : "Ngarkoni ca lëndë ose bëni njëkohësim me pajisjet tuaja!", + "No entries found in this folder" : "Në këtë dosje s’u gjetën zëra", + "Select all" : "Përzgjidhe krejt", + "Upload too large" : "Ngarkim shumë i madh", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kartelat që po rrekeni të ngarkoni e tejkalojnë madhësinë maksimale për ngarkime kartelash në këtë shërbyes.", + "Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.", + "Currently scanning" : "Po kontrollohet", + "No favorites" : "Pa të parapëlqyera", + "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json index 1e755ee80f6..462f4d06392 100644 --- a/apps/files/l10n/sq.json +++ b/apps/files/l10n/sq.json @@ -1,93 +1,123 @@ { "translations": { - "Storage not available" : "Hapësira e memorizimit nuk është e disponueshme", - "Storage invalid" : "Hapësirë memorizimi e pavlefshme", - "Unknown error" : "Gabim panjohur", - "Could not move %s - File with this name already exists" : "E pa mundur zhvendosja e %s - ekziston nje skedar me te njetin emer", - "Could not move %s" : "Nuk mund të zhvendoset %s", - "Permission denied" : "Nuk ka të drejtë", - "The target folder has been moved or deleted." : "Dosja e destinacionit është zhvendosur ose fshirë.", - "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s është i përdorur në dosjen %s. Ju lutem zgjidhni një emër tjetër.", - "Error when creating the file" : "Gabim gjatë krijimit të skedarit", + "Storage not available" : "Pa depozitë gati", + "Storage invalid" : "Depozitë e pavlefshme", + "Unknown error" : "Gabim i panjohur", + "Could not move %s - File with this name already exists" : "S’u zhvendos dot %s - Ka tashmë kartelë me këtë", + "Could not move %s" : "S’u zhvendos dot %s", + "Permission denied" : "Leje e mohuar", + "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.", + "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s tashmë është i përdorur në dosjen %s. Ju lutemi, zgjidhni një emër tjetër.", + "Error when creating the file" : "Gabim gjatë krijimit të kartelës", "Error when creating the folder" : "Gabim gjatë krijimit të dosjes", - "Unable to set upload directory." : "E pa mundur të vendoset dosja e ngarkimit", - "Invalid Token" : "Shenjë e gabuar", - "No file was uploaded. Unknown error" : "Asnjë skedar nuk u dërgua. Gabim i pa njohur", - "There is no error, the file uploaded with success" : "Skedari u ngarkua me sukses", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Skedari i ngarkuar tejkalon limitin hapsirës së lejuar në php.ini", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Skedari i ngarkuar tejlakon vlerën MAX_FILE_SIZE të përcaktuar në formën HTML", - "The uploaded file was only partially uploaded" : "Skedari është ngakruar vetëm pjesërisht", - "No file was uploaded" : "Asnjë skedar nuk është ngarkuar", - "Missing a temporary folder" : "Mungon dosja e përkohshme", + "Unable to set upload directory." : "S’arrihet të caktohet drejtori ngarkimesh", + "Invalid Token" : "Token i pavlefshëm", + "No file was uploaded. Unknown error" : "S’u ngarkua ndonjë kartelë. Gabim i panjohur", + "There is no error, the file uploaded with success" : "S’pati gabim, kartela u ngarkua me sukses", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Kartela e ngarkuar tejkalon udhëzimin upload_max_filesize directive te php.ini: ", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Kartela e ngarkuar tejkalon udhëzimin MAX_FILE_SIZE që qe përcaktuar te formulari HTML", + "The uploaded file was only partially uploaded" : "Kartela në fjalë u ngarkua vetëm pjesërisht", + "No file was uploaded" : "S’u ngarkua kartelë", + "Missing a temporary folder" : "Mungon një dosje e përkohshme", "Failed to write to disk" : "Dështoi shkrimi në disk", - "Not enough storage available" : "Hapsira e arkivimit e pamjaftueshme", - "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. Nuk mund të gjendet skedari i ngarkuar", - "Upload failed. Could not get file info." : "Ngarkimi dështoi. Nuk mund të gjej informacion mbi skedarin.", - "Invalid directory." : "Dosje e pavlefshme", - "Files" : "Skedarë", - "All files" : "Të gjithë", - "Home" : "Shtëpi", - "Close" : "Mbyll", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nuk mund të ngarkohet {filename} sepse është dosje ose ka 0 byte", - "Total file size {size1} exceeds upload limit {size2}" : "Përmasa totale {size1} e skedarit tejkalon limitin e ngarkimit {size2}", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, ju po ngarkoni {size1} por vetëm {size2} është e lirë", - "Upload cancelled." : "Ngarkimi u anullua", - "Could not get result from server." : "Nuk mund të merret ndonjë rezultat nga serveri.", - "File upload is in progress. Leaving the page now will cancel the upload." : "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin", - "Download" : "Shkarko", - "Pending" : "Në vijim", - "Error moving file." : "Gabim në lëvizjen e skedarëve.", - "Error moving file" : "Gabim lëvizjen dokumentave", + "Not enough storage available" : "S’ka depozitë të mjaftueshme", + "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. S’u gjet dot kartela e ngarkuar", + "Upload failed. Could not get file info." : "Ngarkoi dështoi. S’u morën dot të dhëna kartele.", + "Invalid directory." : "Drejtori e pavlefshme.", + "Files" : "Kartela", + "All files" : "Krejt kartelat", + "Favorites" : "Të parapëlqyera", + "Home" : "Kreu", + "Close" : "Mbylle", + "Upload cancelled." : "Ngarkimi u anulua.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "S’arrihet të ngarkohet {filename}, ngaqë është drejtori ose ka 0 bajte", + "Total file size {size1} exceeds upload limit {size2}" : "Madhësia gjithsej e kartelës {size1} e tejkalon kufirin {size2} për ngarkimet", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, po ngarkoni {size1}, por ka vetëm {size2} të lira", + "Could not get result from server." : "S’mori dot përfundime nga shërbyesi.", + "File upload is in progress. Leaving the page now will cancel the upload." : "Ngarkimi i kartelës është në punë e sipër. Largimi nga faqja do të anulojë ngarkimin.", + "Actions" : "Veprime", + "Download" : "Shkarkoje", + "Rename" : "Riemërtojeni", + "Delete" : "Fshije", + "Details" : "Hollësi", + "Select" : "Përzgjidhe", + "Pending" : "Në pritje", + "Unable to determine date" : "S’arrihet të përcaktohet data", + "This operation is forbidden" : "Ky veprim është i ndaluar", + "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin", + "Error moving file." : "Gabim në lëvizjen e kartelës.", + "Error moving file" : "Gabim në lëvizjen e kartelës", "Error" : "Gabim", - "{new_name} already exists" : "{new_name} është ekzistues ", - "Could not rename file" : "Riemërtimi i skedarit nuk është i mundur", - "Could not create file" : "Skedari nuk mund të krijohet", - "Could not create folder" : "I pamundur krijimi i kartelës", - "Error deleting file." : "Gabim gjatë fshirjes së skedarit.", - "Name" : "Emri", - "Size" : "Madhësia", - "Modified" : "Ndryshuar", + "{new_name} already exists" : "{new_name} ekziston tashmtë", + "Could not rename file" : "Kartela s’u riemërtua dot", + "Could not create file" : "Kartela s’u krijua dot", + "Could not create folder" : "Dosja s’u krijua dot", + "Error deleting file." : "Gabim gjatë fshirjes së kartelës.", + "No entries in this folder match '{filter}'" : "Në këtë dosje s’ka zëra me përputhje me '{filter}'", + "Name" : "Emër", + "Size" : "Madhësi", + "Modified" : "Ndryshuar më", "_%n folder_::_%n folders_" : ["%n dosje","%n dosje"], - "_%n file_::_%n files_" : ["%n skedar","%n skedarë"], + "_%n file_::_%n files_" : ["%n kartelë","%n kartela"], "{dirs} and {files}" : "{dirs} dhe {files}", - "You don’t have permission to upload or create files here" : "Ju nuk keni të drejta për të ngarkuar apo krijuar skedarë këtu", - "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkoj %n skedar","Po ngarkoj %n skedarë"], + "You don’t have permission to upload or create files here" : "S’keni leje për të ngarkuar apo krijuar kartela këtu", + "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkohet %n kartelë","Po ngarkohen %n kartela"], "New" : "E re", - "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm.", - "File name cannot be empty." : "Emri i skedarit nuk mund të jetë bosh.", - "Your storage is full, files can not be updated or synced anymore!" : "Hapsira juaj e arkivimit është plot, skedarët nuk mund të përditësohen ose sinkronizohen!", - "Your storage is almost full ({usedSpacePercent}%)" : "Hapsira juaj e arkivimit është pothuajse në fund ({usedSpacePercent}%)", - "Upload" : "Ngarko", - "Text file" : "Skedar tekst", + "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm kartele.", + "File name cannot be empty." : "Emri i kartelës s’mund të jetë i zbrazët.", + "Storage of {owner} is full, files can not be updated or synced anymore!" : "Depozita e {owner} është plot, kartelat s’mund të përditësohen ose njëkohësohen më!", + "Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose njëkohësohen më!", + "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Depozita e {owner} është thuasje plot ({usedSpacePercent}%)", + "Your storage is almost full ({usedSpacePercent}%)" : "Depozita juaj është thuajse plot ({usedSpacePercent}%)", + "Path" : "Shteg", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"], + "Favorited" : "U kalua e parapëlqyer", + "Favorite" : "E parapëlqyer", + "{newname} already exists" : "Ka tashmë një {newname}", + "Upload" : "Ngarkoje", + "Text file" : "Kartelë tekst", + "New text file.txt" : "Kartelë e re file.txt", "Folder" : "Dosje", - "New folder" : "Dosje e're", - "A new file or folder has been <strong>created</strong>" : "Një skedar ose një dosje e re është <strong>krijuar</strong>", - "A file or folder has been <strong>changed</strong>" : "Një skedar ose një dosje ka <strong>ndryshuar</strong>", - "A file or folder has been <strong>deleted</strong>" : "Një skedar ose një dosje është <strong>fshirë</strong>", - "A file or folder has been <strong>restored</strong>" : "Një skedar ose dosje është <strong>rikthyer</strong>", - "You created %1$s" : "Ju krijuat %1$s", - "%2$s created %1$s" : "%2$s krijuar %1$s", - "%1$s was created in a public folder" : "%1$s është krijuar në një dosje publike", - "You changed %1$s" : "Ju ndryshuat %1$s", - "%2$s changed %1$s" : "%2$s ndryshuar %1$s", - "You deleted %1$s" : "Ju fshitë %1$s", - "%2$s deleted %1$s" : "%2$s fshirë %1$s", - "You restored %1$s" : "Ju rikthyet %1$s", + "New folder" : "Dosje e re", + "An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat", + "A new file or folder has been <strong>created</strong>" : "<strong>U krijua</strong> një kartelë ose dosje e re", + "A file or folder has been <strong>changed</strong>" : "<strong>U ndryshua</strong> një kartelë ose dosje", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Kufizojini njoftimet mbi krijim dhe ndryshim kartelash vetëm për <strong>kartelat tuaja të parapëlqyera</strong> <em>(Vetëm te rrjedha)</em>", + "A file or folder has been <strong>deleted</strong>" : "<strong>U fshi</strong> një kartelë ose dosje", + "A file or folder has been <strong>restored</strong>" : "<strong>U rikthye</strong> një kartelë ose dosje", + "You created %1$s" : "Krijuat %1$s", + "%2$s created %1$s" : "%2$s krijoi %1$s", + "%1$s was created in a public folder" : "%1$s u krijua në një dosje publike", + "You changed %1$s" : "Ndryshuat %1$s", + "%2$s changed %1$s" : "%2$s ndryshoi %1$s", + "You deleted %1$s" : "Fshitë %1$s", + "%2$s deleted %1$s" : "%2$s fshiu %1$s", + "You restored %1$s" : "Rikthyet %1$s", "%2$s restored %1$s" : "%2$s riktheu %1$s", - "%s could not be renamed as it has been deleted" : "%s nuk mund të riemërtohet sepse është fshirë", - "%s could not be renamed" : "Nuk është i mundur riemërtimi i %s", - "Upload (max. %s)" : "Ngarko (maks. %s)", - "File handling" : "Trajtimi i Skedarëve", - "Maximum upload size" : "Madhësia maksimale e nagarkimit", - "max. possible: " : "maks i mundshëm", - "Save" : "Ruaj", - "Settings" : "Konfigurime", + "Changed by %2$s" : "Ndryshuar nga %2$s", + "Deleted by %2$s" : "Fshirë nga %2$s", + "Restored by %2$s" : "Rikthyer nga %2$s", + "%s could not be renamed as it has been deleted" : "%s s’riemërtohet dot, sepse është fshirë", + "%s could not be renamed" : "%s s’riemërtohet dot", + "Upload (max. %s)" : "Ngarkim (max. %s)", + "File handling" : "Trajtim kartele", + "Maximum upload size" : "Madhësi maksimale ngarkimi", + "max. possible: " : "maks. i mundshëm: ", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Me PHP-FPM kjo vlerë mund të dojë deri në 5 minuta të hyjë në fuqi, pasi të ruhet.", + "Save" : "Ruaje", + "Can not be edited from here due to insufficient permissions." : "S’mund të përpunohet që këtu, për shkak lejesh të pamjaftueshme.", + "Settings" : "Rregullime", "WebDAV" : "WebDAV", - "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">qasje në skedarët tuaj me anë të WebDAV</a>", - "Cancel upload" : "Anullo ngarkimin", - "Delete" : "Fshi", - "Upload too large" : "Ngarkimi shumë i madh", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.", - "Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni.", - "Currently scanning" : "Duke skanuar" + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>", + "Cancel upload" : "Anuloje ngarkimin", + "No files in here" : "S’ka kartela këtu", + "Upload some content or sync with your devices!" : "Ngarkoni ca lëndë ose bëni njëkohësim me pajisjet tuaja!", + "No entries found in this folder" : "Në këtë dosje s’u gjetën zëra", + "Select all" : "Përzgjidhe krejt", + "Upload too large" : "Ngarkim shumë i madh", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kartelat që po rrekeni të ngarkoni e tejkalojnë madhësinë maksimale për ngarkime kartelash në këtë shërbyes.", + "Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.", + "Currently scanning" : "Po kontrollohet", + "No favorites" : "Pa të parapëlqyera", + "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 597389e15da..93f8979c2cb 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.", "Actions" : "Радње", "Download" : "Преузми", + "Rename" : "Преименуј", + "Delete" : "Обриши", + "Details" : "Подаци", "Select" : "Изабери", "Pending" : "На чекању", "Unable to determine date" : "Не могу да одредим датум", @@ -68,10 +71,14 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Ваше складиште је скоро пуно ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["се поклапа са '{filter}'","се поклапају са '{filter}'","се поклапа са '{filter}'"], + "Path" : "Путања", + "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајта"], "Favorited" : "Омиљено", "Favorite" : "Омиљени", + "{newname} already exists" : "{newname} већ постоји", "Upload" : "Отпреми", "Text file" : "текстуални фајл", + "New text file.txt" : "Нов текстуални фајл.txt", "Folder" : "фасцикла", "New folder" : "Нова фасцикла", "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака", @@ -89,12 +96,16 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s обриса %1$s", "You restored %1$s" : "Вратили сте %1$s", "%2$s restored %1$s" : "%2$s поврати %1$s", + "Changed by %2$s" : "Изменио %2$s", + "Deleted by %2$s" : "Обрисао %2$s", + "Restored by %2$s" : "Повратио %2$s", "%s could not be renamed as it has been deleted" : "%s се не може преименовати јер је обрисан", "%s could not be renamed" : "%s се не може преименовати", "Upload (max. %s)" : "Отпремање (макс. %s)", "File handling" : "Руковање фајловима", "Maximum upload size" : "Највећа величина отпремања", "max. possible: " : "највише могуће:", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "У PHP-FPM-у ова вредност има ефекта тек након 5 минута након примене.", "Save" : "Сачувај", "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.", "Settings" : "Поставке", @@ -105,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!", "No entries found in this folder" : "Нема ничега у овој фасцикли", "Select all" : "Означи све", - "Delete" : "Обриши", "Upload too large" : "Отпремање је превелико", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.", "Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.", diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index ec2fcc101e6..08ba9712de7 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.", "Actions" : "Радње", "Download" : "Преузми", + "Rename" : "Преименуј", + "Delete" : "Обриши", + "Details" : "Подаци", "Select" : "Изабери", "Pending" : "На чекању", "Unable to determine date" : "Не могу да одредим датум", @@ -66,10 +69,14 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Ваше складиште је скоро пуно ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["се поклапа са '{filter}'","се поклапају са '{filter}'","се поклапа са '{filter}'"], + "Path" : "Путања", + "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајта"], "Favorited" : "Омиљено", "Favorite" : "Омиљени", + "{newname} already exists" : "{newname} већ постоји", "Upload" : "Отпреми", "Text file" : "текстуални фајл", + "New text file.txt" : "Нов текстуални фајл.txt", "Folder" : "фасцикла", "New folder" : "Нова фасцикла", "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака", @@ -87,12 +94,16 @@ "%2$s deleted %1$s" : "%2$s обриса %1$s", "You restored %1$s" : "Вратили сте %1$s", "%2$s restored %1$s" : "%2$s поврати %1$s", + "Changed by %2$s" : "Изменио %2$s", + "Deleted by %2$s" : "Обрисао %2$s", + "Restored by %2$s" : "Повратио %2$s", "%s could not be renamed as it has been deleted" : "%s се не може преименовати јер је обрисан", "%s could not be renamed" : "%s се не може преименовати", "Upload (max. %s)" : "Отпремање (макс. %s)", "File handling" : "Руковање фајловима", "Maximum upload size" : "Највећа величина отпремања", "max. possible: " : "највише могуће:", + "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "У PHP-FPM-у ова вредност има ефекта тек након 5 минута након примене.", "Save" : "Сачувај", "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.", "Settings" : "Поставке", @@ -103,7 +114,6 @@ "Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!", "No entries found in this folder" : "Нема ничега у овој фасцикли", "Select all" : "Означи све", - "Delete" : "Обриши", "Upload too large" : "Отпремање је превелико", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.", "Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.", diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js index b00575619e9..9c7732e4e71 100644 --- a/apps/files/l10n/sr@latin.js +++ b/apps/files/l10n/sr@latin.js @@ -37,6 +37,9 @@ OC.L10N.register( "Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.", "Download" : "Preuzmi", + "Rename" : "Preimenuj", + "Delete" : "Obriši", + "Details" : "Detaljnije", "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Ne mogu da odredim datum", @@ -100,7 +103,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!", "No entries found in this folder" : "Nema ničega u ovoj fascikli", "Select all" : "Označi sve", - "Delete" : "Obriši", "Upload too large" : "Otpremanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.", "Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.", diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json index b6ffda5aa6b..0eb117e6026 100644 --- a/apps/files/l10n/sr@latin.json +++ b/apps/files/l10n/sr@latin.json @@ -35,6 +35,9 @@ "Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.", "Download" : "Preuzmi", + "Rename" : "Preimenuj", + "Delete" : "Obriši", + "Details" : "Detaljnije", "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Ne mogu da odredim datum", @@ -98,7 +101,6 @@ "Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!", "No entries found in this folder" : "Nema ničega u ovoj fascikli", "Select all" : "Označi sve", - "Delete" : "Obriši", "Upload too large" : "Otpremanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.", "Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.", diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index 5f9a08404d7..a5dc7478f80 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", "Actions" : "Åtgärder", "Download" : "Ladda ner", + "Rename" : "Byt namn", + "Delete" : "Radera", + "Details" : "Detaljer", "Select" : "Välj", "Pending" : "Väntar", "Unable to determine date" : "Misslyckades avgöra datum", @@ -94,7 +97,6 @@ OC.L10N.register( "Cancel upload" : "Avbryt uppladdning", "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!", "Select all" : "Välj allt", - "Delete" : "Radera", "Upload too large" : "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", "Files are being scanned, please wait." : "Filer skannas, var god vänta", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index e6775948cf6..afcbb6100db 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", "Actions" : "Åtgärder", "Download" : "Ladda ner", + "Rename" : "Byt namn", + "Delete" : "Radera", + "Details" : "Detaljer", "Select" : "Välj", "Pending" : "Väntar", "Unable to determine date" : "Misslyckades avgöra datum", @@ -92,7 +95,6 @@ "Cancel upload" : "Avbryt uppladdning", "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!", "Select all" : "Välj allt", - "Delete" : "Radera", "Upload too large" : "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", "Files are being scanned, please wait." : "Filer skannas, var god vänta", diff --git a/apps/files/l10n/ta_IN.js b/apps/files/l10n/ta_IN.js index c8453338084..85ed1ea3141 100644 --- a/apps/files/l10n/ta_IN.js +++ b/apps/files/l10n/ta_IN.js @@ -2,6 +2,7 @@ OC.L10N.register( "files", { "Files" : "கோப்புகள்", + "Details" : "விவரங்கள்", "Upload" : "பதிவேற்று", "New folder" : "புதிய கோப்புறை", "A new file or folder has been <strong>created</strong>" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் <strong> உருவாக்கப்பட்டுள்ளது.</strong>", diff --git a/apps/files/l10n/ta_IN.json b/apps/files/l10n/ta_IN.json index 392601a3756..bb7117bc62e 100644 --- a/apps/files/l10n/ta_IN.json +++ b/apps/files/l10n/ta_IN.json @@ -1,5 +1,6 @@ { "translations": { "Files" : "கோப்புகள்", + "Details" : "விவரங்கள்", "Upload" : "பதிவேற்று", "New folder" : "புதிய கோப்புறை", "A new file or folder has been <strong>created</strong>" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் <strong> உருவாக்கப்பட்டுள்ளது.</strong>", diff --git a/apps/files/l10n/ta_LK.js b/apps/files/l10n/ta_LK.js index 90a955e135b..de912eaea2e 100644 --- a/apps/files/l10n/ta_LK.js +++ b/apps/files/l10n/ta_LK.js @@ -16,6 +16,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", "Actions" : "செயல்கள்", "Download" : "பதிவிறக்குக", + "Rename" : "பெயர்மாற்றம்", + "Delete" : "நீக்குக", + "Details" : "விவரங்கள்", "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", "Error" : "வழு", @@ -34,7 +37,6 @@ OC.L10N.register( "Save" : "சேமிக்க ", "Settings" : "அமைப்புகள்", "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", - "Delete" : "நீக்குக", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்." diff --git a/apps/files/l10n/ta_LK.json b/apps/files/l10n/ta_LK.json index 64220b86744..b14853b503e 100644 --- a/apps/files/l10n/ta_LK.json +++ b/apps/files/l10n/ta_LK.json @@ -14,6 +14,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", "Actions" : "செயல்கள்", "Download" : "பதிவிறக்குக", + "Rename" : "பெயர்மாற்றம்", + "Delete" : "நீக்குக", + "Details" : "விவரங்கள்", "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", "Error" : "வழு", @@ -32,7 +35,6 @@ "Save" : "சேமிக்க ", "Settings" : "அமைப்புகள்", "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", - "Delete" : "நீக்குக", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்." diff --git a/apps/files/l10n/te.js b/apps/files/l10n/te.js index 51f6b1c5291..9badfac3532 100644 --- a/apps/files/l10n/te.js +++ b/apps/files/l10n/te.js @@ -2,13 +2,13 @@ OC.L10N.register( "files", { "Close" : "మూసివేయి", + "Delete" : "తొలగించు", "Error" : "పొరపాటు", "Name" : "పేరు", "Size" : "పరిమాణం", "Folder" : "సంచయం", "New folder" : "కొత్త సంచయం", "Save" : "భద్రపరచు", - "Settings" : "అమరికలు", - "Delete" : "తొలగించు" + "Settings" : "అమరికలు" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/te.json b/apps/files/l10n/te.json index fa7efa9d702..21d09484cd8 100644 --- a/apps/files/l10n/te.json +++ b/apps/files/l10n/te.json @@ -1,12 +1,12 @@ { "translations": { "Close" : "మూసివేయి", + "Delete" : "తొలగించు", "Error" : "పొరపాటు", "Name" : "పేరు", "Size" : "పరిమాణం", "Folder" : "సంచయం", "New folder" : "కొత్త సంచయం", "Save" : "భద్రపరచు", - "Settings" : "అమరికలు", - "Delete" : "తొలగించు" + "Settings" : "అమరికలు" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js index 2b092551a17..1cee4efd362 100644 --- a/apps/files/l10n/th_TH.js +++ b/apps/files/l10n/th_TH.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", "Actions" : "การกระทำ", "Download" : "ดาวน์โหลด", + "Rename" : "เปลี่ยนชื่อ", + "Delete" : "ลบ", + "Details" : "รายละเอียด", "Select" : "เลือก", "Pending" : "อยู่ระหว่างดำเนินการ", "Unable to determine date" : "ไม่สามารถกำหนดวัน", @@ -93,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s ลบ %1$s ออก", "You restored %1$s" : "คุณกู้คืน %1$s", "%2$s restored %1$s" : "%2$s ได้กู้คืน %1$s", + "Changed by %2$s" : "เปลี่ยนแปลงโดย %2$s", + "Deleted by %2$s" : "ลบโดย %2$s", + "Restored by %2$s" : "กู้คืนโดย %2$s", "%s could not be renamed as it has been deleted" : "%s ไม่สามารถเปลี่ยนชื่อเนื่องจากถูกลบไปแล้ว", "%s could not be renamed" : "%s ไม่สามารถเปลี่ยนชื่อ", "Upload (max. %s)" : "อัพโหลด (สูงสุด %s)", @@ -110,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "อัพโหลดเนื้อหาบางส่วนหรือประสานข้อมูลกับอุปกรณ์ของคุณ! อีกครั้ง", "No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้", "Select all" : "เลือกทั้งหมด", - "Delete" : "ลบ", "Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", "Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json index 3125adc820f..e15e4e5803b 100644 --- a/apps/files/l10n/th_TH.json +++ b/apps/files/l10n/th_TH.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", "Actions" : "การกระทำ", "Download" : "ดาวน์โหลด", + "Rename" : "เปลี่ยนชื่อ", + "Delete" : "ลบ", + "Details" : "รายละเอียด", "Select" : "เลือก", "Pending" : "อยู่ระหว่างดำเนินการ", "Unable to determine date" : "ไม่สามารถกำหนดวัน", @@ -91,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s ลบ %1$s ออก", "You restored %1$s" : "คุณกู้คืน %1$s", "%2$s restored %1$s" : "%2$s ได้กู้คืน %1$s", + "Changed by %2$s" : "เปลี่ยนแปลงโดย %2$s", + "Deleted by %2$s" : "ลบโดย %2$s", + "Restored by %2$s" : "กู้คืนโดย %2$s", "%s could not be renamed as it has been deleted" : "%s ไม่สามารถเปลี่ยนชื่อเนื่องจากถูกลบไปแล้ว", "%s could not be renamed" : "%s ไม่สามารถเปลี่ยนชื่อ", "Upload (max. %s)" : "อัพโหลด (สูงสุด %s)", @@ -108,7 +114,6 @@ "Upload some content or sync with your devices!" : "อัพโหลดเนื้อหาบางส่วนหรือประสานข้อมูลกับอุปกรณ์ของคุณ! อีกครั้ง", "No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้", "Select all" : "เลือกทั้งหมด", - "Delete" : "ลบ", "Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", "Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index 157280b696c..cd48408b9e1 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.", "Actions" : "Eylemler", "Download" : "İndir", + "Rename" : "Yeniden adlandır", + "Delete" : "Sil", + "Details" : "Ayrıntılar", "Select" : "Seç", "Pending" : "Bekliyor", "Unable to determine date" : "Tarih tespit edilemedi", @@ -72,8 +75,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"], "Favorited" : "Sık kullanılanlara eklendi", "Favorite" : "Sık kullanılan", + "{newname} already exists" : "{newname} zaten mevcut", "Upload" : "Yükle", "Text file" : "Metin dosyası", + "New text file.txt" : "Yeni metin dosyası.txt", "Folder" : "Klasör", "New folder" : "Yeni klasör", "An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu", @@ -91,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s, %1$s dosyasını sildi", "You restored %1$s" : "%1$s ögesini geri aldınız", "%2$s restored %1$s" : "%2$s, %1$s ögesini geri aldı", + "Changed by %2$s" : "%2$s tarafından değiştirildi", + "Deleted by %2$s" : "%2$s tarafından silindi", + "Restored by %2$s" : "%2$s tarafından geri yüklendi", "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı", "%s could not be renamed" : "%s yeniden adlandırılamadı", "Upload (max. %s)" : "Yükle (azami: %s)", @@ -108,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!", "No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı", "Select all" : "Tümünü seç", - "Delete" : "Sil", "Upload too large" : "Yükleme çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.", "Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.", diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index 8a15f7ff315..92af334f703 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.", "Actions" : "Eylemler", "Download" : "İndir", + "Rename" : "Yeniden adlandır", + "Delete" : "Sil", + "Details" : "Ayrıntılar", "Select" : "Seç", "Pending" : "Bekliyor", "Unable to determine date" : "Tarih tespit edilemedi", @@ -70,8 +73,10 @@ "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"], "Favorited" : "Sık kullanılanlara eklendi", "Favorite" : "Sık kullanılan", + "{newname} already exists" : "{newname} zaten mevcut", "Upload" : "Yükle", "Text file" : "Metin dosyası", + "New text file.txt" : "Yeni metin dosyası.txt", "Folder" : "Klasör", "New folder" : "Yeni klasör", "An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu", @@ -89,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s, %1$s dosyasını sildi", "You restored %1$s" : "%1$s ögesini geri aldınız", "%2$s restored %1$s" : "%2$s, %1$s ögesini geri aldı", + "Changed by %2$s" : "%2$s tarafından değiştirildi", + "Deleted by %2$s" : "%2$s tarafından silindi", + "Restored by %2$s" : "%2$s tarafından geri yüklendi", "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı", "%s could not be renamed" : "%s yeniden adlandırılamadı", "Upload (max. %s)" : "Yükle (azami: %s)", @@ -106,7 +114,6 @@ "Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!", "No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı", "Select all" : "Tümünü seç", - "Delete" : "Sil", "Upload too large" : "Yükleme çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.", "Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.", diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js index 8d6dabd50d7..4371e15067f 100644 --- a/apps/files/l10n/ug.js +++ b/apps/files/l10n/ug.js @@ -16,6 +16,8 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.", "Actions" : "مەشغۇلاتلار", "Download" : "چۈشۈر", + "Rename" : "ئات ئۆزگەرت", + "Delete" : "ئۆچۈر", "Pending" : "كۈتۈۋاتىدۇ", "Error" : "خاتالىق", "{new_name} already exists" : "{new_name} مەۋجۇت", @@ -32,7 +34,6 @@ OC.L10N.register( "Settings" : "تەڭشەكلەر", "WebDAV" : "WebDAV", "Cancel upload" : "يۈكلەشتىن ۋاز كەچ", - "Delete" : "ئۆچۈر", "Upload too large" : "يۈكلەندىغىنى بەك چوڭ" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json index 86bd8391af2..f6a71d8bda6 100644 --- a/apps/files/l10n/ug.json +++ b/apps/files/l10n/ug.json @@ -14,6 +14,8 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.", "Actions" : "مەشغۇلاتلار", "Download" : "چۈشۈر", + "Rename" : "ئات ئۆزگەرت", + "Delete" : "ئۆچۈر", "Pending" : "كۈتۈۋاتىدۇ", "Error" : "خاتالىق", "{new_name} already exists" : "{new_name} مەۋجۇت", @@ -30,7 +32,6 @@ "Settings" : "تەڭشەكلەر", "WebDAV" : "WebDAV", "Cancel upload" : "يۈكلەشتىن ۋاز كەچ", - "Delete" : "ئۆچۈر", "Upload too large" : "يۈكلەندىغىنى بەك چوڭ" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index a06cc2f3d73..bf5b0f1d456 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.", "Actions" : "Дії", "Download" : "Завантажити", + "Rename" : "Перейменувати", + "Delete" : "Видалити", + "Details" : "Деталі", "Select" : "Оберіть", "Pending" : "Очікування", "Unable to determine date" : "Неможливо визначити дату", @@ -102,7 +105,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "Вивантажте щось або синхронізуйте з пристроями!", "No entries found in this folder" : "В цій теці нічого немає", "Select all" : "Вибрати всі", - "Delete" : "Видалити", "Upload too large" : "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь вивантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", "Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.", diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index 964ada95de1..28d307b55be 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.", "Actions" : "Дії", "Download" : "Завантажити", + "Rename" : "Перейменувати", + "Delete" : "Видалити", + "Details" : "Деталі", "Select" : "Оберіть", "Pending" : "Очікування", "Unable to determine date" : "Неможливо визначити дату", @@ -100,7 +103,6 @@ "Upload some content or sync with your devices!" : "Вивантажте щось або синхронізуйте з пристроями!", "No entries found in this folder" : "В цій теці нічого немає", "Select all" : "Вибрати всі", - "Delete" : "Видалити", "Upload too large" : "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь вивантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", "Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.", diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js index d5e85bfe35c..2265e52d771 100644 --- a/apps/files/l10n/ur_PK.js +++ b/apps/files/l10n/ur_PK.js @@ -4,10 +4,10 @@ OC.L10N.register( "Unknown error" : "غیر معروف خرابی", "Close" : "بند ", "Download" : "ڈاؤن لوڈ،", + "Delete" : "حذف کریں", "Error" : "ایرر", "Name" : "اسم", "Save" : "حفظ", - "Settings" : "ترتیبات", - "Delete" : "حذف کریں" + "Settings" : "ترتیبات" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json index 3da48310dfb..e8eb736811c 100644 --- a/apps/files/l10n/ur_PK.json +++ b/apps/files/l10n/ur_PK.json @@ -2,10 +2,10 @@ "Unknown error" : "غیر معروف خرابی", "Close" : "بند ", "Download" : "ڈاؤن لوڈ،", + "Delete" : "حذف کریں", "Error" : "ایرر", "Name" : "اسم", "Save" : "حفظ", - "Settings" : "ترتیبات", - "Delete" : "حذف کریں" + "Settings" : "ترتیبات" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index 5e83c36abea..2c643e3cfb5 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -33,6 +33,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", "Actions" : "Actions", "Download" : "Tải về", + "Rename" : "Sửa tên", + "Delete" : "Xóa", + "Details" : "Chi tiết", "Select" : "Chọn", "Pending" : "Đang chờ", "Error moving file" : "Lỗi di chuyển tập tin", @@ -69,7 +72,6 @@ OC.L10N.register( "Cancel upload" : "Hủy upload", "No entries found in this folder" : "Chưa có mục nào trong thư mục", "Select all" : "Chọn tất cả", - "Delete" : "Xóa", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ." diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index 285c0e39240..ac7a1f3828e 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -31,6 +31,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", "Actions" : "Actions", "Download" : "Tải về", + "Rename" : "Sửa tên", + "Delete" : "Xóa", + "Details" : "Chi tiết", "Select" : "Chọn", "Pending" : "Đang chờ", "Error moving file" : "Lỗi di chuyển tập tin", @@ -67,7 +70,6 @@ "Cancel upload" : "Hủy upload", "No entries found in this folder" : "Chưa có mục nào trong thư mục", "Select all" : "Chọn tất cả", - "Delete" : "Xóa", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ." diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index 84b31368a14..d2b0989e35a 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。", "Actions" : "动作", "Download" : "下载", + "Rename" : "重命名", + "Delete" : "删除", + "Details" : "详细信息", "Select" : "选择", "Pending" : "等待", "Unable to determine date" : "无法确定日期", @@ -72,8 +75,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n 字节"], "Favorited" : "已收藏", "Favorite" : "收藏", + "{newname} already exists" : "{newname} 已经存在", "Upload" : "上传", "Text file" : "文本文件", + "New text file.txt" : "创建文本文件 .txt", "Folder" : "文件夹", "New folder" : "增加文件夹", "An error occurred while trying to update the tags" : "更新标签时出错", @@ -91,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s 删除了 %1$s", "You restored %1$s" : "你恢复了 %1$s", "%2$s restored %1$s" : "%2$s 恢复了 %1$s", + "Changed by %2$s" : "被 %2$s 更改", + "Deleted by %2$s" : "被 %2$s 删除", + "Restored by %2$s" : "被 %2$s 恢复", "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ", "%s could not be renamed" : "%s 不能被重命名", "Upload (max. %s)" : "上传 (最大 %s)", @@ -108,7 +116,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", "No entries found in this folder" : "此文件夹中无项目", "Select all" : "全部选择", - "Delete" : "删除", "Upload too large" : "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index 4d9a3737a98..6eee0d3a765 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。", "Actions" : "动作", "Download" : "下载", + "Rename" : "重命名", + "Delete" : "删除", + "Details" : "详细信息", "Select" : "选择", "Pending" : "等待", "Unable to determine date" : "无法确定日期", @@ -70,8 +73,10 @@ "_%n byte_::_%n bytes_" : ["%n 字节"], "Favorited" : "已收藏", "Favorite" : "收藏", + "{newname} already exists" : "{newname} 已经存在", "Upload" : "上传", "Text file" : "文本文件", + "New text file.txt" : "创建文本文件 .txt", "Folder" : "文件夹", "New folder" : "增加文件夹", "An error occurred while trying to update the tags" : "更新标签时出错", @@ -89,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s 删除了 %1$s", "You restored %1$s" : "你恢复了 %1$s", "%2$s restored %1$s" : "%2$s 恢复了 %1$s", + "Changed by %2$s" : "被 %2$s 更改", + "Deleted by %2$s" : "被 %2$s 删除", + "Restored by %2$s" : "被 %2$s 恢复", "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ", "%s could not be renamed" : "%s 不能被重命名", "Upload (max. %s)" : "上传 (最大 %s)", @@ -106,7 +114,6 @@ "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", "No entries found in this folder" : "此文件夹中无项目", "Select all" : "全部选择", - "Delete" : "删除", "Upload too large" : "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index 94f4397f23b..421ae5dc92a 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -7,6 +7,8 @@ OC.L10N.register( "Home" : "主頁", "Close" : "關閉", "Download" : "下載", + "Rename" : "重新命名", + "Delete" : "刪除", "Error" : "錯誤", "Name" : "名稱", "Size" : "大小", @@ -27,7 +29,6 @@ OC.L10N.register( "Save" : "儲存", "Settings" : "設定", "WebDAV" : "WebDAV", - "Cancel upload" : "取消上戴", - "Delete" : "刪除" + "Cancel upload" : "取消上戴" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index 63716aca559..3d1af1593bd 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -5,6 +5,8 @@ "Home" : "主頁", "Close" : "關閉", "Download" : "下載", + "Rename" : "重新命名", + "Delete" : "刪除", "Error" : "錯誤", "Name" : "名稱", "Size" : "大小", @@ -25,7 +27,6 @@ "Save" : "儲存", "Settings" : "設定", "WebDAV" : "WebDAV", - "Cancel upload" : "取消上戴", - "Delete" : "刪除" + "Cancel upload" : "取消上戴" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 7c013533e2a..772cf083307 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -38,6 +38,9 @@ OC.L10N.register( "File upload is in progress. Leaving the page now will cancel the upload." : "檔案上傳中,離開此頁面將會取消上傳。", "Actions" : "動作", "Download" : "下載", + "Rename" : "重新命名", + "Delete" : "刪除", + "Details" : "詳細資料", "Select" : "選擇", "Pending" : "等候中", "Unable to determine date" : "無法確定日期", @@ -103,7 +106,6 @@ OC.L10N.register( "Upload some content or sync with your devices!" : "在您的裝置中同步或上傳一些內容", "No entries found in this folder" : "在此資料夾中沒有任何項目", "Select all" : "全選", - "Delete" : "刪除", "Upload too large" : "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。", "Files are being scanned, please wait." : "正在掃描檔案,請稍等。", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index 9d1aec9e4f2..4e1a38eccbd 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -36,6 +36,9 @@ "File upload is in progress. Leaving the page now will cancel the upload." : "檔案上傳中,離開此頁面將會取消上傳。", "Actions" : "動作", "Download" : "下載", + "Rename" : "重新命名", + "Delete" : "刪除", + "Details" : "詳細資料", "Select" : "選擇", "Pending" : "等候中", "Unable to determine date" : "無法確定日期", @@ -101,7 +104,6 @@ "Upload some content or sync with your devices!" : "在您的裝置中同步或上傳一些內容", "No entries found in this folder" : "在此資料夾中沒有任何項目", "Select all" : "全選", - "Delete" : "刪除", "Upload too large" : "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。", "Files are being scanned, please wait." : "正在掃描檔案,請稍等。", diff --git a/apps/files/lib/activity.php b/apps/files/lib/activity.php index bf80d0cfd7c..f3bbff48640 100644 --- a/apps/files/lib/activity.php +++ b/apps/files/lib/activity.php @@ -145,6 +145,24 @@ class Activity implements IExtension { } $l = $this->getL10N($languageCode); + + if ($this->activityManager->isFormattingFilteredObject()) { + $translation = $this->translateShort($text, $l, $params); + if ($translation !== false) { + return $translation; + } + } + + return $this->translateLong($text, $l, $params); + } + + /** + * @param string $text + * @param IL10N $l + * @param array $params + * @return bool|string + */ + protected function translateLong($text, IL10N $l, array $params) { switch ($text) { case 'created_self': return (string) $l->t('You created %1$s', $params); @@ -171,6 +189,26 @@ class Activity implements IExtension { } /** + * @param string $text + * @param IL10N $l + * @param array $params + * @return bool|string + */ + protected function translateShort($text, IL10N $l, array $params) { + switch ($text) { + case 'changed_by': + return (string) $l->t('Changed by %2$s', $params); + case 'deleted_by': + return (string) $l->t('Deleted by %2$s', $params); + case 'restored_by': + return (string) $l->t('Restored by %2$s', $params); + + default: + return false; + } + } + + /** * The extension can define the type of parameters for translation * * Currently known types are: diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index 6bfdc0a095c..fb14cea731f 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -137,10 +137,8 @@ class Helper { $entry['id'] = $i['fileid']; $entry['parentId'] = $i['parent']; - $entry['date'] = \OCP\Util::formatDate($i['mtime']); $entry['mtime'] = $i['mtime'] * 1000; // only pick out the needed attributes - $entry['icon'] = \OCA\Files\Helper::determineIcon($i); if (\OC::$server->getPreviewManager()->isAvailable($i)) { $entry['isPreviewAvailable'] = true; } diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html index 5360a7c8e8f..e3513237d2b 100644 --- a/apps/files/templates/fileexists.html +++ b/apps/files/templates/fileexists.html @@ -3,24 +3,28 @@ <span class="what">{what}<!-- If you select both versions, the copied file will have a number added to its name. --></span><br/> <br/> <table> - <th><label><input class="allnewfiles" type="checkbox" />{allnewfiles}<span class="count"></span></label></th> - <th><label><input class="allexistingfiles" type="checkbox" />{allexistingfiles}<span class="count"></span></label></th> + <th><input id="checkbox-allnewfiles" class="allnewfiles checkbox" type="checkbox" /><label for="checkbox-allnewfiles">{allnewfiles}<span class="count"></span></label></th> + <th><input id="checkbox-allexistingfiles" class="allexistingfiles checkbox" type="checkbox" /><label for="checkbox-allexistingfiles">{allexistingfiles}<span class="count"></span></label></th> </table> <div class="conflicts"> <div class="template"> <div class="filename"></div> <div class="replacement"> - <input type="checkbox" /> + <input type="checkbox" class="checkbox u-left"/> + <label> <span class="svg icon"></span> <div class="mtime"></div> <div class="size"></div> + </label> </div> <div class="original"> - <input type="checkbox" /> + <input type="checkbox" class="checkbox u-left" /> + <label> <span class="svg icon"></span> <div class="mtime"></div> <div class="size"></div> <div class="message"></div> + </label> </div> </div> </div> diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php index 15af1970dc3..7ebf80ee8b2 100644 --- a/apps/files/templates/list.php +++ b/apps/files/templates/list.php @@ -51,12 +51,12 @@ <p></p> </div> -<table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="36" data-preview-y="36"> +<table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="32" data-preview-y="32"> <thead> <tr> <th id='headerName' class="hidden column-name"> <div id="headerName-container"> - <input type="checkbox" id="select_all_files" class="select-all"/> + <input type="checkbox" id="select_all_files" class="select-all checkbox"/> <label for="select_all_files"> <span class="hidden-visually"><?php p($l->t('Select all'))?></span> </label> diff --git a/apps/files/templates/simplelist.php b/apps/files/templates/simplelist.php index 6b6c018024f..ca26d9b5d5b 100644 --- a/apps/files/templates/simplelist.php +++ b/apps/files/templates/simplelist.php @@ -1,6 +1,3 @@ -<div id="controls"> - <div id="file_action_panel"></div> -</div> <div id='notification'></div> <div id="emptycontent" class="hidden"> diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php index 8abde9094d9..00a62fa002d 100644 --- a/apps/files/tests/ajax_rename.php +++ b/apps/files/tests/ajax_rename.php @@ -5,6 +5,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author tbartenstein <tbartenstein@users.noreply.github.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * @@ -116,9 +117,6 @@ class Test_OC_Files_App_Rename extends \Test\TestCase { $this->assertEquals('abcdef', $result['data']['etag']); $this->assertFalse(isset($result['data']['tags'])); $this->assertEquals('/', $result['data']['path']); - $icon = \OC_Helper::mimetypeIcon('dir-external'); - $icon = substr($icon, 0, -3) . 'svg'; - $this->assertEquals($icon, $result['data']['icon']); } /** @@ -181,9 +179,6 @@ class Test_OC_Files_App_Rename extends \Test\TestCase { $this->assertEquals('abcdef', $result['data']['etag']); $this->assertEquals(array('tag1', 'tag2'), $result['data']['tags']); $this->assertEquals('/', $result['data']['path']); - $icon = \OC_Helper::mimetypeIcon('text'); - $icon = substr($icon, 0, -3) . 'svg'; - $this->assertEquals($icon, $result['data']['icon']); \OC::$server->registerService('TagManager', function ($c) use ($oldTagManager) { return $oldTagManager; diff --git a/apps/files/tests/command/deleteorphanedfilestest.php b/apps/files/tests/command/deleteorphanedfilestest.php index 76fe9dbdfa0..3a1a541d8f1 100644 --- a/apps/files/tests/command/deleteorphanedfilestest.php +++ b/apps/files/tests/command/deleteorphanedfilestest.php @@ -22,6 +22,7 @@ namespace OCA\Files\Tests\Command; use OCA\Files\Command\DeleteOrphanedFiles; +use OCP\Files\StorageNotAvailableException; class DeleteOrphanedFilesTest extends \Test\TestCase { @@ -110,7 +111,11 @@ class DeleteOrphanedFilesTest extends \Test\TestCase { $this->assertCount(0, $this->getFile($fileInfo->getId()), 'Asserts that file gets cleaned up'); - $view->unlink('files/test'); + // since we deleted the storage it might throw a (valid) StorageNotAvailableException + try { + $view->unlink('files/test'); + } catch (StorageNotAvailableException $e) { + } } } diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php index 35d00af75ba..7f34c0a5642 100644 --- a/apps/files/tests/controller/apicontrollertest.php +++ b/apps/files/tests/controller/apicontrollertest.php @@ -110,9 +110,7 @@ class ApiControllerTest extends TestCase { [ 'id' => null, 'parentId' => null, - 'date' => \OCP\Util::formatDate(55), 'mtime' => 55000, - 'icon' => \OCA\Files\Helper::determineIcon($fileInfo), 'name' => 'root.txt', 'permissions' => null, 'mimetype' => 'application/pdf', @@ -175,9 +173,7 @@ class ApiControllerTest extends TestCase { [ 'id' => null, 'parentId' => null, - 'date' => \OCP\Util::formatDate(55), 'mtime' => 55000, - 'icon' => \OCA\Files\Helper::determineIcon($fileInfo1), 'name' => 'root.txt', 'permissions' => null, 'mimetype' => 'application/pdf', @@ -194,9 +190,7 @@ class ApiControllerTest extends TestCase { [ 'id' => null, 'parentId' => null, - 'date' => \OCP\Util::formatDate(999), 'mtime' => 999000, - 'icon' => \OCA\Files\Helper::determineIcon($fileInfo2), 'name' => 'root.txt', 'permissions' => null, 'mimetype' => 'application/binary', diff --git a/apps/files/tests/js/detailsviewSpec.js b/apps/files/tests/js/detailsviewSpec.js index 852f8b04293..26a16b31530 100644 --- a/apps/files/tests/js/detailsviewSpec.js +++ b/apps/files/tests/js/detailsviewSpec.js @@ -144,14 +144,91 @@ describe('OCA.Files.DetailsView tests', function() { expect(detailsView.$el.find('.tab').eq(0).hasClass('hidden')).toEqual(true); expect(detailsView.$el.find('.tab').eq(1).hasClass('hidden')).toEqual(false); }); - it('does not render tab headers when only one tab exists', function() { + describe('tab visibility', function() { + beforeEach(function() { + detailsView.remove(); + detailsView = new OCA.Files.DetailsView(); + }); + it('does not display tab headers when only one tab exists', function() { + testView = new OCA.Files.DetailTabView({id: 'test1'}); + detailsView.addTabView(testView); + detailsView.render(); + + expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(true); + expect(detailsView.$el.find('.tabHeader').length).toEqual(1); + }); + it('does not display tab that do not pass visibility check', function() { + testView = new OCA.Files.DetailTabView({id: 'test1'}); + testView.canDisplay = sinon.stub().returns(false); + testView2 = new OCA.Files.DetailTabView({id: 'test2'}); + var testView3 = new OCA.Files.DetailTabView({id: 'test3'}); + detailsView.addTabView(testView); + detailsView.addTabView(testView2); + detailsView.addTabView(testView3); + + var fileInfo = {id: 5, name: 'test.txt'}; + detailsView.setFileInfo(fileInfo); + + expect(testView.canDisplay.calledOnce).toEqual(true); + expect(testView.canDisplay.calledWith(fileInfo)).toEqual(true); + + expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(false); + expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('hidden')).toEqual(true); + expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('hidden')).toEqual(false); + expect(detailsView.$el.find('.tabHeader[data-tabid=test3]').hasClass('hidden')).toEqual(false); + }); + it('does not show tab headers if only one header is visible due to visibility check', function() { + testView = new OCA.Files.DetailTabView({id: 'test1'}); + testView.canDisplay = sinon.stub().returns(false); + testView2 = new OCA.Files.DetailTabView({id: 'test2'}); + detailsView.addTabView(testView); + detailsView.addTabView(testView2); + + var fileInfo = {id: 5, name: 'test.txt'}; + detailsView.setFileInfo(fileInfo); + + expect(testView.canDisplay.calledOnce).toEqual(true); + expect(testView.canDisplay.calledWith(fileInfo)).toEqual(true); + + expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(true); + expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('hidden')).toEqual(true); + expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('hidden')).toEqual(false); + }); + it('deselects the current tab if a model update does not pass the visibility check', function() { + testView = new OCA.Files.DetailTabView({id: 'test1'}); + testView.canDisplay = function(fileInfo) { + return fileInfo.mimetype !== 'httpd/unix-directory'; + }; + testView2 = new OCA.Files.DetailTabView({id: 'test2'}); + detailsView.addTabView(testView); + detailsView.addTabView(testView2); + + var fileInfo = {id: 5, name: 'test.txt', mimetype: 'text/plain'}; + detailsView.setFileInfo(fileInfo); + + expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('selected')).toEqual(true); + expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('selected')).toEqual(false); + + detailsView.setFileInfo({id: 10, name: 'folder', mimetype: 'httpd/unix-directory'}); + + expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('selected')).toEqual(false); + expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('selected')).toEqual(true); + }); + }); + it('sorts by order and then label', function() { detailsView.remove(); detailsView = new OCA.Files.DetailsView(); - testView = new OCA.Files.DetailTabView({id: 'test1'}); - detailsView.addTabView(testView); + detailsView.addTabView(new OCA.Files.DetailTabView({id: 'abc', order: 20})); + detailsView.addTabView(new OCA.Files.DetailTabView({id: 'def', order: 10})); + detailsView.addTabView(new OCA.Files.DetailTabView({id: 'jkl'})); + detailsView.addTabView(new OCA.Files.DetailTabView({id: 'ghi'})); detailsView.render(); - expect(detailsView.$el.find('.tabHeader').length).toEqual(0); + var tabs = detailsView.$el.find('.tabHeader').map(function() { + return $(this).attr('data-tabid'); + }).toArray(); + + expect(tabs).toEqual(['ghi', 'jkl', 'def', 'abc']); }); }); }); diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js index 1254843e66a..6a57c56c3af 100644 --- a/apps/files/tests/js/fileactionsSpec.js +++ b/apps/files/tests/js/fileactionsSpec.js @@ -151,6 +151,62 @@ describe('OCA.Files.FileActions tests', function() { expect($tr.find('.action.action-match').length).toEqual(1); expect($tr.find('.action.action-nomatch').length).toEqual(0); }); + it('display inline icon', function() { + fileActions.registerAction({ + name: 'Icon', + displayName: 'IconDisplay', + type: OCA.Files.FileActions.TYPE_INLINE, + mime: 'all', + icon: OC.imagePath('core', 'actions/icon'), + permissions: OC.PERMISSION_READ + }); + fileActions.registerAction({ + name: 'NoIcon', + displayName: 'NoIconDisplay', + type: OCA.Files.FileActions.TYPE_INLINE, + mime: 'all', + permissions: OC.PERMISSION_READ + }); + + fileActions.display($tr.find('td.filename'), true, fileList); + + expect($tr.find('.action.action-icon').length).toEqual(1); + expect($tr.find('.action.action-icon').find('img').length).toEqual(1); + expect($tr.find('.action.action-icon').find('img').eq(0).attr('src')).toEqual(OC.imagePath('core', 'actions/icon')); + + expect($tr.find('.action.action-noicon').length).toEqual(1); + expect($tr.find('.action.action-noicon').find('img').length).toEqual(0); + }); + it('display alt text on inline icon', function() { + fileActions.registerAction({ + name: 'IconAltText', + displayName: 'IconAltTextDisplay', + type: OCA.Files.FileActions.TYPE_INLINE, + mime: 'all', + icon: OC.imagePath('core', 'actions/iconAltText'), + altText: 'alt icon text', + permissions: OC.PERMISSION_READ + }); + + fileActions.registerAction({ + name: 'IconNoAltText', + displayName: 'IconNoAltTextDisplay', + type: OCA.Files.FileActions.TYPE_INLINE, + mime: 'all', + icon: OC.imagePath('core', 'actions/iconNoAltText'), + permissions: OC.PERMISSION_READ + }); + + fileActions.display($tr.find('td.filename'), true, fileList); + + expect($tr.find('.action.action-iconalttext').length).toEqual(1); + expect($tr.find('.action.action-iconalttext').find('img').length).toEqual(1); + expect($tr.find('.action.action-iconalttext').find('img').eq(0).attr('alt')).toEqual('alt icon text'); + + expect($tr.find('.action.action-iconnoalttext').length).toEqual(1); + expect($tr.find('.action.action-iconnoalttext').find('img').length).toEqual(1); + expect($tr.find('.action.action-iconnoalttext').find('img').eq(0).attr('alt')).toEqual(''); + }); }); describe('action handler', function() { var actionStub, $tr, clock; diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js index 0cfd12a2d04..dee542458b6 100644 --- a/apps/files/tests/js/fileactionsmenuSpec.js +++ b/apps/files/tests/js/fileactionsmenuSpec.js @@ -152,6 +152,43 @@ describe('OCA.Files.FileActionsMenu tests', function() { expect(menu.$el.find('a[data-action=Match]').length).toEqual(1); expect(menu.$el.find('a[data-action=NoMatch]').length).toEqual(0); }); + it('sorts by order attribute, then name', function() { + fileActions.registerAction({ + name: 'Baction', + displayName: 'Baction', + order: 2, + mime: 'text/plain', + permissions: OC.PERMISSION_ALL + }); + fileActions.registerAction({ + name: 'Zaction', + displayName: 'Zaction', + order: 1, + mime: 'text/plain', + permissions: OC.PERMISSION_ALL + }); + fileActions.registerAction({ + name: 'Yaction', + displayName: 'Yaction', + mime: 'text/plain', + permissions: OC.PERMISSION_ALL + }); + fileActions.registerAction({ + name: 'Waction', + displayName: 'Waction', + mime: 'text/plain', + permissions: OC.PERMISSION_ALL + }); + + menu.render(); + var zactionIndex = menu.$el.find('a[data-action=Zaction]').closest('li').index(); + var bactionIndex = menu.$el.find('a[data-action=Baction]').closest('li').index(); + expect(zactionIndex).toBeLessThan(bactionIndex); + + var wactionIndex = menu.$el.find('a[data-action=Waction]').closest('li').index(); + var yactionIndex = menu.$el.find('a[data-action=Yaction]').closest('li').index(); + expect(wactionIndex).toBeLessThan(yactionIndex); + }); }); describe('action handler', function() { diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index c05e7c37214..994e1d32844 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -135,6 +135,9 @@ describe('OCA.Files.FileList tests', function() { }); afterEach(function() { testFiles = undefined; + if (fileList) { + fileList.destroy(); + } fileList = undefined; notificationStub.restore(); @@ -1876,14 +1879,54 @@ describe('OCA.Files.FileList tests', function() { $tr2.find('td.filename .name').trigger(e); expect(fileList.getSelectedFiles().length).toEqual(0); }); - }) + }); }); describe('Details sidebar', function() { beforeEach(function() { fileList.setFiles(testFiles); + fileList.showDetailsView('Two.jpg'); + }); + describe('registering', function() { + var addTabStub; + var addDetailStub; + + beforeEach(function() { + addTabStub = sinon.stub(OCA.Files.DetailsView.prototype, 'addTabView'); + addDetailStub = sinon.stub(OCA.Files.DetailsView.prototype, 'addDetailView'); + }); + afterEach(function() { + addTabStub.restore(); + addDetailStub.restore(); + }); + it('forward the registered views to the underlying DetailsView', function() { + fileList.destroy(); + fileList = new OCA.Files.FileList($('#app-content-files'), { + detailsViewEnabled: true + }); + fileList.registerTabView(new OCA.Files.DetailTabView()); + fileList.registerDetailView(new OCA.Files.DetailFileInfoView()); + + expect(addTabStub.calledOnce).toEqual(true); + // twice because the filelist already registers one by default + expect(addDetailStub.calledTwice).toEqual(true); + }); + it('does not error when registering panels when not details view configured', function() { + fileList.destroy(); + fileList = new OCA.Files.FileList($('#app-content-files'), { + detailsViewEnabled: false + }); + fileList.registerTabView(new OCA.Files.DetailTabView()); + fileList.registerDetailView(new OCA.Files.DetailFileInfoView()); + + expect(addTabStub.notCalled).toEqual(true); + expect(addDetailStub.notCalled).toEqual(true); + }); }); - it('Clicking on a file row will trigger file action if no details view configured', function() { - fileList._detailsView = null; + it('triggers file action when clicking on row if no details view configured', function() { + fileList.destroy(); + fileList = new OCA.Files.FileList($('#app-content-files'), { + detailsViewEnabled: false + }); var updateDetailsViewStub = sinon.stub(fileList, '_updateDetailsView'); var actionStub = sinon.stub(); fileList.setFiles(testFiles); @@ -1904,7 +1947,7 @@ describe('OCA.Files.FileList tests', function() { expect(updateDetailsViewStub.notCalled).toEqual(true); updateDetailsViewStub.restore(); }); - it('Clicking on a file row will trigger details sidebar', function() { + it('highlights current file when clicked and updates sidebar', function() { fileList.fileActions.setDefault('text/plain', 'Test'); var $tr = fileList.findFileEl('One.txt'); $tr.find('td.filename>a.name').click(); @@ -1912,14 +1955,34 @@ describe('OCA.Files.FileList tests', function() { expect(fileList._detailsView.getFileInfo().id).toEqual(1); }); - it('Clicking outside to deselect a file row will trigger details sidebar', function() { + it('keeps the last highlighted file when clicking outside', function() { var $tr = fileList.findFileEl('One.txt'); $tr.find('td.filename>a.name').click(); fileList.$el.find('tfoot').click(); - expect($tr.hasClass('highlighted')).toEqual(false); - expect(fileList._detailsView.getFileInfo()).toEqual(null); + expect($tr.hasClass('highlighted')).toEqual(true); + expect(fileList._detailsView.getFileInfo().id).toEqual(1); + }); + it('keeps the last highlighted file when unselecting file using checkbox', function() { + var $tr = fileList.findFileEl('One.txt'); + $tr.find('input:checkbox').click(); + expect($tr.hasClass('highlighted')).toEqual(true); + $tr.find('input:checkbox').click(); + + expect($tr.hasClass('highlighted')).toEqual(true); + expect(fileList._detailsView.getFileInfo().id).toEqual(1); + }); + it('closes sidebar whenever the currently highlighted file was removed from the list', function() { + var $tr = fileList.findFileEl('One.txt'); + $tr.find('td.filename>a.name').click(); + expect($tr.hasClass('highlighted')).toEqual(true); + + expect(fileList._detailsView.getFileInfo().id).toEqual(1); + + expect($('#app-sidebar').hasClass('disappear')).toEqual(false); + fileList.remove('One.txt'); + expect($('#app-sidebar').hasClass('disappear')).toEqual(true); }); it('returns the currently selected model instance when calling getModelForFile', function() { var $tr = fileList.findFileEl('One.txt'); @@ -1935,6 +1998,14 @@ describe('OCA.Files.FileList tests', function() { var model3 = fileList.getModelForFile($tr); expect(model3).toEqual(model1); }); + it('closes the sidebar when switching folders', function() { + var $tr = fileList.findFileEl('One.txt'); + $tr.find('td.filename>a.name').click(); + + expect($('#app-sidebar').hasClass('disappear')).toEqual(false); + fileList.changeDirectory('/another'); + expect($('#app-sidebar').hasClass('disappear')).toEqual(true); + }); }); describe('File actions', function() { it('Clicking on a file name will trigger default action', function() { @@ -2156,6 +2227,25 @@ describe('OCA.Files.FileList tests', function() { expect(fileList.files.length).toEqual(5); expect(fileList.$fileList.find('tr').length).toEqual(5); }); + it('does not sort when clicking on header whenever multiselect is enabled', function() { + var sortStub = sinon.stub(OCA.Files.FileList.prototype, 'setSort'); + + fileList.setFiles(testFiles); + fileList.findFileEl('One.txt').find('input:checkbox:first').click(); + + fileList.$el.find('.column-size .columntitle').click(); + + expect(sortStub.notCalled).toEqual(true); + + // can sort again after deselecting + fileList.findFileEl('One.txt').find('input:checkbox:first').click(); + + fileList.$el.find('.column-size .columntitle').click(); + + expect(sortStub.calledOnce).toEqual(true); + + sortStub.restore(); + }); }); describe('create file', function() { var deferredCreate; diff --git a/apps/files/tests/js/mainfileinfodetailviewSpec.js b/apps/files/tests/js/mainfileinfodetailviewSpec.js index 2b9e2b23f93..f4403196f2e 100644 --- a/apps/files/tests/js/mainfileinfodetailviewSpec.js +++ b/apps/files/tests/js/mainfileinfodetailviewSpec.js @@ -58,7 +58,7 @@ describe('OCA.Files.MainFileInfoDetailView tests', function() { expect(view.$el.find('.fileName h3').attr('title')).toEqual('One.txt'); expect(view.$el.find('.size').text()).toEqual('117.7 MB'); expect(view.$el.find('.size').attr('title')).toEqual('123456789 bytes'); - expect(view.$el.find('.date').text()).toEqual('a few seconds ago'); + expect(view.$el.find('.date').text()).toEqual('seconds ago'); expect(view.$el.find('.date').attr('title')).toEqual(dateExpected); clock.restore(); }); diff --git a/apps/files_external/ajax/applicable.php b/apps/files_external/ajax/applicable.php index 5ae91c8e182..7f1b4dc9221 100644 --- a/apps/files_external/ajax/applicable.php +++ b/apps/files_external/ajax/applicable.php @@ -2,6 +2,7 @@ /** * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/ajax/oauth1.php b/apps/files_external/ajax/oauth1.php index ca339aeec58..3d6736b3b59 100644 --- a/apps/files_external/ajax/oauth1.php +++ b/apps/files_external/ajax/oauth1.php @@ -4,8 +4,8 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Volkan Gezer <volkangezer@gmail.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/ajax/oauth2.php b/apps/files_external/ajax/oauth2.php index 0a202e3ddcb..e3e32c4b912 100644 --- a/apps/files_external/ajax/oauth2.php +++ b/apps/files_external/ajax/oauth2.php @@ -6,6 +6,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Volkan Gezer <volkangezer@gmail.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index f33012b5f09..aa39d79a85e 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -1,18 +1,14 @@ <?php /** * @author Christian Berendt <berendt@b1-systems.de> - * @author fibsifan <fi@volans.uberspace.de> * @author Jan-Christoph Borchardt <hey@jancborchardt.net> * @author j-ed <juergen@eisfair.org> - * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> - * @author Philipp Kapfer <philipp.kapfer@gmx.at> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Ross Nicoll <jrn@jrn.me.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> - * @author Volkan Gezer <volkangezer@gmail.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php index 3a222141fb5..c7deaaf270e 100644 --- a/apps/files_external/appinfo/application.php +++ b/apps/files_external/appinfo/application.php @@ -1,9 +1,10 @@ <?php /** * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Ross Nicoll <jrn@jrn.me.uk> * @author Vincent Petry <pvince81@owncloud.com> - * @author Robin McCorkell <rmccorkell@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index 8518cc89298..bb494a2eaba 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -14,12 +14,13 @@ <admin>admin-external-storage</admin> </documentation> <rememberlogin>false</rememberlogin> + <version>0.4.0</version> <types> <filesystem/> </types> <ocsid>166048</ocsid> <dependencies> - <owncloud min-version="8" /> + <owncloud min-version="9.0" /> </dependencies> </info> diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php index a371273e74e..a98a63c711d 100644 --- a/apps/files_external/appinfo/routes.php +++ b/apps/files_external/appinfo/routes.php @@ -3,6 +3,8 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Ross Nicoll <jrn@jrn.me.uk> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_external/appinfo/version b/apps/files_external/appinfo/version deleted file mode 100644 index 7179039691c..00000000000 --- a/apps/files_external/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2.3 diff --git a/apps/files_external/controller/ajaxcontroller.php b/apps/files_external/controller/ajaxcontroller.php index c285cd34e70..b278d66c1c0 100644 --- a/apps/files_external/controller/ajaxcontroller.php +++ b/apps/files_external/controller/ajaxcontroller.php @@ -1,6 +1,7 @@ <?php /** * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Ross Nicoll <jrn@jrn.me.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_external/controller/globalstoragescontroller.php b/apps/files_external/controller/globalstoragescontroller.php index 7d97fdbb4f4..e36d1fb2c03 100644 --- a/apps/files_external/controller/globalstoragescontroller.php +++ b/apps/files_external/controller/globalstoragescontroller.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -98,7 +99,7 @@ class GlobalStoragesController extends StoragesController { return $newStorage; } - $response = $this->validate($newStorage, BackendService::PERMISSION_CREATE); + $response = $this->validate($newStorage); if (!empty($response)) { return $response; } @@ -154,7 +155,7 @@ class GlobalStoragesController extends StoragesController { } $storage->setId($id); - $response = $this->validate($storage, BackendService::PERMISSION_MODIFY); + $response = $this->validate($storage); if (!empty($response)) { return $response; } @@ -179,14 +180,5 @@ class GlobalStoragesController extends StoragesController { } - /** - * Get the user type for this controller, used in validation - * - * @return string BackendService::USER_* constants - */ - protected function getUserType() { - return BackendService::USER_ADMIN; - } - } diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php index 46202c8ba4a..f754565f628 100644 --- a/apps/files_external/controller/storagescontroller.php +++ b/apps/files_external/controller/storagescontroller.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -125,11 +126,10 @@ abstract class StoragesController extends Controller { * Validate storage config * * @param StorageConfig $storage storage config - * @param int $permissionCheck permission to check * * @return DataResponse|null returns response in case of validation error */ - protected function validate(StorageConfig $storage, $permissionCheck = BackendService::PERMISSION_CREATE) { + protected function validate(StorageConfig $storage) { $mountPoint = $storage->getMountPoint(); if ($mountPoint === '' || $mountPoint === '/') { return new DataResponse( @@ -154,7 +154,7 @@ abstract class StoragesController extends Controller { $backend = $storage->getBackend(); /** @var AuthMechanism */ $authMechanism = $storage->getAuthMechanism(); - if (!$backend || $backend->checkDependencies()) { + if ($backend->checkDependencies()) { // invalid backend return new DataResponse( array( @@ -166,7 +166,7 @@ abstract class StoragesController extends Controller { ); } - if (!$backend->isPermitted($this->getUserType(), $permissionCheck)) { + if (!$backend->isVisibleFor($this->service->getVisibilityType())) { // not permitted to use backend return new DataResponse( array( @@ -177,7 +177,7 @@ abstract class StoragesController extends Controller { Http::STATUS_UNPROCESSABLE_ENTITY ); } - if (!$authMechanism->isPermitted($this->getUserType(), $permissionCheck)) { + if (!$authMechanism->isVisibleFor($this->service->getVisibilityType())) { // not permitted to use auth mechanism return new DataResponse( array( @@ -212,13 +212,6 @@ abstract class StoragesController extends Controller { } /** - * Get the user type for this controller, used in validation - * - * @return string BackendService::USER_* constants - */ - abstract protected function getUserType(); - - /** * Check whether the given storage is available / valid. * * Note that this operation can be time consuming depending diff --git a/apps/files_external/controller/userstoragescontroller.php b/apps/files_external/controller/userstoragescontroller.php index 801c9ab0aae..71d1f7cca46 100644 --- a/apps/files_external/controller/userstoragescontroller.php +++ b/apps/files_external/controller/userstoragescontroller.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -103,7 +104,7 @@ class UserStoragesController extends StoragesController { return $newStorage; } - $response = $this->validate($newStorage, BackendService::PERMISSION_CREATE); + $response = $this->validate($newStorage); if (!empty($response)) { return $response; } @@ -151,7 +152,7 @@ class UserStoragesController extends StoragesController { } $storage->setId($id); - $response = $this->validate($storage, BackendService::PERMISSION_MODIFY); + $response = $this->validate($storage); if (!empty($response)) { return $response; } @@ -187,13 +188,4 @@ class UserStoragesController extends StoragesController { return parent::destroy($id); } - /** - * Get the user type for this controller, used in validation - * - * @return string BackendService::USER_* constants - */ - protected function getUserType() { - return BackendService::USER_PERSONAL; - } - } diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css index fb7789a537d..35c7a395c58 100644 --- a/apps/files_external/css/settings.css +++ b/apps/files_external/css/settings.css @@ -57,16 +57,27 @@ td.mountPoint, td.backend { width:160px; } height: 32px; padding: 3px; } +.select2-results .select2-result-label > span { + display: block; + position: relative; +} .select2-results .select2-result-label .avatardiv { display:inline-block; } .select2-results .select2-result-label .avatardiv + span { + position: absolute; + top: 5px; margin-left: 10px; } .select2-results .select2-result-label .avatardiv[data-type="group"] + span { vertical-align: top; top: 6px; - position: relative; + position: absolute; + max-width: 80%; + left: 30px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } #externalStorage .mountOptionsToggle .dropdown { diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 4319677f4f4..5da34c52193 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -1113,7 +1113,18 @@ $(document).ready(function() { $('input[name="allowUserMountingBackends\\[\\]"]').bind('change', function() { OC.msg.startSaving('#userMountingMsg'); - var userMountingBackends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){return $(this).val();}).get(); + + var userMountingBackends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){ + return $(this).val(); + }).get(); + var deprecatedBackends = $('input[name="allowUserMountingBackends\\[\\]"][data-deprecate-to]').map(function(){ + if ($.inArray($(this).data('deprecate-to'), userMountingBackends) !== -1) { + return $(this).val(); + } + return null; + }).get(); + userMountingBackends = userMountingBackends.concat(deprecatedBackends); + OC.AppConfig.setValue('files_external', 'user_mounting_backends', userMountingBackends.join()); OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('files_external', 'Saved')}}); diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js index b6084cc1545..b663657e029 100644 --- a/apps/files_external/l10n/ast.js +++ b/apps/files_external/l10n/ast.js @@ -39,6 +39,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "Root" : "Raíz", "Share" : "Compartir", + "SMB / CIFS using OC login" : "SMB / CIFS usando accesu OC", "Username as share" : "Nome d'usuariu como Compartición", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Nota:</b> ", @@ -54,7 +55,6 @@ OC.L10N.register( "Available for" : "Disponible pa", "Delete" : "Desaniciar", "Add storage" : "Amestar almacenamientu", - "Enable User External Storage" : "Habilitar almacenamientu esterno d'usuariu", "Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamientu esternu" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json index ccf882952ae..0e98fe5a24a 100644 --- a/apps/files_external/l10n/ast.json +++ b/apps/files_external/l10n/ast.json @@ -37,6 +37,7 @@ "ownCloud" : "ownCloud", "Root" : "Raíz", "Share" : "Compartir", + "SMB / CIFS using OC login" : "SMB / CIFS usando accesu OC", "Username as share" : "Nome d'usuariu como Compartición", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Nota:</b> ", @@ -52,7 +53,6 @@ "Available for" : "Disponible pa", "Delete" : "Desaniciar", "Add storage" : "Amestar almacenamientu", - "Enable User External Storage" : "Habilitar almacenamientu esterno d'usuariu", "Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamientu esternu" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/az.js b/apps/files_external/l10n/az.js index 9c86576c7fc..700e36a4aef 100644 --- a/apps/files_external/l10n/az.js +++ b/apps/files_external/l10n/az.js @@ -41,6 +41,7 @@ OC.L10N.register( "Local" : "Yerli", "Location" : "Yerləşdiyiniz ünvan", "Share" : "Yayımla", + "SMB / CIFS using OC login" : "OC login istifadə edir SMB / CIFS", "Username as share" : "Paylaşım üçün istifadəçi adı", "OpenStack Object Storage" : "OpenStack Obyekt Deposu", "<b>Note:</b> " : "<b>Qeyd:</b> ", @@ -59,7 +60,6 @@ OC.L10N.register( "Advanced settings" : "İrəliləmiş quraşdırmalar", "Delete" : "Sil", "Add storage" : "Deponu əlavə et", - "Enable User External Storage" : "İstifadəçi kənar deponu aktivləşdir", "Allow users to mount the following external storage" : "Göstərilən kənar deponun bərkidilməsi üçün istifadəçilərə izin ver" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/az.json b/apps/files_external/l10n/az.json index fa300deea8d..6cccabb2dd6 100644 --- a/apps/files_external/l10n/az.json +++ b/apps/files_external/l10n/az.json @@ -39,6 +39,7 @@ "Local" : "Yerli", "Location" : "Yerləşdiyiniz ünvan", "Share" : "Yayımla", + "SMB / CIFS using OC login" : "OC login istifadə edir SMB / CIFS", "Username as share" : "Paylaşım üçün istifadəçi adı", "OpenStack Object Storage" : "OpenStack Obyekt Deposu", "<b>Note:</b> " : "<b>Qeyd:</b> ", @@ -57,7 +58,6 @@ "Advanced settings" : "İrəliləmiş quraşdırmalar", "Delete" : "Sil", "Add storage" : "Deponu əlavə et", - "Enable User External Storage" : "İstifadəçi kənar deponu aktivləşdir", "Allow users to mount the following external storage" : "Göstərilən kənar deponun bərkidilməsi üçün istifadəçilərə izin ver" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/bg_BG.js b/apps/files_external/l10n/bg_BG.js index 70eae9d1abd..f14b13d2a0e 100644 --- a/apps/files_external/l10n/bg_BG.js +++ b/apps/files_external/l10n/bg_BG.js @@ -43,6 +43,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "Root" : "Root", "Share" : "Споделяне", + "SMB / CIFS using OC login" : "SMB / CIFS използвайки OC профил", "Username as share" : "Потребителско име като споделена папка", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Бележка:</b> ", @@ -61,7 +62,6 @@ OC.L10N.register( "Advanced settings" : "Разширени настройки", "Delete" : "Изтрий", "Add storage" : "Добави дисково пространство", - "Enable User External Storage" : "Разреши Потребителско Външно Дисково Пространство", "Allow users to mount the following external storage" : "Разреши на потребителите да прикачват следното външно дисково пространство" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/bg_BG.json b/apps/files_external/l10n/bg_BG.json index 731897d4a3a..6cce8fd5cfa 100644 --- a/apps/files_external/l10n/bg_BG.json +++ b/apps/files_external/l10n/bg_BG.json @@ -41,6 +41,7 @@ "ownCloud" : "ownCloud", "Root" : "Root", "Share" : "Споделяне", + "SMB / CIFS using OC login" : "SMB / CIFS използвайки OC профил", "Username as share" : "Потребителско име като споделена папка", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Бележка:</b> ", @@ -59,7 +60,6 @@ "Advanced settings" : "Разширени настройки", "Delete" : "Изтрий", "Add storage" : "Добави дисково пространство", - "Enable User External Storage" : "Разреши Потребителско Външно Дисково Пространство", "Allow users to mount the following external storage" : "Разреши на потребителите да прикачват следното външно дисково пространство" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/bn_BD.js b/apps/files_external/l10n/bn_BD.js index 3676a1a8b51..32d40f3fb8a 100644 --- a/apps/files_external/l10n/bn_BD.js +++ b/apps/files_external/l10n/bn_BD.js @@ -34,7 +34,6 @@ OC.L10N.register( "External Storage" : "বাহ্যিক সংরক্ষণাগার", "Folder name" : "ফোলডারের নাম", "Configuration" : "কনফিগারেসন", - "Delete" : "মুছে", - "Enable User External Storage" : "ব্যবহারকারীর বাহ্যিক সংরক্ষণাগার সক্রিয় কর" + "Delete" : "মুছে" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/bn_BD.json b/apps/files_external/l10n/bn_BD.json index 5b7d07da5a2..3a2d8d4f2af 100644 --- a/apps/files_external/l10n/bn_BD.json +++ b/apps/files_external/l10n/bn_BD.json @@ -32,7 +32,6 @@ "External Storage" : "বাহ্যিক সংরক্ষণাগার", "Folder name" : "ফোলডারের নাম", "Configuration" : "কনফিগারেসন", - "Delete" : "মুছে", - "Enable User External Storage" : "ব্যবহারকারীর বাহ্যিক সংরক্ষণাগার সক্রিয় কর" + "Delete" : "মুছে" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js index 9c10f6d5c50..b14057ea420 100644 --- a/apps/files_external/l10n/ca.js +++ b/apps/files_external/l10n/ca.js @@ -48,7 +48,9 @@ OC.L10N.register( "Location" : "Ubicació", "ownCloud" : "ownCloud", "Root" : "Arrel", + "SFTP with secret key login" : "Inici de sessió SFTP amb clau secreta", "Share" : "Comparteix", + "SMB / CIFS using OC login" : "SMB / CIFS usant acreditació OC", "Username as share" : "Nom d'usuari per compartir", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Nota:</b> ", @@ -67,7 +69,6 @@ OC.L10N.register( "Advanced settings" : "Configuració avançada", "Delete" : "Esborra", "Add storage" : "Afegeix emmagatzemament", - "Enable User External Storage" : "Habilita l'emmagatzemament extern d'usuari", "Allow users to mount the following external storage" : "Permet als usuaris muntar els dispositius externs següents" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json index 123527688c4..cce51970c18 100644 --- a/apps/files_external/l10n/ca.json +++ b/apps/files_external/l10n/ca.json @@ -46,7 +46,9 @@ "Location" : "Ubicació", "ownCloud" : "ownCloud", "Root" : "Arrel", + "SFTP with secret key login" : "Inici de sessió SFTP amb clau secreta", "Share" : "Comparteix", + "SMB / CIFS using OC login" : "SMB / CIFS usant acreditació OC", "Username as share" : "Nom d'usuari per compartir", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Nota:</b> ", @@ -65,7 +67,6 @@ "Advanced settings" : "Configuració avançada", "Delete" : "Esborra", "Add storage" : "Afegeix emmagatzemament", - "Enable User External Storage" : "Habilita l'emmagatzemament extern d'usuari", "Allow users to mount the following external storage" : "Permet als usuaris muntar els dispositius externs següents" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js index 503d00893e9..78b5832d70c 100644 --- a/apps/files_external/l10n/cs_CZ.js +++ b/apps/files_external/l10n/cs_CZ.js @@ -10,7 +10,12 @@ OC.L10N.register( "Storage with id \"%i\" not found" : "Úložiště s id \"%i\" nebylo nalezeno", "Invalid backend or authentication mechanism class" : "Neplatný backend nebo třída ověřovacího mechanismu", "Invalid mount point" : "Neplatný přípojný bod", + "Objectstore forbidden" : "Úložiště objektů zakázáno", "Invalid storage backend \"%s\"" : "Neplatná služba úložiště \"%s\"", + "Not permitted to use backend \"%s\"" : "Nebylo povoleno použítí služby \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Nebylo povoleno použití ověřovacího mechanismu \"%s\"", + "Unsatisfied backend parameters" : "Neuspokojivé parametry služby", + "Unsatisfied authentication mechanism parameters" : "Neuspokojivé parametry ověřovacího mechanismu", "Personal" : "Osobní", "System" : "Systém", "Grant access" : "Povolit přístup", @@ -30,6 +35,7 @@ OC.L10N.register( "Saved" : "Uloženo", "Access key" : "Přístupový klíč", "Secret key" : "Tajný klíč", + "Builtin" : "Zabudované", "None" : "Žádné", "OAuth1" : "OAuth1", "App key" : "Klíč aplikace", @@ -40,6 +46,7 @@ OC.L10N.register( "OpenStack" : "OpenStack", "Username" : "Uživatelské jméno", "Password" : "Heslo", + "Rackspace" : "Rackspace", "API key" : "Klíč API", "Username and password" : "Uživatelské jméno a heslo", "Session credentials" : "Přihlašovací údaje sezení", @@ -66,10 +73,15 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Kořen", + "SFTP with secret key login" : "SFTP login s tajným klíčem", "SMB / CIFS" : "SMB / CIFS", "Share" : "Sdílet", + "Domain" : "Doména", + "SMB / CIFS using OC login" : "SMB / CIFS za použití přihlašovacího jména OC", "Username as share" : "Uživatelské jméno jako sdílený adresář", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Jméno služby", + "Request timeout (seconds)" : "Čas vypršení požadavku (sekundy)", "<b>Note:</b> " : "<b>Poznámka:</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", @@ -87,7 +99,6 @@ OC.L10N.register( "Advanced settings" : "Pokročilá nastavení", "Delete" : "Smazat", "Add storage" : "Přidat úložiště", - "Enable User External Storage" : "Zapnout externí uživatelské úložiště", "Allow users to mount the following external storage" : "Povolit uživatelů připojit následující externí úložiště" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json index 74aa6cc82e3..d509e99689a 100644 --- a/apps/files_external/l10n/cs_CZ.json +++ b/apps/files_external/l10n/cs_CZ.json @@ -8,7 +8,12 @@ "Storage with id \"%i\" not found" : "Úložiště s id \"%i\" nebylo nalezeno", "Invalid backend or authentication mechanism class" : "Neplatný backend nebo třída ověřovacího mechanismu", "Invalid mount point" : "Neplatný přípojný bod", + "Objectstore forbidden" : "Úložiště objektů zakázáno", "Invalid storage backend \"%s\"" : "Neplatná služba úložiště \"%s\"", + "Not permitted to use backend \"%s\"" : "Nebylo povoleno použítí služby \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Nebylo povoleno použití ověřovacího mechanismu \"%s\"", + "Unsatisfied backend parameters" : "Neuspokojivé parametry služby", + "Unsatisfied authentication mechanism parameters" : "Neuspokojivé parametry ověřovacího mechanismu", "Personal" : "Osobní", "System" : "Systém", "Grant access" : "Povolit přístup", @@ -28,6 +33,7 @@ "Saved" : "Uloženo", "Access key" : "Přístupový klíč", "Secret key" : "Tajný klíč", + "Builtin" : "Zabudované", "None" : "Žádné", "OAuth1" : "OAuth1", "App key" : "Klíč aplikace", @@ -38,6 +44,7 @@ "OpenStack" : "OpenStack", "Username" : "Uživatelské jméno", "Password" : "Heslo", + "Rackspace" : "Rackspace", "API key" : "Klíč API", "Username and password" : "Uživatelské jméno a heslo", "Session credentials" : "Přihlašovací údaje sezení", @@ -64,10 +71,15 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Kořen", + "SFTP with secret key login" : "SFTP login s tajným klíčem", "SMB / CIFS" : "SMB / CIFS", "Share" : "Sdílet", + "Domain" : "Doména", + "SMB / CIFS using OC login" : "SMB / CIFS za použití přihlašovacího jména OC", "Username as share" : "Uživatelské jméno jako sdílený adresář", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Jméno služby", + "Request timeout (seconds)" : "Čas vypršení požadavku (sekundy)", "<b>Note:</b> " : "<b>Poznámka:</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", @@ -85,7 +97,6 @@ "Advanced settings" : "Pokročilá nastavení", "Delete" : "Smazat", "Add storage" : "Přidat úložiště", - "Enable User External Storage" : "Zapnout externí uživatelské úložiště", "Allow users to mount the following external storage" : "Povolit uživatelů připojit následující externí úložiště" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js index 435884aa11d..ba5d572a206 100644 --- a/apps/files_external/l10n/da.js +++ b/apps/files_external/l10n/da.js @@ -75,11 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", - "SFTP with secret key login [DEPRECATED]" : "SFTP med det hemmelige nøgle login [DEPRECATED]", + "SFTP with secret key login" : "SFTP med hemmelig nøglelogin", "SMB / CIFS" : "SMB / CIFS", "Share" : "Del", "Domain" : "Domæne", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS der bruger OC login [DEPRECATED]", + "SMB / CIFS using OC login" : "SMB / CIFS med OC-login", "Username as share" : "Brugernavn som deling", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Tjenestenavn", @@ -101,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Avancerede indstillinger", "Delete" : "Slet", "Add storage" : "Tilføj lager", - "Enable User External Storage" : "Aktivér ekstern opbevaring for brugere", "Allow users to mount the following external storage" : "Tillad brugere at montere følgende som eksternt lager" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json index 631fb196624..c819040bc74 100644 --- a/apps/files_external/l10n/da.json +++ b/apps/files_external/l10n/da.json @@ -73,11 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", - "SFTP with secret key login [DEPRECATED]" : "SFTP med det hemmelige nøgle login [DEPRECATED]", + "SFTP with secret key login" : "SFTP med hemmelig nøglelogin", "SMB / CIFS" : "SMB / CIFS", "Share" : "Del", "Domain" : "Domæne", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS der bruger OC login [DEPRECATED]", + "SMB / CIFS using OC login" : "SMB / CIFS med OC-login", "Username as share" : "Brugernavn som deling", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Tjenestenavn", @@ -99,7 +99,6 @@ "Advanced settings" : "Avancerede indstillinger", "Delete" : "Slet", "Add storage" : "Tilføj lager", - "Enable User External Storage" : "Aktivér ekstern opbevaring for brugere", "Allow users to mount the following external storage" : "Tillad brugere at montere følgende som eksternt lager" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js index fc0af67d3d7..c26322495d6 100644 --- a/apps/files_external/l10n/de.js +++ b/apps/files_external/l10n/de.js @@ -1,6 +1,9 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Abrufen des Anfrage-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel korrekt sind.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Abrufen des Zugriff-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel korrekt sind.", + "Please provide a valid app key and secret." : "Bitte trage einen gültigen App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", "External storage" : "Externer Speicher", @@ -11,6 +14,7 @@ OC.L10N.register( "System" : "System", "Grant access" : "Zugriff gestatten", "Access granted" : "Zugriff gestattet", + "Error configuring OAuth2" : "Fehler beim Einrichten von OAuth2", "Generate keys" : "Schlüssel erzeugen", "Error generating key pair" : "Fehler beim Erzeugen des Schlüsselpaares", "Enable encryption" : "Verschlüsselung aktivieren", @@ -22,14 +26,21 @@ OC.L10N.register( "All users. Type to select user or group." : "Alle Benutzer. Benutzer oder Gruppe zur Auswahl eingeben.", "(group)" : "(group)", "Saved" : "Gespeichert", + "Access key" : "Zugangsschlüssel", + "Secret key" : "Geheimer Schlüssel", "None" : "Keine", + "OAuth1" : "OAuth1", "App key" : "App-Schlüssel", "App secret" : "Geheime Zeichenkette der App", + "OAuth2" : "OAutch2", "Client ID" : "Client-ID", "Client secret" : "Geheime Zeichenkette des Client", + "OpenStack" : "OpenStack", "Username" : "Benutzername", "Password" : "Passwort", "API key" : "API-Schlüssel", + "Username and password" : "Benutzername und Passwort", + "RSA public key" : "RSA öffentlicher Schlüssel", "Public key" : "Öffentlicher Schlüssel", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -43,13 +54,20 @@ OC.L10N.register( "Remote subfolder" : "Entfernter Unterordner", "Secure https://" : "Sicherer HTTPS://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Host", "Secure ftps://" : "Sicherer ftps://", + "Google Drive" : "Google Drive", "Local" : "Lokal", "Location" : "Ort", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Share", + "Domain" : "Domain", + "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login", "Username as share" : "Benutzername als Freigabe", "OpenStack Object Storage" : "Openstack-Objektspeicher", "<b>Note:</b> " : "<b>Hinweis:</b> ", @@ -63,12 +81,12 @@ OC.L10N.register( "Scope" : "Anwendungsbereich", "External Storage" : "Externer Speicher", "Folder name" : "Ordnername", + "Authentication" : "Authentifizierung", "Configuration" : "Konfiguration", "Available for" : "Verfügbar für", "Advanced settings" : "Erweiterte Einstellungen", "Delete" : "Löschen", "Add storage" : "Speicher hinzufügen", - "Enable User External Storage" : "Externen Speicher für Benutzer aktivieren", "Allow users to mount the following external storage" : "Erlaube es Benutzern, den folgenden externen Speicher einzubinden" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json index 4242b817073..adec32d072b 100644 --- a/apps/files_external/l10n/de.json +++ b/apps/files_external/l10n/de.json @@ -1,4 +1,7 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Abrufen des Anfrage-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel korrekt sind.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Abrufen des Zugriff-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel korrekt sind.", + "Please provide a valid app key and secret." : "Bitte trage einen gültigen App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", "External storage" : "Externer Speicher", @@ -9,6 +12,7 @@ "System" : "System", "Grant access" : "Zugriff gestatten", "Access granted" : "Zugriff gestattet", + "Error configuring OAuth2" : "Fehler beim Einrichten von OAuth2", "Generate keys" : "Schlüssel erzeugen", "Error generating key pair" : "Fehler beim Erzeugen des Schlüsselpaares", "Enable encryption" : "Verschlüsselung aktivieren", @@ -20,14 +24,21 @@ "All users. Type to select user or group." : "Alle Benutzer. Benutzer oder Gruppe zur Auswahl eingeben.", "(group)" : "(group)", "Saved" : "Gespeichert", + "Access key" : "Zugangsschlüssel", + "Secret key" : "Geheimer Schlüssel", "None" : "Keine", + "OAuth1" : "OAuth1", "App key" : "App-Schlüssel", "App secret" : "Geheime Zeichenkette der App", + "OAuth2" : "OAutch2", "Client ID" : "Client-ID", "Client secret" : "Geheime Zeichenkette des Client", + "OpenStack" : "OpenStack", "Username" : "Benutzername", "Password" : "Passwort", "API key" : "API-Schlüssel", + "Username and password" : "Benutzername und Passwort", + "RSA public key" : "RSA öffentlicher Schlüssel", "Public key" : "Öffentlicher Schlüssel", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -41,13 +52,20 @@ "Remote subfolder" : "Entfernter Unterordner", "Secure https://" : "Sicherer HTTPS://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Host", "Secure ftps://" : "Sicherer ftps://", + "Google Drive" : "Google Drive", "Local" : "Lokal", "Location" : "Ort", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Share", + "Domain" : "Domain", + "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login", "Username as share" : "Benutzername als Freigabe", "OpenStack Object Storage" : "Openstack-Objektspeicher", "<b>Note:</b> " : "<b>Hinweis:</b> ", @@ -61,12 +79,12 @@ "Scope" : "Anwendungsbereich", "External Storage" : "Externer Speicher", "Folder name" : "Ordnername", + "Authentication" : "Authentifizierung", "Configuration" : "Konfiguration", "Available for" : "Verfügbar für", "Advanced settings" : "Erweiterte Einstellungen", "Delete" : "Löschen", "Add storage" : "Speicher hinzufügen", - "Enable User External Storage" : "Externen Speicher für Benutzer aktivieren", "Allow users to mount the following external storage" : "Erlaube es Benutzern, den folgenden externen Speicher einzubinden" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js index 9d363aecbf6..c30fcb95919 100644 --- a/apps/files_external/l10n/de_DE.js +++ b/apps/files_external/l10n/de_DE.js @@ -49,7 +49,9 @@ OC.L10N.register( "Location" : "Ort", "ownCloud" : "ownCloud", "Root" : "Root", + "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel", "Share" : "Share", + "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login", "Username as share" : "Benutzername als Freigabe", "OpenStack Object Storage" : "Openstack-Objektspeicher", "<b>Note:</b> " : "<b>Hinweis:</b> ", @@ -68,7 +70,6 @@ OC.L10N.register( "Advanced settings" : "Erweiterte Einstellungen", "Delete" : "Löschen", "Add storage" : "Speicher hinzufügen", - "Enable User External Storage" : "Externen Speicher für Benutzer aktivieren", "Allow users to mount the following external storage" : "Erlauben Sie Benutzern, folgende externe Speicher einzubinden" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json index 62fe7b0803c..7fec06bf90f 100644 --- a/apps/files_external/l10n/de_DE.json +++ b/apps/files_external/l10n/de_DE.json @@ -47,7 +47,9 @@ "Location" : "Ort", "ownCloud" : "ownCloud", "Root" : "Root", + "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel", "Share" : "Share", + "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login", "Username as share" : "Benutzername als Freigabe", "OpenStack Object Storage" : "Openstack-Objektspeicher", "<b>Note:</b> " : "<b>Hinweis:</b> ", @@ -66,7 +68,6 @@ "Advanced settings" : "Erweiterte Einstellungen", "Delete" : "Löschen", "Add storage" : "Speicher hinzufügen", - "Enable User External Storage" : "Externen Speicher für Benutzer aktivieren", "Allow users to mount the following external storage" : "Erlauben Sie Benutzern, folgende externe Speicher einzubinden" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js index b311d615c32..8b4d089a964 100644 --- a/apps/files_external/l10n/el.js +++ b/apps/files_external/l10n/el.js @@ -75,10 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", - "SFTP with secret key login [DEPRECATED]" : "SFTP με σύνδεση με κρυφό κλειδί [ΠΑΡΩΧΗΜΕΝΟ]", + "SFTP with secret key login" : "SFTP με σύνδεση με κρυφό κλειδί", "SMB / CIFS" : "SMB / CIFS", "Share" : "Διαμοιράστε", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC [ΠΑΡΩΧΗΜΕΝΟ]", + "Domain" : "Τομέας", + "SMB / CIFS using OC login" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC", "Username as share" : "Όνομα χρήστη ως διαμοιραζόμενος φάκελος", "OpenStack Object Storage" : "Αποθήκη αντικειμένων OpenStack", "Service name" : "Όνομα υπηρεσίας", @@ -100,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Ρυθμίσεις για προχωρημένους", "Delete" : "Διαγραφή", "Add storage" : "Προσθηκη αποθηκευσης", - "Enable User External Storage" : "Ενεργοποίηση Εξωτερικού Αποθηκευτικού Χώρου Χρήστη", "Allow users to mount the following external storage" : "Χορήγηση άδειας στους χρήστες να συνδέσουν τα παρακάτω εξωτερικά μέσα αποθήκευσης" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json index f42a610cc55..74a9aa298ef 100644 --- a/apps/files_external/l10n/el.json +++ b/apps/files_external/l10n/el.json @@ -73,10 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", - "SFTP with secret key login [DEPRECATED]" : "SFTP με σύνδεση με κρυφό κλειδί [ΠΑΡΩΧΗΜΕΝΟ]", + "SFTP with secret key login" : "SFTP με σύνδεση με κρυφό κλειδί", "SMB / CIFS" : "SMB / CIFS", "Share" : "Διαμοιράστε", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC [ΠΑΡΩΧΗΜΕΝΟ]", + "Domain" : "Τομέας", + "SMB / CIFS using OC login" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC", "Username as share" : "Όνομα χρήστη ως διαμοιραζόμενος φάκελος", "OpenStack Object Storage" : "Αποθήκη αντικειμένων OpenStack", "Service name" : "Όνομα υπηρεσίας", @@ -98,7 +99,6 @@ "Advanced settings" : "Ρυθμίσεις για προχωρημένους", "Delete" : "Διαγραφή", "Add storage" : "Προσθηκη αποθηκευσης", - "Enable User External Storage" : "Ενεργοποίηση Εξωτερικού Αποθηκευτικού Χώρου Χρήστη", "Allow users to mount the following external storage" : "Χορήγηση άδειας στους χρήστες να συνδέσουν τα παρακάτω εξωτερικά μέσα αποθήκευσης" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/en_GB.js b/apps/files_external/l10n/en_GB.js index 8b1c0cdd328..9829bd3e8c7 100644 --- a/apps/files_external/l10n/en_GB.js +++ b/apps/files_external/l10n/en_GB.js @@ -49,7 +49,9 @@ OC.L10N.register( "Location" : "Location", "ownCloud" : "ownCloud", "Root" : "Root", + "SFTP with secret key login" : "SFTP with secret key login", "Share" : "Share", + "SMB / CIFS using OC login" : "SMB / CIFS using OC login", "Username as share" : "Username as share", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Note:</b> ", @@ -68,7 +70,6 @@ OC.L10N.register( "Advanced settings" : "Advanced settings", "Delete" : "Delete", "Add storage" : "Add storage", - "Enable User External Storage" : "Enable User External Storage", "Allow users to mount the following external storage" : "Allow users to mount the following external storage" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/en_GB.json b/apps/files_external/l10n/en_GB.json index 78feab7a08f..88467528431 100644 --- a/apps/files_external/l10n/en_GB.json +++ b/apps/files_external/l10n/en_GB.json @@ -47,7 +47,9 @@ "Location" : "Location", "ownCloud" : "ownCloud", "Root" : "Root", + "SFTP with secret key login" : "SFTP with secret key login", "Share" : "Share", + "SMB / CIFS using OC login" : "SMB / CIFS using OC login", "Username as share" : "Username as share", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Note:</b> ", @@ -66,7 +68,6 @@ "Advanced settings" : "Advanced settings", "Delete" : "Delete", "Add storage" : "Add storage", - "Enable User External Storage" : "Enable User External Storage", "Allow users to mount the following external storage" : "Allow users to mount the following external storage" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/eo.js b/apps/files_external/l10n/eo.js index 8a8884777e6..ce3dd21c012 100644 --- a/apps/files_external/l10n/eo.js +++ b/apps/files_external/l10n/eo.js @@ -40,7 +40,6 @@ OC.L10N.register( "Available for" : "Disponebla por", "Delete" : "Forigi", "Add storage" : "Aldoni memorilon", - "Enable User External Storage" : "Kapabligi malenan memorilon de uzanto", "Allow users to mount the following external storage" : "Permesi uzantojn munti la jenajn malenajn memorilojn" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/eo.json b/apps/files_external/l10n/eo.json index 6741a31e72a..d8c620d24c2 100644 --- a/apps/files_external/l10n/eo.json +++ b/apps/files_external/l10n/eo.json @@ -38,7 +38,6 @@ "Available for" : "Disponebla por", "Delete" : "Forigi", "Add storage" : "Aldoni memorilon", - "Enable User External Storage" : "Kapabligi malenan memorilon de uzanto", "Allow users to mount the following external storage" : "Permesi uzantojn munti la jenajn malenajn memorilojn" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index 62d09425f72..5415e8963cd 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -7,6 +7,7 @@ OC.L10N.register( "Storage with id \"%i\" not found" : "No se ha encontrado almacenamiento con id \"%i\"", "Invalid mount point" : "Punto de montaje no válido", "Invalid storage backend \"%s\"" : "Motor de almacenamiento no válido «%s»", + "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autenticación \"%s\"", "Personal" : "Personal", "System" : "Sistema", "Grant access" : "Conceder acceso", @@ -35,9 +36,11 @@ OC.L10N.register( "Client secret" : "Cliente secreto", "Username" : "Nombre de usuario", "Password" : "Contraseña", - "API key" : "clave API", + "Tenant name" : "Nombre del inquilino", + "API key" : "Clave API", "Username and password" : "Nombre de usuario y contraseña", "Session credentials" : "Credenciales de la sesión", + "RSA public key" : "Clave pública RSA", "Public key" : "Clave pública", "Amazon S3" : "Amazon S3", "Bucket" : "Depósito", @@ -60,10 +63,14 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Raíz", + "SFTP with secret key login" : "Inicio de sesión SFTP con clave secreta", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartir", + "Domain" : "Dominio", + "SMB / CIFS using OC login" : "SMB / CIFS que usan acceso OC", "Username as share" : "Nombre de usuario como compartir", "OpenStack Object Storage" : "Almacenamiento de objeto OpenStack", + "Service name" : "Nombre del servicio", "<b>Note:</b> " : "<b>Nota:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.", @@ -81,7 +88,6 @@ OC.L10N.register( "Advanced settings" : "Configuración avanzada", "Delete" : "Eliminar", "Add storage" : "Añadir almacenamiento", - "Enable User External Storage" : "Habilitar almacenamiento externo de usuario", "Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamiento externo" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index 6bcfca820f5..10cbf0c974a 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -5,6 +5,7 @@ "Storage with id \"%i\" not found" : "No se ha encontrado almacenamiento con id \"%i\"", "Invalid mount point" : "Punto de montaje no válido", "Invalid storage backend \"%s\"" : "Motor de almacenamiento no válido «%s»", + "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autenticación \"%s\"", "Personal" : "Personal", "System" : "Sistema", "Grant access" : "Conceder acceso", @@ -33,9 +34,11 @@ "Client secret" : "Cliente secreto", "Username" : "Nombre de usuario", "Password" : "Contraseña", - "API key" : "clave API", + "Tenant name" : "Nombre del inquilino", + "API key" : "Clave API", "Username and password" : "Nombre de usuario y contraseña", "Session credentials" : "Credenciales de la sesión", + "RSA public key" : "Clave pública RSA", "Public key" : "Clave pública", "Amazon S3" : "Amazon S3", "Bucket" : "Depósito", @@ -58,10 +61,14 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Raíz", + "SFTP with secret key login" : "Inicio de sesión SFTP con clave secreta", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartir", + "Domain" : "Dominio", + "SMB / CIFS using OC login" : "SMB / CIFS que usan acceso OC", "Username as share" : "Nombre de usuario como compartir", "OpenStack Object Storage" : "Almacenamiento de objeto OpenStack", + "Service name" : "Nombre del servicio", "<b>Note:</b> " : "<b>Nota:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.", @@ -79,7 +86,6 @@ "Advanced settings" : "Configuración avanzada", "Delete" : "Eliminar", "Add storage" : "Añadir almacenamiento", - "Enable User External Storage" : "Habilitar almacenamiento externo de usuario", "Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamiento externo" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/es_AR.js b/apps/files_external/l10n/es_AR.js index 383b511a75f..fd242104c8c 100644 --- a/apps/files_external/l10n/es_AR.js +++ b/apps/files_external/l10n/es_AR.js @@ -23,7 +23,6 @@ OC.L10N.register( "Folder name" : "Nombre de la carpeta", "Configuration" : "Configuración", "Delete" : "Borrar", - "Add storage" : "Añadir almacenamiento", - "Enable User External Storage" : "Habilitar almacenamiento de usuario externo" + "Add storage" : "Añadir almacenamiento" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/es_AR.json b/apps/files_external/l10n/es_AR.json index 0389f98e647..d9e91a3af47 100644 --- a/apps/files_external/l10n/es_AR.json +++ b/apps/files_external/l10n/es_AR.json @@ -21,7 +21,6 @@ "Folder name" : "Nombre de la carpeta", "Configuration" : "Configuración", "Delete" : "Borrar", - "Add storage" : "Añadir almacenamiento", - "Enable User External Storage" : "Habilitar almacenamiento de usuario externo" + "Add storage" : "Añadir almacenamiento" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/es_MX.js b/apps/files_external/l10n/es_MX.js index a8d1dea1a09..9682e360a58 100644 --- a/apps/files_external/l10n/es_MX.js +++ b/apps/files_external/l10n/es_MX.js @@ -5,9 +5,12 @@ OC.L10N.register( "Personal" : "Personal", "Grant access" : "Conceder acceso", "Access granted" : "Acceso concedido", + "Saved" : "Guardado", + "None" : "Ninguno", "Username" : "Nombre de usuario", "Password" : "Contraseña", "API key" : "clave API", + "Public key" : "Llave pública", "Port" : "Puerto", "WebDAV" : "WebDAV", "URL" : "URL", @@ -19,7 +22,6 @@ OC.L10N.register( "Folder name" : "Nombre de la carpeta", "Configuration" : "Configuración", "Delete" : "Eliminar", - "Add storage" : "Añadir almacenamiento", - "Enable User External Storage" : "Habilitar almacenamiento externo de usuario" + "Add storage" : "Añadir almacenamiento" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/es_MX.json b/apps/files_external/l10n/es_MX.json index 3fdea60b775..81b2f408d11 100644 --- a/apps/files_external/l10n/es_MX.json +++ b/apps/files_external/l10n/es_MX.json @@ -3,9 +3,12 @@ "Personal" : "Personal", "Grant access" : "Conceder acceso", "Access granted" : "Acceso concedido", + "Saved" : "Guardado", + "None" : "Ninguno", "Username" : "Nombre de usuario", "Password" : "Contraseña", "API key" : "clave API", + "Public key" : "Llave pública", "Port" : "Puerto", "WebDAV" : "WebDAV", "URL" : "URL", @@ -17,7 +20,6 @@ "Folder name" : "Nombre de la carpeta", "Configuration" : "Configuración", "Delete" : "Eliminar", - "Add storage" : "Añadir almacenamiento", - "Enable User External Storage" : "Habilitar almacenamiento externo de usuario" + "Add storage" : "Añadir almacenamiento" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js index 50102a5d2eb..ae66daa37a6 100644 --- a/apps/files_external/l10n/et_EE.js +++ b/apps/files_external/l10n/et_EE.js @@ -22,11 +22,14 @@ OC.L10N.register( "All users. Type to select user or group." : "Kõik kasutajad. Kirjuta, et valida kasutaja või grupp.", "(group)" : "(grupp)", "Saved" : "Salvestatud", + "Builtin" : "Sisseehitatud", "None" : "Pole", + "OAuth1" : "OAuth1", "App key" : "Rakenduse võti", "App secret" : "Rakenduse salasõna", "Client ID" : "Kliendi ID", "Client secret" : "Kliendi salasõna", + "OpenStack" : "OpenStack", "Username" : "Kasutajanimi", "Password" : "Parool", "API key" : "API võti", @@ -43,15 +46,23 @@ OC.L10N.register( "Remote subfolder" : "Mujahl olev alamkaust", "Secure https://" : "Turvaline https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Host", "Secure ftps://" : "Turvaline ftps://", + "Google Drive" : "Google Drive", "Local" : "Kohalik", "Location" : "Asukoht", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Juur", + "SFTP with secret key login" : "SFTP koos salajase võtmega logimisega", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Jaga", + "Domain" : "Domeen", + "SMB / CIFS using OC login" : "SMB / CIFS kasutades OC logimist", "Username as share" : "Kasutajanimi kui jagamine", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Teenuse nimi", "<b>Note:</b> " : "<b>Märkus:</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> cURL tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata cURL tugi.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> FTP tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata FTP tugi.", @@ -63,12 +74,12 @@ OC.L10N.register( "Scope" : "Skoop", "External Storage" : "Väline salvestuskoht", "Folder name" : "Kausta nimi", + "Authentication" : "Autentimine", "Configuration" : "Seadistamine", "Available for" : "Saadaval", "Advanced settings" : "Lisavalikud", "Delete" : "Kustuta", "Add storage" : "Lisa andmehoidla", - "Enable User External Storage" : "Luba kasutajatele väline salvestamine", "Allow users to mount the following external storage" : "Võimalda kasutajatel ühendada järgmist välist andmehoidlat" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json index d307bc9c214..f2cc31e46e1 100644 --- a/apps/files_external/l10n/et_EE.json +++ b/apps/files_external/l10n/et_EE.json @@ -20,11 +20,14 @@ "All users. Type to select user or group." : "Kõik kasutajad. Kirjuta, et valida kasutaja või grupp.", "(group)" : "(grupp)", "Saved" : "Salvestatud", + "Builtin" : "Sisseehitatud", "None" : "Pole", + "OAuth1" : "OAuth1", "App key" : "Rakenduse võti", "App secret" : "Rakenduse salasõna", "Client ID" : "Kliendi ID", "Client secret" : "Kliendi salasõna", + "OpenStack" : "OpenStack", "Username" : "Kasutajanimi", "Password" : "Parool", "API key" : "API võti", @@ -41,15 +44,23 @@ "Remote subfolder" : "Mujahl olev alamkaust", "Secure https://" : "Turvaline https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Host", "Secure ftps://" : "Turvaline ftps://", + "Google Drive" : "Google Drive", "Local" : "Kohalik", "Location" : "Asukoht", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Juur", + "SFTP with secret key login" : "SFTP koos salajase võtmega logimisega", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Jaga", + "Domain" : "Domeen", + "SMB / CIFS using OC login" : "SMB / CIFS kasutades OC logimist", "Username as share" : "Kasutajanimi kui jagamine", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Teenuse nimi", "<b>Note:</b> " : "<b>Märkus:</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> cURL tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata cURL tugi.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> FTP tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata FTP tugi.", @@ -61,12 +72,12 @@ "Scope" : "Skoop", "External Storage" : "Väline salvestuskoht", "Folder name" : "Kausta nimi", + "Authentication" : "Autentimine", "Configuration" : "Seadistamine", "Available for" : "Saadaval", "Advanced settings" : "Lisavalikud", "Delete" : "Kustuta", "Add storage" : "Lisa andmehoidla", - "Enable User External Storage" : "Luba kasutajatele väline salvestamine", "Allow users to mount the following external storage" : "Võimalda kasutajatel ühendada järgmist välist andmehoidlat" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/eu.js b/apps/files_external/l10n/eu.js index 199676d7269..599229a92b3 100644 --- a/apps/files_external/l10n/eu.js +++ b/apps/files_external/l10n/eu.js @@ -38,6 +38,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "Root" : "Erroa", "Share" : "Partekatu", + "SMB / CIFS using OC login" : "SMB / CIFS saioa hasteko OC erabiliz", "Username as share" : "Erabiltzaile izena elkarbanaketa bezala", "OpenStack Object Storage" : "OpenStack Objektu Biltegiratzea", "<b>Note:</b> " : "<b>Oharra:</b>", @@ -53,7 +54,6 @@ OC.L10N.register( "Available for" : "Hauentzat eskuragarri", "Delete" : "Ezabatu", "Add storage" : "Gehitu biltegiratzea", - "Enable User External Storage" : "Gaitu erabiltzaileentzako kanpo biltegiratzea", "Allow users to mount the following external storage" : "Baimendu erabiltzaileak hurrengo kanpo biltegiratzeak muntatzen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/eu.json b/apps/files_external/l10n/eu.json index f13311954f7..5a568893060 100644 --- a/apps/files_external/l10n/eu.json +++ b/apps/files_external/l10n/eu.json @@ -36,6 +36,7 @@ "ownCloud" : "ownCloud", "Root" : "Erroa", "Share" : "Partekatu", + "SMB / CIFS using OC login" : "SMB / CIFS saioa hasteko OC erabiliz", "Username as share" : "Erabiltzaile izena elkarbanaketa bezala", "OpenStack Object Storage" : "OpenStack Objektu Biltegiratzea", "<b>Note:</b> " : "<b>Oharra:</b>", @@ -51,7 +52,6 @@ "Available for" : "Hauentzat eskuragarri", "Delete" : "Ezabatu", "Add storage" : "Gehitu biltegiratzea", - "Enable User External Storage" : "Gaitu erabiltzaileentzako kanpo biltegiratzea", "Allow users to mount the following external storage" : "Baimendu erabiltzaileak hurrengo kanpo biltegiratzeak muntatzen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/fa.js b/apps/files_external/l10n/fa.js index 1a3a06ba391..a18f7cdcf5c 100644 --- a/apps/files_external/l10n/fa.js +++ b/apps/files_external/l10n/fa.js @@ -1,29 +1,64 @@ OC.L10N.register( "files_external", { + "Please provide a valid app key and secret." : "لطفا یک کلید و رمز معتبر برای برنامه فرآهم کنید.", + "Step 1 failed. Exception: %s" : "گام 1 ناموفق بود. خطا: %s", + "Step 2 failed. Exception: %s" : "گام 2ناموفق بود. خطا: %s", "External storage" : "حافظه خارجی", + "Storage with id \"%i\" not found" : "فضای ذخیرهسازی با شماره \"%i\" یافت نشد", "Personal" : "شخصی", + "System" : "سیستم", "Grant access" : " مجوز اعطا دسترسی", "Access granted" : "مجوز دسترسی صادر شد", + "Error configuring OAuth1" : "خطا پیکربندی OAuth1", + "Error configuring OAuth2" : "خطا پیکربندی OAuth2", + "Generate keys" : "تولید کلید", + "Enable encryption" : "فعال کردن رمزگذاری", + "Check for changes" : "بررسی برای تغییرات", + "Never" : "هرگز", + "(group)" : "(گروه)", "Saved" : "ذخیره شد", + "Access key" : "کلید دسترسی", + "Secret key" : "کلید مخفی", "None" : "هیچکدام", + "OAuth1" : "OAuth1", + "App secret" : "کد برنامه", + "OAuth2" : "OAuth2", + "OpenStack" : "OpenStack", "Username" : "نام کاربری", "Password" : "گذرواژه", "API key" : "کلید API ", + "Username and password" : "نام کاربری و رمز عبور", + "Public key" : "کلید عمومی", + "Amazon S3" : "Amazon S3", "Port" : "درگاه", "Region" : "ناحیه", + "Enable SSL" : "فعالسازی SSL", "WebDAV" : "WebDAV", "URL" : "آدرس", + "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "میزبانی", + "Google Drive" : "Google Drive", + "Local" : "محلی", "Location" : "محل", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "SMB / CIFS" : "SMB / CIFS", "Share" : "اشتراکگذاری", + "Domain" : "دامنه", + "Service name" : "نام سرویس", + "No external storage configured" : "هیچ فضای ذخیرهسازی خارجیای تنظیم نشده است", "Name" : "نام", + "Storage type" : "نوع فضای ذخیرهسازی", + "Scope" : "حوزه", "External Storage" : "حافظه خارجی", "Folder name" : "نام پوشه", + "Authentication" : "احراز هویت", "Configuration" : "پیکربندی", + "Available for" : "در دسترس برای", + "Advanced settings" : "تنظیمات پیشرفته", "Delete" : "حذف", - "Add storage" : "اضافه کردن حافظه", - "Enable User External Storage" : "فعال سازی حافظه خارجی کاربر" + "Add storage" : "اضافه کردن حافظه" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/fa.json b/apps/files_external/l10n/fa.json index 79a599d7390..4bc16f72f54 100644 --- a/apps/files_external/l10n/fa.json +++ b/apps/files_external/l10n/fa.json @@ -1,27 +1,62 @@ { "translations": { + "Please provide a valid app key and secret." : "لطفا یک کلید و رمز معتبر برای برنامه فرآهم کنید.", + "Step 1 failed. Exception: %s" : "گام 1 ناموفق بود. خطا: %s", + "Step 2 failed. Exception: %s" : "گام 2ناموفق بود. خطا: %s", "External storage" : "حافظه خارجی", + "Storage with id \"%i\" not found" : "فضای ذخیرهسازی با شماره \"%i\" یافت نشد", "Personal" : "شخصی", + "System" : "سیستم", "Grant access" : " مجوز اعطا دسترسی", "Access granted" : "مجوز دسترسی صادر شد", + "Error configuring OAuth1" : "خطا پیکربندی OAuth1", + "Error configuring OAuth2" : "خطا پیکربندی OAuth2", + "Generate keys" : "تولید کلید", + "Enable encryption" : "فعال کردن رمزگذاری", + "Check for changes" : "بررسی برای تغییرات", + "Never" : "هرگز", + "(group)" : "(گروه)", "Saved" : "ذخیره شد", + "Access key" : "کلید دسترسی", + "Secret key" : "کلید مخفی", "None" : "هیچکدام", + "OAuth1" : "OAuth1", + "App secret" : "کد برنامه", + "OAuth2" : "OAuth2", + "OpenStack" : "OpenStack", "Username" : "نام کاربری", "Password" : "گذرواژه", "API key" : "کلید API ", + "Username and password" : "نام کاربری و رمز عبور", + "Public key" : "کلید عمومی", + "Amazon S3" : "Amazon S3", "Port" : "درگاه", "Region" : "ناحیه", + "Enable SSL" : "فعالسازی SSL", "WebDAV" : "WebDAV", "URL" : "آدرس", + "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "میزبانی", + "Google Drive" : "Google Drive", + "Local" : "محلی", "Location" : "محل", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "SMB / CIFS" : "SMB / CIFS", "Share" : "اشتراکگذاری", + "Domain" : "دامنه", + "Service name" : "نام سرویس", + "No external storage configured" : "هیچ فضای ذخیرهسازی خارجیای تنظیم نشده است", "Name" : "نام", + "Storage type" : "نوع فضای ذخیرهسازی", + "Scope" : "حوزه", "External Storage" : "حافظه خارجی", "Folder name" : "نام پوشه", + "Authentication" : "احراز هویت", "Configuration" : "پیکربندی", + "Available for" : "در دسترس برای", + "Advanced settings" : "تنظیمات پیشرفته", "Delete" : "حذف", - "Add storage" : "اضافه کردن حافظه", - "Enable User External Storage" : "فعال سازی حافظه خارجی کاربر" + "Add storage" : "اضافه کردن حافظه" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js index 92e93d9ed3a..b65dad2e321 100644 --- a/apps/files_external/l10n/fi_FI.js +++ b/apps/files_external/l10n/fi_FI.js @@ -58,6 +58,7 @@ OC.L10N.register( "SFTP" : "SFTP", "SMB / CIFS" : "SMB / CIFS", "Share" : "Jaa", + "SMB / CIFS using OC login" : "SMB / CIFS käyttäen OC-kirjautumista", "Username as share" : "Käyttäjänimi jakona", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Palvelun nimi", @@ -77,7 +78,6 @@ OC.L10N.register( "Advanced settings" : "Lisäasetukset", "Delete" : "Poista", "Add storage" : "Lisää tallennustila", - "Enable User External Storage" : "Ota käyttöön ulkopuoliset tallennuspaikat", "Allow users to mount the following external storage" : "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json index 6459b33a126..edf5c7c13b1 100644 --- a/apps/files_external/l10n/fi_FI.json +++ b/apps/files_external/l10n/fi_FI.json @@ -56,6 +56,7 @@ "SFTP" : "SFTP", "SMB / CIFS" : "SMB / CIFS", "Share" : "Jaa", + "SMB / CIFS using OC login" : "SMB / CIFS käyttäen OC-kirjautumista", "Username as share" : "Käyttäjänimi jakona", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Palvelun nimi", @@ -75,7 +76,6 @@ "Advanced settings" : "Lisäasetukset", "Delete" : "Poista", "Add storage" : "Lisää tallennustila", - "Enable User External Storage" : "Ota käyttöön ulkopuoliset tallennuspaikat", "Allow users to mount the following external storage" : "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index 87c7f63bfb5..48567ebd604 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -8,10 +8,12 @@ OC.L10N.register( "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", "External storage" : "Stockage externe", "Storage with id \"%i\" not found" : "Stockage avec l'id \"%i\" non trouvé", - "Invalid backend or authentication mechanism class" : "Système de stockage ou méthode d'authentification non valable", + "Invalid backend or authentication mechanism class" : "Service ou méthode d'authentification non valable", "Invalid mount point" : "Point de montage non valide", "Objectstore forbidden" : "\"Objectstore\" interdit", "Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"", + "Not permitted to use backend \"%s\"" : "Non autorisé à utiliser le service \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Non autorisé à utiliser le mécanisme d'authentification \"%s\"", "Unsatisfied backend parameters" : "Paramètres manquants pour le service", "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", "Personal" : "Personnel", @@ -33,7 +35,7 @@ OC.L10N.register( "Saved" : "Sauvegardé", "Access key" : "Clé d'accès", "Secret key" : "Clé secrète", - "Builtin" : "inclus", + "Builtin" : "Intégré", "None" : "Aucun", "OAuth1" : "OAuth1", "App key" : "App key", @@ -41,11 +43,16 @@ OC.L10N.register( "OAuth2" : "OAuth2", "Client ID" : "ID Client", "Client secret" : "Secret client", + "OpenStack" : "OpenStack", "Username" : "Nom d'utilisateur", "Password" : "Mot de passe", + "Tenant name" : "Tenant name", + "Identity endpoint URL" : "Identity endpoint URL", + "Rackspace" : "Rackspace", "API key" : "Clé API", "Username and password" : "Nom d'utilisateur et mot de passe", "Session credentials" : "Informations d'identification de session", + "RSA public key" : "Clé publique RSA", "Public key" : "Clef publique", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -67,11 +74,16 @@ OC.L10N.register( "Location" : "Emplacement", "ownCloud" : "ownCloud", "SFTP" : "SFTP", - "Root" : "Root", + "Root" : "Racine", + "SFTP with secret key login" : "SFTP avec identification par clé", "SMB / CIFS" : "SMB / CIFS", "Share" : "Partage", + "Domain" : "Domaine", + "SMB / CIFS using OC login" : "SMB / CIFS en utilisant les identifiants OC", "Username as share" : "Nom d'utilisateur comme nom de partage", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nom du service", + "Request timeout (seconds)" : "Timeout des requêtes (en secondes)", "<b>Note:</b> " : "<b>Attention :</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", @@ -89,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Paramètres avancés", "Delete" : "Supprimer", "Add storage" : "Ajouter un support de stockage", - "Enable User External Storage" : "Autoriser les utilisateurs à ajouter des stockages externes", "Allow users to mount the following external storage" : "Autoriser les utilisateurs à monter les stockages externes suivants" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index dee041e3546..228ff869c4a 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -6,10 +6,12 @@ "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", "External storage" : "Stockage externe", "Storage with id \"%i\" not found" : "Stockage avec l'id \"%i\" non trouvé", - "Invalid backend or authentication mechanism class" : "Système de stockage ou méthode d'authentification non valable", + "Invalid backend or authentication mechanism class" : "Service ou méthode d'authentification non valable", "Invalid mount point" : "Point de montage non valide", "Objectstore forbidden" : "\"Objectstore\" interdit", "Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"", + "Not permitted to use backend \"%s\"" : "Non autorisé à utiliser le service \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Non autorisé à utiliser le mécanisme d'authentification \"%s\"", "Unsatisfied backend parameters" : "Paramètres manquants pour le service", "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", "Personal" : "Personnel", @@ -31,7 +33,7 @@ "Saved" : "Sauvegardé", "Access key" : "Clé d'accès", "Secret key" : "Clé secrète", - "Builtin" : "inclus", + "Builtin" : "Intégré", "None" : "Aucun", "OAuth1" : "OAuth1", "App key" : "App key", @@ -39,11 +41,16 @@ "OAuth2" : "OAuth2", "Client ID" : "ID Client", "Client secret" : "Secret client", + "OpenStack" : "OpenStack", "Username" : "Nom d'utilisateur", "Password" : "Mot de passe", + "Tenant name" : "Tenant name", + "Identity endpoint URL" : "Identity endpoint URL", + "Rackspace" : "Rackspace", "API key" : "Clé API", "Username and password" : "Nom d'utilisateur et mot de passe", "Session credentials" : "Informations d'identification de session", + "RSA public key" : "Clé publique RSA", "Public key" : "Clef publique", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -65,11 +72,16 @@ "Location" : "Emplacement", "ownCloud" : "ownCloud", "SFTP" : "SFTP", - "Root" : "Root", + "Root" : "Racine", + "SFTP with secret key login" : "SFTP avec identification par clé", "SMB / CIFS" : "SMB / CIFS", "Share" : "Partage", + "Domain" : "Domaine", + "SMB / CIFS using OC login" : "SMB / CIFS en utilisant les identifiants OC", "Username as share" : "Nom d'utilisateur comme nom de partage", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nom du service", + "Request timeout (seconds)" : "Timeout des requêtes (en secondes)", "<b>Note:</b> " : "<b>Attention :</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", @@ -87,7 +99,6 @@ "Advanced settings" : "Paramètres avancés", "Delete" : "Supprimer", "Add storage" : "Ajouter un support de stockage", - "Enable User External Storage" : "Autoriser les utilisateurs à ajouter des stockages externes", "Allow users to mount the following external storage" : "Autoriser les utilisateurs à monter les stockages externes suivants" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js index fc4d4ea4931..5827a6ab57f 100644 --- a/apps/files_external/l10n/gl.js +++ b/apps/files_external/l10n/gl.js @@ -49,7 +49,9 @@ OC.L10N.register( "Location" : "Localización", "ownCloud" : "ownCloud", "Root" : "Root (raíz)", + "SFTP with secret key login" : "SFTP con chave secreta de acceso", "Share" : "Compartir", + "SMB / CIFS using OC login" : "SMB / CIFS usando acceso OC", "Username as share" : "Nome de usuario como compartición", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Nota:</b> ", @@ -68,7 +70,6 @@ OC.L10N.register( "Advanced settings" : "Axustes avanzados", "Delete" : "Eliminar", "Add storage" : "Engadir almacenamento", - "Enable User External Storage" : "Activar o almacenamento externo do usuario", "Allow users to mount the following external storage" : "Permitirlle aos usuarios montar o seguinte almacenamento externo" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json index 48bd2c62e9a..29dde23c329 100644 --- a/apps/files_external/l10n/gl.json +++ b/apps/files_external/l10n/gl.json @@ -47,7 +47,9 @@ "Location" : "Localización", "ownCloud" : "ownCloud", "Root" : "Root (raíz)", + "SFTP with secret key login" : "SFTP con chave secreta de acceso", "Share" : "Compartir", + "SMB / CIFS using OC login" : "SMB / CIFS usando acceso OC", "Username as share" : "Nome de usuario como compartición", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Nota:</b> ", @@ -66,7 +68,6 @@ "Advanced settings" : "Axustes avanzados", "Delete" : "Eliminar", "Add storage" : "Engadir almacenamento", - "Enable User External Storage" : "Activar o almacenamento externo do usuario", "Allow users to mount the following external storage" : "Permitirlle aos usuarios montar o seguinte almacenamento externo" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/he.js b/apps/files_external/l10n/he.js index 2de5539e7d1..613f2688ee4 100644 --- a/apps/files_external/l10n/he.js +++ b/apps/files_external/l10n/he.js @@ -21,7 +21,6 @@ OC.L10N.register( "External Storage" : "אחסון חיצוני", "Folder name" : "שם התיקייה", "Configuration" : "הגדרות", - "Delete" : "מחיקה", - "Enable User External Storage" : "הפעלת אחסון חיצוני למשתמשים" + "Delete" : "מחיקה" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/he.json b/apps/files_external/l10n/he.json index 4b4e289c53e..928329f1d4e 100644 --- a/apps/files_external/l10n/he.json +++ b/apps/files_external/l10n/he.json @@ -19,7 +19,6 @@ "External Storage" : "אחסון חיצוני", "Folder name" : "שם התיקייה", "Configuration" : "הגדרות", - "Delete" : "מחיקה", - "Enable User External Storage" : "הפעלת אחסון חיצוני למשתמשים" + "Delete" : "מחיקה" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/hr.js b/apps/files_external/l10n/hr.js index 7ab17521581..4ab71f76ffb 100644 --- a/apps/files_external/l10n/hr.js +++ b/apps/files_external/l10n/hr.js @@ -36,6 +36,7 @@ OC.L10N.register( "ownCloud" : "OwnCloud", "Root" : "Korijen", "Share" : "Dijeljenje zhajedničkih resursa", + "SMB / CIFS using OC login" : "SMB / CIFS uz prijavu putem programa OC", "Username as share" : "Korisničko ime kao dijeljeni resurs", "OpenStack Object Storage" : "Prostor za pohranu.....", "<b>Note:</b> " : "<b>Bilješka:</b>", @@ -51,7 +52,6 @@ OC.L10N.register( "Available for" : "Dostupno za", "Delete" : "Izbrišite", "Add storage" : "Dodajte spremište", - "Enable User External Storage" : "Omogućite korisničko vanjsko spremište", "Allow users to mount the following external storage" : "Dopustite korisnicima postavljanje sljedećeg vanjskog spremišta" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/files_external/l10n/hr.json b/apps/files_external/l10n/hr.json index 23188c55fea..e8b8dcd3f61 100644 --- a/apps/files_external/l10n/hr.json +++ b/apps/files_external/l10n/hr.json @@ -34,6 +34,7 @@ "ownCloud" : "OwnCloud", "Root" : "Korijen", "Share" : "Dijeljenje zhajedničkih resursa", + "SMB / CIFS using OC login" : "SMB / CIFS uz prijavu putem programa OC", "Username as share" : "Korisničko ime kao dijeljeni resurs", "OpenStack Object Storage" : "Prostor za pohranu.....", "<b>Note:</b> " : "<b>Bilješka:</b>", @@ -49,7 +50,6 @@ "Available for" : "Dostupno za", "Delete" : "Izbrišite", "Add storage" : "Dodajte spremište", - "Enable User External Storage" : "Omogućite korisničko vanjsko spremište", "Allow users to mount the following external storage" : "Dopustite korisnicima postavljanje sljedećeg vanjskog spremišta" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/hu_HU.js b/apps/files_external/l10n/hu_HU.js index 563267f66fd..0a307f8a609 100644 --- a/apps/files_external/l10n/hu_HU.js +++ b/apps/files_external/l10n/hu_HU.js @@ -40,7 +40,6 @@ OC.L10N.register( "Configuration" : "Beállítások", "Available for" : "Elérhető számukra", "Delete" : "Törlés", - "Add storage" : "Tároló becsatolása", - "Enable User External Storage" : "Külső tárolók engedélyezése a felhasználók részére" + "Add storage" : "Tároló becsatolása" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/hu_HU.json b/apps/files_external/l10n/hu_HU.json index a3608dba7b7..4012c0eb490 100644 --- a/apps/files_external/l10n/hu_HU.json +++ b/apps/files_external/l10n/hu_HU.json @@ -38,7 +38,6 @@ "Configuration" : "Beállítások", "Available for" : "Elérhető számukra", "Delete" : "Törlés", - "Add storage" : "Tároló becsatolása", - "Enable User External Storage" : "Külső tárolók engedélyezése a felhasználók részére" + "Add storage" : "Tároló becsatolása" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/hy.js b/apps/files_external/l10n/hy.js index 2030a284acb..9996681f88b 100644 --- a/apps/files_external/l10n/hy.js +++ b/apps/files_external/l10n/hy.js @@ -2,6 +2,11 @@ OC.L10N.register( "files_external", { "Personal" : "Անձնական", + "Password" : "Գաղտնաբառ", + "URL" : "URL", + "Dropbox" : "Dropbox", + "Share" : "Կիսվել", + "Name" : "Անուն", "Delete" : "Ջնջել" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/hy.json b/apps/files_external/l10n/hy.json index fa925e0854d..ac5a0edf013 100644 --- a/apps/files_external/l10n/hy.json +++ b/apps/files_external/l10n/hy.json @@ -1,5 +1,10 @@ { "translations": { "Personal" : "Անձնական", + "Password" : "Գաղտնաբառ", + "URL" : "URL", + "Dropbox" : "Dropbox", + "Share" : "Կիսվել", + "Name" : "Անուն", "Delete" : "Ջնջել" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js index be0abf0bbae..b01e13e6085 100644 --- a/apps/files_external/l10n/id.js +++ b/apps/files_external/l10n/id.js @@ -12,6 +12,8 @@ OC.L10N.register( "Invalid mount point" : "Mount point salah", "Objectstore forbidden" : "Objectstore terlarang", "Invalid storage backend \"%s\"" : "Backend penyimpanan \"%s\" salah", + "Not permitted to use backend \"%s\"" : "Tidak diizinkan menggunakan backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Tidak diizinkan menggunakan mekanisme otentikasi \"%s\"", "Unsatisfied backend parameters" : "Parameter backend tidak lengkap", "Unsatisfied authentication mechanism parameters" : "Parameter mekanisme otentikasi tidak lengkap", "Personal" : "Pribadi", @@ -41,11 +43,16 @@ OC.L10N.register( "OAuth2" : "OAuth2", "Client ID" : "ID Klien", "Client secret" : "Rahasia klien", + "OpenStack" : "OpenStack", "Username" : "Nama Pengguna", "Password" : "Sandi", + "Tenant name" : "Nama tenant", + "Identity endpoint URL" : "Identitas URL akhir", + "Rackspace" : "Rackspace", "API key" : "Kunci API", "Username and password" : "Nama pengguna dan sandi", "Session credentials" : "Kredensial sesi", + "RSA public key" : "Kunci publik RSA", "Public key" : "Kunci Public", "Amazon S3" : "Amazon S3", "Bucket" : "Keranjang", @@ -68,10 +75,15 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", + "SFTP with secret key login" : "SFTP dengan kunci rahasia masuk", "SMB / CIFS" : "SMB / CIFS", "Share" : "Bagikan", + "Domain" : "Domain", + "SMB / CIFS using OC login" : "SMB / CIFS menggunakan OC login", "Username as share" : "Nama pengguna berbagi", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nama layanan", + "Request timeout (seconds)" : "Minta waktu habis (detik)", "<b>Note:</b> " : "<b>Catatan:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", @@ -89,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Pengaturan Lanjutan", "Delete" : "Hapus", "Add storage" : "Tambahkan penyimpanan", - "Enable User External Storage" : "Aktifkan Penyimpanan Eksternal Pengguna", "Allow users to mount the following external storage" : "Izinkan pengguna untuk mengaitkan penyimpanan eksternal berikut" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json index 6c80a01b970..383850199ac 100644 --- a/apps/files_external/l10n/id.json +++ b/apps/files_external/l10n/id.json @@ -10,6 +10,8 @@ "Invalid mount point" : "Mount point salah", "Objectstore forbidden" : "Objectstore terlarang", "Invalid storage backend \"%s\"" : "Backend penyimpanan \"%s\" salah", + "Not permitted to use backend \"%s\"" : "Tidak diizinkan menggunakan backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Tidak diizinkan menggunakan mekanisme otentikasi \"%s\"", "Unsatisfied backend parameters" : "Parameter backend tidak lengkap", "Unsatisfied authentication mechanism parameters" : "Parameter mekanisme otentikasi tidak lengkap", "Personal" : "Pribadi", @@ -39,11 +41,16 @@ "OAuth2" : "OAuth2", "Client ID" : "ID Klien", "Client secret" : "Rahasia klien", + "OpenStack" : "OpenStack", "Username" : "Nama Pengguna", "Password" : "Sandi", + "Tenant name" : "Nama tenant", + "Identity endpoint URL" : "Identitas URL akhir", + "Rackspace" : "Rackspace", "API key" : "Kunci API", "Username and password" : "Nama pengguna dan sandi", "Session credentials" : "Kredensial sesi", + "RSA public key" : "Kunci publik RSA", "Public key" : "Kunci Public", "Amazon S3" : "Amazon S3", "Bucket" : "Keranjang", @@ -66,10 +73,15 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", + "SFTP with secret key login" : "SFTP dengan kunci rahasia masuk", "SMB / CIFS" : "SMB / CIFS", "Share" : "Bagikan", + "Domain" : "Domain", + "SMB / CIFS using OC login" : "SMB / CIFS menggunakan OC login", "Username as share" : "Nama pengguna berbagi", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nama layanan", + "Request timeout (seconds)" : "Minta waktu habis (detik)", "<b>Note:</b> " : "<b>Catatan:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", @@ -87,7 +99,6 @@ "Advanced settings" : "Pengaturan Lanjutan", "Delete" : "Hapus", "Add storage" : "Tambahkan penyimpanan", - "Enable User External Storage" : "Aktifkan Penyimpanan Eksternal Pengguna", "Allow users to mount the following external storage" : "Izinkan pengguna untuk mengaitkan penyimpanan eksternal berikut" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/is.js b/apps/files_external/l10n/is.js index 8af1f2ac0cf..a1edd11fc1c 100644 --- a/apps/files_external/l10n/is.js +++ b/apps/files_external/l10n/is.js @@ -17,7 +17,6 @@ OC.L10N.register( "External Storage" : "Ytri gagnageymsla", "Folder name" : "Nafn möppu", "Configuration" : "Uppsetning", - "Delete" : "Eyða", - "Enable User External Storage" : "Virkja ytra gagnasvæði notenda" + "Delete" : "Eyða" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/files_external/l10n/is.json b/apps/files_external/l10n/is.json index 8abd02bdf0a..6d52ed3a896 100644 --- a/apps/files_external/l10n/is.json +++ b/apps/files_external/l10n/is.json @@ -15,7 +15,6 @@ "External Storage" : "Ytri gagnageymsla", "Folder name" : "Nafn möppu", "Configuration" : "Uppsetning", - "Delete" : "Eyða", - "Enable User External Storage" : "Virkja ytra gagnasvæði notenda" + "Delete" : "Eyða" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index 0844e90b903..860429080bc 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -75,11 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Radice", - "SFTP with secret key login [DEPRECATED]" : "SFTP con accesso a chiave segreta [DEPRECATO]", + "SFTP with secret key login" : "SFTP con accesso a chiave segreta", "SMB / CIFS" : "SMB / CIFS", "Share" : "Condividi", "Domain" : "Dominio", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS utilizzando le credenziali di OC [DEPRECATO]", + "SMB / CIFS using OC login" : "SMB / CIFS utilizzando le credenziali di OC", "Username as share" : "Nome utente come condivisione", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nome servizio", @@ -101,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Impostazioni avanzate", "Delete" : "Elimina", "Add storage" : "Aggiungi archiviazione", - "Enable User External Storage" : "Abilita la memoria esterna dell'utente", "Allow users to mount the following external storage" : "Consenti agli utenti di montare la seguente memoria esterna" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index cfe633bc328..e277e9e8604 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -73,11 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Radice", - "SFTP with secret key login [DEPRECATED]" : "SFTP con accesso a chiave segreta [DEPRECATO]", + "SFTP with secret key login" : "SFTP con accesso a chiave segreta", "SMB / CIFS" : "SMB / CIFS", "Share" : "Condividi", "Domain" : "Dominio", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS utilizzando le credenziali di OC [DEPRECATO]", + "SMB / CIFS using OC login" : "SMB / CIFS utilizzando le credenziali di OC", "Username as share" : "Nome utente come condivisione", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nome servizio", @@ -99,7 +99,6 @@ "Advanced settings" : "Impostazioni avanzate", "Delete" : "Elimina", "Add storage" : "Aggiungi archiviazione", - "Enable User External Storage" : "Abilita la memoria esterna dell'utente", "Allow users to mount the following external storage" : "Consenti agli utenti di montare la seguente memoria esterna" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index f5a9720be2e..358a362e506 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -1,6 +1,7 @@ OC.L10N.register( "files_external", { + "Please provide a valid app key and secret." : "有効なアプリのキーとパスワードを入力してください。", "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s", "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s", "External storage" : "外部ストレージ", @@ -22,14 +23,21 @@ OC.L10N.register( "All users. Type to select user or group." : "すべてのユーザー。ユーザー、グループを追加", "(group)" : "(グループ)", "Saved" : "保存されました", + "Access key" : "アクセスキー", + "Secret key" : "シークレットキー", "None" : "なし", + "OAuth1" : "OAuth1", "App key" : "アプリキー", "App secret" : "アプリシークレット", + "OAuth2" : "OAuth2", "Client ID" : "クライアントID", "Client secret" : "クライアント秘密キー", + "OpenStack" : "OpenStack", "Username" : "ユーザー名", "Password" : "パスワード", + "Rackspace" : "Rackspace", "API key" : "APIキー", + "RSA public key" : "RSA公開鍵", "Public key" : "公開鍵", "Amazon S3" : "Amazon S3", "Bucket" : "バケット名", @@ -43,15 +51,23 @@ OC.L10N.register( "Remote subfolder" : "リモートサブフォルダー", "Secure https://" : "セキュア https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "ホスト", "Secure ftps://" : "Secure ftps://", + "Google Drive" : "Google Drive", "Local" : "ローカル", "Location" : "位置", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "ルート", + "SFTP with secret key login" : "秘密鍵でSFTPログイン", + "SMB / CIFS" : "SMB / CIFS", "Share" : "共有", + "Domain" : "ドメイン", + "SMB / CIFS using OC login" : "ownCloudログインを利用したSMB / CIFS", "Username as share" : "共有名", "OpenStack Object Storage" : "OpenStack ObjectStorage", + "Service name" : "サービス名", "<b>Note:</b> " : "<b>注意:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにcURLのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにFTPのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", @@ -63,12 +79,12 @@ OC.L10N.register( "Scope" : "スコープ", "External Storage" : "外部ストレージ", "Folder name" : "フォルダー名", + "Authentication" : "認証", "Configuration" : "設定", "Available for" : "利用可能", "Advanced settings" : "詳細設定", "Delete" : "削除", "Add storage" : "ストレージを追加", - "Enable User External Storage" : "ユーザーの外部ストレージを有効にする", "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index 951e86df8ca..8af4ce97ced 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -1,4 +1,5 @@ { "translations": { + "Please provide a valid app key and secret." : "有効なアプリのキーとパスワードを入力してください。", "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s", "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s", "External storage" : "外部ストレージ", @@ -20,14 +21,21 @@ "All users. Type to select user or group." : "すべてのユーザー。ユーザー、グループを追加", "(group)" : "(グループ)", "Saved" : "保存されました", + "Access key" : "アクセスキー", + "Secret key" : "シークレットキー", "None" : "なし", + "OAuth1" : "OAuth1", "App key" : "アプリキー", "App secret" : "アプリシークレット", + "OAuth2" : "OAuth2", "Client ID" : "クライアントID", "Client secret" : "クライアント秘密キー", + "OpenStack" : "OpenStack", "Username" : "ユーザー名", "Password" : "パスワード", + "Rackspace" : "Rackspace", "API key" : "APIキー", + "RSA public key" : "RSA公開鍵", "Public key" : "公開鍵", "Amazon S3" : "Amazon S3", "Bucket" : "バケット名", @@ -41,15 +49,23 @@ "Remote subfolder" : "リモートサブフォルダー", "Secure https://" : "セキュア https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "ホスト", "Secure ftps://" : "Secure ftps://", + "Google Drive" : "Google Drive", "Local" : "ローカル", "Location" : "位置", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "ルート", + "SFTP with secret key login" : "秘密鍵でSFTPログイン", + "SMB / CIFS" : "SMB / CIFS", "Share" : "共有", + "Domain" : "ドメイン", + "SMB / CIFS using OC login" : "ownCloudログインを利用したSMB / CIFS", "Username as share" : "共有名", "OpenStack Object Storage" : "OpenStack ObjectStorage", + "Service name" : "サービス名", "<b>Note:</b> " : "<b>注意:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにcURLのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにFTPのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", @@ -61,12 +77,12 @@ "Scope" : "スコープ", "External Storage" : "外部ストレージ", "Folder name" : "フォルダー名", + "Authentication" : "認証", "Configuration" : "設定", "Available for" : "利用可能", "Advanced settings" : "詳細設定", "Delete" : "削除", "Add storage" : "ストレージを追加", - "Enable User External Storage" : "ユーザーの外部ストレージを有効にする", "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ka_GE.js b/apps/files_external/l10n/ka_GE.js index 6f38743a215..824295cb93d 100644 --- a/apps/files_external/l10n/ka_GE.js +++ b/apps/files_external/l10n/ka_GE.js @@ -22,7 +22,6 @@ OC.L10N.register( "Folder name" : "ფოლდერის სახელი", "Configuration" : "კონფიგურაცია", "Delete" : "წაშლა", - "Add storage" : "საცავის დამატება", - "Enable User External Storage" : "მომხმარებლის ექსტერნალ საცავის აქტივირება" + "Add storage" : "საცავის დამატება" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/ka_GE.json b/apps/files_external/l10n/ka_GE.json index 7ca96f6db5d..73ad2cfd0c5 100644 --- a/apps/files_external/l10n/ka_GE.json +++ b/apps/files_external/l10n/ka_GE.json @@ -20,7 +20,6 @@ "Folder name" : "ფოლდერის სახელი", "Configuration" : "კონფიგურაცია", "Delete" : "წაშლა", - "Add storage" : "საცავის დამატება", - "Enable User External Storage" : "მომხმარებლის ექსტერნალ საცავის აქტივირება" + "Add storage" : "საცავის დამატება" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js index 3bed24abe66..0d5bf1b4622 100644 --- a/apps/files_external/l10n/ko.js +++ b/apps/files_external/l10n/ko.js @@ -12,6 +12,8 @@ OC.L10N.register( "Invalid mount point" : "잘못된 마운트 지점", "Objectstore forbidden" : "Objectstore에 접근 금지됨", "Invalid storage backend \"%s\"" : "잘못된 저장소 백엔드 \"%s\"", + "Not permitted to use backend \"%s\"" : "백엔드 \"%s\" 사용이 허가되지 않았음", + "Not permitted to use authentication mechanism \"%s\"" : "인증 방식 \"%s\" 사용이 허가되지 않았음", "Unsatisfied backend parameters" : "백엔드 인자가 부족함", "Unsatisfied authentication mechanism parameters" : "인증 방식 인자가 부족함", "Personal" : "개인", @@ -41,11 +43,16 @@ OC.L10N.register( "OAuth2" : "OAuth2", "Client ID" : "클라이언트 ID", "Client secret" : "클라이언트 비밀 값", + "OpenStack" : "OpenStack", "Username" : "사용자 이름", "Password" : "암호", + "Tenant name" : "테넌트 이름", + "Identity endpoint URL" : "아이덴티티 끝점(Endpoint) URL", + "Rackspace" : "Rackspace", "API key" : "API 키", "Username and password" : "사용자 이름과 암호", "Session credentials" : "세션 접근 정보", + "RSA public key" : "RSA 공개 키", "Public key" : "공개 키", "Amazon S3" : "Amazon S3", "Bucket" : "버킷", @@ -68,10 +75,15 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "루트", + "SFTP with secret key login" : "비밀 키 로그인을 사용하는 SFTP", "SMB / CIFS" : "SMB/CIFS", "Share" : "공유", + "Domain" : "도메인", + "SMB / CIFS using OC login" : "OC 로그인을 사용하는 SMB/CIFS", "Username as share" : "사용자 이름으로 공유", "OpenStack Object Storage" : "OpenStack 객체 저장소", + "Service name" : "서비스 이름", + "Request timeout (seconds)" : "요청 시간 제한(초)", "<b>Note:</b> " : "<b>메모:</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>메모:</b> PHP cURL 모듈이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>메모:</b> PHP FTP 모듈이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", @@ -89,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "고급 설정", "Delete" : "삭제", "Add storage" : "저장소 추가", - "Enable User External Storage" : "사용자 외부 저장소 사용", "Allow users to mount the following external storage" : "사용자가 다음 외부 저장소를 마운트할 수 있도록 허용" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json index 86cecf01329..2695f209730 100644 --- a/apps/files_external/l10n/ko.json +++ b/apps/files_external/l10n/ko.json @@ -10,6 +10,8 @@ "Invalid mount point" : "잘못된 마운트 지점", "Objectstore forbidden" : "Objectstore에 접근 금지됨", "Invalid storage backend \"%s\"" : "잘못된 저장소 백엔드 \"%s\"", + "Not permitted to use backend \"%s\"" : "백엔드 \"%s\" 사용이 허가되지 않았음", + "Not permitted to use authentication mechanism \"%s\"" : "인증 방식 \"%s\" 사용이 허가되지 않았음", "Unsatisfied backend parameters" : "백엔드 인자가 부족함", "Unsatisfied authentication mechanism parameters" : "인증 방식 인자가 부족함", "Personal" : "개인", @@ -39,11 +41,16 @@ "OAuth2" : "OAuth2", "Client ID" : "클라이언트 ID", "Client secret" : "클라이언트 비밀 값", + "OpenStack" : "OpenStack", "Username" : "사용자 이름", "Password" : "암호", + "Tenant name" : "테넌트 이름", + "Identity endpoint URL" : "아이덴티티 끝점(Endpoint) URL", + "Rackspace" : "Rackspace", "API key" : "API 키", "Username and password" : "사용자 이름과 암호", "Session credentials" : "세션 접근 정보", + "RSA public key" : "RSA 공개 키", "Public key" : "공개 키", "Amazon S3" : "Amazon S3", "Bucket" : "버킷", @@ -66,10 +73,15 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "루트", + "SFTP with secret key login" : "비밀 키 로그인을 사용하는 SFTP", "SMB / CIFS" : "SMB/CIFS", "Share" : "공유", + "Domain" : "도메인", + "SMB / CIFS using OC login" : "OC 로그인을 사용하는 SMB/CIFS", "Username as share" : "사용자 이름으로 공유", "OpenStack Object Storage" : "OpenStack 객체 저장소", + "Service name" : "서비스 이름", + "Request timeout (seconds)" : "요청 시간 제한(초)", "<b>Note:</b> " : "<b>메모:</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>메모:</b> PHP cURL 모듈이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>메모:</b> PHP FTP 모듈이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", @@ -87,7 +99,6 @@ "Advanced settings" : "고급 설정", "Delete" : "삭제", "Add storage" : "저장소 추가", - "Enable User External Storage" : "사용자 외부 저장소 사용", "Allow users to mount the following external storage" : "사용자가 다음 외부 저장소를 마운트할 수 있도록 허용" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/lt_LT.js b/apps/files_external/l10n/lt_LT.js index 9232ec997d2..b6d334d792d 100644 --- a/apps/files_external/l10n/lt_LT.js +++ b/apps/files_external/l10n/lt_LT.js @@ -5,6 +5,7 @@ OC.L10N.register( "Personal" : "Asmeniniai", "Grant access" : "Suteikti priėjimą", "Access granted" : "Priėjimas suteiktas", + "Saved" : "Išsaugoti", "None" : "Nieko", "Username" : "Prisijungimo vardas", "Password" : "Slaptažodis", @@ -22,7 +23,6 @@ OC.L10N.register( "Folder name" : "Katalogo pavadinimas", "Configuration" : "Konfigūracija", "Delete" : "Ištrinti", - "Add storage" : "Pridėti saugyklą", - "Enable User External Storage" : "Įjungti vartotojų išorines saugyklas" + "Add storage" : "Pridėti saugyklą" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/lt_LT.json b/apps/files_external/l10n/lt_LT.json index d196c8e00bd..f1c46b145ee 100644 --- a/apps/files_external/l10n/lt_LT.json +++ b/apps/files_external/l10n/lt_LT.json @@ -3,6 +3,7 @@ "Personal" : "Asmeniniai", "Grant access" : "Suteikti priėjimą", "Access granted" : "Priėjimas suteiktas", + "Saved" : "Išsaugoti", "None" : "Nieko", "Username" : "Prisijungimo vardas", "Password" : "Slaptažodis", @@ -20,7 +21,6 @@ "Folder name" : "Katalogo pavadinimas", "Configuration" : "Konfigūracija", "Delete" : "Ištrinti", - "Add storage" : "Pridėti saugyklą", - "Enable User External Storage" : "Įjungti vartotojų išorines saugyklas" + "Add storage" : "Pridėti saugyklą" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/lv.js b/apps/files_external/l10n/lv.js index 2f694de2249..7b4d94be6c7 100644 --- a/apps/files_external/l10n/lv.js +++ b/apps/files_external/l10n/lv.js @@ -21,7 +21,6 @@ OC.L10N.register( "Folder name" : "Mapes nosaukums", "Configuration" : "Konfigurācija", "Delete" : "Dzēst", - "Add storage" : "Pievienot krātuvi", - "Enable User External Storage" : "Aktivēt lietotāja ārējo krātuvi" + "Add storage" : "Pievienot krātuvi" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/files_external/l10n/lv.json b/apps/files_external/l10n/lv.json index 5b281307ec3..7ad68595d73 100644 --- a/apps/files_external/l10n/lv.json +++ b/apps/files_external/l10n/lv.json @@ -19,7 +19,6 @@ "Folder name" : "Mapes nosaukums", "Configuration" : "Konfigurācija", "Delete" : "Dzēst", - "Add storage" : "Pievienot krātuvi", - "Enable User External Storage" : "Aktivēt lietotāja ārējo krātuvi" + "Add storage" : "Pievienot krātuvi" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/mk.js b/apps/files_external/l10n/mk.js index 3a62a2b580b..e75f1afa620 100644 --- a/apps/files_external/l10n/mk.js +++ b/apps/files_external/l10n/mk.js @@ -22,7 +22,6 @@ OC.L10N.register( "External Storage" : "Надворешно складиште", "Folder name" : "Име на папка", "Configuration" : "Конфигурација", - "Delete" : "Избриши", - "Enable User External Storage" : "Овозможи надворешни за корисници" + "Delete" : "Избриши" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/files_external/l10n/mk.json b/apps/files_external/l10n/mk.json index 9fb0994a604..ae095b46310 100644 --- a/apps/files_external/l10n/mk.json +++ b/apps/files_external/l10n/mk.json @@ -20,7 +20,6 @@ "External Storage" : "Надворешно складиште", "Folder name" : "Име на папка", "Configuration" : "Конфигурација", - "Delete" : "Избриши", - "Enable User External Storage" : "Овозможи надворешни за корисници" + "Delete" : "Избриши" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/nb_NO.js b/apps/files_external/l10n/nb_NO.js index ea912e4cf7a..ecafac048c0 100644 --- a/apps/files_external/l10n/nb_NO.js +++ b/apps/files_external/l10n/nb_NO.js @@ -75,11 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Rot", - "SFTP with secret key login [DEPRECATED]" : "SFTP med hemmelig nøkkel for pålogging [FORELDET]", + "SFTP with secret key login" : "SFTP med hemmelig nøkkel for pålogging", "SMB / CIFS" : "SMB / CIFS", "Share" : "Delt ressurs", "Domain" : "Domene", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS med OC-pålogging [FORELDET]", + "SMB / CIFS using OC login" : "SMB / CIFS med OC-pålogging", "Username as share" : "Brukernavn som share", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Tjenestenavn", @@ -101,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Avanserte innstillinger", "Delete" : "Slett", "Add storage" : "Legg til lagringsplass", - "Enable User External Storage" : "Aktiver ekstern lagring for bruker", "Allow users to mount the following external storage" : "Tillat brukere å koble opp følgende eksterne lagring" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/nb_NO.json b/apps/files_external/l10n/nb_NO.json index 800234a931a..9a7a2ae6287 100644 --- a/apps/files_external/l10n/nb_NO.json +++ b/apps/files_external/l10n/nb_NO.json @@ -73,11 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Rot", - "SFTP with secret key login [DEPRECATED]" : "SFTP med hemmelig nøkkel for pålogging [FORELDET]", + "SFTP with secret key login" : "SFTP med hemmelig nøkkel for pålogging", "SMB / CIFS" : "SMB / CIFS", "Share" : "Delt ressurs", "Domain" : "Domene", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS med OC-pålogging [FORELDET]", + "SMB / CIFS using OC login" : "SMB / CIFS med OC-pålogging", "Username as share" : "Brukernavn som share", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Tjenestenavn", @@ -99,7 +99,6 @@ "Advanced settings" : "Avanserte innstillinger", "Delete" : "Slett", "Add storage" : "Legg til lagringsplass", - "Enable User External Storage" : "Aktiver ekstern lagring for bruker", "Allow users to mount the following external storage" : "Tillat brukere å koble opp følgende eksterne lagring" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/nds.js b/apps/files_external/l10n/nds.js new file mode 100644 index 00000000000..f7f1da30c60 --- /dev/null +++ b/apps/files_external/l10n/nds.js @@ -0,0 +1,101 @@ +OC.L10N.register( + "files_external", + { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Holen des Requesttokens fehlgeschlagen. Bitte überprüfe Schlüssel und Secret deiner App.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Holen des Zugrifftokens fehlgeschlagen. Bitte überprüfe Schlüssel und Secret deiner App.", + "Please provide a valid app key and secret." : "Bitte verwende für deine App einen gültigen Schüssel und ein gültiges Secret.", + "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Exception: %s", + "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Exception: %s", + "External storage" : "Externer Speicher", + "Storage with id \"%i\" not found" : "Speicher mit der ID \"%i\" wurde nicht gefunden", + "Invalid backend or authentication mechanism class" : "Ungültige Klasse für das Backend oder für den Authentifizierungsmechanismus", + "Invalid mount point" : "Ungültiger Einhängepunkt", + "Objectstore forbidden" : "Objectstore nicht erlaubt", + "Invalid storage backend \"%s\"" : "Ungültiges Speicherbackend \"%s\"", + "Not permitted to use backend \"%s\"" : "Verwendung des Backends \"%s\" nicht erlaubt", + "Not permitted to use authentication mechanism \"%s\"" : "Verwendung des Authentifizierungsmechanismus \"%s\" nicht erlaubt", + "Unsatisfied backend parameters" : "Nicht bediente Backendparameter", + "Unsatisfied authentication mechanism parameters" : "Nicht bediente Authentifizierungsmechanismusparamter", + "Personal" : "Persönlich", + "System" : "System", + "Grant access" : "Erlaube Zugriff", + "Access granted" : "Zugriff erlaubt", + "Error configuring OAuth1" : "Fehler bei der Konfiguration von OAuth1", + "Error configuring OAuth2" : "Fehler bei der Konfiguration von OAuth2", + "Generate keys" : "Generiere Schlüssel", + "Error generating key pair" : "Fehler beim Generieren des Schlüsselpaars", + "Enable encryption" : "Verschlüsselung aktivieren", + "Enable previews" : "Vorschau aktivieren", + "Check for changes" : "Auf Änderungen prüfen", + "Never" : "Nie", + "Once every direct access" : "Einmal bei jedem direkten Zugriff", + "Every time the filesystem is used" : "Bei jeder Verwendung des Dateisystems", + "All users. Type to select user or group." : "Alle Benutzer. Tippe, um eine Benutzergruppe auszuwählen.", + "(group)" : "(Gruppe)", + "Saved" : "Gespeichert", + "Access key" : "Schlüssel für Zugriff", + "Secret key" : "Geheimer Schlüssel", + "Builtin" : "Eingebaut", + "None" : "Keine(r)", + "OAuth1" : "OAuth1", + "App key" : "App Schlüssel", + "App secret" : "App Secret", + "OAuth2" : "OAuth2", + "Client ID" : "Client ID", + "Client secret" : "Client Geheimnis", + "OpenStack" : "OpenStack", + "Username" : "Benutzername", + "Password" : "Passwort", + "API key" : "API Schlüssel", + "Username and password" : "Benutzername und Passwort", + "Session credentials" : "Anmeldedaten der Sitzung", + "RSA public key" : "Öffentlicher RSA Schlüssel", + "Public key" : "Öffentlicher Schlüssel", + "Amazon S3" : "Amazon S3", + "Hostname" : "Hostname", + "Port" : "Port", + "Region" : "Region", + "Enable SSL" : "SSL aktivieren", + "Enable Path Style" : "Path Style aktivieren", + "WebDAV" : "WebDAV", + "URL" : "URL", + "Remote subfolder" : "Entfernter Unterordner", + "Secure https://" : "Sicheres https://", + "Dropbox" : "Dropbox", + "FTP" : "FTP", + "Host" : "Host", + "Secure ftps://" : "Sicheres fpts://", + "Google Drive" : "Google Drive", + "Local" : "Lokal", + "Location" : "Ort", + "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "Root" : "Root", + "SFTP with secret key login" : "SFTP mit Anmeldung über geheimen Schlüssel", + "SMB / CIFS" : "SMB / CIFS", + "Share" : "Teilen", + "Domain" : "Domäne", + "SMB / CIFS using OC login" : "SMB / DIFS mit OC Anmeldung", + "Username as share" : "Benutzername als Freigabe", + "Service name" : "Name des Dienstes", + "Request timeout (seconds)" : "Zeitüberschreitung der Anfrage (Sekunden)", + "<b>Note:</b> " : "<b>Notiz:</b>", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Notiz:</b> Die cURL-Unterstützung ist in PHP nicht aktiviert oder nicht installiert, deshalb ist das Einhängen von %s nicht möglich. Bitte deinen Administrator diese zu installieren.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Notiz:</b> Die FTP-Unterstützung ist in PHP nicht aktiviert oder nicht installiert, deshalb ist das Einhängen von %s nicht möglich. Bitte deinen Administrator diese zu installieren.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Notiz:</b> \"%s\" ist nicht installiert, deshalb ist das Einhängen von %s nicht möglich. Bitte deinen Administrator diese zu installieren.", + "No external storage configured" : "Kein externer Speicher konfiguriert", + "You can add external storages in the personal settings" : "Du kannst externe Speicher in deinen persönlichen Einstellungen hinzufügen", + "Name" : "Name", + "Storage type" : "Speicherart", + "Scope" : "Bereich", + "External Storage" : "Externer Speicher", + "Folder name" : "Ordnername", + "Authentication" : "Authentifizierung", + "Configuration" : "Konfiguration", + "Available for" : "Verfügbar für", + "Advanced settings" : "Erweiterte Einstellungen", + "Delete" : "Löschen", + "Add storage" : "Speicher hinzufügen", + "Allow users to mount the following external storage" : "Erlaube Benutzern folgenden externen Speicher einzuhängen" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/nds.json b/apps/files_external/l10n/nds.json new file mode 100644 index 00000000000..bfadfc0c123 --- /dev/null +++ b/apps/files_external/l10n/nds.json @@ -0,0 +1,99 @@ +{ "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Holen des Requesttokens fehlgeschlagen. Bitte überprüfe Schlüssel und Secret deiner App.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Holen des Zugrifftokens fehlgeschlagen. Bitte überprüfe Schlüssel und Secret deiner App.", + "Please provide a valid app key and secret." : "Bitte verwende für deine App einen gültigen Schüssel und ein gültiges Secret.", + "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Exception: %s", + "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Exception: %s", + "External storage" : "Externer Speicher", + "Storage with id \"%i\" not found" : "Speicher mit der ID \"%i\" wurde nicht gefunden", + "Invalid backend or authentication mechanism class" : "Ungültige Klasse für das Backend oder für den Authentifizierungsmechanismus", + "Invalid mount point" : "Ungültiger Einhängepunkt", + "Objectstore forbidden" : "Objectstore nicht erlaubt", + "Invalid storage backend \"%s\"" : "Ungültiges Speicherbackend \"%s\"", + "Not permitted to use backend \"%s\"" : "Verwendung des Backends \"%s\" nicht erlaubt", + "Not permitted to use authentication mechanism \"%s\"" : "Verwendung des Authentifizierungsmechanismus \"%s\" nicht erlaubt", + "Unsatisfied backend parameters" : "Nicht bediente Backendparameter", + "Unsatisfied authentication mechanism parameters" : "Nicht bediente Authentifizierungsmechanismusparamter", + "Personal" : "Persönlich", + "System" : "System", + "Grant access" : "Erlaube Zugriff", + "Access granted" : "Zugriff erlaubt", + "Error configuring OAuth1" : "Fehler bei der Konfiguration von OAuth1", + "Error configuring OAuth2" : "Fehler bei der Konfiguration von OAuth2", + "Generate keys" : "Generiere Schlüssel", + "Error generating key pair" : "Fehler beim Generieren des Schlüsselpaars", + "Enable encryption" : "Verschlüsselung aktivieren", + "Enable previews" : "Vorschau aktivieren", + "Check for changes" : "Auf Änderungen prüfen", + "Never" : "Nie", + "Once every direct access" : "Einmal bei jedem direkten Zugriff", + "Every time the filesystem is used" : "Bei jeder Verwendung des Dateisystems", + "All users. Type to select user or group." : "Alle Benutzer. Tippe, um eine Benutzergruppe auszuwählen.", + "(group)" : "(Gruppe)", + "Saved" : "Gespeichert", + "Access key" : "Schlüssel für Zugriff", + "Secret key" : "Geheimer Schlüssel", + "Builtin" : "Eingebaut", + "None" : "Keine(r)", + "OAuth1" : "OAuth1", + "App key" : "App Schlüssel", + "App secret" : "App Secret", + "OAuth2" : "OAuth2", + "Client ID" : "Client ID", + "Client secret" : "Client Geheimnis", + "OpenStack" : "OpenStack", + "Username" : "Benutzername", + "Password" : "Passwort", + "API key" : "API Schlüssel", + "Username and password" : "Benutzername und Passwort", + "Session credentials" : "Anmeldedaten der Sitzung", + "RSA public key" : "Öffentlicher RSA Schlüssel", + "Public key" : "Öffentlicher Schlüssel", + "Amazon S3" : "Amazon S3", + "Hostname" : "Hostname", + "Port" : "Port", + "Region" : "Region", + "Enable SSL" : "SSL aktivieren", + "Enable Path Style" : "Path Style aktivieren", + "WebDAV" : "WebDAV", + "URL" : "URL", + "Remote subfolder" : "Entfernter Unterordner", + "Secure https://" : "Sicheres https://", + "Dropbox" : "Dropbox", + "FTP" : "FTP", + "Host" : "Host", + "Secure ftps://" : "Sicheres fpts://", + "Google Drive" : "Google Drive", + "Local" : "Lokal", + "Location" : "Ort", + "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "Root" : "Root", + "SFTP with secret key login" : "SFTP mit Anmeldung über geheimen Schlüssel", + "SMB / CIFS" : "SMB / CIFS", + "Share" : "Teilen", + "Domain" : "Domäne", + "SMB / CIFS using OC login" : "SMB / DIFS mit OC Anmeldung", + "Username as share" : "Benutzername als Freigabe", + "Service name" : "Name des Dienstes", + "Request timeout (seconds)" : "Zeitüberschreitung der Anfrage (Sekunden)", + "<b>Note:</b> " : "<b>Notiz:</b>", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Notiz:</b> Die cURL-Unterstützung ist in PHP nicht aktiviert oder nicht installiert, deshalb ist das Einhängen von %s nicht möglich. Bitte deinen Administrator diese zu installieren.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Notiz:</b> Die FTP-Unterstützung ist in PHP nicht aktiviert oder nicht installiert, deshalb ist das Einhängen von %s nicht möglich. Bitte deinen Administrator diese zu installieren.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Notiz:</b> \"%s\" ist nicht installiert, deshalb ist das Einhängen von %s nicht möglich. Bitte deinen Administrator diese zu installieren.", + "No external storage configured" : "Kein externer Speicher konfiguriert", + "You can add external storages in the personal settings" : "Du kannst externe Speicher in deinen persönlichen Einstellungen hinzufügen", + "Name" : "Name", + "Storage type" : "Speicherart", + "Scope" : "Bereich", + "External Storage" : "Externer Speicher", + "Folder name" : "Ordnername", + "Authentication" : "Authentifizierung", + "Configuration" : "Konfiguration", + "Available for" : "Verfügbar für", + "Advanced settings" : "Erweiterte Einstellungen", + "Delete" : "Löschen", + "Add storage" : "Speicher hinzufügen", + "Allow users to mount the following external storage" : "Erlaube Benutzern folgenden externen Speicher einzuhängen" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index a40b2afa7e8..50e2f785da7 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -75,11 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", - "SFTP with secret key login [DEPRECATED]" : "SFTP inlog met geheime sleutel [VEROUDERD]", + "SFTP with secret key login" : "SFTP met geheime sleutel inlog", "SMB / CIFS" : "SMB / CIFS", "Share" : "Share", "Domain" : "Domein", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS login met OC [VEROUDERD]", + "SMB / CIFS using OC login" : "SMB / CIFS via OC inlog", "Username as share" : "Gebruikersnaam als share", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Servicenaam", @@ -101,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Geavanceerde instellingen", "Delete" : "Verwijder", "Add storage" : "Toevoegen opslag", - "Enable User External Storage" : "Externe opslag voor gebruikers activeren", "Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index 52507dc4744..a17e8e0e1eb 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -73,11 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", - "SFTP with secret key login [DEPRECATED]" : "SFTP inlog met geheime sleutel [VEROUDERD]", + "SFTP with secret key login" : "SFTP met geheime sleutel inlog", "SMB / CIFS" : "SMB / CIFS", "Share" : "Share", "Domain" : "Domein", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS login met OC [VEROUDERD]", + "SMB / CIFS using OC login" : "SMB / CIFS via OC inlog", "Username as share" : "Gebruikersnaam als share", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Servicenaam", @@ -99,7 +99,6 @@ "Advanced settings" : "Geavanceerde instellingen", "Delete" : "Verwijder", "Add storage" : "Toevoegen opslag", - "Enable User External Storage" : "Externe opslag voor gebruikers activeren", "Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/oc.js b/apps/files_external/l10n/oc.js index d234d0c62c1..049016b595d 100644 --- a/apps/files_external/l10n/oc.js +++ b/apps/files_external/l10n/oc.js @@ -14,15 +14,23 @@ OC.L10N.register( "Generate keys" : "Generar de claus", "Error generating key pair" : "Error al moment de la generacion de las claus", "Enable encryption" : "Activar lo chiframent", + "Enable previews" : "Activar las previsualizacions", + "Never" : "Pas jamai", "(group)" : "(grop)", - "Saved" : "Salvat", + "Saved" : "Enregistrat", + "Access key" : "Clau d'accès", + "Secret key" : "Clau secreta", "None" : "Pas cap", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "ID Client", "Client secret" : "Secret client", "Username" : "Nom d'utilizaire", "Password" : "Senhal", + "API key" : "Clau API", + "RSA public key" : "Clau publica RSA", "Public key" : "Clau publica", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -35,14 +43,23 @@ OC.L10N.register( "URL" : "URL", "Remote subfolder" : "Sosdorsièr distant", "Secure https://" : "Securizacion https://", + "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Òste", "Secure ftps://" : "Securizacion ftps://", + "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Emplaçament", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "SFTP with secret key login" : "SFTP amb un identificant secret", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Partejar", + "Domain" : "Domeni", + "SMB / CIFS using OC login" : "SMB / CIFS en utilizant los identificants OC", "Username as share" : "Nom d'utilizaire coma nom de partiment", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nom del servici", "<b>Note:</b> " : "<b>Atencion :</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Atencion :</b> La presa en carga de cURL per PHP es pas activada o installada. Lo montatge de %s es pas possible. Contactatz vòstre administrator sistèma per l'installar.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Atencion : </b> La presa en carga del FTP per PHP es pas activada o installada. Lo montatge de %s es pas possible. Contactatz vòstre administrator sistèma per l'installar.", @@ -54,12 +71,12 @@ OC.L10N.register( "Scope" : "Portada", "External Storage" : "Emmagazinatge externe", "Folder name" : "Nom del dorsièr", + "Authentication" : "Autentificacion", "Configuration" : "Configuracion", "Available for" : "Disponible per", "Advanced settings" : "Paramètres avançats", "Delete" : "Suprimir", "Add storage" : "Apondre un supòrt d'emmagazinatge", - "Enable User External Storage" : "Autorizar los utilizaires a apondre d'emmagazinatges extèrnes", "Allow users to mount the following external storage" : "Autorizar los utilizaires a montar los emmagazinatges extèrnes seguents" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_external/l10n/oc.json b/apps/files_external/l10n/oc.json index 0dfa95426ca..d90aa481fdc 100644 --- a/apps/files_external/l10n/oc.json +++ b/apps/files_external/l10n/oc.json @@ -12,15 +12,23 @@ "Generate keys" : "Generar de claus", "Error generating key pair" : "Error al moment de la generacion de las claus", "Enable encryption" : "Activar lo chiframent", + "Enable previews" : "Activar las previsualizacions", + "Never" : "Pas jamai", "(group)" : "(grop)", - "Saved" : "Salvat", + "Saved" : "Enregistrat", + "Access key" : "Clau d'accès", + "Secret key" : "Clau secreta", "None" : "Pas cap", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "ID Client", "Client secret" : "Secret client", "Username" : "Nom d'utilizaire", "Password" : "Senhal", + "API key" : "Clau API", + "RSA public key" : "Clau publica RSA", "Public key" : "Clau publica", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -33,14 +41,23 @@ "URL" : "URL", "Remote subfolder" : "Sosdorsièr distant", "Secure https://" : "Securizacion https://", + "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Òste", "Secure ftps://" : "Securizacion ftps://", + "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Emplaçament", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "SFTP with secret key login" : "SFTP amb un identificant secret", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Partejar", + "Domain" : "Domeni", + "SMB / CIFS using OC login" : "SMB / CIFS en utilizant los identificants OC", "Username as share" : "Nom d'utilizaire coma nom de partiment", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nom del servici", "<b>Note:</b> " : "<b>Atencion :</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Atencion :</b> La presa en carga de cURL per PHP es pas activada o installada. Lo montatge de %s es pas possible. Contactatz vòstre administrator sistèma per l'installar.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Atencion : </b> La presa en carga del FTP per PHP es pas activada o installada. Lo montatge de %s es pas possible. Contactatz vòstre administrator sistèma per l'installar.", @@ -52,12 +69,12 @@ "Scope" : "Portada", "External Storage" : "Emmagazinatge externe", "Folder name" : "Nom del dorsièr", + "Authentication" : "Autentificacion", "Configuration" : "Configuracion", "Available for" : "Disponible per", "Advanced settings" : "Paramètres avançats", "Delete" : "Suprimir", "Add storage" : "Apondre un supòrt d'emmagazinatge", - "Enable User External Storage" : "Autorizar los utilizaires a apondre d'emmagazinatges extèrnes", "Allow users to mount the following external storage" : "Autorizar los utilizaires a montar los emmagazinatges extèrnes seguents" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js index 9fb70e71778..1f7cc6b1979 100644 --- a/apps/files_external/l10n/pl.js +++ b/apps/files_external/l10n/pl.js @@ -49,7 +49,9 @@ OC.L10N.register( "Location" : "Lokalizacja", "ownCloud" : "ownCloud", "Root" : "Root", + "SFTP with secret key login" : "Logowanie tajnym kluczem do SFTP", "Share" : "Udostępnij", + "SMB / CIFS using OC login" : "SMB / CIFS przy użyciu loginu OC", "Username as share" : "Użytkownik jako zasób", "OpenStack Object Storage" : "Magazyn obiektów OpenStack", "<b>Note:</b> " : "<b>Uwaga:</b> ", @@ -68,7 +70,6 @@ OC.L10N.register( "Advanced settings" : "Ustawienia zaawansowane", "Delete" : "Usuń", "Add storage" : "Dodaj zasoby dyskowe", - "Enable User External Storage" : "Włącz zewnętrzne zasoby dyskowe użytkownika", "Allow users to mount the following external storage" : "Pozwól użytkownikom montować następujące zewnętrzne zasoby dyskowe" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/pl.json b/apps/files_external/l10n/pl.json index d7cd70b8c36..5b5059a5d18 100644 --- a/apps/files_external/l10n/pl.json +++ b/apps/files_external/l10n/pl.json @@ -47,7 +47,9 @@ "Location" : "Lokalizacja", "ownCloud" : "ownCloud", "Root" : "Root", + "SFTP with secret key login" : "Logowanie tajnym kluczem do SFTP", "Share" : "Udostępnij", + "SMB / CIFS using OC login" : "SMB / CIFS przy użyciu loginu OC", "Username as share" : "Użytkownik jako zasób", "OpenStack Object Storage" : "Magazyn obiektów OpenStack", "<b>Note:</b> " : "<b>Uwaga:</b> ", @@ -66,7 +68,6 @@ "Advanced settings" : "Ustawienia zaawansowane", "Delete" : "Usuń", "Add storage" : "Dodaj zasoby dyskowe", - "Enable User External Storage" : "Włącz zewnętrzne zasoby dyskowe użytkownika", "Allow users to mount the following external storage" : "Pozwól użytkownikom montować następujące zewnętrzne zasoby dyskowe" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 68b1c671c3c..58de3eb8386 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -75,11 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Raiz", - "SFTP with secret key login [DEPRECATED]" : "SFTP com chave secreta de login [DEPRECATED]", + "SFTP with secret key login" : "SFTP com chave secreta de login", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartilhar", "Domain" : "Domínio", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS usando OC de login [DEPRECATED]", + "SMB / CIFS using OC login" : "SMB / CIFS usando OC login", "Username as share" : "Nome de usuário como compartilhado", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", @@ -101,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Configurações avançadas", "Delete" : "Excluir", "Add storage" : "Adicionar Armazenamento", - "Enable User External Storage" : "Habilitar Armazenamento Externo do Usuário", "Allow users to mount the following external storage" : "Permitir que usuários montem o seguinte armazenamento externo" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index bb4c5b88a2d..50aabd17abb 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -73,11 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Raiz", - "SFTP with secret key login [DEPRECATED]" : "SFTP com chave secreta de login [DEPRECATED]", + "SFTP with secret key login" : "SFTP com chave secreta de login", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartilhar", "Domain" : "Domínio", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS usando OC de login [DEPRECATED]", + "SMB / CIFS using OC login" : "SMB / CIFS usando OC login", "Username as share" : "Nome de usuário como compartilhado", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", @@ -99,7 +99,6 @@ "Advanced settings" : "Configurações avançadas", "Delete" : "Excluir", "Add storage" : "Adicionar Armazenamento", - "Enable User External Storage" : "Habilitar Armazenamento Externo do Usuário", "Allow users to mount the following external storage" : "Permitir que usuários montem o seguinte armazenamento externo" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js index ba1d86a40d0..3d6d9377cc9 100644 --- a/apps/files_external/l10n/pt_PT.js +++ b/apps/files_external/l10n/pt_PT.js @@ -67,8 +67,11 @@ OC.L10N.register( "Root" : "Root", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartilhar", + "Domain" : "Domínio", + "SMB / CIFS using OC login" : "SMB / CIFS utilizando o início de sessão OC", "Username as share" : "Nome de utilizador como partilha", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", + "Service name" : "Nome do serviço", "<b>Note:</b> " : "<b>Nota:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte cURL no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte FTP no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", @@ -86,7 +89,6 @@ OC.L10N.register( "Advanced settings" : "Definições avançadas", "Delete" : "Apagar", "Add storage" : "Adicionar armazenamento", - "Enable User External Storage" : "Ativar Armazenamento Externo para o Utilizador", "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json index 24955db65f6..ae3cf899ed8 100644 --- a/apps/files_external/l10n/pt_PT.json +++ b/apps/files_external/l10n/pt_PT.json @@ -65,8 +65,11 @@ "Root" : "Root", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartilhar", + "Domain" : "Domínio", + "SMB / CIFS using OC login" : "SMB / CIFS utilizando o início de sessão OC", "Username as share" : "Nome de utilizador como partilha", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", + "Service name" : "Nome do serviço", "<b>Note:</b> " : "<b>Nota:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte cURL no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte FTP no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", @@ -84,7 +87,6 @@ "Advanced settings" : "Definições avançadas", "Delete" : "Apagar", "Add storage" : "Adicionar armazenamento", - "Enable User External Storage" : "Ativar Armazenamento Externo para o Utilizador", "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ro.js b/apps/files_external/l10n/ro.js index 502d9a5cbef..d8ba040824c 100644 --- a/apps/files_external/l10n/ro.js +++ b/apps/files_external/l10n/ro.js @@ -17,6 +17,7 @@ OC.L10N.register( "Region" : "Regiune", "WebDAV" : "WebDAV", "URL" : "URL", + "Dropbox" : "Dropbox", "Host" : "Gazdă", "Local" : "Local", "Location" : "Locație", @@ -30,7 +31,6 @@ OC.L10N.register( "Configuration" : "Configurație", "Delete" : "Șterge", "Add storage" : "Adauga stocare", - "Enable User External Storage" : "Permite stocare externă pentru utilizatori", "Allow users to mount the following external storage" : "Permite utilizatorilor să monteze următoarea unitate de stocare" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/files_external/l10n/ro.json b/apps/files_external/l10n/ro.json index 41c844e36b7..cbe2826def4 100644 --- a/apps/files_external/l10n/ro.json +++ b/apps/files_external/l10n/ro.json @@ -15,6 +15,7 @@ "Region" : "Regiune", "WebDAV" : "WebDAV", "URL" : "URL", + "Dropbox" : "Dropbox", "Host" : "Gazdă", "Local" : "Local", "Location" : "Locație", @@ -28,7 +29,6 @@ "Configuration" : "Configurație", "Delete" : "Șterge", "Add storage" : "Adauga stocare", - "Enable User External Storage" : "Permite stocare externă pentru utilizatori", "Allow users to mount the following external storage" : "Permite utilizatorilor să monteze următoarea unitate de stocare" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js index f76c5526bca..5550ea780ab 100644 --- a/apps/files_external/l10n/ru.js +++ b/apps/files_external/l10n/ru.js @@ -1,16 +1,27 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов запроса. Проверьте корректность ключа и секрета приложения.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов доступа. Проверьте корректность ключа и секрета приложения.", + "Please provide a valid app key and secret." : "Пожалуйста укажите корректные ключ и секрет приложения.", "Step 1 failed. Exception: %s" : "Шаг 1 неудачен. Исключение: %s", "Step 2 failed. Exception: %s" : "Шаг 2 неудачен. Исключение: %s", "External storage" : "Внешнее хранилище", "Storage with id \"%i\" not found" : "Хранилище с идентификатором \"%i\" не найдено", + "Invalid backend or authentication mechanism class" : "Некорректный механизм авторизации или бэкенд", "Invalid mount point" : "Неправильная точка входа", + "Objectstore forbidden" : "Хранение объектов запрещено", "Invalid storage backend \"%s\"" : "Неверный бэкенд хранилища \"%s\"", + "Not permitted to use backend \"%s\"" : "Не допускается использование бэкенда \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Не допускается использование механизма авторизации \"%s\"", + "Unsatisfied backend parameters" : "Недопустимые настройки бэкенда", + "Unsatisfied authentication mechanism parameters" : "Недопустимые настройки механизма авторизации", "Personal" : "Личное", "System" : "Система", "Grant access" : "Предоставить доступ", "Access granted" : "Доступ предоставлен", + "Error configuring OAuth1" : "Ошибка настройки OAuth1", + "Error configuring OAuth2" : "Ошибка настройки OAuth2", "Generate keys" : "Создать ключи", "Error generating key pair" : "Ошибка создания ключевой пары", "Enable encryption" : "Включить шифрование", @@ -22,14 +33,26 @@ OC.L10N.register( "All users. Type to select user or group." : "Все пользователи. Введите имя пользователя или группы.", "(group)" : "(группа)", "Saved" : "Сохранено", + "Access key" : "Ключ доступа", + "Secret key" : "Секретный ключ", + "Builtin" : "Встроенный", "None" : "Отсутствует", + "OAuth1" : "OAuth1", "App key" : "Ключ приложения", "App secret" : "Секретный ключ ", + "OAuth2" : "OAuth2", "Client ID" : "Идентификатор клиента", "Client secret" : "Клиентский ключ ", + "OpenStack" : "OpenStack", "Username" : "Имя пользователя", "Password" : "Пароль", + "Tenant name" : "Имя арендатора", + "Identity endpoint URL" : "Удостоверение конечной точки URL", + "Rackspace" : "Rackspace", "API key" : "Ключ API", + "Username and password" : "Имя пользователя и пароль", + "Session credentials" : "Учетные данные сессии", + "RSA public key" : "Открытый ключ RSA", "Public key" : "Открытый ключ", "Amazon S3" : "Amazon S3", "Bucket" : "Корзина", @@ -43,15 +66,24 @@ OC.L10N.register( "Remote subfolder" : "Удаленный подкаталог", "Secure https://" : "Безопасный https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Сервер", "Secure ftps://" : "Защищённый ftps://", + "Google Drive" : "Google Drive", "Local" : "Локально", "Location" : "Местоположение", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Корневой каталог", + "SFTP with secret key login" : "SFTP с помощью секретного ключа", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Общий доступ", + "Domain" : "Домен", + "SMB / CIFS using OC login" : "SMB / CIFS с ипользованием логина OC", "Username as share" : "Имя пользователя в качестве имени общего ресурса", "OpenStack Object Storage" : "Хранилище объектов OpenStack", + "Service name" : "Название сервиса", + "Request timeout (seconds)" : "Таймаут запроса (секунды)", "<b>Note:</b> " : "<b>Примечание:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка cURL в PHP не включена или не установлена. Монтирование %s невозможно. Обратитесь к вашему системному администратору.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка FTP в PHP не включена или не установлена. Монтирование %s невозможно. Пожалуйста, обратитесь к системному администратору.", @@ -63,12 +95,12 @@ OC.L10N.register( "Scope" : "Область", "External Storage" : "Внешнее хранилище", "Folder name" : "Имя каталога", + "Authentication" : "Авторизация", "Configuration" : "Конфигурация", "Available for" : "Доступно для", "Advanced settings" : "Расширенные настройки", "Delete" : "Удалить", "Add storage" : "Добавить хранилище", - "Enable User External Storage" : "Включить пользовательские внешние хранилища", "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json index 3428d05ef4b..52792a3f09a 100644 --- a/apps/files_external/l10n/ru.json +++ b/apps/files_external/l10n/ru.json @@ -1,14 +1,25 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов запроса. Проверьте корректность ключа и секрета приложения.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов доступа. Проверьте корректность ключа и секрета приложения.", + "Please provide a valid app key and secret." : "Пожалуйста укажите корректные ключ и секрет приложения.", "Step 1 failed. Exception: %s" : "Шаг 1 неудачен. Исключение: %s", "Step 2 failed. Exception: %s" : "Шаг 2 неудачен. Исключение: %s", "External storage" : "Внешнее хранилище", "Storage with id \"%i\" not found" : "Хранилище с идентификатором \"%i\" не найдено", + "Invalid backend or authentication mechanism class" : "Некорректный механизм авторизации или бэкенд", "Invalid mount point" : "Неправильная точка входа", + "Objectstore forbidden" : "Хранение объектов запрещено", "Invalid storage backend \"%s\"" : "Неверный бэкенд хранилища \"%s\"", + "Not permitted to use backend \"%s\"" : "Не допускается использование бэкенда \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Не допускается использование механизма авторизации \"%s\"", + "Unsatisfied backend parameters" : "Недопустимые настройки бэкенда", + "Unsatisfied authentication mechanism parameters" : "Недопустимые настройки механизма авторизации", "Personal" : "Личное", "System" : "Система", "Grant access" : "Предоставить доступ", "Access granted" : "Доступ предоставлен", + "Error configuring OAuth1" : "Ошибка настройки OAuth1", + "Error configuring OAuth2" : "Ошибка настройки OAuth2", "Generate keys" : "Создать ключи", "Error generating key pair" : "Ошибка создания ключевой пары", "Enable encryption" : "Включить шифрование", @@ -20,14 +31,26 @@ "All users. Type to select user or group." : "Все пользователи. Введите имя пользователя или группы.", "(group)" : "(группа)", "Saved" : "Сохранено", + "Access key" : "Ключ доступа", + "Secret key" : "Секретный ключ", + "Builtin" : "Встроенный", "None" : "Отсутствует", + "OAuth1" : "OAuth1", "App key" : "Ключ приложения", "App secret" : "Секретный ключ ", + "OAuth2" : "OAuth2", "Client ID" : "Идентификатор клиента", "Client secret" : "Клиентский ключ ", + "OpenStack" : "OpenStack", "Username" : "Имя пользователя", "Password" : "Пароль", + "Tenant name" : "Имя арендатора", + "Identity endpoint URL" : "Удостоверение конечной точки URL", + "Rackspace" : "Rackspace", "API key" : "Ключ API", + "Username and password" : "Имя пользователя и пароль", + "Session credentials" : "Учетные данные сессии", + "RSA public key" : "Открытый ключ RSA", "Public key" : "Открытый ключ", "Amazon S3" : "Amazon S3", "Bucket" : "Корзина", @@ -41,15 +64,24 @@ "Remote subfolder" : "Удаленный подкаталог", "Secure https://" : "Безопасный https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Сервер", "Secure ftps://" : "Защищённый ftps://", + "Google Drive" : "Google Drive", "Local" : "Локально", "Location" : "Местоположение", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Корневой каталог", + "SFTP with secret key login" : "SFTP с помощью секретного ключа", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Общий доступ", + "Domain" : "Домен", + "SMB / CIFS using OC login" : "SMB / CIFS с ипользованием логина OC", "Username as share" : "Имя пользователя в качестве имени общего ресурса", "OpenStack Object Storage" : "Хранилище объектов OpenStack", + "Service name" : "Название сервиса", + "Request timeout (seconds)" : "Таймаут запроса (секунды)", "<b>Note:</b> " : "<b>Примечание:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка cURL в PHP не включена или не установлена. Монтирование %s невозможно. Обратитесь к вашему системному администратору.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка FTP в PHP не включена или не установлена. Монтирование %s невозможно. Пожалуйста, обратитесь к системному администратору.", @@ -61,12 +93,12 @@ "Scope" : "Область", "External Storage" : "Внешнее хранилище", "Folder name" : "Имя каталога", + "Authentication" : "Авторизация", "Configuration" : "Конфигурация", "Available for" : "Доступно для", "Advanced settings" : "Расширенные настройки", "Delete" : "Удалить", "Add storage" : "Добавить хранилище", - "Enable User External Storage" : "Включить пользовательские внешние хранилища", "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/si_LK.js b/apps/files_external/l10n/si_LK.js index 80a6026ad75..82b68af82eb 100644 --- a/apps/files_external/l10n/si_LK.js +++ b/apps/files_external/l10n/si_LK.js @@ -18,7 +18,6 @@ OC.L10N.register( "External Storage" : "භාහිර ගබඩාව", "Folder name" : "ෆොල්ඩරයේ නම", "Configuration" : "වින්යාසය", - "Delete" : "මකා දමන්න", - "Enable User External Storage" : "පරිශීලක භාහිර ගබඩාවන් සක්රිය කරන්න" + "Delete" : "මකා දමන්න" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/si_LK.json b/apps/files_external/l10n/si_LK.json index bc3a9ee11db..2150ac0f9b2 100644 --- a/apps/files_external/l10n/si_LK.json +++ b/apps/files_external/l10n/si_LK.json @@ -16,7 +16,6 @@ "External Storage" : "භාහිර ගබඩාව", "Folder name" : "ෆොල්ඩරයේ නම", "Configuration" : "වින්යාසය", - "Delete" : "මකා දමන්න", - "Enable User External Storage" : "පරිශීලක භාහිර ගබඩාවන් සක්රිය කරන්න" + "Delete" : "මකා දමන්න" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sk_SK.js b/apps/files_external/l10n/sk_SK.js index 87ea8c64bc5..41f9c866196 100644 --- a/apps/files_external/l10n/sk_SK.js +++ b/apps/files_external/l10n/sk_SK.js @@ -1,30 +1,58 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Sťahovanie tokenov požiadavky zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Sťahovanie prístupových tokenov zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.", + "Please provide a valid app key and secret." : "Zadajte prosím platný aplikačný kľúč a heslo (secret).", "Step 1 failed. Exception: %s" : "Krok 1 zlyhal. Výnimka: %s", "Step 2 failed. Exception: %s" : "Krok 2 zlyhal. Výnimka: %s", "External storage" : "Externé úložisko", + "Storage with id \"%i\" not found" : "Úložisko s ID \"%i\" sa nenašlo", + "Invalid backend or authentication mechanism class" : "Neplatný backend, prípadne trieda mechanizmu autentifikácie", "Invalid mount point" : "Chybný prípojný bod", + "Objectstore forbidden" : "Objectstore je zakáazaný", + "Invalid storage backend \"%s\"" : "Neplatný backend úložiska \"%s\"", + "Not permitted to use backend \"%s\"" : "Nie je povolené použiť backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Nie je povolené použiť autentifikačný mechanizmus \"%s\"", + "Unsatisfied backend parameters" : "Nedostatočné parametre backendu", + "Unsatisfied authentication mechanism parameters" : "Nedostatočné parametre autentifikačného mechanizmu", "Personal" : "Osobné", "System" : "Systém", "Grant access" : "Povoliť prístup", "Access granted" : "Prístup povolený", + "Error configuring OAuth1" : "Chyba konfigurovania OAuth1", + "Error configuring OAuth2" : "Chyba konfigurovania OAuth2", "Generate keys" : "Vytvoriť kľúče", "Error generating key pair" : "Chyba pri vytváraní dvojice kľúčov", "Enable encryption" : "Povoliť šifrovanie", "Enable previews" : "Povoliť náhľady", + "Check for changes" : "Zisťovať zmeny", "Never" : "Nikdy", + "Once every direct access" : "S každým priamym prístupom", + "Every time the filesystem is used" : "Vždy keď je použitý súborový systém", "All users. Type to select user or group." : "Všetci používatelia. Začnite písať pre výber používateľa alebo skupinu.", "(group)" : "(skupina)", "Saved" : "Uložené", + "Access key" : "Prístupový kľúč", + "Secret key" : "Tajný kľúč", + "Builtin" : "Vstavaný", "None" : "Žiadny", + "OAuth1" : "OAuth1", "App key" : "Kľúč aplikácie", "App secret" : "Heslo aplikácie", + "OAuth2" : "OAuth2", "Client ID" : "Client ID", "Client secret" : "Heslo klienta", + "OpenStack" : "OpenStack", "Username" : "Používateľské meno", "Password" : "Heslo", + "Tenant name" : "Meno nájomcu", + "Identity endpoint URL" : "Endpoint URL identita", + "Rackspace" : "Rackspace", "API key" : "API kľúč", + "Username and password" : "Meno a heslo", + "Session credentials" : "Pihlasovacie údaje sezóny", + "RSA public key" : "RSA verejný kľúč", "Public key" : "Verejný kľúč", "Amazon S3" : "Amazon S3", "Bucket" : "Sektor", @@ -38,31 +66,40 @@ OC.L10N.register( "Remote subfolder" : "Vzdialený podpriečinok", "Secure https://" : "Zabezpečené https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Hostiteľ", "Secure ftps://" : "Zabezpečené ftps://", + "Google Drive" : "Google Drive", "Local" : "Lokálny", "Location" : "Umiestnenie", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Zdieľať", + "Domain" : "Doména", + "SMB / CIFS using OC login" : "SMB / CIFS s použitím OC prihlásenia", "Username as share" : "Používateľské meno ako zdieľaný priečinok", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Názov služby", + "Request timeout (seconds)" : "Timeout požiadavky (s)", "<b>Note:</b> " : "<b>Poznámka:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "No external storage configured" : "Žiadne externé úložisko nie je nakonfigurované", + "You can add external storages in the personal settings" : "Externé úložisko je možné pridať v osobných nastaveniach", "Name" : "Názov", "Storage type" : "Typ úložiska", "Scope" : "Rozsah", "External Storage" : "Externé úložisko", "Folder name" : "Názov priečinka", + "Authentication" : "Autentifikácia", "Configuration" : "Nastavenia", "Available for" : "K dispozícii pre", "Advanced settings" : "Rozšírené nastavenia", "Delete" : "Zmazať", "Add storage" : "Pridať úložisko", - "Enable User External Storage" : "Povoliť externé úložisko", "Allow users to mount the following external storage" : "Povoliť používateľom pripojiť tieto externé úložiská" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files_external/l10n/sk_SK.json b/apps/files_external/l10n/sk_SK.json index 5e7f4d1fa94..4072136fa53 100644 --- a/apps/files_external/l10n/sk_SK.json +++ b/apps/files_external/l10n/sk_SK.json @@ -1,28 +1,56 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Sťahovanie tokenov požiadavky zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Sťahovanie prístupových tokenov zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.", + "Please provide a valid app key and secret." : "Zadajte prosím platný aplikačný kľúč a heslo (secret).", "Step 1 failed. Exception: %s" : "Krok 1 zlyhal. Výnimka: %s", "Step 2 failed. Exception: %s" : "Krok 2 zlyhal. Výnimka: %s", "External storage" : "Externé úložisko", + "Storage with id \"%i\" not found" : "Úložisko s ID \"%i\" sa nenašlo", + "Invalid backend or authentication mechanism class" : "Neplatný backend, prípadne trieda mechanizmu autentifikácie", "Invalid mount point" : "Chybný prípojný bod", + "Objectstore forbidden" : "Objectstore je zakáazaný", + "Invalid storage backend \"%s\"" : "Neplatný backend úložiska \"%s\"", + "Not permitted to use backend \"%s\"" : "Nie je povolené použiť backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Nie je povolené použiť autentifikačný mechanizmus \"%s\"", + "Unsatisfied backend parameters" : "Nedostatočné parametre backendu", + "Unsatisfied authentication mechanism parameters" : "Nedostatočné parametre autentifikačného mechanizmu", "Personal" : "Osobné", "System" : "Systém", "Grant access" : "Povoliť prístup", "Access granted" : "Prístup povolený", + "Error configuring OAuth1" : "Chyba konfigurovania OAuth1", + "Error configuring OAuth2" : "Chyba konfigurovania OAuth2", "Generate keys" : "Vytvoriť kľúče", "Error generating key pair" : "Chyba pri vytváraní dvojice kľúčov", "Enable encryption" : "Povoliť šifrovanie", "Enable previews" : "Povoliť náhľady", + "Check for changes" : "Zisťovať zmeny", "Never" : "Nikdy", + "Once every direct access" : "S každým priamym prístupom", + "Every time the filesystem is used" : "Vždy keď je použitý súborový systém", "All users. Type to select user or group." : "Všetci používatelia. Začnite písať pre výber používateľa alebo skupinu.", "(group)" : "(skupina)", "Saved" : "Uložené", + "Access key" : "Prístupový kľúč", + "Secret key" : "Tajný kľúč", + "Builtin" : "Vstavaný", "None" : "Žiadny", + "OAuth1" : "OAuth1", "App key" : "Kľúč aplikácie", "App secret" : "Heslo aplikácie", + "OAuth2" : "OAuth2", "Client ID" : "Client ID", "Client secret" : "Heslo klienta", + "OpenStack" : "OpenStack", "Username" : "Používateľské meno", "Password" : "Heslo", + "Tenant name" : "Meno nájomcu", + "Identity endpoint URL" : "Endpoint URL identita", + "Rackspace" : "Rackspace", "API key" : "API kľúč", + "Username and password" : "Meno a heslo", + "Session credentials" : "Pihlasovacie údaje sezóny", + "RSA public key" : "RSA verejný kľúč", "Public key" : "Verejný kľúč", "Amazon S3" : "Amazon S3", "Bucket" : "Sektor", @@ -36,31 +64,40 @@ "Remote subfolder" : "Vzdialený podpriečinok", "Secure https://" : "Zabezpečené https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Hostiteľ", "Secure ftps://" : "Zabezpečené ftps://", + "Google Drive" : "Google Drive", "Local" : "Lokálny", "Location" : "Umiestnenie", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Zdieľať", + "Domain" : "Doména", + "SMB / CIFS using OC login" : "SMB / CIFS s použitím OC prihlásenia", "Username as share" : "Používateľské meno ako zdieľaný priečinok", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Názov služby", + "Request timeout (seconds)" : "Timeout požiadavky (s)", "<b>Note:</b> " : "<b>Poznámka:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "No external storage configured" : "Žiadne externé úložisko nie je nakonfigurované", + "You can add external storages in the personal settings" : "Externé úložisko je možné pridať v osobných nastaveniach", "Name" : "Názov", "Storage type" : "Typ úložiska", "Scope" : "Rozsah", "External Storage" : "Externé úložisko", "Folder name" : "Názov priečinka", + "Authentication" : "Autentifikácia", "Configuration" : "Nastavenia", "Available for" : "K dispozícii pre", "Advanced settings" : "Rozšírené nastavenia", "Delete" : "Zmazať", "Add storage" : "Pridať úložisko", - "Enable User External Storage" : "Povoliť externé úložisko", "Allow users to mount the following external storage" : "Povoliť používateľom pripojiť tieto externé úložiská" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js index b4c9cc00275..f9513a5f11c 100644 --- a/apps/files_external/l10n/sl.js +++ b/apps/files_external/l10n/sl.js @@ -49,7 +49,9 @@ OC.L10N.register( "Location" : "Mesto", "ownCloud" : "ownCloud", "Root" : "Koren", + "SFTP with secret key login" : "Prijava preko protokola SFTP z geslom", "Share" : "Souporaba", + "SMB / CIFS using OC login" : "SMB / CIFS z uporabo prijave OC", "Username as share" : "Uporabniško ime za souporabo", "OpenStack Object Storage" : "Shramba predmeta OpenStack", "<b>Note:</b> " : "<b>Opomba:</b> ", @@ -68,7 +70,6 @@ OC.L10N.register( "Advanced settings" : "Napredne nastavitve", "Delete" : "Izbriši", "Add storage" : "Dodaj shrambo", - "Enable User External Storage" : "Omogoči zunanjo uporabniško podatkovno shrambo", "Allow users to mount the following external storage" : "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb." }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json index 56b64fb17cc..ca97f27b234 100644 --- a/apps/files_external/l10n/sl.json +++ b/apps/files_external/l10n/sl.json @@ -47,7 +47,9 @@ "Location" : "Mesto", "ownCloud" : "ownCloud", "Root" : "Koren", + "SFTP with secret key login" : "Prijava preko protokola SFTP z geslom", "Share" : "Souporaba", + "SMB / CIFS using OC login" : "SMB / CIFS z uporabo prijave OC", "Username as share" : "Uporabniško ime za souporabo", "OpenStack Object Storage" : "Shramba predmeta OpenStack", "<b>Note:</b> " : "<b>Opomba:</b> ", @@ -66,7 +68,6 @@ "Advanced settings" : "Napredne nastavitve", "Delete" : "Izbriši", "Add storage" : "Dodaj shrambo", - "Enable User External Storage" : "Omogoči zunanjo uporabniško podatkovno shrambo", "Allow users to mount the following external storage" : "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb." },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sq.js b/apps/files_external/l10n/sq.js index 61262e8c8b1..9885f7143e0 100644 --- a/apps/files_external/l10n/sq.js +++ b/apps/files_external/l10n/sq.js @@ -1,19 +1,104 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Dhënia e elementëve të kërkuar dështoi. Verifikoni që kyçi dhe e fshehta juaj për aplikacionin janë të sakta.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Dhënia e elementëve të hyrjes dështoi. Verifikoni që kyçi dhe e fshehta juaj për aplikacionin janë të sakta.", + "Please provide a valid app key and secret." : "Ju lutemi jepni një kyç dhe një të fshehtë aplikacioni të vlefshme.", + "Step 1 failed. Exception: %s" : "Hapi 1 dështoi. Përjashtim: %s", + "Step 2 failed. Exception: %s" : "Hapi 2 dështoi. Përjashtim: %s", + "External storage" : "Depozitë e jashtme", + "Storage with id \"%i\" not found" : "S’u gjet depozitë me id \"%i\"", + "Invalid backend or authentication mechanism class" : "Mekanizëm shërbimi ose klasë mekanizmi mirëfilltësimi e palvefshme", + "Invalid mount point" : "Pikë montimi e pavlefshme", + "Objectstore forbidden" : "Objectstore e ndaluar", + "Invalid storage backend \"%s\"" : "Mekanizëm shërbimi depozite i pavlefshëm \"%s\"", + "Not permitted to use backend \"%s\"" : "I palejuar të përdorë mekanizmin e shërbimit \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "S’i lejohet të përdorë mekanizmin e mirëfilltësimit \"%s\"", + "Unsatisfied backend parameters" : "Parametra mekanizmi shërbimi të paplotësuar", + "Unsatisfied authentication mechanism parameters" : "Parametra mekanizmi mirëfilltësimi të papërmbushur", "Personal" : "Personale", + "System" : "Sistem", + "Grant access" : "Akordoji hyrje", + "Access granted" : "Hyrja u akordua", + "Error configuring OAuth1" : "Gabim gjatë formësimit të OAuth1", + "Error configuring OAuth2" : "Gabim gjatë formësimit të OAuth2", + "Generate keys" : "Prodho kyçe", + "Error generating key pair" : "Gabim gjatë prodhimit të çiftit të kyçeve", + "Enable encryption" : "Aktivizoni fshehtëzim", + "Enable previews" : "Aktivizoni paraparje", + "Check for changes" : "Kontrollo për ndryshime", + "Never" : "Kurrë", + "Once every direct access" : "Çdo herë pas hyrjesh të drejtpërdrejta", + "Every time the filesystem is used" : "Sa herë që përdoret sistemi i kartelave", + "All users. Type to select user or group." : "Krejt përdoruesit. Shtypni që të përzgjidhet përdorues ose grup.", + "(group)" : "(grup)", "Saved" : "U ruajt", - "None" : "Asgjë", - "Username" : "Përdoruesi", - "Password" : "fjalëkalim", - "Port" : "Porta", + "Access key" : "Kyç hyrjesh", + "Secret key" : "Kyç i fshehtë", + "Builtin" : "I brendshëm", + "None" : "Asnjë", + "OAuth1" : "OAuth1", + "App key" : "Kyç aplikacioni", + "App secret" : "E fshehtë aplikacioni", + "OAuth2" : "OAuth2", + "Client ID" : "ID klienti", + "Client secret" : "E fshehtë klienti", + "OpenStack" : "OpenStack", + "Username" : "Emër përdoruesi", + "Password" : "Fjalëkalim", + "Rackspace" : "Rackspace", + "API key" : "Kyç API", + "Username and password" : "Emër përdoruesi dhe fjalëkalim", + "Session credentials" : "Kredenciale sesioni", + "RSA public key" : "Kyç publik RSA ", + "Public key" : "Kyç publik", + "Amazon S3" : "Amazon S3", + "Bucket" : "Bucket", + "Hostname" : "Strehëemër", + "Port" : "Portë", + "Region" : "Rajon", + "Enable SSL" : "Aktivizo SSL-në", + "Enable Path Style" : "Aktivizo Stile Shtegu", "WebDAV" : "WebDAV", - "URL" : "URL-i", - "Host" : "Pritësi", - "Location" : "Vendndodhja", - "Share" : "Ndaj", - "Name" : "Emri", - "Folder name" : "Emri i Skedarit", - "Delete" : "Elimino" + "URL" : "URL", + "Remote subfolder" : "Nëndosje e largët", + "Secure https://" : "https:// e sigurt", + "Dropbox" : "Dropbox", + "FTP" : "FTP", + "Host" : "Strehë", + "Secure ftps://" : "ftps:// e sigurt", + "Google Drive" : "Google Drive", + "Local" : "Vendore", + "Location" : "Vendndodhje", + "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "Root" : "Rrënjë", + "SFTP with secret key login" : "SFTP me hyrje me kyç të fshehtë", + "SMB / CIFS" : "SMB / CIFS", + "Share" : "Ndajeni me të tjerët", + "Domain" : "Përkatësi", + "SMB / CIFS using OC login" : "SMB / CIFS me përdorim hyrjeje OC", + "Username as share" : "Emër përdoruesi si emër ndarjeje", + "OpenStack Object Storage" : "Depozitë OpenStack Object", + "Service name" : "Emër shërbimi", + "Request timeout (seconds)" : "Kohë skadimi kërkese (sekonda)", + "<b>Note:</b> " : "<b>Shënim:</b> ", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Shënim:</b> S’është aktivizuar ose instaluar mbulimi i cURL-ve në PHP. Montimi i %s s’është i mundur. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Shënim:</b> S’është aktivizuar ose instaluar mbulimi i FTP-së në PHP. Montimi i %s s’është i mundur. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Shënim:</b> S’është instaluar \"%s\". Montimi i %s s’është i mundur. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "No external storage configured" : "Pa depozita të jashtme të formësuara", + "You can add external storages in the personal settings" : "Depozita të jashtme mund të shtoni që prej rregullimeve personale", + "Name" : "Emër", + "Storage type" : "Lloj depozite", + "Scope" : "Shtrirje", + "External Storage" : "Depozitë e Jashtme", + "Folder name" : "Emër dosjeje", + "Authentication" : "Mirëfilltësim", + "Configuration" : "Formësim", + "Available for" : "E gatshme për", + "Advanced settings" : "Rregullime të mëtejshme", + "Delete" : "Fshije", + "Add storage" : "Shtoni depozitë", + "Allow users to mount the following external storage" : "Lejoju përdoruesve të montojnë depozitën e jashtme vijuese" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/sq.json b/apps/files_external/l10n/sq.json index 20ebd508480..1dbebd0fb5c 100644 --- a/apps/files_external/l10n/sq.json +++ b/apps/files_external/l10n/sq.json @@ -1,17 +1,102 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Dhënia e elementëve të kërkuar dështoi. Verifikoni që kyçi dhe e fshehta juaj për aplikacionin janë të sakta.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Dhënia e elementëve të hyrjes dështoi. Verifikoni që kyçi dhe e fshehta juaj për aplikacionin janë të sakta.", + "Please provide a valid app key and secret." : "Ju lutemi jepni një kyç dhe një të fshehtë aplikacioni të vlefshme.", + "Step 1 failed. Exception: %s" : "Hapi 1 dështoi. Përjashtim: %s", + "Step 2 failed. Exception: %s" : "Hapi 2 dështoi. Përjashtim: %s", + "External storage" : "Depozitë e jashtme", + "Storage with id \"%i\" not found" : "S’u gjet depozitë me id \"%i\"", + "Invalid backend or authentication mechanism class" : "Mekanizëm shërbimi ose klasë mekanizmi mirëfilltësimi e palvefshme", + "Invalid mount point" : "Pikë montimi e pavlefshme", + "Objectstore forbidden" : "Objectstore e ndaluar", + "Invalid storage backend \"%s\"" : "Mekanizëm shërbimi depozite i pavlefshëm \"%s\"", + "Not permitted to use backend \"%s\"" : "I palejuar të përdorë mekanizmin e shërbimit \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "S’i lejohet të përdorë mekanizmin e mirëfilltësimit \"%s\"", + "Unsatisfied backend parameters" : "Parametra mekanizmi shërbimi të paplotësuar", + "Unsatisfied authentication mechanism parameters" : "Parametra mekanizmi mirëfilltësimi të papërmbushur", "Personal" : "Personale", + "System" : "Sistem", + "Grant access" : "Akordoji hyrje", + "Access granted" : "Hyrja u akordua", + "Error configuring OAuth1" : "Gabim gjatë formësimit të OAuth1", + "Error configuring OAuth2" : "Gabim gjatë formësimit të OAuth2", + "Generate keys" : "Prodho kyçe", + "Error generating key pair" : "Gabim gjatë prodhimit të çiftit të kyçeve", + "Enable encryption" : "Aktivizoni fshehtëzim", + "Enable previews" : "Aktivizoni paraparje", + "Check for changes" : "Kontrollo për ndryshime", + "Never" : "Kurrë", + "Once every direct access" : "Çdo herë pas hyrjesh të drejtpërdrejta", + "Every time the filesystem is used" : "Sa herë që përdoret sistemi i kartelave", + "All users. Type to select user or group." : "Krejt përdoruesit. Shtypni që të përzgjidhet përdorues ose grup.", + "(group)" : "(grup)", "Saved" : "U ruajt", - "None" : "Asgjë", - "Username" : "Përdoruesi", - "Password" : "fjalëkalim", - "Port" : "Porta", + "Access key" : "Kyç hyrjesh", + "Secret key" : "Kyç i fshehtë", + "Builtin" : "I brendshëm", + "None" : "Asnjë", + "OAuth1" : "OAuth1", + "App key" : "Kyç aplikacioni", + "App secret" : "E fshehtë aplikacioni", + "OAuth2" : "OAuth2", + "Client ID" : "ID klienti", + "Client secret" : "E fshehtë klienti", + "OpenStack" : "OpenStack", + "Username" : "Emër përdoruesi", + "Password" : "Fjalëkalim", + "Rackspace" : "Rackspace", + "API key" : "Kyç API", + "Username and password" : "Emër përdoruesi dhe fjalëkalim", + "Session credentials" : "Kredenciale sesioni", + "RSA public key" : "Kyç publik RSA ", + "Public key" : "Kyç publik", + "Amazon S3" : "Amazon S3", + "Bucket" : "Bucket", + "Hostname" : "Strehëemër", + "Port" : "Portë", + "Region" : "Rajon", + "Enable SSL" : "Aktivizo SSL-në", + "Enable Path Style" : "Aktivizo Stile Shtegu", "WebDAV" : "WebDAV", - "URL" : "URL-i", - "Host" : "Pritësi", - "Location" : "Vendndodhja", - "Share" : "Ndaj", - "Name" : "Emri", - "Folder name" : "Emri i Skedarit", - "Delete" : "Elimino" + "URL" : "URL", + "Remote subfolder" : "Nëndosje e largët", + "Secure https://" : "https:// e sigurt", + "Dropbox" : "Dropbox", + "FTP" : "FTP", + "Host" : "Strehë", + "Secure ftps://" : "ftps:// e sigurt", + "Google Drive" : "Google Drive", + "Local" : "Vendore", + "Location" : "Vendndodhje", + "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "Root" : "Rrënjë", + "SFTP with secret key login" : "SFTP me hyrje me kyç të fshehtë", + "SMB / CIFS" : "SMB / CIFS", + "Share" : "Ndajeni me të tjerët", + "Domain" : "Përkatësi", + "SMB / CIFS using OC login" : "SMB / CIFS me përdorim hyrjeje OC", + "Username as share" : "Emër përdoruesi si emër ndarjeje", + "OpenStack Object Storage" : "Depozitë OpenStack Object", + "Service name" : "Emër shërbimi", + "Request timeout (seconds)" : "Kohë skadimi kërkese (sekonda)", + "<b>Note:</b> " : "<b>Shënim:</b> ", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Shënim:</b> S’është aktivizuar ose instaluar mbulimi i cURL-ve në PHP. Montimi i %s s’është i mundur. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Shënim:</b> S’është aktivizuar ose instaluar mbulimi i FTP-së në PHP. Montimi i %s s’është i mundur. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Shënim:</b> S’është instaluar \"%s\". Montimi i %s s’është i mundur. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "No external storage configured" : "Pa depozita të jashtme të formësuara", + "You can add external storages in the personal settings" : "Depozita të jashtme mund të shtoni që prej rregullimeve personale", + "Name" : "Emër", + "Storage type" : "Lloj depozite", + "Scope" : "Shtrirje", + "External Storage" : "Depozitë e Jashtme", + "Folder name" : "Emër dosjeje", + "Authentication" : "Mirëfilltësim", + "Configuration" : "Formësim", + "Available for" : "E gatshme për", + "Advanced settings" : "Rregullime të mëtejshme", + "Delete" : "Fshije", + "Add storage" : "Shtoni depozitë", + "Allow users to mount the following external storage" : "Lejoju përdoruesve të montojnë depozitën e jashtme vijuese" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js index ddc5878f1f5..02596d8ab22 100644 --- a/apps/files_external/l10n/sr.js +++ b/apps/files_external/l10n/sr.js @@ -48,7 +48,9 @@ OC.L10N.register( "Local" : "локална", "Location" : "Локација", "ownCloud" : "оунКлауд", + "SFTP with secret key login" : "СФТП са пријавом помоћу тајног кључа", "Share" : "Дели", + "SMB / CIFS using OC login" : "СМБ/ЦИФС користећи оунКлауд пријаву", "Username as share" : "Корисничко име као дељење", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Напомена:</b> ", @@ -67,7 +69,6 @@ OC.L10N.register( "Advanced settings" : "Напредне поставке", "Delete" : "Обриши", "Add storage" : "Додај складиште", - "Enable User External Storage" : "Укључи корисничко спољашње складиште", "Allow users to mount the following external storage" : "Дозволи корисницима да монтирају следећа спољашња складишта" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/sr.json b/apps/files_external/l10n/sr.json index bc7dc4de21a..f1c12eeb0f7 100644 --- a/apps/files_external/l10n/sr.json +++ b/apps/files_external/l10n/sr.json @@ -46,7 +46,9 @@ "Local" : "локална", "Location" : "Локација", "ownCloud" : "оунКлауд", + "SFTP with secret key login" : "СФТП са пријавом помоћу тајног кључа", "Share" : "Дели", + "SMB / CIFS using OC login" : "СМБ/ЦИФС користећи оунКлауд пријаву", "Username as share" : "Корисничко име као дељење", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Напомена:</b> ", @@ -65,7 +67,6 @@ "Advanced settings" : "Напредне поставке", "Delete" : "Обриши", "Add storage" : "Додај складиште", - "Enable User External Storage" : "Укључи корисничко спољашње складиште", "Allow users to mount the following external storage" : "Дозволи корисницима да монтирају следећа спољашња складишта" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sr@latin.js b/apps/files_external/l10n/sr@latin.js index 64301b4a026..880a33c1614 100644 --- a/apps/files_external/l10n/sr@latin.js +++ b/apps/files_external/l10n/sr@latin.js @@ -34,6 +34,7 @@ OC.L10N.register( "Location" : "Lokacija", "Root" : "Koren", "Share" : "Podeli", + "SMB / CIFS using OC login" : "SMB / CIFS koji koristi OC prijavljivanje", "Username as share" : "Korisničko ime i deljeni direktorijum", "OpenStack Object Storage" : "OpenStack skladište objekata", "<b>Note:</b> " : "<b>Obratite pažnju:</b>", @@ -49,7 +50,6 @@ OC.L10N.register( "Available for" : "Dostupno za", "Delete" : "Obriši", "Add storage" : "Dodaj skladište", - "Enable User External Storage" : "Omogući korisničko spoljašnje skladište", "Allow users to mount the following external storage" : "Omogući korisnicima da namontiraju sledeće spoljašnje skladište" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/sr@latin.json b/apps/files_external/l10n/sr@latin.json index 72fc20844bd..760100867eb 100644 --- a/apps/files_external/l10n/sr@latin.json +++ b/apps/files_external/l10n/sr@latin.json @@ -32,6 +32,7 @@ "Location" : "Lokacija", "Root" : "Koren", "Share" : "Podeli", + "SMB / CIFS using OC login" : "SMB / CIFS koji koristi OC prijavljivanje", "Username as share" : "Korisničko ime i deljeni direktorijum", "OpenStack Object Storage" : "OpenStack skladište objekata", "<b>Note:</b> " : "<b>Obratite pažnju:</b>", @@ -47,7 +48,6 @@ "Available for" : "Dostupno za", "Delete" : "Obriši", "Add storage" : "Dodaj skladište", - "Enable User External Storage" : "Omogući korisničko spoljašnje skladište", "Allow users to mount the following external storage" : "Omogući korisnicima da namontiraju sledeće spoljašnje skladište" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js index 08175a56562..09786533e87 100644 --- a/apps/files_external/l10n/sv.js +++ b/apps/files_external/l10n/sv.js @@ -39,6 +39,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "Root" : "Root", "Share" : "Dela", + "SMB / CIFS using OC login" : "SMB / CIFS använder OC inloggning", "Username as share" : "Användarnamn till utdelning", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b> OBS: </ b>", @@ -54,7 +55,6 @@ OC.L10N.register( "Available for" : "Tillgänglig för", "Delete" : "Radera", "Add storage" : "Lägg till lagring", - "Enable User External Storage" : "Aktivera extern lagring för användare", "Allow users to mount the following external storage" : "Tillåt användare att montera följande extern lagring" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json index c44ad337ab3..ddb7439cb8d 100644 --- a/apps/files_external/l10n/sv.json +++ b/apps/files_external/l10n/sv.json @@ -37,6 +37,7 @@ "ownCloud" : "ownCloud", "Root" : "Root", "Share" : "Dela", + "SMB / CIFS using OC login" : "SMB / CIFS använder OC inloggning", "Username as share" : "Användarnamn till utdelning", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b> OBS: </ b>", @@ -52,7 +53,6 @@ "Available for" : "Tillgänglig för", "Delete" : "Radera", "Add storage" : "Lägg till lagring", - "Enable User External Storage" : "Aktivera extern lagring för användare", "Allow users to mount the following external storage" : "Tillåt användare att montera följande extern lagring" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ta_LK.js b/apps/files_external/l10n/ta_LK.js index 382d5e943a1..8ab0f6d513c 100644 --- a/apps/files_external/l10n/ta_LK.js +++ b/apps/files_external/l10n/ta_LK.js @@ -18,7 +18,6 @@ OC.L10N.register( "External Storage" : "வெளி சேமிப்பு", "Folder name" : "கோப்புறை பெயர்", "Configuration" : "தகவமைப்பு", - "Delete" : "நீக்குக", - "Enable User External Storage" : "பயனாளர் வெளி சேமிப்பை இயலுமைப்படுத்துக" + "Delete" : "நீக்குக" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/ta_LK.json b/apps/files_external/l10n/ta_LK.json index c838cbe0173..dd1c1003728 100644 --- a/apps/files_external/l10n/ta_LK.json +++ b/apps/files_external/l10n/ta_LK.json @@ -16,7 +16,6 @@ "External Storage" : "வெளி சேமிப்பு", "Folder name" : "கோப்புறை பெயர்", "Configuration" : "தகவமைப்பு", - "Delete" : "நீக்குக", - "Enable User External Storage" : "பயனாளர் வெளி சேமிப்பை இயலுமைப்படுத்துக" + "Delete" : "நீக்குக" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js index 89308e5889c..c027e63642f 100644 --- a/apps/files_external/l10n/th_TH.js +++ b/apps/files_external/l10n/th_TH.js @@ -75,11 +75,11 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "รูท", - "SFTP with secret key login [DEPRECATED]" : "SFTP กับรหัสลับเข้าสู่ระบบ [ยกเลิก]", + "SFTP with secret key login" : "SFTP กับคีย์ลับสำหรับเข้าสู่ระบบ", "SMB / CIFS" : "SMB / CIFS", "Share" : "แชร์", "Domain" : "โดเมน", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS กำลังใช้ OC เข้าสู่ระบบ [ยกเลิก]", + "SMB / CIFS using OC login" : "SMB/CIFS กำลังใช้ OC เข้าสู่ระบบ", "Username as share" : "ชื่อผู้ใช้ที่แชร์", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "ชื่อบริการ", @@ -101,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "ตั้งค่าขั้นสูง", "Delete" : "ลบ", "Add storage" : "เพิ่มพื้นที่จัดเก็บข้อมูล", - "Enable User External Storage" : "เปิดให้มีการใช้พื้นที่จัดเก็บข้อมูลของผู้ใช้งานจากภายนอกได้", "Allow users to mount the following external storage" : "อนุญาตให้ผู้ใช้ติดตั้งจัดเก็บข้อมูลภายนอกต่อไปนี้" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json index 5b167001e4e..34bf501d7af 100644 --- a/apps/files_external/l10n/th_TH.json +++ b/apps/files_external/l10n/th_TH.json @@ -73,11 +73,11 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "รูท", - "SFTP with secret key login [DEPRECATED]" : "SFTP กับรหัสลับเข้าสู่ระบบ [ยกเลิก]", + "SFTP with secret key login" : "SFTP กับคีย์ลับสำหรับเข้าสู่ระบบ", "SMB / CIFS" : "SMB / CIFS", "Share" : "แชร์", "Domain" : "โดเมน", - "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS กำลังใช้ OC เข้าสู่ระบบ [ยกเลิก]", + "SMB / CIFS using OC login" : "SMB/CIFS กำลังใช้ OC เข้าสู่ระบบ", "Username as share" : "ชื่อผู้ใช้ที่แชร์", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "ชื่อบริการ", @@ -99,7 +99,6 @@ "Advanced settings" : "ตั้งค่าขั้นสูง", "Delete" : "ลบ", "Add storage" : "เพิ่มพื้นที่จัดเก็บข้อมูล", - "Enable User External Storage" : "เปิดให้มีการใช้พื้นที่จัดเก็บข้อมูลของผู้ใช้งานจากภายนอกได้", "Allow users to mount the following external storage" : "อนุญาตให้ผู้ใช้ติดตั้งจัดเก็บข้อมูลภายนอกต่อไปนี้" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js index 652bc611866..619e5975ed8 100644 --- a/apps/files_external/l10n/tr.js +++ b/apps/files_external/l10n/tr.js @@ -1,18 +1,20 @@ OC.L10N.register( "files_external", { - "Fetching request tokens failed. Verify that your app key and secret are correct." : "Getirme istek jetonları başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", - "Fetching access tokens failed. Verify that your app key and secret are correct." : "Getirme erişim jetonları başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", + "Fetching request tokens failed. Verify that your app key and secret are correct." : "İstek jetonları getirme başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Erişim jetonları getirme başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", "Please provide a valid app key and secret." : "Lütfen geçerli bir uygulama anahtarı ve gizli bilgisini girin.", "Step 1 failed. Exception: %s" : "Adım 1 başarısız. Özel durum: %s", "Step 2 failed. Exception: %s" : "Adım 2 başarısız. Özel durum: %s", "External storage" : "Harici depolama", "Storage with id \"%i\" not found" : "\"%i\" kimliği ile bir depolama bulunamadı", - "Invalid backend or authentication mechanism class" : "Geçersiz arkauç veya kimlik doğrulama mekanizma sınıfı", + "Invalid backend or authentication mechanism class" : "Geçersiz arka uç veya kimlik doğrulama mekanizma sınıfı", "Invalid mount point" : "Geçersiz bağlama noktası", "Objectstore forbidden" : "Nesne deposu yasaktır", "Invalid storage backend \"%s\"" : "Geçersiz depolama arka ucu \"%s\"", - "Unsatisfied backend parameters" : "Yetersiz arkauç parametreleri", + "Not permitted to use backend \"%s\"" : "\"%s\" arka ucu kullanımına izin verilmiyor", + "Not permitted to use authentication mechanism \"%s\"" : "\"%s\" kimlik doğrulama mekanizmasına izin verilmiyor", + "Unsatisfied backend parameters" : "Yetersiz arka uç parametreleri", "Unsatisfied authentication mechanism parameters" : "Yetersiz kimlik doğrulama mekanizması parametreleri", "Personal" : "Kişisel", "System" : "Sistem", @@ -41,11 +43,16 @@ OC.L10N.register( "OAuth2" : "OAuth2", "Client ID" : "İstemci kimliği", "Client secret" : "İstemci parolası", + "OpenStack" : "OpenStack", "Username" : "Kullanıcı Adı", "Password" : "Parola", + "Tenant name" : "Kiracı adı", + "Identity endpoint URL" : "Kimlik uç nokta URL'si", + "Rackspace" : "Rackspace", "API key" : "API anahtarı", "Username and password" : "Kullanıcı adı ve parola", "Session credentials" : "Oturum bilgileri", + "RSA public key" : "RSA ortak anahtarı", "Public key" : "Ortak anahtar", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -68,10 +75,15 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Kök", + "SFTP with secret key login" : "Gizli anahtar oturumu ile SFTP", "SMB / CIFS" : "SMB / CIFS", "Share" : "Paylaş", + "Domain" : "Alan adı", + "SMB / CIFS using OC login" : "OC oturumu kullanarak SMB / CIFS", "Username as share" : "Paylaşım olarak kullanıcı adı", "OpenStack Object Storage" : "OpenStack Nesne Depolama", + "Service name" : "Hizmet adı", + "Request timeout (seconds)" : "İstek zamanaşımı (saniye)", "<b>Note:</b> " : "<b>Not:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de cURL desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de FTP desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", @@ -89,7 +101,6 @@ OC.L10N.register( "Advanced settings" : "Gelişmiş ayarlar", "Delete" : "Sil", "Add storage" : "Depo ekle", - "Enable User External Storage" : "Kullanıcılar için Harici Depolamayı Etkinleştir", "Allow users to mount the following external storage" : "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json index 328ecab466f..cb315a333c2 100644 --- a/apps/files_external/l10n/tr.json +++ b/apps/files_external/l10n/tr.json @@ -1,16 +1,18 @@ { "translations": { - "Fetching request tokens failed. Verify that your app key and secret are correct." : "Getirme istek jetonları başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", - "Fetching access tokens failed. Verify that your app key and secret are correct." : "Getirme erişim jetonları başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", + "Fetching request tokens failed. Verify that your app key and secret are correct." : "İstek jetonları getirme başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Erişim jetonları getirme başarısız oldu. Uygulama anahtarınızın ve gizli bilginin doğruluğunu kontrol edin.", "Please provide a valid app key and secret." : "Lütfen geçerli bir uygulama anahtarı ve gizli bilgisini girin.", "Step 1 failed. Exception: %s" : "Adım 1 başarısız. Özel durum: %s", "Step 2 failed. Exception: %s" : "Adım 2 başarısız. Özel durum: %s", "External storage" : "Harici depolama", "Storage with id \"%i\" not found" : "\"%i\" kimliği ile bir depolama bulunamadı", - "Invalid backend or authentication mechanism class" : "Geçersiz arkauç veya kimlik doğrulama mekanizma sınıfı", + "Invalid backend or authentication mechanism class" : "Geçersiz arka uç veya kimlik doğrulama mekanizma sınıfı", "Invalid mount point" : "Geçersiz bağlama noktası", "Objectstore forbidden" : "Nesne deposu yasaktır", "Invalid storage backend \"%s\"" : "Geçersiz depolama arka ucu \"%s\"", - "Unsatisfied backend parameters" : "Yetersiz arkauç parametreleri", + "Not permitted to use backend \"%s\"" : "\"%s\" arka ucu kullanımına izin verilmiyor", + "Not permitted to use authentication mechanism \"%s\"" : "\"%s\" kimlik doğrulama mekanizmasına izin verilmiyor", + "Unsatisfied backend parameters" : "Yetersiz arka uç parametreleri", "Unsatisfied authentication mechanism parameters" : "Yetersiz kimlik doğrulama mekanizması parametreleri", "Personal" : "Kişisel", "System" : "Sistem", @@ -39,11 +41,16 @@ "OAuth2" : "OAuth2", "Client ID" : "İstemci kimliği", "Client secret" : "İstemci parolası", + "OpenStack" : "OpenStack", "Username" : "Kullanıcı Adı", "Password" : "Parola", + "Tenant name" : "Kiracı adı", + "Identity endpoint URL" : "Kimlik uç nokta URL'si", + "Rackspace" : "Rackspace", "API key" : "API anahtarı", "Username and password" : "Kullanıcı adı ve parola", "Session credentials" : "Oturum bilgileri", + "RSA public key" : "RSA ortak anahtarı", "Public key" : "Ortak anahtar", "Amazon S3" : "Amazon S3", "Bucket" : "Bucket", @@ -66,10 +73,15 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Kök", + "SFTP with secret key login" : "Gizli anahtar oturumu ile SFTP", "SMB / CIFS" : "SMB / CIFS", "Share" : "Paylaş", + "Domain" : "Alan adı", + "SMB / CIFS using OC login" : "OC oturumu kullanarak SMB / CIFS", "Username as share" : "Paylaşım olarak kullanıcı adı", "OpenStack Object Storage" : "OpenStack Nesne Depolama", + "Service name" : "Hizmet adı", + "Request timeout (seconds)" : "İstek zamanaşımı (saniye)", "<b>Note:</b> " : "<b>Not:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de cURL desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de FTP desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", @@ -87,7 +99,6 @@ "Advanced settings" : "Gelişmiş ayarlar", "Delete" : "Sil", "Add storage" : "Depo ekle", - "Enable User External Storage" : "Kullanıcılar için Harici Depolamayı Etkinleştir", "Allow users to mount the following external storage" : "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js index 024d4fcf982..f8ca8dc360c 100644 --- a/apps/files_external/l10n/uk.js +++ b/apps/files_external/l10n/uk.js @@ -45,6 +45,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "Root" : "Батьківський каталог", "Share" : "Поділитися", + "SMB / CIFS using OC login" : "SMB / CIFS з використанням логіна OC", "Username as share" : "Ім'я для відкритого доступу", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Примітка:</b>", @@ -63,7 +64,6 @@ OC.L10N.register( "Advanced settings" : "Розширені налаштування", "Delete" : "Видалити", "Add storage" : "Додати сховище", - "Enable User External Storage" : "Активувати користувацькі зовнішні сховища", "Allow users to mount the following external storage" : "Дозволити користувачам монтувати наступні зовнішні сховища" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json index fe5c43a8f39..c34d0d2c82f 100644 --- a/apps/files_external/l10n/uk.json +++ b/apps/files_external/l10n/uk.json @@ -43,6 +43,7 @@ "ownCloud" : "ownCloud", "Root" : "Батьківський каталог", "Share" : "Поділитися", + "SMB / CIFS using OC login" : "SMB / CIFS з використанням логіна OC", "Username as share" : "Ім'я для відкритого доступу", "OpenStack Object Storage" : "OpenStack Object Storage", "<b>Note:</b> " : "<b>Примітка:</b>", @@ -61,7 +62,6 @@ "Advanced settings" : "Розширені налаштування", "Delete" : "Видалити", "Add storage" : "Додати сховище", - "Enable User External Storage" : "Активувати користувацькі зовнішні сховища", "Allow users to mount the following external storage" : "Дозволити користувачам монтувати наступні зовнішні сховища" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/vi.js b/apps/files_external/l10n/vi.js index 49c746851eb..f3fdb39136c 100644 --- a/apps/files_external/l10n/vi.js +++ b/apps/files_external/l10n/vi.js @@ -22,7 +22,6 @@ OC.L10N.register( "Folder name" : "Tên thư mục", "Configuration" : "Cấu hình", "Delete" : "Xóa", - "Add storage" : "Thêm bộ nhớ", - "Enable User External Storage" : "Kích hoạt tính năng lưu trữ ngoài" + "Add storage" : "Thêm bộ nhớ" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/vi.json b/apps/files_external/l10n/vi.json index 4daddc7ae57..fdba39fc95e 100644 --- a/apps/files_external/l10n/vi.json +++ b/apps/files_external/l10n/vi.json @@ -20,7 +20,6 @@ "Folder name" : "Tên thư mục", "Configuration" : "Cấu hình", "Delete" : "Xóa", - "Add storage" : "Thêm bộ nhớ", - "Enable User External Storage" : "Kích hoạt tính năng lưu trữ ngoài" + "Add storage" : "Thêm bộ nhớ" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/zh_CN.js b/apps/files_external/l10n/zh_CN.js index 535d945b028..4b99fc170a2 100644 --- a/apps/files_external/l10n/zh_CN.js +++ b/apps/files_external/l10n/zh_CN.js @@ -30,6 +30,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "Root" : "根路径", "Share" : "共享", + "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登录信息", "OpenStack Object Storage" : "OpenStack 对象存储", "<b>Note:</b> " : "<b>注意:</b>", "Name" : "名称", @@ -41,7 +42,6 @@ OC.L10N.register( "Available for" : "可用于", "Delete" : "删除", "Add storage" : "增加存储", - "Enable User External Storage" : "启用用户外部存储", "Allow users to mount the following external storage" : "允许用户挂载以下外部存储" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/zh_CN.json b/apps/files_external/l10n/zh_CN.json index ac75d680c7e..fddc688c5c2 100644 --- a/apps/files_external/l10n/zh_CN.json +++ b/apps/files_external/l10n/zh_CN.json @@ -28,6 +28,7 @@ "ownCloud" : "ownCloud", "Root" : "根路径", "Share" : "共享", + "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登录信息", "OpenStack Object Storage" : "OpenStack 对象存储", "<b>Note:</b> " : "<b>注意:</b>", "Name" : "名称", @@ -39,7 +40,6 @@ "Available for" : "可用于", "Delete" : "删除", "Add storage" : "增加存储", - "Enable User External Storage" : "启用用户外部存储", "Allow users to mount the following external storage" : "允许用户挂载以下外部存储" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js index e4e01cd2d59..d272f82f094 100644 --- a/apps/files_external/l10n/zh_TW.js +++ b/apps/files_external/l10n/zh_TW.js @@ -33,7 +33,6 @@ OC.L10N.register( "Available for" : "可用的", "Delete" : "刪除", "Add storage" : "增加儲存區", - "Enable User External Storage" : "啓用使用者外部儲存", "Allow users to mount the following external storage" : "允許使用者自行掛載以下的外部儲存" }, "nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json index 1ed049bc079..3efd2fa691f 100644 --- a/apps/files_external/l10n/zh_TW.json +++ b/apps/files_external/l10n/zh_TW.json @@ -31,7 +31,6 @@ "Available for" : "可用的", "Delete" : "刪除", "Add storage" : "增加儲存區", - "Enable User External Storage" : "啓用使用者外部儲存", "Allow users to mount the following external storage" : "允許使用者自行掛載以下的外部儲存" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php index 34e8974a6d5..00915140bab 100644 --- a/apps/files_external/lib/amazons3.php +++ b/apps/files_external/lib/amazons3.php @@ -7,6 +7,7 @@ * @author Christopher T. Johnson <ctjctj@gmail.com> * @author Johan Björk <johanimon@gmail.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Philipp Kapfer <philipp.kapfer@gmx.at> @@ -517,7 +518,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { $dh = $this->opendir($path1); if (is_resource($dh)) { while (($file = readdir($dh)) !== false) { - if ($file === '.' || $file === '..') { + if (\OC\Files\Filesystem::isIgnoredDir($file)) { continue; } diff --git a/apps/files_external/lib/api.php b/apps/files_external/lib/api.php index 015c15c41ff..af9b802e522 100644 --- a/apps/files_external/lib/api.php +++ b/apps/files_external/lib/api.php @@ -2,6 +2,7 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_external/lib/auth/amazons3/accesskey.php b/apps/files_external/lib/auth/amazons3/accesskey.php index 9e3aab374b9..d265db6279f 100644 --- a/apps/files_external/lib/auth/amazons3/accesskey.php +++ b/apps/files_external/lib/auth/amazons3/accesskey.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/authmechanism.php b/apps/files_external/lib/auth/authmechanism.php index ddc0c6a4dca..e695cbbebd5 100644 --- a/apps/files_external/lib/auth/authmechanism.php +++ b/apps/files_external/lib/auth/authmechanism.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -22,7 +22,7 @@ namespace OCA\Files_External\Lib\Auth; use \OCA\Files_External\Lib\StorageConfig; -use \OCA\Files_External\Lib\PermissionsTrait; +use \OCA\Files_External\Lib\VisibilityTrait; use \OCA\Files_External\Lib\IdentifierTrait; use \OCA\Files_External\Lib\FrontendDefinitionTrait; use \OCA\Files_External\Lib\StorageModifierTrait; @@ -40,7 +40,7 @@ use \OCA\Files_External\Lib\StorageModifierTrait; * scheme, which are provided from the authentication mechanism. * * This class uses the following traits: - * - PermissionsTrait + * - VisibilityTrait * Restrict usage to admin-only/none * - FrontendDefinitionTrait * Specify configuration parameters and other definitions @@ -58,7 +58,7 @@ class AuthMechanism implements \JsonSerializable { const SCHEME_PUBLICKEY = 'publickey'; const SCHEME_OPENSTACK = 'openstack'; - use PermissionsTrait; + use VisibilityTrait; use FrontendDefinitionTrait; use StorageModifierTrait; use IdentifierTrait; @@ -92,6 +92,8 @@ class AuthMechanism implements \JsonSerializable { */ public function jsonSerialize() { $data = $this->jsonSerializeDefinition(); + $data += $this->jsonSerializeIdentifier(); + $data['scheme'] = $this->getScheme(); return $data; diff --git a/apps/files_external/lib/auth/builtin.php b/apps/files_external/lib/auth/builtin.php index ee28a4e8a5c..8fb4c901cbc 100644 --- a/apps/files_external/lib/auth/builtin.php +++ b/apps/files_external/lib/auth/builtin.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/nullmechanism.php b/apps/files_external/lib/auth/nullmechanism.php index 1765fc67396..399c8301c5a 100644 --- a/apps/files_external/lib/auth/nullmechanism.php +++ b/apps/files_external/lib/auth/nullmechanism.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/oauth1/oauth1.php b/apps/files_external/lib/auth/oauth1/oauth1.php index 3fb1b16aa6d..7bdd01d4c16 100644 --- a/apps/files_external/lib/auth/oauth1/oauth1.php +++ b/apps/files_external/lib/auth/oauth1/oauth1.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/oauth2/oauth2.php b/apps/files_external/lib/auth/oauth2/oauth2.php index 73faa85a44e..7123f8c16e3 100644 --- a/apps/files_external/lib/auth/oauth2/oauth2.php +++ b/apps/files_external/lib/auth/oauth2/oauth2.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/openstack/openstack.php b/apps/files_external/lib/auth/openstack/openstack.php index faf356bcf2e..757fdab9ea6 100644 --- a/apps/files_external/lib/auth/openstack/openstack.php +++ b/apps/files_external/lib/auth/openstack/openstack.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/openstack/rackspace.php b/apps/files_external/lib/auth/openstack/rackspace.php index 9268f3aad87..395b58e6fae 100644 --- a/apps/files_external/lib/auth/openstack/rackspace.php +++ b/apps/files_external/lib/auth/openstack/rackspace.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/password/password.php b/apps/files_external/lib/auth/password/password.php index 96ad4b496d4..d3444cb1419 100644 --- a/apps/files_external/lib/auth/password/password.php +++ b/apps/files_external/lib/auth/password/password.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/password/sessioncredentials.php b/apps/files_external/lib/auth/password/sessioncredentials.php index 37cfd97a176..8e36ff5f1d8 100644 --- a/apps/files_external/lib/auth/password/sessioncredentials.php +++ b/apps/files_external/lib/auth/password/sessioncredentials.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/auth/publickey/rsa.php b/apps/files_external/lib/auth/publickey/rsa.php index f40136dda01..4e19f90c83b 100644 --- a/apps/files_external/lib/auth/publickey/rsa.php +++ b/apps/files_external/lib/auth/publickey/rsa.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/amazons3.php b/apps/files_external/lib/backend/amazons3.php index 1cf62d7cb09..538b53637e3 100644 --- a/apps/files_external/lib/backend/amazons3.php +++ b/apps/files_external/lib/backend/amazons3.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/backend.php b/apps/files_external/lib/backend/backend.php index 2a2add3ac59..9868519ed4f 100644 --- a/apps/files_external/lib/backend/backend.php +++ b/apps/files_external/lib/backend/backend.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -22,7 +22,7 @@ namespace OCA\Files_External\Lib\Backend; use \OCA\Files_External\Lib\StorageConfig; -use \OCA\Files_External\Lib\PermissionsTrait; +use \OCA\Files_External\Lib\VisibilityTrait; use \OCA\Files_External\Lib\FrontendDefinitionTrait; use \OCA\Files_External\Lib\PriorityTrait; use \OCA\Files_External\Lib\DependencyTrait; @@ -43,7 +43,7 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism; * scheme, which are provided from the authentication mechanism. * * This class uses the following traits: - * - PermissionsTrait + * - VisibilityTrait * Restrict usage to admin-only/none * - FrontendDefinitionTrait * Specify configuration parameters and other definitions @@ -56,7 +56,7 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism; */ class Backend implements \JsonSerializable { - use PermissionsTrait; + use VisibilityTrait; use FrontendDefinitionTrait; use PriorityTrait; use DependencyTrait; @@ -142,6 +142,7 @@ class Backend implements \JsonSerializable { */ public function jsonSerialize() { $data = $this->jsonSerializeDefinition(); + $data += $this->jsonSerializeIdentifier(); $data['backend'] = $data['name']; // legacy compat $data['priority'] = $this->getPriority(); diff --git a/apps/files_external/lib/backend/dav.php b/apps/files_external/lib/backend/dav.php index c4f446548e1..abc5103c70f 100644 --- a/apps/files_external/lib/backend/dav.php +++ b/apps/files_external/lib/backend/dav.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/dropbox.php b/apps/files_external/lib/backend/dropbox.php index 3e595cb0a9c..01b7a62edbe 100644 --- a/apps/files_external/lib/backend/dropbox.php +++ b/apps/files_external/lib/backend/dropbox.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/ftp.php b/apps/files_external/lib/backend/ftp.php index 1caf3a8fcb8..8f3dfffc77b 100644 --- a/apps/files_external/lib/backend/ftp.php +++ b/apps/files_external/lib/backend/ftp.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/google.php b/apps/files_external/lib/backend/google.php index bc0b52c464b..14b2815b6e5 100644 --- a/apps/files_external/lib/backend/google.php +++ b/apps/files_external/lib/backend/google.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/legacybackend.php b/apps/files_external/lib/backend/legacybackend.php index 83a5b45940d..5ebf143f749 100644 --- a/apps/files_external/lib/backend/legacybackend.php +++ b/apps/files_external/lib/backend/legacybackend.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/local.php b/apps/files_external/lib/backend/local.php index a6635491b6e..7827055eeac 100644 --- a/apps/files_external/lib/backend/local.php +++ b/apps/files_external/lib/backend/local.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -39,7 +39,7 @@ class Local extends Backend { ->addParameters([ (new DefinitionParameter('datadir', $l->t('Location'))), ]) - ->setAllowedPermissions(BackendService::USER_PERSONAL, BackendService::PERMISSION_NONE) + ->setAllowedVisibility(BackendService::VISIBILITY_ADMIN) ->setPriority(BackendService::PRIORITY_DEFAULT + 50) ->addAuthScheme(AuthMechanism::SCHEME_NULL) ->setLegacyAuthMechanism($legacyAuth) diff --git a/apps/files_external/lib/backend/owncloud.php b/apps/files_external/lib/backend/owncloud.php index d06625de241..d10f0b3bd0b 100644 --- a/apps/files_external/lib/backend/owncloud.php +++ b/apps/files_external/lib/backend/owncloud.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/sftp.php b/apps/files_external/lib/backend/sftp.php index c0bcd27c54b..d3fcd41d520 100644 --- a/apps/files_external/lib/backend/sftp.php +++ b/apps/files_external/lib/backend/sftp.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/sftp_key.php b/apps/files_external/lib/backend/sftp_key.php index 6a75172026d..8db5761c1b2 100644 --- a/apps/files_external/lib/backend/sftp_key.php +++ b/apps/files_external/lib/backend/sftp_key.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -27,23 +27,23 @@ use \OCA\Files_External\Lib\DefinitionParameter; use \OCA\Files_External\Lib\Auth\AuthMechanism; use \OCA\Files_External\Service\BackendService; use \OCA\Files_External\Lib\Auth\PublicKey\RSA; +use \OCA\Files_External\Lib\Backend\SFTP; class SFTP_Key extends Backend { - public function __construct(IL10N $l, RSA $legacyAuth) { + public function __construct(IL10N $l, RSA $legacyAuth, SFTP $sftpBackend) { $this ->setIdentifier('\OC\Files\Storage\SFTP_Key') ->setStorageClass('\OC\Files\Storage\SFTP') - ->setText($l->t('SFTP with secret key login [DEPRECATED]')) + ->setText($l->t('SFTP with secret key login')) ->addParameters([ (new DefinitionParameter('host', $l->t('Host'))), (new DefinitionParameter('root', $l->t('Remote subfolder'))) ->setFlag(DefinitionParameter::FLAG_OPTIONAL), ]) - ->removeAllowedPermission(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE) - ->removeAllowedPermission(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE) ->addAuthScheme(AuthMechanism::SCHEME_PUBLICKEY) ->setLegacyAuthMechanism($legacyAuth) + ->deprecateTo($sftpBackend) ; } diff --git a/apps/files_external/lib/backend/smb.php b/apps/files_external/lib/backend/smb.php index 7865b44d689..aa91cf51e85 100644 --- a/apps/files_external/lib/backend/smb.php +++ b/apps/files_external/lib/backend/smb.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/backend/smb_oc.php b/apps/files_external/lib/backend/smb_oc.php index d21b0ddaf42..b84b0b9dcb1 100644 --- a/apps/files_external/lib/backend/smb_oc.php +++ b/apps/files_external/lib/backend/smb_oc.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -29,6 +29,7 @@ use \OCA\Files_External\Service\BackendService; use \OCA\Files_External\Lib\Auth\Password\SessionCredentials; use \OCA\Files_External\Lib\StorageConfig; use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill; +use \OCA\Files_External\Lib\Backend\SMB; /** * Deprecated SMB_OC class - use SMB with the password::sessioncredentials auth mechanism @@ -37,11 +38,11 @@ class SMB_OC extends Backend { use LegacyDependencyCheckPolyfill; - public function __construct(IL10N $l, SessionCredentials $legacyAuth) { + public function __construct(IL10N $l, SessionCredentials $legacyAuth, SMB $smbBackend) { $this ->setIdentifier('\OC\Files\Storage\SMB_OC') ->setStorageClass('\OC\Files\Storage\SMB') - ->setText($l->t('SMB / CIFS using OC login [DEPRECATED]')) + ->setText($l->t('SMB / CIFS using OC login')) ->addParameters([ (new DefinitionParameter('host', $l->t('Host'))), (new DefinitionParameter('username_as_share', $l->t('Username as share'))) @@ -51,11 +52,10 @@ class SMB_OC extends Backend { (new DefinitionParameter('root', $l->t('Remote subfolder'))) ->setFlag(DefinitionParameter::FLAG_OPTIONAL), ]) - ->removeAllowedPermission(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE) - ->removeAllowedPermission(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE) ->setPriority(BackendService::PRIORITY_DEFAULT - 10) ->addAuthScheme(AuthMechanism::SCHEME_PASSWORD) ->setLegacyAuthMechanism($legacyAuth) + ->deprecateTo($smbBackend) ; } diff --git a/apps/files_external/lib/backend/swift.php b/apps/files_external/lib/backend/swift.php index 2e14855206c..8c64c791ad8 100644 --- a/apps/files_external/lib/backend/swift.php +++ b/apps/files_external/lib/backend/swift.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 2dc7de30a6c..d9fdb748fcd 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -1,10 +1,10 @@ <?php /** + * @author Andreas Fischer <bantu@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Björn Schießle <schiessle@owncloud.com> * @author Frank Karlitschek <frank@owncloud.org> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> @@ -112,7 +112,7 @@ class OC_Mount_Config { * @param string $uid user * @return array of mount point string as key, mountpoint config as value * - * @deprecated 8.2.0 use UserGlobalStoragesService::getAllStorages() and UserStoragesService::getAllStorages() + * @deprecated 8.2.0 use UserGlobalStoragesService::getStorages() and UserStoragesService::getStorages() */ public static function getAbsoluteMountPoints($uid) { $mountPoints = array(); @@ -124,7 +124,7 @@ class OC_Mount_Config { $userGlobalStoragesService->setUser($user); $userStoragesService->setUser($user); - foreach ($userGlobalStoragesService->getAllStorages() as $storage) { + foreach ($userGlobalStoragesService->getStorages() as $storage) { $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint(); $mountEntry = self::prepareMountPointEntry($storage, false); foreach ($mountEntry['options'] as &$option) { @@ -133,7 +133,7 @@ class OC_Mount_Config { $mountPoints[$mountPoint] = $mountEntry; } - foreach ($userStoragesService->getAllStorages() as $storage) { + foreach ($userStoragesService->getStorages() as $storage) { $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint(); $mountEntry = self::prepareMountPointEntry($storage, true); foreach ($mountEntry['options'] as &$option) { @@ -153,13 +153,13 @@ class OC_Mount_Config { * * @return array * - * @deprecated 8.2.0 use GlobalStoragesService::getAllStorages() + * @deprecated 8.2.0 use GlobalStoragesService::getStorages() */ public static function getSystemMountPoints() { $mountPoints = []; $service = self::$app->getContainer()->query('OCA\Files_External\Service\GlobalStoragesService'); - foreach ($service->getAllStorages() as $storage) { + foreach ($service->getStorages() as $storage) { $mountPoints[] = self::prepareMountPointEntry($storage, false); } @@ -171,13 +171,13 @@ class OC_Mount_Config { * * @return array * - * @deprecated 8.2.0 use UserStoragesService::getAllStorages() + * @deprecated 8.2.0 use UserStoragesService::getStorages() */ public static function getPersonalMountPoints() { $mountPoints = []; $service = self::$app->getContainer()->query('OCA\Files_External\Service\UserStoragesService'); - foreach ($service->getAllStorages() as $storage) { + foreach ($service->getStorages() as $storage) { $mountPoints[] = self::prepareMountPointEntry($storage, true); } @@ -207,6 +207,11 @@ class OC_Mount_Config { 'groups' => $storage->getApplicableGroups(), 'users' => $storage->getApplicableUsers(), ]; + // if mountpoint is applicable to all users the old API expects ['all'] + if (empty($mountEntry['applicable']['groups']) && empty($mountEntry['applicable']['users'])) { + $mountEntry['applicable']['users'] = ['all']; + } + $mountEntry['id'] = $storage->getId(); return $mountEntry; diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php index cb8c2f24caa..3a04512e8a8 100644 --- a/apps/files_external/lib/config/configadapter.php +++ b/apps/files_external/lib/config/configadapter.php @@ -2,7 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -133,7 +133,7 @@ class ConfigAdapter implements IMountProvider { $mounts[$storage->getMountPoint()] = $mount; } - foreach ($this->userStoragesService->getAllStorages() as $storage) { + foreach ($this->userStoragesService->getStorages() as $storage) { try { $this->prepareStorageConfig($storage, $user); $impl = $this->constructStorage($storage); diff --git a/apps/files_external/lib/dependencytrait.php b/apps/files_external/lib/dependencytrait.php index f0d6d6080e5..f112f6c2e66 100644 --- a/apps/files_external/lib/dependencytrait.php +++ b/apps/files_external/lib/dependencytrait.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php index 4ab14d4f3e0..3b353b7777a 100644 --- a/apps/files_external/lib/dropbox.php +++ b/apps/files_external/lib/dropbox.php @@ -64,7 +64,7 @@ class Dropbox extends \OC\Files\Storage\Common { * @param string $path */ private function deleteMetaData($path) { - $path = $this->root.$path; + $path = ltrim($this->root.$path, '/'); if (isset($this->metaData[$path])) { unset($this->metaData[$path]); return true; @@ -72,6 +72,10 @@ class Dropbox extends \OC\Files\Storage\Common { return false; } + private function setMetaData($path, $metaData) { + $this->metaData[ltrim($path, '/')] = $metaData; + } + /** * Returns the path's metadata * @param string $path path for which to return the metadata @@ -80,7 +84,7 @@ class Dropbox extends \OC\Files\Storage\Common { * false, null if the file doesn't exist or "false" if the operation failed */ private function getDropBoxMetaData($path, $list = false) { - $path = $this->root.$path; + $path = ltrim($this->root.$path, '/'); if ( ! $list && isset($this->metaData[$path])) { return $this->metaData[$path]; } else { @@ -96,14 +100,14 @@ class Dropbox extends \OC\Files\Storage\Common { // Cache folder's contents foreach ($response['contents'] as $file) { if (!isset($file['is_deleted']) || !$file['is_deleted']) { - $this->metaData[$path.'/'.basename($file['path'])] = $file; + $this->setMetaData($path.'/'.basename($file['path']), $file); $contents[] = $file; } } unset($response['contents']); } if (!isset($response['is_deleted']) || !$response['is_deleted']) { - $this->metaData[$path] = $response; + $this->setMetaData($path, $response); } // Return contents of folder only return $contents; @@ -116,7 +120,7 @@ class Dropbox extends \OC\Files\Storage\Common { $response = $this->dropbox->getMetaData($requestPath, 'false'); if (!isset($response['is_deleted']) || !$response['is_deleted']) { - $this->metaData[$path] = $response; + $this->setMetaData($path, $response); return $response; } return null; @@ -288,6 +292,7 @@ class Dropbox extends \OC\Files\Storage\Common { try { $this->dropbox->putFile(self::$tempFiles[$tmpFile], $handle); unlink($tmpFile); + $this->deleteMetaData(self::$tempFiles[$tmpFile]); } catch (\Exception $exception) { \OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR); } diff --git a/apps/files_external/lib/failedstorage.php b/apps/files_external/lib/failedstorage.php index 22ee5326491..c3181fd6b02 100644 --- a/apps/files_external/lib/failedstorage.php +++ b/apps/files_external/lib/failedstorage.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/frontenddefinitiontrait.php b/apps/files_external/lib/frontenddefinitiontrait.php index a5fb1a3f62f..d3b78aa56d4 100644 --- a/apps/files_external/lib/frontenddefinitiontrait.php +++ b/apps/files_external/lib/frontenddefinitiontrait.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index 94f954178c0..eba2ee7f9b5 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -10,6 +10,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Philipp Kapfer <philipp.kapfer@gmx.at> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_external/lib/identifiertrait.php b/apps/files_external/lib/identifiertrait.php index 139911580fc..913e1899db8 100644 --- a/apps/files_external/lib/identifiertrait.php +++ b/apps/files_external/lib/identifiertrait.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -23,6 +23,7 @@ namespace OCA\Files_External\Lib; /** * Trait for objects requiring an identifier (and/or identifier aliases) + * Also supports deprecation to a different object, linking the objects */ trait IdentifierTrait { @@ -32,6 +33,9 @@ trait IdentifierTrait { /** @var string[] */ protected $identifierAliases = []; + /** @var IdentifierTrait */ + protected $deprecateTo = null; + /** * @return string */ @@ -65,4 +69,34 @@ trait IdentifierTrait { return $this; } + /** + * @return object|null + */ + public function getDeprecateTo() { + return $this->deprecateTo; + } + + /** + * @param object $destinationObject + * @return self + */ + public function deprecateTo($destinationObject) { + $this->deprecateTo = $destinationObject; + return $this; + } + + /** + * @return array + */ + public function jsonSerializeIdentifier() { + $data = [ + 'identifier' => $this->identifier, + 'identifierAliases' => $this->identifierAliases, + ]; + if ($this->deprecateTo) { + $data['deprecateTo'] = $this->deprecateTo->getIdentifier(); + } + return $data; + } + } diff --git a/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php b/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php index dd4cd75df12..f77667cb70a 100644 --- a/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php +++ b/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/legacydependencycheckpolyfill.php b/apps/files_external/lib/legacydependencycheckpolyfill.php index 7bb137fb3e1..bd0095debcd 100644 --- a/apps/files_external/lib/legacydependencycheckpolyfill.php +++ b/apps/files_external/lib/legacydependencycheckpolyfill.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/permissionstrait.php b/apps/files_external/lib/permissionstrait.php deleted file mode 100644 index 8509a01e422..00000000000 --- a/apps/files_external/lib/permissionstrait.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php -/** - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -namespace OCA\Files_External\Lib; - -use \OCA\Files_External\Service\BackendService; - -/** - * Trait to implement backend and auth mechanism permissions - * - * For user type constants, see BackendService::USER_* - * For permission constants, see BackendService::PERMISSION_* - */ -trait PermissionsTrait { - - /** @var array [user type => permissions] */ - protected $permissions = [ - BackendService::USER_PERSONAL => BackendService::PERMISSION_DEFAULT, - BackendService::USER_ADMIN => BackendService::PERMISSION_DEFAULT, - ]; - - /** @var array [user type => allowed permissions] */ - protected $allowedPermissions = [ - BackendService::USER_PERSONAL => BackendService::PERMISSION_DEFAULT, - BackendService::USER_ADMIN => BackendService::PERMISSION_DEFAULT, - ]; - - /** - * @param string $userType - * @return int - */ - public function getPermissions($userType) { - if (isset($this->permissions[$userType])) { - return $this->permissions[$userType]; - } - return BackendService::PERMISSION_NONE; - } - - /** - * Check if the user type has permission - * - * @param string $userType - * @param int $permission - * @return bool - */ - public function isPermitted($userType, $permission) { - if ($this->getPermissions($userType) & $permission) { - return true; - } - return false; - } - - /** - * @param string $userType - * @param int $permissions - * @return self - */ - public function setPermissions($userType, $permissions) { - $this->permissions[$userType] = $permissions; - $this->allowedPermissions[$userType] = - $this->getAllowedPermissions($userType) | $permissions; - return $this; - } - - /** - * @param string $userType - * @param int $permission - * @return self - */ - public function addPermission($userType, $permission) { - return $this->setPermissions($userType, - $this->getPermissions($userType) | $permission - ); - } - - /** - * @param string $userType - * @param int $permission - * @return self - */ - public function removePermission($userType, $permission) { - return $this->setPermissions($userType, - $this->getPermissions($userType) & ~$permission - ); - } - - /** - * @param string $userType - * @return int - */ - public function getAllowedPermissions($userType) { - if (isset($this->allowedPermissions[$userType])) { - return $this->allowedPermissions[$userType]; - } - return BackendService::PERMISSION_NONE; - } - - /** - * Check if the user type has an allowed permission - * - * @param string $userType - * @param int $permission - * @return bool - */ - public function isAllowedPermitted($userType, $permission) { - if ($this->getAllowedPermissions($userType) & $permission) { - return true; - } - return false; - } - - /** - * @param string $userType - * @param int $permissions - * @return self - */ - public function setAllowedPermissions($userType, $permissions) { - $this->allowedPermissions[$userType] = $permissions; - $this->permissions[$userType] = - $this->getPermissions($userType) & $permissions; - return $this; - } - - /** - * @param string $userType - * @param int $permission - * @return self - */ - public function addAllowedPermission($userType, $permission) { - return $this->setAllowedPermissions($userType, - $this->getAllowedPermissions($userType) | $permission - ); - } - - /** - * @param string $userType - * @param int $permission - * @return self - */ - public function removeAllowedPermission($userType, $permission) { - return $this->setAllowedPermissions($userType, - $this->getAllowedPermissions($userType) & ~$permission - ); - } - -} diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php index d177f1a1ad0..26f68ba32db 100644 --- a/apps/files_external/lib/personalmount.php +++ b/apps/files_external/lib/personalmount.php @@ -2,6 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/sessionstoragewrapper.php b/apps/files_external/lib/sessionstoragewrapper.php index f8f5aba53a2..e45589c4472 100644 --- a/apps/files_external/lib/sessionstoragewrapper.php +++ b/apps/files_external/lib/sessionstoragewrapper.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php index 921e7283c66..5dcc7686ca3 100644 --- a/apps/files_external/lib/sftp.php +++ b/apps/files_external/lib/sftp.php @@ -7,6 +7,7 @@ * @author Lennart Rosam <lennart.rosam@medien-systempartner.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Ross Nicoll <jrn@jrn.me.uk> * @author SA <stephen@mthosting.net> diff --git a/apps/files_external/lib/storageconfig.php b/apps/files_external/lib/storageconfig.php index aeb8f527078..70aaa186783 100644 --- a/apps/files_external/lib/storageconfig.php +++ b/apps/files_external/lib/storageconfig.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_external/lib/storagemodifiertrait.php b/apps/files_external/lib/storagemodifiertrait.php index 3af0bb234d9..6d31ce8999a 100644 --- a/apps/files_external/lib/storagemodifiertrait.php +++ b/apps/files_external/lib/storagemodifiertrait.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php index 6f93f3c84cd..b9454b8d671 100644 --- a/apps/files_external/lib/swift.php +++ b/apps/files_external/lib/swift.php @@ -5,6 +5,7 @@ * @author Christian Berendt <berendt@b1-systems.de> * @author Felix Moeller <mail@felixmoeller.de> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Morris Jobke <hey@morrisjobke.de> * @author Philipp Kapfer <philipp.kapfer@gmx.at> * @author Robin Appelman <icewind@owncloud.com> @@ -175,7 +176,7 @@ class Swift extends \OC\Files\Storage\Common { $dh = $this->opendir($path); while ($file = readdir($dh)) { - if ($file === '.' || $file === '..') { + if (\OC\Files\Filesystem::isIgnoredDir($file)) { continue; } @@ -429,7 +430,7 @@ class Swift extends \OC\Files\Storage\Common { $dh = $this->opendir($path1); while ($file = readdir($dh)) { - if ($file === '.' || $file === '..') { + if (\OC\Files\Filesystem::isIgnoredDir($file)) { continue; } diff --git a/apps/files_external/lib/visibilitytrait.php b/apps/files_external/lib/visibilitytrait.php new file mode 100644 index 00000000000..dfd2d323ca6 --- /dev/null +++ b/apps/files_external/lib/visibilitytrait.php @@ -0,0 +1,136 @@ +<?php +/** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_External\Lib; + +use \OCA\Files_External\Service\BackendService; + +/** + * Trait to implement visibility mechanics for a configuration class + * + * The standard visibility defines which users/groups can use or see the + * object. The allowed visibility defines the maximum visibility allowed to be + * set on the object. The standard visibility is often set dynamically by + * stored configuration parameters that can be modified by the administrator, + * while the allowed visibility is set directly by the object and cannot be + * modified by the administrator. + */ +trait VisibilityTrait { + + /** @var int visibility */ + protected $visibility = BackendService::VISIBILITY_DEFAULT; + + /** @var int allowed visibilities */ + protected $allowedVisibility = BackendService::VISIBILITY_DEFAULT; + + /** + * @return int + */ + public function getVisibility() { + return $this->visibility; + } + + /** + * Check if the backend is visible for a user type + * + * @param int $visibility + * @return bool + */ + public function isVisibleFor($visibility) { + if ($this->visibility & $visibility) { + return true; + } + return false; + } + + /** + * @param int $visibility + * @return self + */ + public function setVisibility($visibility) { + $this->visibility = $visibility; + $this->allowedVisibility |= $visibility; + return $this; + } + + /** + * @param int $visibility + * @return self + */ + public function addVisibility($visibility) { + return $this->setVisibility($this->visibility | $visibility); + } + + /** + * @param int $visibility + * @return self + */ + public function removeVisibility($visibility) { + return $this->setVisibility($this->visibility & ~$visibility); + } + + /** + * @return int + */ + public function getAllowedVisibility() { + return $this->allowedVisibility; + } + + /** + * Check if the backend is allowed to be visible for a user type + * + * @param int $allowedVisibility + * @return bool + */ + public function isAllowedVisibleFor($allowedVisibility) { + if ($this->allowedVisibility & $allowedVisibility) { + return true; + } + return false; + } + + /** + * @param int $allowedVisibility + * @return self + */ + public function setAllowedVisibility($allowedVisibility) { + $this->allowedVisibility = $allowedVisibility; + $this->visibility &= $allowedVisibility; + return $this; + } + + /** + * @param int $allowedVisibility + * @return self + */ + public function addAllowedVisibility($allowedVisibility) { + return $this->setAllowedVisibility($this->allowedVisibility | $allowedVisibility); + } + + /** + * @param int $allowedVisibility + * @return self + */ + public function removeAllowedVisibility($allowedVisibility) { + return $this->setAllowedVisibility($this->allowedVisibility & ~$allowedVisibility); + } + +} diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php index d47f983b357..df15c3bd258 100644 --- a/apps/files_external/personal.php +++ b/apps/files_external/personal.php @@ -5,6 +5,7 @@ * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -35,10 +36,10 @@ OCP\Util::addScript('files_external', 'settings'); OCP\Util::addStyle('files_external', 'settings'); $backends = array_filter($backendService->getAvailableBackends(), function($backend) { - return $backend->isPermitted(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE); + return $backend->isVisibleFor(BackendService::VISIBILITY_PERSONAL); }); $authMechanisms = array_filter($backendService->getAuthMechanisms(), function($authMechanism) { - return $authMechanism->isPermitted(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE); + return $authMechanism->isVisibleFor(BackendService::VISIBILITY_PERSONAL); }); foreach ($backends as $backend) { if ($backend->getCustomJs()) { @@ -54,7 +55,7 @@ foreach ($authMechanisms as $authMechanism) { $tmpl = new OCP\Template('files_external', 'settings'); $tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled()); $tmpl->assign('isAdminPage', false); -$tmpl->assign('storages', $userStoragesService->getAllStorages()); +$tmpl->assign('storages', $userStoragesService->getStorages()); $tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends())); $tmpl->assign('backends', $backends); $tmpl->assign('authMechanisms', $authMechanisms); diff --git a/apps/files_external/service/backendservice.php b/apps/files_external/service/backendservice.php index 70cb9291660..1e90247b3e4 100644 --- a/apps/files_external/service/backendservice.php +++ b/apps/files_external/service/backendservice.php @@ -31,17 +31,13 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism; */ class BackendService { - /** Permission constants for PermissionsTrait */ - const PERMISSION_NONE = 0; - const PERMISSION_MOUNT = 1; - const PERMISSION_CREATE = 2; - const PERMISSION_MODIFY = 4; + /** Visibility constants for VisibilityTrait */ + const VISIBILITY_NONE = 0; + const VISIBILITY_PERSONAL = 1; + const VISIBILITY_ADMIN = 2; + //const VISIBILITY_ALIENS = 4; - const PERMISSION_DEFAULT = 7; // MOUNT | CREATE | MODIFY - - /** User contants */ - const USER_ADMIN = 'admin'; - const USER_PERSONAL = 'personal'; + const VISIBILITY_DEFAULT = 3; // PERSONAL | ADMIN /** Priority constants for PriorityTrait */ const PRIORITY_DEFAULT = 100; @@ -85,7 +81,7 @@ class BackendService { */ public function registerBackend(Backend $backend) { if (!$this->isAllowedUserBackend($backend)) { - $backend->removePermission(self::USER_PERSONAL, self::PERMISSION_CREATE | self::PERMISSION_MOUNT); + $backend->removeVisibility(BackendService::VISIBILITY_PERSONAL); } foreach ($backend->getIdentifierAliases() as $alias) { $this->backends[$alias] = $backend; @@ -107,7 +103,7 @@ class BackendService { */ public function registerAuthMechanism(AuthMechanism $authMech) { if (!$this->isAllowedAuthMechanism($authMech)) { - $authMech->removePermission(self::USER_PERSONAL, self::PERMISSION_CREATE | self::PERMISSION_MOUNT); + $authMech->removeVisibility(BackendService::VISIBILITY_PERSONAL); } foreach ($authMech->getIdentifierAliases() as $alias) { $this->authMechanisms[$alias] = $authMech; diff --git a/apps/files_external/service/globalstoragesservice.php b/apps/files_external/service/globalstoragesservice.php index 0e2d3f2b9c1..ec9b8e782fa 100644 --- a/apps/files_external/service/globalstoragesservice.php +++ b/apps/files_external/service/globalstoragesservice.php @@ -1,7 +1,7 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -210,4 +210,13 @@ class GlobalStoragesService extends StoragesService { ); } } + + /** + * Get the visibility type for this controller, used in validation + * + * @return string BackendService::VISIBILITY_* constants + */ + public function getVisibilityType() { + return BackendService::VISIBILITY_ADMIN; + } } diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php index 703f277d84e..41bb0ca9b80 100644 --- a/apps/files_external/service/storagesservice.php +++ b/apps/files_external/service/storagesservice.php @@ -1,7 +1,7 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -29,6 +29,8 @@ use \OC\Files\Filesystem; use \OCA\Files_external\Lib\StorageConfig; use \OCA\Files_external\NotFoundException; use \OCA\Files_External\Service\BackendService; +use \OCA\Files_External\Lib\Backend\Backend; +use \OCA\Files_External\Lib\Auth\AuthMechanism; /** * Service class to manage external storages @@ -331,7 +333,7 @@ abstract class StoragesService { } /** - * Gets all storages + * Gets all storages, valid or not * * @return array array of storage configs */ @@ -340,6 +342,47 @@ abstract class StoragesService { } /** + * Gets all valid storages + * + * @return array + */ + public function getStorages() { + return array_filter($this->getAllStorages(), [$this, 'validateStorage']); + } + + /** + * Validate storage + * FIXME: De-duplicate with StoragesController::validate() + * + * @param StorageConfig $storage + * @return bool + */ + protected function validateStorage(StorageConfig $storage) { + /** @var Backend */ + $backend = $storage->getBackend(); + /** @var AuthMechanism */ + $authMechanism = $storage->getAuthMechanism(); + + if (!$backend->isVisibleFor($this->getVisibilityType())) { + // not permitted to use backend + return false; + } + if (!$authMechanism->isVisibleFor($this->getVisibilityType())) { + // not permitted to use auth mechanism + return false; + } + + return true; + } + + /** + * Get the visibility type for this controller, used in validation + * + * @return string BackendService::VISIBILITY_* constants + */ + abstract public function getVisibilityType(); + + /** * Add new storage to the configuration * * @param array $newStorage storage attributes @@ -507,6 +550,21 @@ abstract class StoragesService { $this->writeConfig($allStorages); $this->triggerHooks($deletedStorage, Filesystem::signal_delete_mount); + + // delete oc_storages entries and oc_filecache + try { + $rustyStorageId = $this->getRustyStorageIdFromConfig($deletedStorage); + \OC\Files\Cache\Storage::remove($rustyStorageId); + } catch (\Exception $e) { + // can happen either for invalid configs where the storage could not + // be instantiated or whenever $user vars where used, in which case + // the storage id could not be computed + \OCP\Util::writeLog( + 'files_external', + 'Exception: "' . $e->getMessage() . '"', + \OCP\Util::ERROR + ); + } } /** @@ -527,4 +585,30 @@ abstract class StoragesService { return (max(array_keys($allStorages)) + 1); } + /** + * Returns the rusty storage id from oc_storages from the given storage config. + * + * @param StorageConfig $storageConfig + * @return string rusty storage id + */ + private function getRustyStorageIdFromConfig(StorageConfig $storageConfig) { + // if any of the storage options contains $user, it is not possible + // to compute the possible storage id as we don't know which users + // mounted it already (and we certainly don't want to iterate over ALL users) + foreach ($storageConfig->getBackendOptions() as $value) { + if (strpos($value, '$user') !== false) { + throw new \Exception('Cannot compute storage id for deletion due to $user vars in the configuration'); + } + } + + // note: similar to ConfigAdapter->prepateStorageConfig() + $storageConfig->getAuthMechanism()->manipulateStorageConfig($storageConfig); + $storageConfig->getBackend()->manipulateStorageConfig($storageConfig); + + $class = $storageConfig->getBackend()->getStorageClass(); + $storageImpl = new $class($storageConfig->getBackendOptions()); + + return $storageImpl->getId(); + } + } diff --git a/apps/files_external/service/userglobalstoragesservice.php b/apps/files_external/service/userglobalstoragesservice.php index b60473f131e..afe77e1e059 100644 --- a/apps/files_external/service/userglobalstoragesservice.php +++ b/apps/files_external/service/userglobalstoragesservice.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -117,7 +117,7 @@ class UserGlobalStoragesService extends GlobalStoragesService { * @return StorageConfig[] */ public function getUniqueStorages() { - $storages = $this->getAllStorages(); + $storages = $this->getStorages(); $storagesByMountpoint = []; foreach ($storages as $storage) { diff --git a/apps/files_external/service/userstoragesservice.php b/apps/files_external/service/userstoragesservice.php index c69b8d4f51e..a8cdf60ad9c 100644 --- a/apps/files_external/service/userstoragesservice.php +++ b/apps/files_external/service/userstoragesservice.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -171,4 +172,13 @@ class UserStoragesService extends StoragesService { $this->triggerHooks($newStorage, Filesystem::signal_create_mount); } } + + /** + * Get the visibility type for this controller, used in validation + * + * @return string BackendService::VISIBILITY_* constants + */ + public function getVisibilityType() { + return BackendService::VISIBILITY_PERSONAL; + } } diff --git a/apps/files_external/service/usertrait.php b/apps/files_external/service/usertrait.php index 4f84543565c..924f358f939 100644 --- a/apps/files_external/service/usertrait.php +++ b/apps/files_external/service/usertrait.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php index 840f1325fb5..03ed363bdb2 100644 --- a/apps/files_external/settings.php +++ b/apps/files_external/settings.php @@ -7,7 +7,7 @@ * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Vincent Petry <pvince81@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -42,10 +42,10 @@ OCP\Util::addStyle('files_external', 'settings'); \OC_Util::addVendorStyle('select2/select2'); $backends = array_filter($backendService->getAvailableBackends(), function($backend) { - return $backend->isPermitted(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE); + return $backend->isVisibleFor(BackendService::VISIBILITY_ADMIN); }); $authMechanisms = array_filter($backendService->getAuthMechanisms(), function($authMechanism) { - return $authMechanism->isPermitted(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE); + return $authMechanism->isVisibleFor(BackendService::VISIBILITY_ADMIN); }); foreach ($backends as $backend) { if ($backend->getCustomJs()) { @@ -59,15 +59,13 @@ foreach ($authMechanisms as $authMechanism) { } $userBackends = array_filter($backendService->getAvailableBackends(), function($backend) { - return $backend->isAllowedPermitted( - BackendService::USER_PERSONAL, BackendService::PERMISSION_MOUNT - ); + return $backend->isAllowedVisibleFor(BackendService::VISIBILITY_PERSONAL); }); $tmpl = new OCP\Template('files_external', 'settings'); $tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled()); $tmpl->assign('isAdminPage', true); -$tmpl->assign('storages', $globalStoragesService->getAllStorages()); +$tmpl->assign('storages', $globalStoragesService->getStorages()); $tmpl->assign('backends', $backends); $tmpl->assign('authMechanisms', $authMechanisms); $tmpl->assign('userBackends', $userBackends); diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index 7762ff60333..cac73cb87ee 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -26,7 +26,7 @@ <?php $checkboxId = uniqid("checkbox_"); ?> <input type="checkbox" id="<?php p($checkboxId); ?>" - <?php if (!empty($classes)): ?> class="<?php p(implode(' ', $classes)); ?>"<?php endif; ?> + <?php if (!empty($classes)): ?> class="checkbox <?php p(implode(' ', $classes)); ?>"<?php endif; ?> data-parameter="<?php p($parameter->getName()); ?>" <?php if ($value === true): ?> checked="checked"<?php endif; ?> /> @@ -157,6 +157,7 @@ }); ?> <?php foreach ($sortedBackends as $backend): ?> + <?php if ($backend->getDeprecateTo()) continue; // ignore deprecated backends ?> <option value="<?php p($backend->getIdentifier()); ?>"><?php p($backend->getText()); ?></option> <?php endforeach; ?> </select> @@ -190,15 +191,19 @@ <?php if ($_['isAdminPage']): ?> <br /> - <input type="checkbox" name="allowUserMounting" id="allowUserMounting" + <input type="checkbox" name="allowUserMounting" id="allowUserMounting" class="checkbox" value="1" <?php if ($_['allowUserMounting'] == 'yes') print_unescaped(' checked="checked"'); ?> /> - <label for="allowUserMounting"><?php p($l->t('Enable User External Storage')); ?></label> <span id="userMountingMsg" class="msg"></span> + <label for="allowUserMounting"><?php p($l->t('Allow users to mount external storages')); ?></label> <span id="userMountingMsg" class="msg"></span> <p id="userMountingBackends"<?php if ($_['allowUserMounting'] != 'yes'): ?> class="hidden"<?php endif; ?>> <?php p($l->t('Allow users to mount the following external storage')); ?><br /> <?php $i = 0; foreach ($_['userBackends'] as $backend): ?> - <input type="checkbox" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" <?php if ($backend->isPermitted(BackendService::USER_PERSONAL, BackendService::PERMISSION_MOUNT)) print_unescaped(' checked="checked"'); ?> /> - <label for="allowUserMountingBackends<?php p($i); ?>"><?php p($backend->getText()); ?></label> <br /> + <?php if ($deprecateTo = $backend->getDeprecateTo()): ?> + <input type="hidden" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" data-deprecate-to="<?php p($deprecateTo->getIdentifier()); ?>" /> + <?php else: ?> + <input type="checkbox" id="allowUserMountingBackends<?php p($i); ?>" class="checkbox" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" <?php if ($backend->isVisibleFor(BackendService::VISIBILITY_PERSONAL)) print_unescaped(' checked="checked"'); ?> /> + <label for="allowUserMountingBackends<?php p($i); ?>"><?php p($backend->getText()); ?></label> <br /> + <?php endif; ?> <?php $i++; ?> <?php endforeach; ?> </p> diff --git a/apps/files_external/tests/auth/authmechanismtest.php b/apps/files_external/tests/auth/authmechanismtest.php index b09d65a02df..6933cc988b1 100644 --- a/apps/files_external/tests/auth/authmechanismtest.php +++ b/apps/files_external/tests/auth/authmechanismtest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/backend/backendtest.php b/apps/files_external/tests/backend/backendtest.php index 4956a923e94..9e0e27c824b 100644 --- a/apps/files_external/tests/backend/backendtest.php +++ b/apps/files_external/tests/backend/backendtest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/backend/legacybackendtest.php b/apps/files_external/tests/backend/legacybackendtest.php index d57810de29b..6c977522e9e 100644 --- a/apps/files_external/tests/backend/legacybackendtest.php +++ b/apps/files_external/tests/backend/legacybackendtest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/backends/amazons3.php b/apps/files_external/tests/backends/amazons3.php index 7e88f3d0b74..c16581a4495 100644 --- a/apps/files_external/tests/backends/amazons3.php +++ b/apps/files_external/tests/backends/amazons3.php @@ -1,10 +1,10 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/backends/sftp_key.php b/apps/files_external/tests/backends/sftp_key.php index c83d12251aa..6e8ac9f7239 100644 --- a/apps/files_external/tests/backends/sftp_key.php +++ b/apps/files_external/tests/backends/sftp_key.php @@ -2,6 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Ross Nicoll <jrn@jrn.me.uk> + * @author Viktor Szépe <viktor@szepe.net> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/controller/globalstoragescontrollertest.php b/apps/files_external/tests/controller/globalstoragescontrollertest.php index e1bfad8caf6..37b5fed1481 100644 --- a/apps/files_external/tests/controller/globalstoragescontrollertest.php +++ b/apps/files_external/tests/controller/globalstoragescontrollertest.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -24,6 +25,7 @@ use \OCA\Files_external\Controller\GlobalStoragesController; use \OCA\Files_external\Service\GlobalStoragesService; use \OCP\AppFramework\Http; use \OCA\Files_external\NotFoundException; +use \OCA\Files_External\Service\BackendService; class GlobalStoragesControllerTest extends StoragesControllerTest { public function setUp() { @@ -32,6 +34,9 @@ class GlobalStoragesControllerTest extends StoragesControllerTest { ->disableOriginalConstructor() ->getMock(); + $this->service->method('getVisibilityType') + ->willReturn(BackendService::VISIBILITY_ADMIN); + $this->controller = new GlobalStoragesController( 'files_external', $this->getMock('\OCP\IRequest'), diff --git a/apps/files_external/tests/controller/storagescontrollertest.php b/apps/files_external/tests/controller/storagescontrollertest.php index c43761f3bcb..8a7acf81009 100644 --- a/apps/files_external/tests/controller/storagescontrollertest.php +++ b/apps/files_external/tests/controller/storagescontrollertest.php @@ -1,7 +1,7 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> - * @author Robin McCorkell <rmccorkell@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -75,12 +75,12 @@ abstract class StoragesControllerTest extends \Test\TestCase { $authMech = $this->getAuthMechMock(); $authMech->method('validateStorage') ->willReturn(true); - $authMech->method('isPermitted') + $authMech->method('isVisibleFor') ->willReturn(true); $backend = $this->getBackendMock(); $backend->method('validateStorage') ->willReturn(true); - $backend->method('isPermitted') + $backend->method('isVisibleFor') ->willReturn(true); $storageConfig = new StorageConfig(1); @@ -116,12 +116,12 @@ abstract class StoragesControllerTest extends \Test\TestCase { $authMech = $this->getAuthMechMock(); $authMech->method('validateStorage') ->willReturn(true); - $authMech->method('isPermitted') + $authMech->method('isVisibleFor') ->willReturn(true); $backend = $this->getBackendMock(); $backend->method('validateStorage') ->willReturn(true); - $backend->method('isPermitted') + $backend->method('isVisibleFor') ->willReturn(true); $storageConfig = new StorageConfig(1); @@ -249,12 +249,12 @@ abstract class StoragesControllerTest extends \Test\TestCase { $authMech = $this->getAuthMechMock(); $authMech->method('validateStorage') ->willReturn(true); - $authMech->method('isPermitted') + $authMech->method('isVisibleFor') ->willReturn(true); $backend = $this->getBackendMock(); $backend->method('validateStorage') ->willReturn(true); - $backend->method('isPermitted') + $backend->method('isVisibleFor') ->willReturn(true); $storageConfig = new StorageConfig(255); @@ -338,13 +338,13 @@ abstract class StoragesControllerTest extends \Test\TestCase { $backend = $this->getBackendMock(); $backend->method('validateStorage') ->willReturn($backendValidate); - $backend->method('isPermitted') + $backend->method('isVisibleFor') ->willReturn(true); $authMech = $this->getAuthMechMock(); $authMech->method('validateStorage') ->will($this->returnValue($authMechValidate)); - $authMech->method('isPermitted') + $authMech->method('isVisibleFor') ->willReturn(true); $storageConfig = new StorageConfig(); diff --git a/apps/files_external/tests/controller/userstoragescontrollertest.php b/apps/files_external/tests/controller/userstoragescontrollertest.php index b61174b0797..acb25d11d09 100644 --- a/apps/files_external/tests/controller/userstoragescontrollertest.php +++ b/apps/files_external/tests/controller/userstoragescontrollertest.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -40,6 +41,9 @@ class UserStoragesControllerTest extends StoragesControllerTest { ->disableOriginalConstructor() ->getMock(); + $this->service->method('getVisibilityType') + ->willReturn(BackendService::VISIBILITY_PERSONAL); + $this->controller = new UserStoragesController( 'files_external', $this->getMock('\OCP\IRequest'), @@ -49,21 +53,15 @@ class UserStoragesControllerTest extends StoragesControllerTest { } public function testAddOrUpdateStorageDisallowedBackend() { - $backend1 = $this->getBackendMock(); - $backend1->expects($this->once()) - ->method('isPermitted') - ->with(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE) - ->willReturn(false); - $backend2 = $this->getBackendMock(); - $backend2->expects($this->once()) - ->method('isPermitted') - ->with(BackendService::USER_PERSONAL, BackendService::PERMISSION_MODIFY) + $backend = $this->getBackendMock(); + $backend->method('isVisibleFor') + ->with(BackendService::VISIBILITY_PERSONAL) ->willReturn(false); $authMech = $this->getAuthMechMock(); $storageConfig = new StorageConfig(1); $storageConfig->setMountPoint('mount'); - $storageConfig->setBackend($backend1); + $storageConfig->setBackend($backend); $storageConfig->setAuthMechanism($authMech); $storageConfig->setBackendOptions([]); @@ -88,8 +86,6 @@ class UserStoragesControllerTest extends StoragesControllerTest { $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); - $storageConfig->setBackend($backend2); - $response = $this->controller->update( 1, 'mount', diff --git a/apps/files_external/tests/definitionparameterttest.php b/apps/files_external/tests/definitionparameterttest.php index 22e0b842254..3983a805dad 100644 --- a/apps/files_external/tests/definitionparameterttest.php +++ b/apps/files_external/tests/definitionparameterttest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/env/start-amazons3-ceph.sh b/apps/files_external/tests/env/start-amazons3-ceph.sh index 5f274f10ca2..ad0fedba989 100755 --- a/apps/files_external/tests/env/start-amazons3-ceph.sh +++ b/apps/files_external/tests/env/start-amazons3-ceph.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/start-ftp-morrisjobke.sh b/apps/files_external/tests/env/start-ftp-morrisjobke.sh index a082e6195fb..14112d7f803 100755 --- a/apps/files_external/tests/env/start-ftp-morrisjobke.sh +++ b/apps/files_external/tests/env/start-ftp-morrisjobke.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/start-sftp-atmoz.sh b/apps/files_external/tests/env/start-sftp-atmoz.sh index 04b829add59..91eb5747c54 100755 --- a/apps/files_external/tests/env/start-sftp-atmoz.sh +++ b/apps/files_external/tests/env/start-sftp-atmoz.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/start-smb-silvershell.sh b/apps/files_external/tests/env/start-smb-silvershell.sh index afada44d4f7..c45807cc4c8 100755 --- a/apps/files_external/tests/env/start-smb-silvershell.sh +++ b/apps/files_external/tests/env/start-smb-silvershell.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/start-smb-windows.sh b/apps/files_external/tests/env/start-smb-windows.sh index a5a19ff1bcf..2143d7e7499 100755 --- a/apps/files_external/tests/env/start-smb-windows.sh +++ b/apps/files_external/tests/env/start-smb-windows.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/start-webdav-ownCloud.sh b/apps/files_external/tests/env/start-webdav-ownCloud.sh index d6b36c8d90c..6bf9142ee53 100755 --- a/apps/files_external/tests/env/start-webdav-ownCloud.sh +++ b/apps/files_external/tests/env/start-webdav-ownCloud.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/stop-amazons3-ceph.sh b/apps/files_external/tests/env/stop-amazons3-ceph.sh index 01b39b4c680..3f56a6f1e5d 100755 --- a/apps/files_external/tests/env/stop-amazons3-ceph.sh +++ b/apps/files_external/tests/env/stop-amazons3-ceph.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/stop-ftp-morrisjobke.sh b/apps/files_external/tests/env/stop-ftp-morrisjobke.sh index 899b9a53971..e30ec2e594a 100755 --- a/apps/files_external/tests/env/stop-ftp-morrisjobke.sh +++ b/apps/files_external/tests/env/stop-ftp-morrisjobke.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/stop-sftp-atmoz.sh b/apps/files_external/tests/env/stop-sftp-atmoz.sh index 64570cfd68d..0c2fd0b5bc6 100755 --- a/apps/files_external/tests/env/stop-sftp-atmoz.sh +++ b/apps/files_external/tests/env/stop-sftp-atmoz.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/stop-smb-silvershell.sh b/apps/files_external/tests/env/stop-smb-silvershell.sh index aae954284e9..40147b89106 100755 --- a/apps/files_external/tests/env/stop-smb-silvershell.sh +++ b/apps/files_external/tests/env/stop-smb-silvershell.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/stop-smb-windows.sh b/apps/files_external/tests/env/stop-smb-windows.sh index 4f89451ce11..39c49e2c505 100755 --- a/apps/files_external/tests/env/stop-smb-windows.sh +++ b/apps/files_external/tests/env/stop-smb-windows.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/env/stop-webdav-ownCloud.sh b/apps/files_external/tests/env/stop-webdav-ownCloud.sh index c87760a1052..8eaf1ba754f 100755 --- a/apps/files_external/tests/env/stop-webdav-ownCloud.sh +++ b/apps/files_external/tests/env/stop-webdav-ownCloud.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/apps/files_external/tests/frontenddefinitiontraittest.php b/apps/files_external/tests/frontenddefinitiontraittest.php index d92d02b9854..d446813fe92 100644 --- a/apps/files_external/tests/frontenddefinitiontraittest.php +++ b/apps/files_external/tests/frontenddefinitiontraittest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/legacydependencycheckpolyfilltest.php b/apps/files_external/tests/legacydependencycheckpolyfilltest.php index 49d825d77aa..41109b63c1e 100644 --- a/apps/files_external/tests/legacydependencycheckpolyfilltest.php +++ b/apps/files_external/tests/legacydependencycheckpolyfilltest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_external/tests/service/backendservicetest.php b/apps/files_external/tests/service/backendservicetest.php index b37b5e9b466..5097b479a5f 100644 --- a/apps/files_external/tests/service/backendservicetest.php +++ b/apps/files_external/tests/service/backendservicetest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -83,11 +83,11 @@ class BackendServiceTest extends \Test\TestCase { $backendAllowed = $this->getBackendMock('\User\Mount\Allowed'); $backendAllowed->expects($this->never()) - ->method('removePermission'); + ->method('removeVisibility'); $backendNotAllowed = $this->getBackendMock('\User\Mount\NotAllowed'); $backendNotAllowed->expects($this->once()) - ->method('removePermission') - ->with(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE | BackendService::PERMISSION_MOUNT); + ->method('removeVisibility') + ->with(BackendService::VISIBILITY_PERSONAL); $backendAlias = $this->getMockBuilder('\OCA\Files_External\Lib\Backend\Backend') ->disableOriginalConstructor() diff --git a/apps/files_external/tests/service/globalstoragesservicetest.php b/apps/files_external/tests/service/globalstoragesservicetest.php index 94c34c221fc..c129365913f 100644 --- a/apps/files_external/tests/service/globalstoragesservicetest.php +++ b/apps/files_external/tests/service/globalstoragesservicetest.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_external/tests/service/storagesservicetest.php b/apps/files_external/tests/service/storagesservicetest.php index 28220c9bc2e..7487ba459af 100644 --- a/apps/files_external/tests/service/storagesservicetest.php +++ b/apps/files_external/tests/service/storagesservicetest.php @@ -1,7 +1,7 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> - * @author Robin McCorkell <rmccorkell@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -216,18 +216,57 @@ abstract class StoragesServiceTest extends \Test\TestCase { $this->service->updateStorage($storage); } - public function testDeleteStorage() { + public function deleteStorageDataProvider() { + return [ + // regular case, can properly delete the oc_storages entry + [ + [ + 'share' => 'share', + 'host' => 'example.com', + 'user' => 'test', + 'password' => 'testPassword', + 'root' => 'someroot', + ], + 'smb::test@example.com//share//someroot/', + 0 + ], + // special case with $user vars, cannot auto-remove the oc_storages entry + [ + [ + 'share' => 'share', + 'host' => 'example.com', + 'user' => '$user', + 'password' => 'testPassword', + 'root' => 'someroot', + ], + 'smb::someone@example.com//share//someroot/', + 1 + ], + ]; + } + + /** + * @dataProvider deleteStorageDataProvider + */ + public function testDeleteStorage($backendOptions, $rustyStorageId, $expectedCountAfterDeletion) { $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB'); $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism'); $storage = new StorageConfig(255); $storage->setMountPoint('mountpoint'); $storage->setBackend($backend); $storage->setAuthMechanism($authMechanism); - $storage->setBackendOptions(['password' => 'testPassword']); + $storage->setBackendOptions($backendOptions); $newStorage = $this->service->addStorage($storage); $this->assertEquals(1, $newStorage->getId()); + // manually trigger storage entry because normally it happens on first + // access, which isn't possible within this test + $storageCache = new \OC\Files\Cache\Storage($rustyStorageId); + + // get numeric id for later check + $numericId = $storageCache->getNumericId(); + $newStorage = $this->service->removeStorage(1); $caught = false; @@ -238,6 +277,13 @@ abstract class StoragesServiceTest extends \Test\TestCase { } $this->assertTrue($caught); + + // storage id was removed from oc_storages + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $storageCheckQuery = $qb->select('*') + ->from('storages') + ->where($qb->expr()->eq('numeric_id', $qb->expr()->literal($numericId))); + $this->assertCount($expectedCountAfterDeletion, $storageCheckQuery->execute()->fetchAll()); } /** @@ -305,6 +351,52 @@ abstract class StoragesServiceTest extends \Test\TestCase { ); } + public function testGetStoragesBackendNotVisible() { + $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB'); + $backend->expects($this->once()) + ->method('isVisibleFor') + ->with($this->service->getVisibilityType()) + ->willReturn(false); + $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism'); + $authMechanism->method('isVisibleFor') + ->with($this->service->getVisibilityType()) + ->willReturn(true); + + $storage = new StorageConfig(255); + $storage->setMountPoint('mountpoint'); + $storage->setBackend($backend); + $storage->setAuthMechanism($authMechanism); + $storage->setBackendOptions(['password' => 'testPassword']); + + $newStorage = $this->service->addStorage($storage); + + $this->assertCount(1, $this->service->getAllStorages()); + $this->assertEmpty($this->service->getStorages()); + } + + public function testGetStoragesAuthMechanismNotVisible() { + $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB'); + $backend->method('isVisibleFor') + ->with($this->service->getVisibilityType()) + ->willReturn(true); + $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism'); + $authMechanism->expects($this->once()) + ->method('isVisibleFor') + ->with($this->service->getVisibilityType()) + ->willReturn(false); + + $storage = new StorageConfig(255); + $storage->setMountPoint('mountpoint'); + $storage->setBackend($backend); + $storage->setAuthMechanism($authMechanism); + $storage->setBackendOptions(['password' => 'testPassword']); + + $newStorage = $this->service->addStorage($storage); + + $this->assertCount(1, $this->service->getAllStorages()); + $this->assertEmpty($this->service->getStorages()); + } + public static function createHookCallback($params) { self::$hookCalls[] = array( 'signal' => Filesystem::signal_create_mount, diff --git a/apps/files_external/tests/service/userglobalstoragesservicetest.php b/apps/files_external/tests/service/userglobalstoragesservicetest.php index 867872f3683..1b902b6eee5 100644 --- a/apps/files_external/tests/service/userglobalstoragesservicetest.php +++ b/apps/files_external/tests/service/userglobalstoragesservicetest.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -155,8 +155,9 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest { /** * @expectedException \DomainException + * @dataProvider deleteStorageDataProvider */ - public function testDeleteStorage() { + public function testDeleteStorage($backendOptions, $rustyStorageId, $expectedCountAfterDeletion) { $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB'); $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism'); @@ -164,7 +165,7 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest { $storage->setMountPoint('mountpoint'); $storage->setBackend($backend); $storage->setAuthMechanism($authMechanism); - $storage->setBackendOptions(['password' => 'testPassword']); + $storage->setBackendOptions($backendOptions); $newStorage = $this->globalStoragesService->addStorage($storage); $this->assertEquals(1, $newStorage->getId()); @@ -209,7 +210,11 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest { $expectedPrecedence ) { $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB'); + $backend->method('isVisibleFor') + ->willReturn(true); $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism'); + $authMechanism->method('isVisibleFor') + ->willReturn(true); $storage1 = new StorageConfig(); $storage1->setMountPoint('mountpoint'); @@ -243,6 +248,16 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest { } } + public function testGetStoragesBackendNotVisible() { + // we don't test this here + $this->assertTrue(true); + } + + public function testGetStoragesAuthMechanismNotVisible() { + // we don't test this here + $this->assertTrue(true); + } + public function testHooksAddStorage($a = null, $b = null, $c = null) { // we don't test this here $this->assertTrue(true); diff --git a/apps/files_external/tests/service/userstoragesservicetest.php b/apps/files_external/tests/service/userstoragesservicetest.php index 8bbfbe5a050..78f9231c3d1 100644 --- a/apps/files_external/tests/service/userstoragesservicetest.php +++ b/apps/files_external/tests/service/userstoragesservicetest.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -137,8 +138,11 @@ class UserStoragesServiceTest extends StoragesServiceTest { $this->assertEmpty(self::$hookCalls); } - public function testDeleteStorage() { - parent::testDeleteStorage(); + /** + * @dataProvider deleteStorageDataProvider + */ + public function testDeleteStorage($backendOptions, $rustyStorageId, $expectedCountAfterDeletion) { + parent::testDeleteStorage($backendOptions, $rustyStorageId, $expectedCountAfterDeletion); // hook called once for user (first one was during test creation) $this->assertHookCall( diff --git a/apps/files_external/tests/storageconfigtest.php b/apps/files_external/tests/storageconfigtest.php index dba5105d7db..c987f7a84e2 100644 --- a/apps/files_external/tests/storageconfigtest.php +++ b/apps/files_external/tests/storageconfigtest.php @@ -1,5 +1,6 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 66cfd8e9d1a..c80f0e0b288 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -1,9 +1,11 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_sharing/ajax/list.php b/apps/files_sharing/ajax/list.php index 9185e508e67..9819048b881 100644 --- a/apps/files_sharing/ajax/list.php +++ b/apps/files_sharing/ajax/list.php @@ -3,6 +3,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_sharing/ajax/publicpreview.php b/apps/files_sharing/ajax/publicpreview.php index 6ddd4786c2a..62157e0ac0e 100644 --- a/apps/files_sharing/ajax/publicpreview.php +++ b/apps/files_sharing/ajax/publicpreview.php @@ -4,6 +4,7 @@ * @author Georg Ehrke <georg@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -28,8 +29,8 @@ OCP\JSON::checkAppEnabled('files_sharing'); \OC_User::setIncognitoMode(true); $file = array_key_exists('file', $_GET) ? (string) $_GET['file'] : ''; -$maxX = array_key_exists('x', $_GET) ? (int) $_GET['x'] : '36'; -$maxY = array_key_exists('y', $_GET) ? (int) $_GET['y'] : '36'; +$maxX = array_key_exists('x', $_GET) ? (int) $_GET['x'] : '32'; +$maxY = array_key_exists('y', $_GET) ? (int) $_GET['y'] : '32'; $scalingUp = array_key_exists('scalingup', $_GET) ? (bool) $_GET['scalingup'] : true; $token = array_key_exists('t', $_GET) ? (string) $_GET['t'] : ''; $keepAspect = array_key_exists('a', $_GET) ? true : false; diff --git a/apps/files_sharing/api/local.php b/apps/files_sharing/api/local.php index 61b8b47d2d3..42e77570f95 100644 --- a/apps/files_sharing/api/local.php +++ b/apps/files_sharing/api/local.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> diff --git a/apps/files_sharing/api/remote.php b/apps/files_sharing/api/remote.php index 0f6d2dc265a..d67920c3521 100644 --- a/apps/files_sharing/api/remote.php +++ b/apps/files_sharing/api/remote.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -27,9 +28,9 @@ use OCA\Files_Sharing\External\Manager; class Remote { /** - * Accept a remote share + * Get list of pending remote shares * - * @param array $params contains the shareID 'id' which should be accepted + * @param array $params empty * @return \OC_OCS_Result */ public static function getOpenShares($params) { @@ -90,4 +91,101 @@ class Remote { return new \OC_OCS_Result(null, 404, "wrong share ID, share doesn't exist."); } + + /** + * @param array $share Share with info from the share_external table + * @return enriched share info with data from the filecache + */ + private static function extendShareInfo($share) { + $view = new \OC\Files\View('/' . \OC_User::getUser() . '/files/'); + $info = $view->getFileInfo($shares['mountpoint']); + + $share['mimetype'] = $info->getMimetype(); + $share['mtime'] = $info->getMtime(); + $share['permissions'] = $info->getPermissions(); + $share['type'] = $info->getType(); + $share['file_id'] = $info->getId(); + + return $share; + } + + /** + * List accepted remote shares + * + * @param array $params + * @return \OC_OCS_Result + */ + public static function getShares($params) { + $externalManager = new Manager( + \OC::$server->getDatabaseConnection(), + Filesystem::getMountManager(), + Filesystem::getLoader(), + \OC::$server->getHTTPHelper(), + \OC::$server->getNotificationManager(), + \OC_User::getUser() + ); + + $shares = $externalManager->getAcceptedShares(); + + $shares = array_map('self::extendShareInfo', $shares); + + return new \OC_OCS_Result($shares); + } + + /** + * Get info of a remote share + * + * @param array $params contains the shareID 'id' + * @return \OC_OCS_Result + */ + public static function getShare($params) { + $externalManager = new Manager( + \OC::$server->getDatabaseConnection(), + Filesystem::getMountManager(), + Filesystem::getLoader(), + \OC::$server->getHTTPHelper(), + \OC::$server->getNotificationManager(), + \OC_User::getUser() + ); + + $shareInfo = $externalManager->getShare($params['id']); + + if ($shareInfo === false) { + return new \OC_OCS_Result(null, 404, 'share does not exist'); + } else { + $shareInfo = self::extendShareInfo($shareInfo); + return new \OC_OCS_Result($shareInfo); + } + } + + /** + * Unshare a remote share + * + * @param array $params contains the shareID 'id' which should be unshared + * @return \OC_OCS_Result + */ + public static function unshare($params) { + $externalManager = new Manager( + \OC::$server->getDatabaseConnection(), + Filesystem::getMountManager(), + Filesystem::getLoader(), + \OC::$server->getHTTPHelper(), + \OC::$server->getNotificationManager(), + \OC_User::getUser() + ); + + $shareInfo = $externalManager->getShare($params['id']); + + if ($shareInfo === false) { + return new \OC_OCS_Result(null, 404, 'Share does not exist'); + } + + $mountPoint = '/' . \OC_User::getUser() . '/files' . $shareInfo['mountpoint']; + + if ($externalManager->removeShare($mountPoint) === true) { + return new \OC_OCS_Result(null); + } else { + return new \OC_OCS_Result(null, 403, 'Could not unshare'); + } + } } diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php index 7d8860ad6ff..2e0468039b4 100644 --- a/apps/files_sharing/api/server2server.php +++ b/apps/files_sharing/api/server2server.php @@ -1,6 +1,8 @@ <?php /** + * @author Arthur Schiwon <blizzz@owncloud.com> * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -51,6 +53,7 @@ class Server2Server { return new \OC_OCS_Result(null, 400, 'The mountpoint name contains invalid characters.'); } + // FIXME this should be a method in the user management instead \OCP\Util::writeLog('files_sharing', 'shareWith before, ' . $shareWith, \OCP\Util::DEBUG); \OCP\Util::emitHook( '\OCA\Files_Sharing\API\Server2Server', diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 9e324078dad..b34aef72163 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -62,6 +63,9 @@ class Sharees { /** @var bool */ protected $shareWithGroupOnly = false; + /** @var bool */ + protected $shareeEnumeration = true; + /** @var int */ protected $offset = 0; @@ -134,7 +138,7 @@ class Sharees { } } - if (sizeof($users) < $this->limit) { + if (!$this->shareeEnumeration || sizeof($users) < $this->limit) { $this->reachedEndFor[] = 'users'; } @@ -176,6 +180,10 @@ class Sharees { ]); } } + + if (!$this->shareeEnumeration) { + $this->result['users'] = []; + } } /** @@ -187,7 +195,7 @@ class Sharees { $groups = $this->groupManager->search($search, $this->limit, $this->offset); $groups = array_map(function (IGroup $group) { return $group->getGID(); }, $groups); - if (sizeof($groups) < $this->limit) { + if (!$this->shareeEnumeration || sizeof($groups) < $this->limit) { $this->reachedEndFor[] = 'groups'; } @@ -233,6 +241,10 @@ class Sharees { ]); } } + + if (!$this->shareeEnumeration) { + $this->result['groups'] = []; + } } /** @@ -273,6 +285,10 @@ class Sharees { } } + if (!$this->shareeEnumeration) { + $this->result['remotes'] = []; + } + if (!$foundRemoteById && substr_count($search, '@') >= 1 && substr_count($search, ' ') === 0 && $this->offset === 0) { $this->result['exact']['remotes'][] = [ 'label' => $search, @@ -322,6 +338,7 @@ class Sharees { } $this->shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; + $this->shareeEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes'; $this->limit = (int) $perPage; $this->offset = $perPage * ($page - 1); diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index 15c0b864b08..03e448be0af 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -1,5 +1,6 @@ <?php /** + * @author Arthur Schiwon <blizzz@owncloud.com> * @author Björn Schießle <schiessle@owncloud.com> * @author Gadzy <dev@gadzy.fr> * @author Joas Schilling <nickvergessen@owncloud.com> @@ -39,9 +40,6 @@ $l = \OC::$server->getL10N('files_sharing'); \OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php'; \OC::$CLASSPATH['OCA\Files\Share\Proxy'] = 'files_sharing/lib/proxy.php'; -// Exceptions -\OC::$CLASSPATH['OCA\Files_Sharing\Exceptions\BrokenPath'] = 'files_sharing/lib/exceptions.php'; - $application = new Application(); $application->registerMountProviders(); $application->setupPropagation(); @@ -70,7 +68,8 @@ $eventDispatcher->addListener( \OC::$server->getActivityManager()->registerExtension(function() { return new \OCA\Files_Sharing\Activity( \OC::$server->query('L10NFactory'), - \OC::$server->getURLGenerator() + \OC::$server->getURLGenerator(), + \OC::$server->getActivityManager() ); }); diff --git a/apps/files_sharing/appinfo/application.php b/apps/files_sharing/appinfo/application.php index d0dcadb77e8..9dc0e0618b5 100644 --- a/apps/files_sharing/appinfo/application.php +++ b/apps/files_sharing/appinfo/application.php @@ -1,6 +1,7 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> * @@ -26,6 +27,7 @@ namespace OCA\Files_Sharing\AppInfo; use OCA\Files_Sharing\Helper; use OCA\Files_Sharing\MountProvider; use OCA\Files_Sharing\Propagation\PropagationManager; +use OCA\Files_Sharing\Propagation\GroupPropagationManager; use OCP\AppFramework\App; use OC\AppFramework\Utility\SimpleContainer; use OCA\Files_Sharing\Controllers\ExternalSharesController; @@ -61,7 +63,6 @@ class Application extends App { return new ExternalSharesController( $c->query('AppName'), $c->query('Request'), - $c->query('IsIncomingShareEnabled'), $c->query('ExternalManager'), $c->query('HttpClientService') ); @@ -82,9 +83,6 @@ class Application extends App { $container->registerService('HttpClientService', function (SimpleContainer $c) use ($server) { return $server->getHTTPClientService(); }); - $container->registerService('IsIncomingShareEnabled', function (SimpleContainer $c) { - return Helper::isIncomingServer2serverShareEnabled(); - }); $container->registerService('ExternalManager', function (SimpleContainer $c) use ($server) { $user = $server->getUserSession()->getUser(); $uid = $user ? $user->getUID() : null; @@ -105,7 +103,8 @@ class Application extends App { return new SharingCheckMiddleware( $c->query('AppName'), $server->getConfig(), - $server->getAppManager() + $server->getAppManager(), + $c['ControllerMethodReflector'] ); }); @@ -121,6 +120,17 @@ class Application extends App { ); }); + $container->registerService('ExternalMountProvider', function (IContainer $c) { + /** @var \OCP\IServerContainer $server */ + $server = $c->query('ServerContainer'); + return new \OCA\Files_Sharing\External\MountProvider( + $server->getDatabaseConnection(), + function() use ($c) { + return $c->query('ExternalManager'); + } + ); + }); + $container->registerService('PropagationManager', function (IContainer $c) { /** @var \OCP\IServerContainer $server */ $server = $c->query('ServerContainer'); @@ -130,6 +140,16 @@ class Application extends App { ); }); + $container->registerService('GroupPropagationManager', function (IContainer $c) { + /** @var \OCP\IServerContainer $server */ + $server = $c->query('ServerContainer'); + return new GroupPropagationManager( + $server->getUserSession(), + $server->getGroupManager(), + $c->query('PropagationManager') + ); + }); + /* * Register capabilities */ @@ -141,10 +161,13 @@ class Application extends App { $server = $this->getContainer()->query('ServerContainer'); $mountProviderCollection = $server->getMountProviderCollection(); $mountProviderCollection->registerProvider($this->getContainer()->query('MountProvider')); + $mountProviderCollection->registerProvider($this->getContainer()->query('ExternalMountProvider')); } public function setupPropagation() { $propagationManager = $this->getContainer()->query('PropagationManager'); \OCP\Util::connectHook('OC_Filesystem', 'setup', $propagationManager, 'globalSetup'); + + $this->getContainer()->query('GroupPropagationManager')->globalSetup(); } } diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml index 28c64cbb1b4..72e56456961 100644 --- a/apps/files_sharing/appinfo/info.xml +++ b/apps/files_sharing/appinfo/info.xml @@ -9,14 +9,16 @@ Turning the feature off removes shared files and folders on the server for all s </description> <licence>AGPL</licence> <author>Michael Gapczynski, Bjoern Schiessle</author> - <requiremin>4.93</requiremin> <shipped>true</shipped> <default_enable/> + <version>0.8.1</version> <types> <filesystem/> </types> + <dependencies> + <owncloud min-version="9.0" /> + </dependencies> <public> <files>public.php</files> - <webdav>publicwebdav.php</webdav> </public> </info> diff --git a/apps/files_sharing/appinfo/install.php b/apps/files_sharing/appinfo/install.php index f076a17e444..607e990346a 100644 --- a/apps/files_sharing/appinfo/install.php +++ b/apps/files_sharing/appinfo/install.php @@ -20,3 +20,4 @@ */ \OC::$server->getJobList()->add('OCA\Files_sharing\Lib\DeleteOrphanedSharesJob'); +\OC::$server->getJobList()->add('OCA\Files_sharing\ExpireSharesJob'); diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 375124cb730..a466c4fc6cc 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -4,7 +4,6 @@ * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -89,19 +88,35 @@ API::register('delete', API::register('get', '/apps/files_sharing/api/v1/remote_shares', + array('\OCA\Files_Sharing\API\Remote', 'getShares'), + 'files_sharing'); + +API::register('get', + '/apps/files_sharing/api/v1/remote_shares/pending', array('\OCA\Files_Sharing\API\Remote', 'getOpenShares'), 'files_sharing'); API::register('post', - '/apps/files_sharing/api/v1/remote_shares/{id}', + '/apps/files_sharing/api/v1/remote_shares/pending/{id}', array('\OCA\Files_Sharing\API\Remote', 'acceptShare'), 'files_sharing'); API::register('delete', - '/apps/files_sharing/api/v1/remote_shares/{id}', + '/apps/files_sharing/api/v1/remote_shares/pending/{id}', array('\OCA\Files_Sharing\API\Remote', 'declineShare'), 'files_sharing'); +API::register('get', + '/apps/files_sharing/api/v1/remote_shares/{id}', + array('\OCA\Files_Sharing\API\Remote', 'getShare'), + 'files_sharing'); + +API::register('delete', + '/apps/files_sharing/api/v1/remote_shares/{id}', + array('\OCA\Files_Sharing\API\Remote', 'unshare'), + 'files_sharing'); + + $sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), \OC::$server->getUserManager(), \OC::$server->getContactsManager(), diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php index 66b8b78cacf..03fb78a05af 100644 --- a/apps/files_sharing/appinfo/update.php +++ b/apps/files_sharing/appinfo/update.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -29,3 +30,4 @@ if (version_compare($installedVersion, '0.6.0', '<')) { } \OC::$server->getJobList()->add('OCA\Files_sharing\Lib\DeleteOrphanedSharesJob'); +\OC::$server->getJobList()->add('OCA\Files_sharing\ExpireSharesJob'); diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version deleted file mode 100644 index 844f6a91acb..00000000000 --- a/apps/files_sharing/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.6.3 diff --git a/apps/files_sharing/css/authenticate.css b/apps/files_sharing/css/authenticate.css index ac76d4c6870..43707c76100 100644 --- a/apps/files_sharing/css/authenticate.css +++ b/apps/files_sharing/css/authenticate.css @@ -11,7 +11,8 @@ input[type='submit'] { #body-login input[type='submit'] { position: absolute; - top: 0px; + top: 0; + border: none; } fieldset > p { diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css index a5cf57d0ac5..bd8e98e966d 100644 --- a/apps/files_sharing/css/public.css +++ b/apps/files_sharing/css/public.css @@ -1,8 +1,12 @@ +#content { + height: initial; + min-height: calc(100vh - 120px); + overflow: hidden; +} + #preview { background: #fff; text-align: center; - margin: 45px auto 0; - min-height: 200px; } #preview .notCreatable { @@ -134,9 +138,19 @@ thead { margin: 2px 0 !important; } +#save-button-confirm:disabled, +#save-button-confirm:disabled:hover, +#save-button-confirm:disabled:focus { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"; + filter: alpha(opacity=20); + opacity: .2; + cursor: default; +} + #save-button-confirm:hover, #save-button-confirm:focus { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); opacity: 1; + cursor: pointer; } diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css index fe7a1947502..7597004e684 100644 --- a/apps/files_sharing/css/sharetabview.css +++ b/apps/files_sharing/css/sharetabview.css @@ -6,7 +6,6 @@ .shareTabView .shareWithLoading { padding-left: 10px; - position: relative; right: 30px; top: 2px; } @@ -73,5 +72,18 @@ } .shareTabView .icon-loading-small { - margin-left: -30px; + display: inline-block; + z-index: 1; + background-color: white; + padding: 2px 0; +} + +.shareTabView .shareWithList .icon-loading-small, +.shareTabView .linkShareView .icon-loading-small { + position: absolute; } + +.shareTabView .linkPass .icon-loading-small { + margin-top: 9px; +} + diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 1993efe7d73..246b639f652 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -54,7 +54,7 @@ OCA.Sharing.PublicApp = { $el, { id: 'files.public', - scrollContainer: $(window), + scrollContainer: $('#content-wrapper'), dragOptions: dragOptions, folderDropOptions: folderDropOptions, fileActions: fileActions, @@ -90,8 +90,8 @@ OCA.Sharing.PublicApp = { // dynamically load image previews var token = $('#sharingToken').val(); var bottomMargin = 350; - var previewWidth = Math.floor($(window).width() * window.devicePixelRatio); - var previewHeight = Math.floor(($(window).height() - bottomMargin) * window.devicePixelRatio); + var previewWidth = Math.ceil($(window).width() * window.devicePixelRatio); + var previewHeight = Math.ceil(($(window).height() - bottomMargin) * window.devicePixelRatio); previewHeight = Math.max(200, previewHeight); var params = { x: previewWidth, @@ -159,9 +159,18 @@ OCA.Sharing.PublicApp = { }; this.fileList.generatePreviewUrl = function (urlSpec) { + urlSpec = urlSpec || {}; + if (!urlSpec.x) { + urlSpec.x = 32; + } + if (!urlSpec.y) { + urlSpec.y = 32; + } + urlSpec.x *= window.devicePixelRatio; + urlSpec.y *= window.devicePixelRatio; + urlSpec.x = Math.ceil(urlSpec.x); + urlSpec.y = Math.ceil(urlSpec.y); urlSpec.t = $('#dirToken').val(); - urlSpec.y = Math.floor(36 * window.devicePixelRatio); - urlSpec.x = Math.floor(36 * window.devicePixelRatio); return OC.generateUrl('/apps/files_sharing/ajax/publicpreview.php?') + $.param(urlSpec); }; @@ -219,6 +228,14 @@ OCA.Sharing.PublicApp = { OCA.Sharing.PublicApp._saveToOwnCloud(remote, token, owner, name, isProtected); }); + $('#remote_address').on("keyup paste", function() { + if ($(this).val() === '') { + $('#save-button-confirm').prop('disabled', true); + } else { + $('#save-button-confirm').prop('disabled', false); + } + }); + $('#save #save-button').click(function () { $(this).hide(); $('.save-form').css('display', 'inline'); @@ -293,15 +310,8 @@ $(document).ready(function () { if (window.Files) { // HACK: for oc-dialogs previews that depends on Files: - Files.lazyLoadPreview = function (path, mime, ready, width, height, etag) { - return App.fileList.lazyLoadPreview({ - path: path, - mime: mime, - callback: ready, - width: width, - height: height, - etag: etag - }); + Files.generatePreviewUrl = function (urlSpec) { + return App.fileList.generatePreviewUrl(urlSpec); }; } }); diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 5290dfbb7d1..30a803f3207 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -103,15 +103,24 @@ name: 'Share', displayName: '', mime: 'all', - permissions: OC.PERMISSION_SHARE, + permissions: OC.PERMISSION_ALL, icon: OC.imagePath('core', 'actions/share'), type: OCA.Files.FileActions.TYPE_INLINE, actionHandler: function(fileName) { fileList.showDetailsView(fileName, 'shareTabView'); + }, + render: function(actionSpec, isDefault, context) { + var permissions = parseInt(context.$file.attr('data-permissions'), 10); + // if no share permissions but share owner exists, still show the link + if ((permissions & OC.PERMISSION_SHARE) !== 0 || context.$file.attr('data-share-owner')) { + return fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context); + } + // don't render anything + return null; } }); - var shareTab = new OCA.Sharing.ShareTabView('shareTabView'); + var shareTab = new OCA.Sharing.ShareTabView('shareTabView', {order: -20}); // detect changes and change the matching list entry shareTab.on('sharesChanged', function(shareModel) { var fileInfoModel = shareModel.fileInfoModel; @@ -157,26 +166,7 @@ // if the statuses are loaded already, use them for the icon // (needed when scrolling to the next page) if (hasUserShares || hasLinkShare || $tr.attr('data-share-recipients') || $tr.attr('data-share-owner')) { - var permissions = $tr.data('permissions'); OC.Share.markFileAsShared($tr, true, hasLinkShare); - if ((permissions & OC.PERMISSION_SHARE) === 0 && $tr.attr('data-share-owner')) { - // if no share action exists because the admin disabled sharing for this user - // we create a share notification action to inform the user about files - // shared with him otherwise we just update the existing share action. - // TODO: make this work like/with OC.Share.markFileAsShared() - $tr.find('.fileactions .action-share-notification').remove(); - var shareNotification = '<a class="action action-share-notification permanent"' + - ' data-action="Share-Notification" href="#" original-title="">' + - ' <img class="svg" src="' + OC.imagePath('core', 'actions/share') + '"></img>'; - $tr.find('.fileactions').append(function() { - var shareBy = escapeHTML($tr.attr('data-share-owner')); - var $result = $(shareNotification + '<span> ' + shareBy + '</span></span>'); - $result.on('click', function() { - return false; - }); - return $result; - }); - } return true; } return false; diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js index 98dbd4c6702..2e798a92578 100644 --- a/apps/files_sharing/js/sharedfilelist.js +++ b/apps/files_sharing/js/sharedfilelist.js @@ -122,7 +122,9 @@ if (this._reloadCall) { this._reloadCall.abort(); } - this._reloadCall = $.ajax({ + + var promises = []; + var shares = $.ajax({ url: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares', /* jshint camelcase: false */ data: { @@ -132,25 +134,84 @@ type: 'GET', beforeSend: function(xhr) { xhr.setRequestHeader('OCS-APIREQUEST', 'true'); - } + }, }); + promises.push(shares); + + if (!!this._sharedWithUser) { + var remoteShares = $.ajax({ + url: OC.linkToOCS('apps/files_sharing/api/v1') + 'remote_shares', + /* jshint camelcase: false */ + data: { + format: 'json' + }, + type: 'GET', + beforeSend: function(xhr) { + xhr.setRequestHeader('OCS-APIREQUEST', 'true'); + }, + }); + promises.push(remoteShares); + } else { + //Push empty promise so callback gets called the same way + promises.push($.Deferred().resolve()); + } + + this._reloadCall = $.when.apply($, promises); var callBack = this.reloadCallback.bind(this); return this._reloadCall.then(callBack, callBack); }, - reloadCallback: function(result) { + reloadCallback: function(shares, remoteShares) { delete this._reloadCall; this.hideMask(); this.$el.find('#headerSharedWith').text( t('files_sharing', this._sharedWithUser ? 'Shared by' : 'Shared with') ); - if (result.ocs && result.ocs.data) { - this.setFiles(this._makeFilesFromShares(result.ocs.data)); + + var files = []; + + if (shares[0].ocs && shares[0].ocs.data) { + files = files.concat(this._makeFilesFromShares(shares[0].ocs.data)); + } else { + // TODO: error handling } - else { + + if (remoteShares && remoteShares[0].ocs && remoteShares[0].ocs.data) { + files = files.concat(this._makeFilesFromRemoteShares(remoteShares[0].ocs.data)); + } else { // TODO: error handling } + + this.setFiles(files); + }, + + _makeFilesFromRemoteShares: function(data) { + var self = this; + var files = data; + + files = _.chain(files) + // convert share data to file data + .map(function(share) { + var file = { + shareOwner: share.owner + '@' + share.remote.replace(/.*?:\/\//g, ""), + name: OC.basename(share.mountpoint), + mtime: share.mtime * 1000, + mimetype: share.mimetype, + type: share.type, + id: share.file_id, + path: OC.dirname(share.mountpoint), + permissions: share.permissions + }; + + file.shares = [{ + id: share.id, + type: OC.Share.SHARE_TYPE_REMOTE + }]; + return file; + }) + .value(); + return files; }, /** diff --git a/apps/files_sharing/l10n/ar.js b/apps/files_sharing/l10n/ar.js index 376526356dc..d597b01a7b8 100644 --- a/apps/files_sharing/l10n/ar.js +++ b/apps/files_sharing/l10n/ar.js @@ -13,6 +13,7 @@ OC.L10N.register( "This share is password-protected" : "هذه المشاركة محمية بكلمة مرور", "The password is wrong. Try again." : "كلمة المرور خاطئة. حاول مرة أخرى", "Password" : "كلمة المرور", + "No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ", "Name" : "اسم", "Sorry, this link doesn’t seem to work anymore." : "عذرا، يبدو أن هذا الرابط لم يعد يعمل.", "Reasons might be:" : "الأسباب الممكنة :", diff --git a/apps/files_sharing/l10n/ar.json b/apps/files_sharing/l10n/ar.json index e8590b931d9..1b4c04b33db 100644 --- a/apps/files_sharing/l10n/ar.json +++ b/apps/files_sharing/l10n/ar.json @@ -11,6 +11,7 @@ "This share is password-protected" : "هذه المشاركة محمية بكلمة مرور", "The password is wrong. Try again." : "كلمة المرور خاطئة. حاول مرة أخرى", "Password" : "كلمة المرور", + "No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ", "Name" : "اسم", "Sorry, this link doesn’t seem to work anymore." : "عذرا، يبدو أن هذا الرابط لم يعد يعمل.", "Reasons might be:" : "الأسباب الممكنة :", diff --git a/apps/files_sharing/l10n/ca.js b/apps/files_sharing/l10n/ca.js index 403aaa87696..b295a3aa7dc 100644 --- a/apps/files_sharing/l10n/ca.js +++ b/apps/files_sharing/l10n/ca.js @@ -3,10 +3,12 @@ OC.L10N.register( { "Server to server sharing is not enabled on this server" : "La compartició entre servidors no està activada en aquest servidor", "Invalid or untrusted SSL certificate" : "El certificat SSL és invàlid o no és fiable", + "Storage not valid" : "Emmagatzemament no valit", "Couldn't add remote share" : "No s'ha pogut afegir una compartició remota", "Shared with you" : "Us han compartit", "Shared with others" : "Heu compartit", "Shared by link" : "Compartit amb enllaç", + "No shared links" : "no hi ha enllaços compartits", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir la compartició remota {nom} des de {owner}@{remote}?", "Remote share" : "Compartició remota", "Remote share password" : "Contrasenya de compartició remota", diff --git a/apps/files_sharing/l10n/ca.json b/apps/files_sharing/l10n/ca.json index c0aa500d2a6..e5ce33561a5 100644 --- a/apps/files_sharing/l10n/ca.json +++ b/apps/files_sharing/l10n/ca.json @@ -1,10 +1,12 @@ { "translations": { "Server to server sharing is not enabled on this server" : "La compartició entre servidors no està activada en aquest servidor", "Invalid or untrusted SSL certificate" : "El certificat SSL és invàlid o no és fiable", + "Storage not valid" : "Emmagatzemament no valit", "Couldn't add remote share" : "No s'ha pogut afegir una compartició remota", "Shared with you" : "Us han compartit", "Shared with others" : "Heu compartit", "Shared by link" : "Compartit amb enllaç", + "No shared links" : "no hi ha enllaços compartits", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir la compartició remota {nom} des de {owner}@{remote}?", "Remote share" : "Compartició remota", "Remote share password" : "Contrasenya de compartició remota", diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js index f6b43cf4fa3..daa43cc46e8 100644 --- a/apps/files_sharing/l10n/cs_CZ.js +++ b/apps/files_sharing/l10n/cs_CZ.js @@ -38,9 +38,21 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ", "You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s", "You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s", + "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s", + "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz", "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s", "You shared %1$s via link" : "Sdílíte %1$s přes odkaz", + "Downloaded via public link" : "Staženo pomocí veřejného odkazu", + "Shared with %2$s" : "Sdíleno s %2$s", + "Shared with group %2$s" : "Sdíleno se skupinou %2$s", + "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s", + "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s", + "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz", + "Shared by %2$s" : "%2$s sdílel(a)", + "Shared via public link" : "Sdíleno jako veřejný odkaz", "Shares" : "Sdílení", + "You received %2$s as a remote share from %1$s" : "Obdrželi jste %2$s jako vzdálené sdílení od %1$s", "Accept" : "Přijmout", "Decline" : "Zamítnout", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s", diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json index f5822c627ae..f1bd6fa4934 100644 --- a/apps/files_sharing/l10n/cs_CZ.json +++ b/apps/files_sharing/l10n/cs_CZ.json @@ -36,9 +36,21 @@ "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ", "You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s", "You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s", + "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s", + "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz", "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s", "You shared %1$s via link" : "Sdílíte %1$s přes odkaz", + "Downloaded via public link" : "Staženo pomocí veřejného odkazu", + "Shared with %2$s" : "Sdíleno s %2$s", + "Shared with group %2$s" : "Sdíleno se skupinou %2$s", + "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s", + "Shared with group %3$s by %2$s" : "%2$s sdílí se skupinou %3$s", + "Shared via link by %2$s" : "%2$s sdílel(a) jako odkaz", + "Shared by %2$s" : "%2$s sdílel(a)", + "Shared via public link" : "Sdíleno jako veřejný odkaz", "Shares" : "Sdílení", + "You received %2$s as a remote share from %1$s" : "Obdrželi jste %2$s jako vzdálené sdílení od %1$s", "Accept" : "Přijmout", "Decline" : "Zamítnout", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s", diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js index 973aa0f15ac..295c7cdbb76 100644 --- a/apps/files_sharing/l10n/de.js +++ b/apps/files_sharing/l10n/de.js @@ -38,10 +38,23 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Die öffentliche geteilte Datei %1$s wurde heruntergeladen", "You shared %1$s with %2$s" : "Du hast %1$s mit %2$s geteilt", "You shared %1$s with group %2$s" : "Du hast %1$s mit der Gruppe %2$s geteilt", + "%2$s shared %1$s with %3$s" : "%2$s geteilt %1$s mit %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s geteilt %1$s mit Gruppe %3$s", + "%2$s shared %1$s via link" : "%2$s geteilt %1$s via Link", "%2$s shared %1$s with you" : "%2$s hat %1$s mit Dir geteilt", "You shared %1$s via link" : "Du hast %1$s über einen Link freigegeben", + "Downloaded via public link" : "Runtergeladen mittels öffentlichen Link", + "Shared with %2$s" : "Geteilt mit %2$s", + "Shared with group %2$s" : "Geteilt mit Gruppe %2$s", + "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s", + "Shared with group %3$s by %2$s" : "Geteilt mit Gruppe %3$s von %2$s", + "Shared via link by %2$s" : "Geteilt mittels Link von %2$s", + "Shared by %2$s" : "Geteilt von %2$s", + "Shared via public link" : "Geteilt mittels öffentlichen Link", "Shares" : "Freigaben", + "You received %2$s as a remote share from %1$s" : "Du hast %2$s als Remotefreigabe von %1$s erhalten", "Accept" : "Ok", + "Decline" : "Abgelehnt", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s", "Share with me through my #ownCloud Federated Cloud ID" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", @@ -67,6 +80,7 @@ OC.L10N.register( "Federated Cloud" : "Federated Cloud", "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:", "Share it:" : "Zum Teilen:", + "Add to your website" : "Zu deiner Webseite hinzufügen", "Share with me via ownCloud" : "Teile mit mir über ownCloud", "HTML Code:" : "HTML-Code:" }, diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json index 5526be3b6bf..690e7596ffc 100644 --- a/apps/files_sharing/l10n/de.json +++ b/apps/files_sharing/l10n/de.json @@ -36,10 +36,23 @@ "Public shared file %1$s was downloaded" : "Die öffentliche geteilte Datei %1$s wurde heruntergeladen", "You shared %1$s with %2$s" : "Du hast %1$s mit %2$s geteilt", "You shared %1$s with group %2$s" : "Du hast %1$s mit der Gruppe %2$s geteilt", + "%2$s shared %1$s with %3$s" : "%2$s geteilt %1$s mit %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s geteilt %1$s mit Gruppe %3$s", + "%2$s shared %1$s via link" : "%2$s geteilt %1$s via Link", "%2$s shared %1$s with you" : "%2$s hat %1$s mit Dir geteilt", "You shared %1$s via link" : "Du hast %1$s über einen Link freigegeben", + "Downloaded via public link" : "Runtergeladen mittels öffentlichen Link", + "Shared with %2$s" : "Geteilt mit %2$s", + "Shared with group %2$s" : "Geteilt mit Gruppe %2$s", + "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s", + "Shared with group %3$s by %2$s" : "Geteilt mit Gruppe %3$s von %2$s", + "Shared via link by %2$s" : "Geteilt mittels Link von %2$s", + "Shared by %2$s" : "Geteilt von %2$s", + "Shared via public link" : "Geteilt mittels öffentlichen Link", "Shares" : "Freigaben", + "You received %2$s as a remote share from %1$s" : "Du hast %2$s als Remotefreigabe von %1$s erhalten", "Accept" : "Ok", + "Decline" : "Abgelehnt", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s", "Share with me through my #ownCloud Federated Cloud ID" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", @@ -65,6 +78,7 @@ "Federated Cloud" : "Federated Cloud", "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:", "Share it:" : "Zum Teilen:", + "Add to your website" : "Zu deiner Webseite hinzufügen", "Share with me via ownCloud" : "Teile mit mir über ownCloud", "HTML Code:" : "HTML-Code:" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_sharing/l10n/el.js b/apps/files_sharing/l10n/el.js index 18ba9bd0d31..e4024492b65 100644 --- a/apps/files_sharing/l10n/el.js +++ b/apps/files_sharing/l10n/el.js @@ -10,7 +10,7 @@ OC.L10N.register( "Shared with you" : "Διαμοιρασμένο με εσάς", "Shared with others" : "Διαμοιρασμένο με άλλους", "Shared by link" : "Διαμοιρασμένο μέσω συνδέσμου", - "Nothing shared with you yet" : "Δεν έχει διαμοιραστεί κάτι με εσάς ακόμα", + "Nothing shared with you yet" : "Κανένα αρχείο δεν έχει διαμοιραστεί ακόμα με εσάς.", "Files and folders others share with you will show up here" : "Τα αρχεία και οι φάκελοι που άλλοι διαμοιράζονται με εσάς θα εμφανιστούν εδώ", "Nothing shared yet" : "Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής", "Files and folders you share will show up here" : "Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανιστούν εδώ", @@ -38,9 +38,21 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Το κοινόχρηστο διαμοιρασμένο αρχείο %1$s ελήφθη", "You shared %1$s with %2$s" : "Διαμοιραστήκατε το %1$s με %2$s", "You shared %1$s with group %2$s" : "Διαμοιραστήκατε %1$s με την ομάδα %2$s", + "%2$s shared %1$s with %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με %3$s", + "%2$s shared %1$s with group %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με την ομάδα %3$s", + "%2$s shared %1$s via link" : "Ο %2$s διαμοιράστηκε το %1$s μέσω συνδέσμου", "%2$s shared %1$s with you" : "Ο %2$s διαμοιράστηκε το %1$s με εσάς", "You shared %1$s via link" : "Μοιραστήκατε το %1$s μέσω συνδέσμου", + "Downloaded via public link" : "Μεταφορτώθηκε μέσω δημόσιου συνδέσμου", + "Shared with %2$s" : "Διαμοιράστηκε με %2$s", + "Shared with group %2$s" : "Διαμοιράστηκε με την ομάδα %2$s", + "Shared with %3$s by %2$s" : "Διαμοιράστηκε με %3$s από %2$s", + "Shared with group %3$s by %2$s" : "Διαμοιράστηκε με την ομάδα %3$s από %2$s", + "Shared via link by %2$s" : "Διαμοιράστηκε μέσω συνδέσμου από %2$s", + "Shared by %2$s" : "Διαμοιράστηκε από %2$s", + "Shared via public link" : "Διαμοιράστηκε μέσω δημόσιου συνδέσμου", "Shares" : "Κοινόχρηστοι φάκελοι", + "You received %2$s as a remote share from %1$s" : "Λάβατε το %2$s ως απομακρυσμένο διαμοιρασμό από %1$s", "Accept" : "Αποδοχή", "Decline" : "Απόρριψη", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s", diff --git a/apps/files_sharing/l10n/el.json b/apps/files_sharing/l10n/el.json index f8e42195d0d..7bf5c00841e 100644 --- a/apps/files_sharing/l10n/el.json +++ b/apps/files_sharing/l10n/el.json @@ -8,7 +8,7 @@ "Shared with you" : "Διαμοιρασμένο με εσάς", "Shared with others" : "Διαμοιρασμένο με άλλους", "Shared by link" : "Διαμοιρασμένο μέσω συνδέσμου", - "Nothing shared with you yet" : "Δεν έχει διαμοιραστεί κάτι με εσάς ακόμα", + "Nothing shared with you yet" : "Κανένα αρχείο δεν έχει διαμοιραστεί ακόμα με εσάς.", "Files and folders others share with you will show up here" : "Τα αρχεία και οι φάκελοι που άλλοι διαμοιράζονται με εσάς θα εμφανιστούν εδώ", "Nothing shared yet" : "Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής", "Files and folders you share will show up here" : "Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανιστούν εδώ", @@ -36,9 +36,21 @@ "Public shared file %1$s was downloaded" : "Το κοινόχρηστο διαμοιρασμένο αρχείο %1$s ελήφθη", "You shared %1$s with %2$s" : "Διαμοιραστήκατε το %1$s με %2$s", "You shared %1$s with group %2$s" : "Διαμοιραστήκατε %1$s με την ομάδα %2$s", + "%2$s shared %1$s with %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με %3$s", + "%2$s shared %1$s with group %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με την ομάδα %3$s", + "%2$s shared %1$s via link" : "Ο %2$s διαμοιράστηκε το %1$s μέσω συνδέσμου", "%2$s shared %1$s with you" : "Ο %2$s διαμοιράστηκε το %1$s με εσάς", "You shared %1$s via link" : "Μοιραστήκατε το %1$s μέσω συνδέσμου", + "Downloaded via public link" : "Μεταφορτώθηκε μέσω δημόσιου συνδέσμου", + "Shared with %2$s" : "Διαμοιράστηκε με %2$s", + "Shared with group %2$s" : "Διαμοιράστηκε με την ομάδα %2$s", + "Shared with %3$s by %2$s" : "Διαμοιράστηκε με %3$s από %2$s", + "Shared with group %3$s by %2$s" : "Διαμοιράστηκε με την ομάδα %3$s από %2$s", + "Shared via link by %2$s" : "Διαμοιράστηκε μέσω συνδέσμου από %2$s", + "Shared by %2$s" : "Διαμοιράστηκε από %2$s", + "Shared via public link" : "Διαμοιράστηκε μέσω δημόσιου συνδέσμου", "Shares" : "Κοινόχρηστοι φάκελοι", + "You received %2$s as a remote share from %1$s" : "Λάβατε το %2$s ως απομακρυσμένο διαμοιρασμό από %1$s", "Accept" : "Αποδοχή", "Decline" : "Απόρριψη", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s", diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js index ca1e8c430db..650fb5c524a 100644 --- a/apps/files_sharing/l10n/es.js +++ b/apps/files_sharing/l10n/es.js @@ -28,7 +28,7 @@ OC.L10N.register( "Sharing" : "Compartiendo", "A file or folder has been <strong>shared</strong>" : "Se ha <strong>compartido</strong> un archivo o carpeta", "A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>", - "A public shared file or folder was <strong>downloaded</strong>" : "Ha sido <strong>descargado</strong> un archivo (o carpeta) compartido públicamente", + "A public shared file or folder was <strong>downloaded</strong>" : "Se ha <strong>descargado</strong> un archivo o carpeta compartido públicamente", "You received a new remote share %2$s from %1$s" : "Recibió un nuevo recurso compartido remoto %2$s de %1$s", "You received a new remote share from %s" : "Ha recibido un nuevo recurso compartido remoto de %s", "%1$s accepted remote share %2$s" : "%1$s aceptó el recurso compartido remoto %2$s", @@ -38,10 +38,22 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Se descargó el archivo público compartido %1$s", "You shared %1$s with %2$s" : "Usted compartió %1$s con %2$s", "You shared %1$s with group %2$s" : "Usted ha compartido %1$s con el grupo %2$s", + "%2$s shared %1$s with %3$s" : "%2$s compartó %1$s con %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s compartió %1$s con el grupo %3$s", + "%2$s shared %1$s via link" : "%2$s compartió %1$s vía enlace", "%2$s shared %1$s with you" : "%2$s ha compartido %1$s con usted", "You shared %1$s via link" : "Ha compartido %1$s vía enlace", + "Downloaded via public link" : "Descargado vía enlace público", + "Shared with %2$s" : "Compartido con %2$s", + "Shared with group %2$s" : "Compartido con el grupo %2$s", + "Shared with %3$s by %2$s" : "Compartido con %3$s por %2$s", + "Shared with group %3$s by %2$s" : "Compartido con el grupo %3$s por %2$s", + "Shared via link by %2$s" : "Compartido vía enlace por %2$s", + "Shared by %2$s" : "Compartido por %2$s", + "Shared via public link" : "Compartido vía enlace público", "Shares" : "Compartidos", "Accept" : "Aceptar", + "Decline" : "Denegar", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s", "Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud", "This share is password-protected" : "Este elemento compartido está protegido por contraseña", @@ -67,7 +79,7 @@ OC.L10N.register( "Federated Cloud" : "Nube Federada", "Your Federated Cloud ID:" : "Su ID Nube Federada:", "Share it:" : "Compartir:", - "Add to your website" : "Añadir a su Website", + "Add to your website" : "Añadir a su sitio web", "Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud", "HTML Code:" : "Código HTML:" }, diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json index 4b300e1227f..6f963ab8fee 100644 --- a/apps/files_sharing/l10n/es.json +++ b/apps/files_sharing/l10n/es.json @@ -26,7 +26,7 @@ "Sharing" : "Compartiendo", "A file or folder has been <strong>shared</strong>" : "Se ha <strong>compartido</strong> un archivo o carpeta", "A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>", - "A public shared file or folder was <strong>downloaded</strong>" : "Ha sido <strong>descargado</strong> un archivo (o carpeta) compartido públicamente", + "A public shared file or folder was <strong>downloaded</strong>" : "Se ha <strong>descargado</strong> un archivo o carpeta compartido públicamente", "You received a new remote share %2$s from %1$s" : "Recibió un nuevo recurso compartido remoto %2$s de %1$s", "You received a new remote share from %s" : "Ha recibido un nuevo recurso compartido remoto de %s", "%1$s accepted remote share %2$s" : "%1$s aceptó el recurso compartido remoto %2$s", @@ -36,10 +36,22 @@ "Public shared file %1$s was downloaded" : "Se descargó el archivo público compartido %1$s", "You shared %1$s with %2$s" : "Usted compartió %1$s con %2$s", "You shared %1$s with group %2$s" : "Usted ha compartido %1$s con el grupo %2$s", + "%2$s shared %1$s with %3$s" : "%2$s compartó %1$s con %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s compartió %1$s con el grupo %3$s", + "%2$s shared %1$s via link" : "%2$s compartió %1$s vía enlace", "%2$s shared %1$s with you" : "%2$s ha compartido %1$s con usted", "You shared %1$s via link" : "Ha compartido %1$s vía enlace", + "Downloaded via public link" : "Descargado vía enlace público", + "Shared with %2$s" : "Compartido con %2$s", + "Shared with group %2$s" : "Compartido con el grupo %2$s", + "Shared with %3$s by %2$s" : "Compartido con %3$s por %2$s", + "Shared with group %3$s by %2$s" : "Compartido con el grupo %3$s por %2$s", + "Shared via link by %2$s" : "Compartido vía enlace por %2$s", + "Shared by %2$s" : "Compartido por %2$s", + "Shared via public link" : "Compartido vía enlace público", "Shares" : "Compartidos", "Accept" : "Aceptar", + "Decline" : "Denegar", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s", "Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud", "This share is password-protected" : "Este elemento compartido está protegido por contraseña", @@ -65,7 +77,7 @@ "Federated Cloud" : "Nube Federada", "Your Federated Cloud ID:" : "Su ID Nube Federada:", "Share it:" : "Compartir:", - "Add to your website" : "Añadir a su Website", + "Add to your website" : "Añadir a su sitio web", "Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud", "HTML Code:" : "Código HTML:" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_sharing/l10n/et_EE.js b/apps/files_sharing/l10n/et_EE.js index ada0a548162..6d02bdd6ced 100644 --- a/apps/files_sharing/l10n/et_EE.js +++ b/apps/files_sharing/l10n/et_EE.js @@ -32,6 +32,7 @@ OC.L10N.register( "You shared %1$s via link" : "Jagasid %1$s lingiga", "Shares" : "Jagamised", "Accept" : "Nõustu", + "Decline" : "Lükka tagasi", "This share is password-protected" : "See jagamine on parooliga kaitstud", "The password is wrong. Try again." : "Parool on vale. Proovi uuesti.", "Password" : "Parool", @@ -52,6 +53,7 @@ OC.L10N.register( "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse", "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest", "Share it:" : "Jaga seda:", + "Add to your website" : "Lisa oma veebisaidile", "Share with me via ownCloud" : "Jaga minuga läbi ownCloudiga", "HTML Code:" : "HTML kood:" }, diff --git a/apps/files_sharing/l10n/et_EE.json b/apps/files_sharing/l10n/et_EE.json index afa7fc6884d..481a75210ee 100644 --- a/apps/files_sharing/l10n/et_EE.json +++ b/apps/files_sharing/l10n/et_EE.json @@ -30,6 +30,7 @@ "You shared %1$s via link" : "Jagasid %1$s lingiga", "Shares" : "Jagamised", "Accept" : "Nõustu", + "Decline" : "Lükka tagasi", "This share is password-protected" : "See jagamine on parooliga kaitstud", "The password is wrong. Try again." : "Parool on vale. Proovi uuesti.", "Password" : "Parool", @@ -50,6 +51,7 @@ "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse", "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest", "Share it:" : "Jaga seda:", + "Add to your website" : "Lisa oma veebisaidile", "Share with me via ownCloud" : "Jaga minuga läbi ownCloudiga", "HTML Code:" : "HTML kood:" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_sharing/l10n/fa.js b/apps/files_sharing/l10n/fa.js index 5376ad45ca6..cd915b79a17 100644 --- a/apps/files_sharing/l10n/fa.js +++ b/apps/files_sharing/l10n/fa.js @@ -3,15 +3,22 @@ OC.L10N.register( { "Server to server sharing is not enabled on this 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" : "اشتراک گذاشته شده از طریق پیوند", + "Nothing shared with you yet" : "هیچ موردی با شما به اشتراک گذاشته نشده است", + "Nothing shared yet" : "هیچ موردی تاکنون به اشتراک گذاشته نشده است", + "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}?" : "آیا مایل به افزودن اشتراک از راه دور {name} از {owner}@{remote} هستید.", "Remote share" : "اشتراک از راه دور", "Remote share password" : "رمز عبور اشتراک از راه دور", "Cancel" : "منصرف شدن", "Add remote share" : "افزودن اشتراک از راه دور", + "You can upload into this folder" : "میتوانید در این پوشه آپلود کنید", "Invalid ownCloud url" : "آدرس نمونه ownCloud غیر معتبر است", "Shared by" : "اشتراک گذاشته شده به وسیله", "Sharing" : "اشتراک گذاری", @@ -21,9 +28,11 @@ OC.L10N.register( "%2$s shared %1$s with you" : "%2$s مورد %1$s را با شما به اشتراک گذاشت", "You shared %1$s via link" : "شما %1$s را توسط پیوند به اشتراک گذاشتید", "Shares" : "موارد به اشتراک گذاشته", + "Accept" : "قبول", "This share is password-protected" : "این اشتراک توسط رمز عبور محافظت می شود", "The password is wrong. Try again." : "رمزعبور اشتباه می باشد. دوباره امتحان کنید.", "Password" : "گذرواژه", + "No entries found in this folder" : "هیچ ورودیای در این پوشه وجود ندارد", "Name" : "نام", "Share time" : "زمان به اشتراک گذاری", "Sorry, this link doesn’t seem to work anymore." : "متاسفانه این پیوند دیگر کار نمی کند", @@ -35,6 +44,8 @@ OC.L10N.register( "Add to your ownCloud" : "افزودن به ownCloud شما", "Download" : "دانلود", "Download %s" : "دانلود %s", - "Direct link" : "پیوند مستقیم" + "Direct link" : "پیوند مستقیم", + "Open documentation" : "بازکردن مستند", + "HTML Code:" : "کد HTML :" }, "nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/fa.json b/apps/files_sharing/l10n/fa.json index 13778338f48..a345d9f1401 100644 --- a/apps/files_sharing/l10n/fa.json +++ b/apps/files_sharing/l10n/fa.json @@ -1,15 +1,22 @@ { "translations": { "Server to server sharing is not enabled on this 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" : "اشتراک گذاشته شده از طریق پیوند", + "Nothing shared with you yet" : "هیچ موردی با شما به اشتراک گذاشته نشده است", + "Nothing shared yet" : "هیچ موردی تاکنون به اشتراک گذاشته نشده است", + "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}?" : "آیا مایل به افزودن اشتراک از راه دور {name} از {owner}@{remote} هستید.", "Remote share" : "اشتراک از راه دور", "Remote share password" : "رمز عبور اشتراک از راه دور", "Cancel" : "منصرف شدن", "Add remote share" : "افزودن اشتراک از راه دور", + "You can upload into this folder" : "میتوانید در این پوشه آپلود کنید", "Invalid ownCloud url" : "آدرس نمونه ownCloud غیر معتبر است", "Shared by" : "اشتراک گذاشته شده به وسیله", "Sharing" : "اشتراک گذاری", @@ -19,9 +26,11 @@ "%2$s shared %1$s with you" : "%2$s مورد %1$s را با شما به اشتراک گذاشت", "You shared %1$s via link" : "شما %1$s را توسط پیوند به اشتراک گذاشتید", "Shares" : "موارد به اشتراک گذاشته", + "Accept" : "قبول", "This share is password-protected" : "این اشتراک توسط رمز عبور محافظت می شود", "The password is wrong. Try again." : "رمزعبور اشتباه می باشد. دوباره امتحان کنید.", "Password" : "گذرواژه", + "No entries found in this folder" : "هیچ ورودیای در این پوشه وجود ندارد", "Name" : "نام", "Share time" : "زمان به اشتراک گذاری", "Sorry, this link doesn’t seem to work anymore." : "متاسفانه این پیوند دیگر کار نمی کند", @@ -33,6 +42,8 @@ "Add to your ownCloud" : "افزودن به ownCloud شما", "Download" : "دانلود", "Download %s" : "دانلود %s", - "Direct link" : "پیوند مستقیم" + "Direct link" : "پیوند مستقیم", + "Open documentation" : "بازکردن مستند", + "HTML Code:" : "کد HTML :" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/fi_FI.js b/apps/files_sharing/l10n/fi_FI.js index 2e4a32480b1..a87d6156d40 100644 --- a/apps/files_sharing/l10n/fi_FI.js +++ b/apps/files_sharing/l10n/fi_FI.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "%2$s jakoi kohteen %1$s linkin kautta", "%2$s shared %1$s with you" : "%2$s jakoi kohteen %1$s kanssasi", "You shared %1$s via link" : "Jaoit kohteen %1$s linkin kautta", + "Downloaded via public link" : "Lataa julkista linkkiä käyttäen", + "Shared with %2$s" : "Jaettu käyttäjän %2$s kanssa", + "Shared with group %2$s" : "Jaettu ryhmän %2$s kanssa", + "Shared with %3$s by %2$s" : "Jaettu käyttäjän %3$s kanssa käyttäjän %2$s toimesta", + "Shared with group %3$s by %2$s" : "Jaettu ryhmän %3$s kanssa käyttäjän %2$s toimesta", + "Shared via link by %2$s" : "Jaettu linkin kautta käyttäjän %2$s toimesta", + "Shared by %2$s" : "Jakanut %2$s", + "Shared via public link" : "Jaettu julkisen linkin kautta", "Shares" : "Jaot", "You received %2$s as a remote share from %1$s" : "Sait kohteen %2$s etäjakona käyttäjältä %1$s", "Accept" : "Hyväksy", diff --git a/apps/files_sharing/l10n/fi_FI.json b/apps/files_sharing/l10n/fi_FI.json index 2b938d95c0e..172b8476092 100644 --- a/apps/files_sharing/l10n/fi_FI.json +++ b/apps/files_sharing/l10n/fi_FI.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "%2$s jakoi kohteen %1$s linkin kautta", "%2$s shared %1$s with you" : "%2$s jakoi kohteen %1$s kanssasi", "You shared %1$s via link" : "Jaoit kohteen %1$s linkin kautta", + "Downloaded via public link" : "Lataa julkista linkkiä käyttäen", + "Shared with %2$s" : "Jaettu käyttäjän %2$s kanssa", + "Shared with group %2$s" : "Jaettu ryhmän %2$s kanssa", + "Shared with %3$s by %2$s" : "Jaettu käyttäjän %3$s kanssa käyttäjän %2$s toimesta", + "Shared with group %3$s by %2$s" : "Jaettu ryhmän %3$s kanssa käyttäjän %2$s toimesta", + "Shared via link by %2$s" : "Jaettu linkin kautta käyttäjän %2$s toimesta", + "Shared by %2$s" : "Jakanut %2$s", + "Shared via public link" : "Jaettu julkisen linkin kautta", "Shares" : "Jaot", "You received %2$s as a remote share from %1$s" : "Sait kohteen %2$s etäjakona käyttäjältä %1$s", "Accept" : "Hyväksy", diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js index 3942d18de03..9d26127d472 100644 --- a/apps/files_sharing/l10n/fr.js +++ b/apps/files_sharing/l10n/fr.js @@ -38,9 +38,21 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Le fichier public %1$s a été téléchargé", "You shared %1$s with %2$s" : "Vous avez partagé %1$s avec %2$s", "You shared %1$s with group %2$s" : "Vous avez partagé %1$s avec le groupe %2$s", + "%2$s shared %1$s with %3$s" : "%2$s a partagé %1$s avec %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s partagé %1$s avec le groupe %3$s", + "%2$s shared %1$s via link" : "%2$s a partagé %1$s par lien", "%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous", "You shared %1$s via link" : "Vous avez partagé %1$s par lien public", + "Downloaded via public link" : "Téléchargé par lien public", + "Shared with %2$s" : "Partagé avec %2$s", + "Shared with group %2$s" : "Partagé avec le groupe %2$s", + "Shared with %3$s by %2$s" : "Partagé avec %3$s par %2$s", + "Shared with group %3$s by %2$s" : "Partagé avec le groupe %3$s par %2$s", + "Shared via link by %2$s" : "Partagé via lien par %2$s", + "Shared by %2$s" : "Partagé par %2$s", + "Shared via public link" : "Partagé par lien public", "Shares" : "Partages", + "You received %2$s as a remote share from %1$s" : "Vous avez obtenu l'accès au partage distant %2$s de %1$s", "Accept" : "Accepter", "Decline" : "Refuser", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s", diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json index 75b645ef259..0f1edc51dc7 100644 --- a/apps/files_sharing/l10n/fr.json +++ b/apps/files_sharing/l10n/fr.json @@ -36,9 +36,21 @@ "Public shared file %1$s was downloaded" : "Le fichier public %1$s a été téléchargé", "You shared %1$s with %2$s" : "Vous avez partagé %1$s avec %2$s", "You shared %1$s with group %2$s" : "Vous avez partagé %1$s avec le groupe %2$s", + "%2$s shared %1$s with %3$s" : "%2$s a partagé %1$s avec %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s partagé %1$s avec le groupe %3$s", + "%2$s shared %1$s via link" : "%2$s a partagé %1$s par lien", "%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous", "You shared %1$s via link" : "Vous avez partagé %1$s par lien public", + "Downloaded via public link" : "Téléchargé par lien public", + "Shared with %2$s" : "Partagé avec %2$s", + "Shared with group %2$s" : "Partagé avec le groupe %2$s", + "Shared with %3$s by %2$s" : "Partagé avec %3$s par %2$s", + "Shared with group %3$s by %2$s" : "Partagé avec le groupe %3$s par %2$s", + "Shared via link by %2$s" : "Partagé via lien par %2$s", + "Shared by %2$s" : "Partagé par %2$s", + "Shared via public link" : "Partagé par lien public", "Shares" : "Partages", + "You received %2$s as a remote share from %1$s" : "Vous avez obtenu l'accès au partage distant %2$s de %1$s", "Accept" : "Accepter", "Decline" : "Refuser", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s", diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js index 3895a028be8..c0d2d01b2c4 100644 --- a/apps/files_sharing/l10n/hu_HU.js +++ b/apps/files_sharing/l10n/hu_HU.js @@ -38,9 +38,21 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Nyilvánosan megosztott fálj %1$s le lett töltve", "You shared %1$s with %2$s" : "%1$s-t megosztottam ővele: %2$s", "You shared %1$s with group %2$s" : "%1$s-t megosztottam ezzel a csoporttal: %2$s", + "%2$s shared %1$s with %3$s" : "%2$s megosztotta ezt: %1$s, ővele: %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s megosztotta ezt: %1$s, ezzel a csoporttal: %3$s", + "%2$s shared %1$s via link" : "%2$s megosztotta ezt: %1$s, hivatkozással", "%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s", "You shared %1$s via link" : "Megosztottam link segítségével: %1$s", + "Downloaded via public link" : "Letöltve publikus hivatkozással", + "Shared with %2$s" : "Megosztva vele: %2$s", + "Shared with group %2$s" : "Megosztva ezzel a csoporttal: %2$s", + "Shared with %3$s by %2$s" : "Megosztva vele: %3$s, megosztó: %2$s", + "Shared with group %3$s by %2$s" : "Megosztva ezzel a csoporttal: %3$s, megosztó: %2$s", + "Shared via link by %2$s" : "Megosztva hivatkozással: %2$s", + "Shared by %2$s" : "Megosztó: %2$s", + "Shared via public link" : "Megosztva publikus hivatkozással", "Shares" : "Megosztások", + "You received %2$s as a remote share from %1$s" : "Kaptál egy távoli megosztást: %2$s, innen: %1$s", "Accept" : "Elfogadás", "Decline" : "Elutasítás", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s", diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json index e9037d232b0..a2e15c46c52 100644 --- a/apps/files_sharing/l10n/hu_HU.json +++ b/apps/files_sharing/l10n/hu_HU.json @@ -36,9 +36,21 @@ "Public shared file %1$s was downloaded" : "Nyilvánosan megosztott fálj %1$s le lett töltve", "You shared %1$s with %2$s" : "%1$s-t megosztottam ővele: %2$s", "You shared %1$s with group %2$s" : "%1$s-t megosztottam ezzel a csoporttal: %2$s", + "%2$s shared %1$s with %3$s" : "%2$s megosztotta ezt: %1$s, ővele: %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s megosztotta ezt: %1$s, ezzel a csoporttal: %3$s", + "%2$s shared %1$s via link" : "%2$s megosztotta ezt: %1$s, hivatkozással", "%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s", "You shared %1$s via link" : "Megosztottam link segítségével: %1$s", + "Downloaded via public link" : "Letöltve publikus hivatkozással", + "Shared with %2$s" : "Megosztva vele: %2$s", + "Shared with group %2$s" : "Megosztva ezzel a csoporttal: %2$s", + "Shared with %3$s by %2$s" : "Megosztva vele: %3$s, megosztó: %2$s", + "Shared with group %3$s by %2$s" : "Megosztva ezzel a csoporttal: %3$s, megosztó: %2$s", + "Shared via link by %2$s" : "Megosztva hivatkozással: %2$s", + "Shared by %2$s" : "Megosztó: %2$s", + "Shared via public link" : "Megosztva publikus hivatkozással", "Shares" : "Megosztások", + "You received %2$s as a remote share from %1$s" : "Kaptál egy távoli megosztást: %2$s, innen: %1$s", "Accept" : "Elfogadás", "Decline" : "Elutasítás", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s", diff --git a/apps/files_sharing/l10n/hy.js b/apps/files_sharing/l10n/hy.js index 10b9dfa1dd4..28de3fecd2e 100644 --- a/apps/files_sharing/l10n/hy.js +++ b/apps/files_sharing/l10n/hy.js @@ -1,6 +1,9 @@ OC.L10N.register( "files_sharing", { + "Cancel" : "Չեղարկել", + "Password" : "Գաղտնաբառ", + "Name" : "Անուն", "Download" : "Բեռնել" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/hy.json b/apps/files_sharing/l10n/hy.json index 1d9890db3d9..ca2bc14a120 100644 --- a/apps/files_sharing/l10n/hy.json +++ b/apps/files_sharing/l10n/hy.json @@ -1,4 +1,7 @@ { "translations": { + "Cancel" : "Չեղարկել", + "Password" : "Գաղտնաբառ", + "Name" : "Անուն", "Download" : "Բեռնել" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/id.js b/apps/files_sharing/l10n/id.js index d39d9e763f1..bfded66f7c6 100644 --- a/apps/files_sharing/l10n/id.js +++ b/apps/files_sharing/l10n/id.js @@ -38,9 +38,21 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Berkas berbagi publik %1$s telah diunduh", "You shared %1$s with %2$s" : "Anda membagikan %1$s dengan %2$s", "You shared %1$s with group %2$s" : "Anda membagikan %1$s dengan grup %2$s", + "%2$s shared %1$s with %3$s" : "%2$s berbagi %1$s kepada %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s berbagi %1$s kepada grup %3$s", + "%2$s shared %1$s via link" : "%2$s berbagi %1$s via tautan", "%2$s shared %1$s with you" : "%2$s membagikan %1$s dengan Anda", "You shared %1$s via link" : "Anda membagikan %1$s via tautan", + "Downloaded via public link" : "Diunduh via tautan publik", + "Shared with %2$s" : "Dibagikan kepada %2$s", + "Shared with group %2$s" : "Dibagikan kepada grup %2$s", + "Shared with %3$s by %2$s" : "Dibagikan kepada %3$s oleh %2$s", + "Shared with group %3$s by %2$s" : "Dibagikan kepada grup %3$s oleh %2$s", + "Shared via link by %2$s" : "Dibagikan via tautan oleh %2$s", + "Shared by %2$s" : "Dibagikan oleh %2$s", + "Shared via public link" : "Dibagikan via tautan publik", "Shares" : "Dibagikan", + "You received %2$s as a remote share from %1$s" : "Anda menerima %2$s sebagai berbagi remote dari %1$s", "Accept" : "Terima", "Decline" : "Tolak", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s", diff --git a/apps/files_sharing/l10n/id.json b/apps/files_sharing/l10n/id.json index 35b22b53346..b6e9297bcc9 100644 --- a/apps/files_sharing/l10n/id.json +++ b/apps/files_sharing/l10n/id.json @@ -36,9 +36,21 @@ "Public shared file %1$s was downloaded" : "Berkas berbagi publik %1$s telah diunduh", "You shared %1$s with %2$s" : "Anda membagikan %1$s dengan %2$s", "You shared %1$s with group %2$s" : "Anda membagikan %1$s dengan grup %2$s", + "%2$s shared %1$s with %3$s" : "%2$s berbagi %1$s kepada %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s berbagi %1$s kepada grup %3$s", + "%2$s shared %1$s via link" : "%2$s berbagi %1$s via tautan", "%2$s shared %1$s with you" : "%2$s membagikan %1$s dengan Anda", "You shared %1$s via link" : "Anda membagikan %1$s via tautan", + "Downloaded via public link" : "Diunduh via tautan publik", + "Shared with %2$s" : "Dibagikan kepada %2$s", + "Shared with group %2$s" : "Dibagikan kepada grup %2$s", + "Shared with %3$s by %2$s" : "Dibagikan kepada %3$s oleh %2$s", + "Shared with group %3$s by %2$s" : "Dibagikan kepada grup %3$s oleh %2$s", + "Shared via link by %2$s" : "Dibagikan via tautan oleh %2$s", + "Shared by %2$s" : "Dibagikan oleh %2$s", + "Shared via public link" : "Dibagikan via tautan publik", "Shares" : "Dibagikan", + "You received %2$s as a remote share from %1$s" : "Anda menerima %2$s sebagai berbagi remote dari %1$s", "Accept" : "Terima", "Decline" : "Tolak", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s", diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js index d6fcab9c788..8cd66b34d24 100644 --- a/apps/files_sharing/l10n/it.js +++ b/apps/files_sharing/l10n/it.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "%2$s ha condiviso %1$s tramite collegamento", "%2$s shared %1$s with you" : "%2$s ha condiviso %1$s con te", "You shared %1$s via link" : "Hai condiviso %1$s tramite collegamento", + "Downloaded via public link" : "Scaricata tramite collegamento pubblico", + "Shared with %2$s" : "Condivisa con %2$s", + "Shared with group %2$s" : "Condivisa con il gruppo %2$s", + "Shared with %3$s by %2$s" : "Condivisa con %3$s da %2$s", + "Shared with group %3$s by %2$s" : "Condivisa con il gruppo %3$s da %2$s", + "Shared via link by %2$s" : "Condivisa tramite collegamento da %2$s", + "Shared by %2$s" : "Condivisa da %2$s", + "Shared via public link" : "Condivisa tramite collegamento pubblico", "Shares" : "Condivisioni", "You received %2$s as a remote share from %1$s" : "Hai ricevuto %2$s come condivisione remota da %1$s", "Accept" : "Accetta", diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json index 1ae87296032..b93dafd7555 100644 --- a/apps/files_sharing/l10n/it.json +++ b/apps/files_sharing/l10n/it.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "%2$s ha condiviso %1$s tramite collegamento", "%2$s shared %1$s with you" : "%2$s ha condiviso %1$s con te", "You shared %1$s via link" : "Hai condiviso %1$s tramite collegamento", + "Downloaded via public link" : "Scaricata tramite collegamento pubblico", + "Shared with %2$s" : "Condivisa con %2$s", + "Shared with group %2$s" : "Condivisa con il gruppo %2$s", + "Shared with %3$s by %2$s" : "Condivisa con %3$s da %2$s", + "Shared with group %3$s by %2$s" : "Condivisa con il gruppo %3$s da %2$s", + "Shared via link by %2$s" : "Condivisa tramite collegamento da %2$s", + "Shared by %2$s" : "Condivisa da %2$s", + "Shared via public link" : "Condivisa tramite collegamento pubblico", "Shares" : "Condivisioni", "You received %2$s as a remote share from %1$s" : "Hai ricevuto %2$s come condivisione remota da %1$s", "Accept" : "Accetta", diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js index 413f4a2ac8c..d2e3bc9b263 100644 --- a/apps/files_sharing/l10n/ja.js +++ b/apps/files_sharing/l10n/ja.js @@ -67,6 +67,7 @@ OC.L10N.register( "Federated Cloud" : "クラウド連携", "Your Federated Cloud ID:" : "あなたのクラウド連携ID:", "Share it:" : "以下で共有:", + "Add to your website" : "ウェブサイトに追加", "Share with me via ownCloud" : "OwnCloud経由で共有", "HTML Code:" : "HTMLコード:" }, diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json index 65d762871de..16ca792e33d 100644 --- a/apps/files_sharing/l10n/ja.json +++ b/apps/files_sharing/l10n/ja.json @@ -65,6 +65,7 @@ "Federated Cloud" : "クラウド連携", "Your Federated Cloud ID:" : "あなたのクラウド連携ID:", "Share it:" : "以下で共有:", + "Add to your website" : "ウェブサイトに追加", "Share with me via ownCloud" : "OwnCloud経由で共有", "HTML Code:" : "HTMLコード:" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files_sharing/l10n/ko.js b/apps/files_sharing/l10n/ko.js index e4b86b528f3..19eea24e97c 100644 --- a/apps/files_sharing/l10n/ko.js +++ b/apps/files_sharing/l10n/ko.js @@ -38,9 +38,21 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "공개 공유 파일 %1$s이(가) 다운로드됨", "You shared %1$s with %2$s" : "내가 %2$s 님과 %1$s을(를) 공유함", "You shared %1$s with group %2$s" : "내가 %2$s 그룹과 %1$s을(를) 공유함", + "%2$s shared %1$s with %3$s" : "%2$s 님이 %1$s을(를) %3$s 님과 공유함", + "%2$s shared %1$s with group %3$s" : "%2$s 님이 %1$s을(를) %3$s 그룹과 공유함", + "%2$s shared %1$s via link" : "%2$s 님이 %1$s을(를) 링크로 공유함", "%2$s shared %1$s with you" : "%2$s 님이 내게 %1$s을(를) 공유함", "You shared %1$s via link" : "내가 %1$s을(를) 링크로 공유함", + "Downloaded via public link" : "공개 링크로 다운로드", + "Shared with %2$s" : "%2$s 님과 공유함", + "Shared with group %2$s" : "%2$s 그룹과 공유함", + "Shared with %3$s by %2$s" : "%2$s 님이 %3$s 님과 공유함", + "Shared with group %3$s by %2$s" : "%2$s 님이 %3$s 그룹과 공유함", + "Shared via link by %2$s" : "%2$s 님이 링크로 공유함", + "Shared by %2$s" : "%2$s 님이 공유함", + "Shared via public link" : "공개 링크로 공유함", "Shares" : "공유", + "You received %2$s as a remote share from %1$s" : "%1$s의 원격 공유로 %2$s을(를) 받았습니다", "Accept" : "수락", "Decline" : "거절", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: %s", diff --git a/apps/files_sharing/l10n/ko.json b/apps/files_sharing/l10n/ko.json index 383e5038f3c..dd7e398c15c 100644 --- a/apps/files_sharing/l10n/ko.json +++ b/apps/files_sharing/l10n/ko.json @@ -36,9 +36,21 @@ "Public shared file %1$s was downloaded" : "공개 공유 파일 %1$s이(가) 다운로드됨", "You shared %1$s with %2$s" : "내가 %2$s 님과 %1$s을(를) 공유함", "You shared %1$s with group %2$s" : "내가 %2$s 그룹과 %1$s을(를) 공유함", + "%2$s shared %1$s with %3$s" : "%2$s 님이 %1$s을(를) %3$s 님과 공유함", + "%2$s shared %1$s with group %3$s" : "%2$s 님이 %1$s을(를) %3$s 그룹과 공유함", + "%2$s shared %1$s via link" : "%2$s 님이 %1$s을(를) 링크로 공유함", "%2$s shared %1$s with you" : "%2$s 님이 내게 %1$s을(를) 공유함", "You shared %1$s via link" : "내가 %1$s을(를) 링크로 공유함", + "Downloaded via public link" : "공개 링크로 다운로드", + "Shared with %2$s" : "%2$s 님과 공유함", + "Shared with group %2$s" : "%2$s 그룹과 공유함", + "Shared with %3$s by %2$s" : "%2$s 님이 %3$s 님과 공유함", + "Shared with group %3$s by %2$s" : "%2$s 님이 %3$s 그룹과 공유함", + "Shared via link by %2$s" : "%2$s 님이 링크로 공유함", + "Shared by %2$s" : "%2$s 님이 공유함", + "Shared via public link" : "공개 링크로 공유함", "Shares" : "공유", + "You received %2$s as a remote share from %1$s" : "%1$s의 원격 공유로 %2$s을(를) 받았습니다", "Accept" : "수락", "Decline" : "거절", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: %s", diff --git a/apps/files_sharing/l10n/nds.js b/apps/files_sharing/l10n/nds.js new file mode 100644 index 00000000000..e263ab143a8 --- /dev/null +++ b/apps/files_sharing/l10n/nds.js @@ -0,0 +1,8 @@ +OC.L10N.register( + "files_sharing", + { + "Cancel" : "Abbrechen", + "Password" : "Passwort", + "Name" : "Name" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/nds.json b/apps/files_sharing/l10n/nds.json new file mode 100644 index 00000000000..15e6870cb0e --- /dev/null +++ b/apps/files_sharing/l10n/nds.json @@ -0,0 +1,6 @@ +{ "translations": { + "Cancel" : "Abbrechen", + "Password" : "Passwort", + "Name" : "Name" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js index f1edae5f8eb..7b31b7c73e2 100644 --- a/apps/files_sharing/l10n/nl.js +++ b/apps/files_sharing/l10n/nl.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "%2$s deelde %1$s via link", "%2$s shared %1$s with you" : "%2$s deelde %1$s met u", "You shared %1$s via link" : "U deelde %1$s via link", + "Downloaded via public link" : "Gedownload via een openbare link", + "Shared with %2$s" : "Gedeeld met %2$s", + "Shared with group %2$s" : "Gedeeld met groep %2$s", + "Shared with %3$s by %2$s" : "Gedeeld met %3$s door %2$s", + "Shared with group %3$s by %2$s" : "Gedeeld met groep %3$s door %2$s", + "Shared via link by %2$s" : "Gedeeld via link door %2$s", + "Shared by %2$s" : "Gedeeld door %2$s", + "Shared via public link" : "Gedeeld via een openbare link", "Shares" : "Gedeeld", "You received %2$s as a remote share from %1$s" : "U ontving %2$s als een externe share van %1$s", "Accept" : "Accepteren", diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json index a285071ca30..92ba1c04268 100644 --- a/apps/files_sharing/l10n/nl.json +++ b/apps/files_sharing/l10n/nl.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "%2$s deelde %1$s via link", "%2$s shared %1$s with you" : "%2$s deelde %1$s met u", "You shared %1$s via link" : "U deelde %1$s via link", + "Downloaded via public link" : "Gedownload via een openbare link", + "Shared with %2$s" : "Gedeeld met %2$s", + "Shared with group %2$s" : "Gedeeld met groep %2$s", + "Shared with %3$s by %2$s" : "Gedeeld met %3$s door %2$s", + "Shared with group %3$s by %2$s" : "Gedeeld met groep %3$s door %2$s", + "Shared via link by %2$s" : "Gedeeld via link door %2$s", + "Shared by %2$s" : "Gedeeld door %2$s", + "Shared via public link" : "Gedeeld via een openbare link", "Shares" : "Gedeeld", "You received %2$s as a remote share from %1$s" : "U ontving %2$s als een externe share van %1$s", "Accept" : "Accepteren", diff --git a/apps/files_sharing/l10n/oc.js b/apps/files_sharing/l10n/oc.js index 51378911814..54924e11121 100644 --- a/apps/files_sharing/l10n/oc.js +++ b/apps/files_sharing/l10n/oc.js @@ -1,12 +1,79 @@ OC.L10N.register( "files_sharing", { - "Cancel" : "Annula", + "Server to server sharing is not enabled on this server" : "Lo partiment de servidor a servidor es pas activat sus aqueste servidor", + "The mountpoint name contains invalid characters." : "Lo nom del punt de montatge conten de caractèrs invalids.", + "Invalid or untrusted SSL certificate" : "Certificat SSL invalid o pas fisable", + "Could not authenticate to remote share, password might be wrong" : "Impossible de s'autentificar al partiment distant : lo senhal es probablament incorrècte", + "Storage not valid" : "Supòrt d'emmagazinatge invalid", + "Couldn't add remote share" : "Impossible d'apondre lo partiment distant", + "Shared with you" : "Partejats amb vos", + "Shared with others" : "Partejats amb d'autres", + "Shared by link" : "Partejats per ligam", + "Nothing shared with you yet" : "Cap de fichièr es pas partejat amb vos pel moment", + "Files and folders others share with you will show up here" : "Los fichièrs e dorsièrs partejats amb vos apareisseràn aicí", + "Nothing shared yet" : "Res es pas partejat pel moment", + "Files and folders you share will show up here" : "Los fichièrs e dorsièrs que partejatz apareisseràn aicí", + "No shared links" : "Pas cap de partiment per ligam", + "Files and folders you share by link will show up here" : "Los fichièrs e dorsièrs que partejatz per ligam apareisseràn aicí", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Volètz apondre lo partiment distant {name} de {owner}@{remote} ?", + "Remote share" : "Partiment distant", + "Remote share password" : "Senhal del partiment distant", + "Cancel" : "Anullar", + "Add remote share" : "Apondre un partiment distant", + "You can upload into this folder" : "Podètz mandar dins aqueste dorsièr", + "No ownCloud installation (7 or higher) found at {remote}" : "Cap d'installacion ownCloud (7 o superior) pas trobada sus {remote}", + "Invalid ownCloud url" : "URL ownCloud invalida", + "Shared by" : "Partejat per", "Sharing" : "Partiment", + "A file or folder has been <strong>shared</strong>" : "Un fichièr o un repertòri es estat <strong>partejat</strong>", + "A file or folder was shared from <strong>another server</strong>" : "Un fichièr o un repertòri es estat partejat depuis <strong>un autre servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Un fichièr o un repertòri partejat publicament es estat <strong>telecargat</strong>", + "You received a new remote share %2$s from %1$s" : "L'utilizaire %1$s a partejat la ressorsa distanta %2$s amb vos", + "You received a new remote share from %s" : "Avètz recebut un partiment distant de %s", + "%1$s accepted remote share %2$s" : "%1$s a acceptat lo partiment distant %2$s", + "%1$s declined remote share %2$s" : "%1$s a refusat lo partiment distant %2$s", + "%1$s unshared %2$s from you" : "%1$s a daissat de partejar %2$s amb vos", + "Public shared folder %1$s was downloaded" : "Lo dorsièr public %1$s es estat telecargat", + "Public shared file %1$s was downloaded" : "Lo fichièr public %1$s es estat telecargat", + "You shared %1$s with %2$s" : "Avètz partejat %1$s amb %2$s", + "You shared %1$s with group %2$s" : "Avètz partejat %1$s amb lo grop %2$s", + "%2$s shared %1$s with %3$s" : "%2$s partejat %1$s amb %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s partejat %1$s amb lo grop %3$s", + "%2$s shared %1$s via link" : "%2$s a partejat %1$s per ligam public", + "%2$s shared %1$s with you" : "%2$s a partejat %1$s amb vos", + "You shared %1$s via link" : "Avètz partejat %1$s per ligam public", + "Shares" : "Partiments", + "You received %2$s as a remote share from %1$s" : "Avètz recebut %2$s en tant que partiment distant per %1$s", + "Accept" : "Acceptar", + "Decline" : "Refusar", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud", + "This share is password-protected" : "Aqueste partiment es protegit per un senhal", + "The password is wrong. Try again." : "Lo senhal es incorrècte. Ensajatz tornamai.", "Password" : "Senhal", "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr", "Name" : "Nom", - "Download" : "Avalcarga", - "Open documentation" : "Veire la documentacion" + "Share time" : "Data de partiment", + "Sorry, this link doesn’t seem to work anymore." : "O planhèm, mas sembla qu'aqueste ligam fonciona pas mai.", + "Reasons might be:" : "Las rasons pòdon èsser :", + "the item was removed" : "l'element es estat suprimit", + "the link expired" : "lo ligam a expirat", + "sharing is disabled" : "lo partiment es desactivat", + "For more info, please ask the person who sent this link." : "Per mai d'informacions, contactatz la persona qu'a mandat aqueste ligam.", + "Add to your ownCloud" : "Apondre a vòstre ownCloud", + "Download" : "Telecargar", + "Download %s" : "Telecargar %s", + "Direct link" : "Ligam dirècte", + "Federated Cloud Sharing" : "Federated Cloud Sharing", + "Open documentation" : "Veire la documentacion", + "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors", + "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors", + "Federated Cloud" : "Federated Cloud", + "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :", + "Share it:" : "Partejar :", + "Add to your website" : "Apondre a vòstre site web", + "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud", + "HTML Code:" : "Còde HTML :" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_sharing/l10n/oc.json b/apps/files_sharing/l10n/oc.json index 1dc1272a31f..2194f0aa1d2 100644 --- a/apps/files_sharing/l10n/oc.json +++ b/apps/files_sharing/l10n/oc.json @@ -1,10 +1,77 @@ { "translations": { - "Cancel" : "Annula", + "Server to server sharing is not enabled on this server" : "Lo partiment de servidor a servidor es pas activat sus aqueste servidor", + "The mountpoint name contains invalid characters." : "Lo nom del punt de montatge conten de caractèrs invalids.", + "Invalid or untrusted SSL certificate" : "Certificat SSL invalid o pas fisable", + "Could not authenticate to remote share, password might be wrong" : "Impossible de s'autentificar al partiment distant : lo senhal es probablament incorrècte", + "Storage not valid" : "Supòrt d'emmagazinatge invalid", + "Couldn't add remote share" : "Impossible d'apondre lo partiment distant", + "Shared with you" : "Partejats amb vos", + "Shared with others" : "Partejats amb d'autres", + "Shared by link" : "Partejats per ligam", + "Nothing shared with you yet" : "Cap de fichièr es pas partejat amb vos pel moment", + "Files and folders others share with you will show up here" : "Los fichièrs e dorsièrs partejats amb vos apareisseràn aicí", + "Nothing shared yet" : "Res es pas partejat pel moment", + "Files and folders you share will show up here" : "Los fichièrs e dorsièrs que partejatz apareisseràn aicí", + "No shared links" : "Pas cap de partiment per ligam", + "Files and folders you share by link will show up here" : "Los fichièrs e dorsièrs que partejatz per ligam apareisseràn aicí", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Volètz apondre lo partiment distant {name} de {owner}@{remote} ?", + "Remote share" : "Partiment distant", + "Remote share password" : "Senhal del partiment distant", + "Cancel" : "Anullar", + "Add remote share" : "Apondre un partiment distant", + "You can upload into this folder" : "Podètz mandar dins aqueste dorsièr", + "No ownCloud installation (7 or higher) found at {remote}" : "Cap d'installacion ownCloud (7 o superior) pas trobada sus {remote}", + "Invalid ownCloud url" : "URL ownCloud invalida", + "Shared by" : "Partejat per", "Sharing" : "Partiment", + "A file or folder has been <strong>shared</strong>" : "Un fichièr o un repertòri es estat <strong>partejat</strong>", + "A file or folder was shared from <strong>another server</strong>" : "Un fichièr o un repertòri es estat partejat depuis <strong>un autre servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Un fichièr o un repertòri partejat publicament es estat <strong>telecargat</strong>", + "You received a new remote share %2$s from %1$s" : "L'utilizaire %1$s a partejat la ressorsa distanta %2$s amb vos", + "You received a new remote share from %s" : "Avètz recebut un partiment distant de %s", + "%1$s accepted remote share %2$s" : "%1$s a acceptat lo partiment distant %2$s", + "%1$s declined remote share %2$s" : "%1$s a refusat lo partiment distant %2$s", + "%1$s unshared %2$s from you" : "%1$s a daissat de partejar %2$s amb vos", + "Public shared folder %1$s was downloaded" : "Lo dorsièr public %1$s es estat telecargat", + "Public shared file %1$s was downloaded" : "Lo fichièr public %1$s es estat telecargat", + "You shared %1$s with %2$s" : "Avètz partejat %1$s amb %2$s", + "You shared %1$s with group %2$s" : "Avètz partejat %1$s amb lo grop %2$s", + "%2$s shared %1$s with %3$s" : "%2$s partejat %1$s amb %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s partejat %1$s amb lo grop %3$s", + "%2$s shared %1$s via link" : "%2$s a partejat %1$s per ligam public", + "%2$s shared %1$s with you" : "%2$s a partejat %1$s amb vos", + "You shared %1$s via link" : "Avètz partejat %1$s per ligam public", + "Shares" : "Partiments", + "You received %2$s as a remote share from %1$s" : "Avètz recebut %2$s en tant que partiment distant per %1$s", + "Accept" : "Acceptar", + "Decline" : "Refusar", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud", + "This share is password-protected" : "Aqueste partiment es protegit per un senhal", + "The password is wrong. Try again." : "Lo senhal es incorrècte. Ensajatz tornamai.", "Password" : "Senhal", "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr", "Name" : "Nom", - "Download" : "Avalcarga", - "Open documentation" : "Veire la documentacion" + "Share time" : "Data de partiment", + "Sorry, this link doesn’t seem to work anymore." : "O planhèm, mas sembla qu'aqueste ligam fonciona pas mai.", + "Reasons might be:" : "Las rasons pòdon èsser :", + "the item was removed" : "l'element es estat suprimit", + "the link expired" : "lo ligam a expirat", + "sharing is disabled" : "lo partiment es desactivat", + "For more info, please ask the person who sent this link." : "Per mai d'informacions, contactatz la persona qu'a mandat aqueste ligam.", + "Add to your ownCloud" : "Apondre a vòstre ownCloud", + "Download" : "Telecargar", + "Download %s" : "Telecargar %s", + "Direct link" : "Ligam dirècte", + "Federated Cloud Sharing" : "Federated Cloud Sharing", + "Open documentation" : "Veire la documentacion", + "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors", + "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors", + "Federated Cloud" : "Federated Cloud", + "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :", + "Share it:" : "Partejar :", + "Add to your website" : "Apondre a vòstre site web", + "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud", + "HTML Code:" : "Còde HTML :" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ 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 cb167dfb5a4..d2dac6d5955 100644 --- a/apps/files_sharing/l10n/pt_BR.js +++ b/apps/files_sharing/l10n/pt_BR.js @@ -43,6 +43,14 @@ OC.L10N.register( "%2$s shared %1$s via link" : "%2$s compartilhado via link %1$s", "%2$s shared %1$s with you" : "%2$s compartilhou %1$s com você", "You shared %1$s via link" : "Você compartilhou %1$s via link", + "Downloaded via public link" : "Baixar via link público", + "Shared with %2$s" : "Compartilhado com %2$s", + "Shared with group %2$s" : "Compartilhado com o grupo %2$s", + "Shared with %3$s by %2$s" : "Compartilhado com %3$s por %2$s", + "Shared with group %3$s by %2$s" : "Compartilhado com o grupo %3$s por %2$s", + "Shared via link by %2$s" : "Compartilhado via link por %2$s", + "Shared by %2$s" : "Compartilhado por %2$s", + "Shared via public link" : "Compartilhado via link público", "Shares" : "Compartilhamentos", "You received %2$s as a remote share from %1$s" : "Você recebeu %2$s como um compartilhamento remoto de %1$s", "Accept" : "Aceitar", diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json index b42a56f03ce..e64c07ff8e0 100644 --- a/apps/files_sharing/l10n/pt_BR.json +++ b/apps/files_sharing/l10n/pt_BR.json @@ -41,6 +41,14 @@ "%2$s shared %1$s via link" : "%2$s compartilhado via link %1$s", "%2$s shared %1$s with you" : "%2$s compartilhou %1$s com você", "You shared %1$s via link" : "Você compartilhou %1$s via link", + "Downloaded via public link" : "Baixar via link público", + "Shared with %2$s" : "Compartilhado com %2$s", + "Shared with group %2$s" : "Compartilhado com o grupo %2$s", + "Shared with %3$s by %2$s" : "Compartilhado com %3$s por %2$s", + "Shared with group %3$s by %2$s" : "Compartilhado com o grupo %3$s por %2$s", + "Shared via link by %2$s" : "Compartilhado via link por %2$s", + "Shared by %2$s" : "Compartilhado por %2$s", + "Shared via public link" : "Compartilhado via link público", "Shares" : "Compartilhamentos", "You received %2$s as a remote share from %1$s" : "Você recebeu %2$s como um compartilhamento remoto de %1$s", "Accept" : "Aceitar", diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index 2d89b5e3102..1a84d10ecea 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -38,10 +38,23 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Общий файл %1$s, был скачан", "You shared %1$s with %2$s" : "Вы поделились %1$s с %2$s", "You shared %1$s with group %2$s" : "Вы поделились %1$s с группой %2$s", + "%2$s shared %1$s with %3$s" : "%2$s поделился %1$s с %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s поделился %1$s с группой %3$s", + "%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке", "%2$s shared %1$s with you" : "%2$s поделился с вами %1$s", "You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки", + "Downloaded via public link" : "Загружено по открытой ссылке", + "Shared with %2$s" : "Поделился с %2$s", + "Shared with group %2$s" : "Поделился с группой %2$s", + "Shared with %3$s by %2$s" : "Поделился %2$s с %3$s", + "Shared with group %3$s by %2$s" : "Поделился %2$s с группой %3$s", + "Shared via link by %2$s" : "Поделился ссылкой %2$s", + "Shared by %2$s" : "Поделился %2$s", + "Shared via public link" : "Поделился открытой ссылкой", "Shares" : "События обмена файлами", + "You received %2$s as a remote share from %1$s" : "Вы получили %2$s через удаленный общий ресурс %1$s", "Accept" : "Принять", + "Decline" : "Отклонить", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s", "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ", "This share is password-protected" : "Общий ресурс защищен паролем", @@ -67,6 +80,7 @@ OC.L10N.register( "Federated Cloud" : "Объединение облачных хранилищ", "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:", "Share it:" : "Поделись этим:", + "Add to your website" : "Добавить к себе на сайт", "Share with me via ownCloud" : "Поделитесь мной через ownCloud", "HTML Code:" : "HTML код:" }, diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index 0f7a152f536..401896709d6 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -36,10 +36,23 @@ "Public shared file %1$s was downloaded" : "Общий файл %1$s, был скачан", "You shared %1$s with %2$s" : "Вы поделились %1$s с %2$s", "You shared %1$s with group %2$s" : "Вы поделились %1$s с группой %2$s", + "%2$s shared %1$s with %3$s" : "%2$s поделился %1$s с %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s поделился %1$s с группой %3$s", + "%2$s shared %1$s via link" : "%2$s поделился %1$s по ссылке", "%2$s shared %1$s with you" : "%2$s поделился с вами %1$s", "You shared %1$s via link" : "Вы поделились %1$s с помощью ссылки", + "Downloaded via public link" : "Загружено по открытой ссылке", + "Shared with %2$s" : "Поделился с %2$s", + "Shared with group %2$s" : "Поделился с группой %2$s", + "Shared with %3$s by %2$s" : "Поделился %2$s с %3$s", + "Shared with group %3$s by %2$s" : "Поделился %2$s с группой %3$s", + "Shared via link by %2$s" : "Поделился ссылкой %2$s", + "Shared by %2$s" : "Поделился %2$s", + "Shared via public link" : "Поделился открытой ссылкой", "Shares" : "События обмена файлами", + "You received %2$s as a remote share from %1$s" : "Вы получили %2$s через удаленный общий ресурс %1$s", "Accept" : "Принять", + "Decline" : "Отклонить", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s", "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ", "This share is password-protected" : "Общий ресурс защищен паролем", @@ -65,6 +78,7 @@ "Federated Cloud" : "Объединение облачных хранилищ", "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:", "Share it:" : "Поделись этим:", + "Add to your website" : "Добавить к себе на сайт", "Share with me via ownCloud" : "Поделитесь мной через ownCloud", "HTML Code:" : "HTML код:" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" diff --git a/apps/files_sharing/l10n/sk_SK.js b/apps/files_sharing/l10n/sk_SK.js index 4d596987963..1f109b739e5 100644 --- a/apps/files_sharing/l10n/sk_SK.js +++ b/apps/files_sharing/l10n/sk_SK.js @@ -38,9 +38,13 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Verejne zdieľaný súbor %1$s bol stiahnutý", "You shared %1$s with %2$s" : "Bol zdieľaný %1$s s %2$s", "You shared %1$s with group %2$s" : "Bol zdieľaný %1$s so skupinou %2$s", + "%2$s shared %1$s with %3$s" : "%2$s zdieľané %1$s s %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s zdieľané %1$s so skupinou %3$s", + "%2$s shared %1$s via link" : "%2$s zdieľané %1$s pomocou linky", "%2$s shared %1$s with you" : "%2$s vám zdieľal %1$s", "You shared %1$s via link" : "Zdieľate %1$s prostredníctvom odkazu", "Shares" : "Zdieľanie", + "You received %2$s as a remote share from %1$s" : "Dostali ste %2$s, ako vzdialené zdieľanie od %1$s", "Accept" : "Schváliť", "Decline" : "Odmietnuť", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s", diff --git a/apps/files_sharing/l10n/sk_SK.json b/apps/files_sharing/l10n/sk_SK.json index e8468d1500e..dab3d4105c4 100644 --- a/apps/files_sharing/l10n/sk_SK.json +++ b/apps/files_sharing/l10n/sk_SK.json @@ -36,9 +36,13 @@ "Public shared file %1$s was downloaded" : "Verejne zdieľaný súbor %1$s bol stiahnutý", "You shared %1$s with %2$s" : "Bol zdieľaný %1$s s %2$s", "You shared %1$s with group %2$s" : "Bol zdieľaný %1$s so skupinou %2$s", + "%2$s shared %1$s with %3$s" : "%2$s zdieľané %1$s s %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s zdieľané %1$s so skupinou %3$s", + "%2$s shared %1$s via link" : "%2$s zdieľané %1$s pomocou linky", "%2$s shared %1$s with you" : "%2$s vám zdieľal %1$s", "You shared %1$s via link" : "Zdieľate %1$s prostredníctvom odkazu", "Shares" : "Zdieľanie", + "You received %2$s as a remote share from %1$s" : "Dostali ste %2$s, ako vzdialené zdieľanie od %1$s", "Accept" : "Schváliť", "Decline" : "Odmietnuť", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s", diff --git a/apps/files_sharing/l10n/sq.js b/apps/files_sharing/l10n/sq.js index c5933a0fa5e..413214d58de 100644 --- a/apps/files_sharing/l10n/sq.js +++ b/apps/files_sharing/l10n/sq.js @@ -1,26 +1,84 @@ OC.L10N.register( "files_sharing", { - "Cancel" : "Anullo", + "Server to server sharing is not enabled on this server" : "Ndarja mes shërbyesish s’është e aktivizuar në këtë shërbyes", + "The mountpoint name contains invalid characters." : "Emri i pikës së montimit përmban shenja të pavlefshme.", + "Invalid or untrusted SSL certificate" : "Dëshmi SSL e pavlefshme ose e pabesuar", + "Could not authenticate to remote share, password might be wrong" : "S’bëri dot mirëfilltësimin te ndarja e largët, fjalëkalimi mund të jetë i gabuar", + "Storage not valid" : "Depozitë jo e vlefshme", + "Couldn't add remote share" : "S’shtoi dotë ndarje të largët", + "Shared with you" : "Të ndara me ju", + "Shared with others" : "Të ndara me të tjerët", + "Shared by link" : "Të ndara me lidhje", + "Nothing shared with you yet" : "Ende pa ndarë gjë me ju", + "Files and folders others share with you will show up here" : "Këtu do të shfaqen kartelat dhe dosjet që të jerët ndajnë me ju", + "Nothing shared yet" : "Ende pa ndarë gjë", + "Files and folders you share will show up here" : "Këtu do të shfaqen kartelat dhe dosjet që ndani me të tjerët", + "No shared links" : "Pa lidhje ndarjesh", + "Files and folders you share by link will show up here" : "Këtu do të shfaqen kartelat dhe dosjet që ndani përmes lidhjesh", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Doni të shtohet ndarja e largët {name} nga {owner}@{remote}?", + "Remote share" : "Ndarje e largët", + "Remote share password" : "Fjalëkalim ndarjeje të largët", + "Cancel" : "Anuloje", + "Add remote share" : "Shtoni ndarje të largët", + "You can upload into this folder" : "Mund të ngarkoni te kjo dosje", + "No ownCloud installation (7 or higher) found at {remote}" : "Te {remote} s’u gjet instalim ownCloud (7 ose më sipër)", + "Invalid ownCloud url" : "URL ownCloud e pavlefshme", "Shared by" : "Ndarë nga", "Sharing" : "Ndarje", - "A file or folder has been <strong>shared</strong>" : "Një skedar ose dosje është <strong>ndarë</strong>", - "You shared %1$s with %2$s" : "Ju ndatë %1$s me %2$s", - "You shared %1$s with group %2$s" : "Ju ndatë %1$s me grupin %2$s", + "A file or folder has been <strong>shared</strong>" : "U <strong>nda me të tjerë</strong> një kartelë ose dosje", + "A file or folder was shared from <strong>another server</strong>" : "Një kartelë ose dosje u nda prej një <strong>shërbyesi tjetër</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "<strong>U shkarkua</strong> një kartelë ose dosje e ndarë me të tjerët publikisht", + "You received a new remote share %2$s from %1$s" : "Morët një ndarje të largët %2$s nga %1$s", + "You received a new remote share from %s" : "Morët një ndarje të largët nga %s", + "%1$s accepted remote share %2$s" : "%1$s pranoi ndarjen e largët %2$s", + "%1$s declined remote share %2$s" : "%1$s hodhi tej ndarjen e largët %2$s", + "Public shared folder %1$s was downloaded" : "U shkarkua dosja e ndarë publikisht %1$s", + "Public shared file %1$s was downloaded" : "U shkarkua kartela e ndarë publikisht %1$s", + "You shared %1$s with %2$s" : "Ndatë %1$s me %2$s", + "You shared %1$s with group %2$s" : "Ndatë %1$s me grupin %2$s", + "%2$s shared %1$s with %3$s" : "%2$s ndau %1$s me %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s ndau %1$s me grupin %3$s", + "%2$s shared %1$s via link" : "%2$s ndau %1$s përmes një lidhjeje", "%2$s shared %1$s with you" : "%2$s ndau %1$s me ju", - "You shared %1$s via link" : "Ju ndatë %1$s me lidhje", - "Shares" : "ndarjet", + "You shared %1$s via link" : "Ndatë %1$s përmes një lidhjeje", + "Downloaded via public link" : "Shkarkuar përmes një lidhjeje publike", + "Shared with %2$s" : "U nda me %2$s", + "Shared with group %2$s" : "U nda me grupin %2$s", + "Shared with %3$s by %2$s" : "U nda me %3$s nga %2$s", + "Shared with group %3$s by %2$s" : "U nda me grupin %3$s nga %2$s", + "Shared via link by %2$s" : "U nda përmes një lidhje nga %2$s", + "Shared by %2$s" : "U nda nga %2$s", + "Shared via public link" : "U nda përmes një lidhje publike", + "Shares" : "Ndarje", + "You received %2$s as a remote share from %1$s" : "%2$s e morët si një ndarje të largët prej %1$s", + "Accept" : "Pranoje", + "Decline" : "Hidhe poshtë", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud, shihni %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud", "This share is password-protected" : "Kjo pjesë është e mbrojtur me fjalëkalim", - "The password is wrong. Try again." : "Kodi është i gabuar. Provojeni përsëri.", - "Password" : "Kodi", - "Name" : "Emri", - "Sorry, this link doesn’t seem to work anymore." : "Ju kërkojmë ndjesë, kjo lidhje duket sikur nuk punon më.", + "The password is wrong. Try again." : "Fjalëkalimi është i gabuar. Riprovoni.", + "Password" : "Fjalëkalim", + "No entries found in this folder" : "S’u gjetën zëra në këtë dosje", + "Name" : "Emër", + "Share time" : "Kohë ndarjeje", + "Sorry, this link doesn’t seem to work anymore." : "Na ndjeni, kjo lidhje duket se nuk funksionon më.", "Reasons might be:" : "Arsyet mund të jenë:", - "the item was removed" : "elementi është eliminuar", + "the item was removed" : "objekti është hequr", "the link expired" : "lidhja ka skaduar", - "sharing is disabled" : "ndarja është çaktivizuar", - "For more info, please ask the person who sent this link." : "Për më shumë informacione, ju lutem pyesni personin që iu dërgoi këtë lidhje.", + "sharing is disabled" : "ndarjet janë çaktivizuar", + "For more info, please ask the person who sent this link." : "Për më shumë të dhëna, ju lutemi, pyetni personin që ju dërgoi këtë lidhje.", + "Add to your ownCloud" : "Shtojeni te ownCloud-i juaj", "Download" : "Shkarko", - "Direct link" : "Lidhje direkte" + "Download %s" : "Shkarko %s", + "Direct link" : "Lidhje e drejtpërdrejtë", + "Open documentation" : "Hap dokumentimin", + "Allow users on this server to send shares to other servers" : "Lejoju përdoruesve në këtë shërbyes të dërgojnë ndarje në shërbyes të tjerë", + "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë", + "Your Federated Cloud ID:" : "ID-ja juaj Federated Cloud:", + "Share it:" : "Ndajeni:", + "Add to your website" : "Shtojeni te sajti juaj", + "Share with me via ownCloud" : "Ndani me mua përmes ownCloud-it", + "HTML Code:" : "Kod HTML:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/sq.json b/apps/files_sharing/l10n/sq.json index e7c43d75aca..8722966f5da 100644 --- a/apps/files_sharing/l10n/sq.json +++ b/apps/files_sharing/l10n/sq.json @@ -1,24 +1,82 @@ { "translations": { - "Cancel" : "Anullo", + "Server to server sharing is not enabled on this server" : "Ndarja mes shërbyesish s’është e aktivizuar në këtë shërbyes", + "The mountpoint name contains invalid characters." : "Emri i pikës së montimit përmban shenja të pavlefshme.", + "Invalid or untrusted SSL certificate" : "Dëshmi SSL e pavlefshme ose e pabesuar", + "Could not authenticate to remote share, password might be wrong" : "S’bëri dot mirëfilltësimin te ndarja e largët, fjalëkalimi mund të jetë i gabuar", + "Storage not valid" : "Depozitë jo e vlefshme", + "Couldn't add remote share" : "S’shtoi dotë ndarje të largët", + "Shared with you" : "Të ndara me ju", + "Shared with others" : "Të ndara me të tjerët", + "Shared by link" : "Të ndara me lidhje", + "Nothing shared with you yet" : "Ende pa ndarë gjë me ju", + "Files and folders others share with you will show up here" : "Këtu do të shfaqen kartelat dhe dosjet që të jerët ndajnë me ju", + "Nothing shared yet" : "Ende pa ndarë gjë", + "Files and folders you share will show up here" : "Këtu do të shfaqen kartelat dhe dosjet që ndani me të tjerët", + "No shared links" : "Pa lidhje ndarjesh", + "Files and folders you share by link will show up here" : "Këtu do të shfaqen kartelat dhe dosjet që ndani përmes lidhjesh", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Doni të shtohet ndarja e largët {name} nga {owner}@{remote}?", + "Remote share" : "Ndarje e largët", + "Remote share password" : "Fjalëkalim ndarjeje të largët", + "Cancel" : "Anuloje", + "Add remote share" : "Shtoni ndarje të largët", + "You can upload into this folder" : "Mund të ngarkoni te kjo dosje", + "No ownCloud installation (7 or higher) found at {remote}" : "Te {remote} s’u gjet instalim ownCloud (7 ose më sipër)", + "Invalid ownCloud url" : "URL ownCloud e pavlefshme", "Shared by" : "Ndarë nga", "Sharing" : "Ndarje", - "A file or folder has been <strong>shared</strong>" : "Një skedar ose dosje është <strong>ndarë</strong>", - "You shared %1$s with %2$s" : "Ju ndatë %1$s me %2$s", - "You shared %1$s with group %2$s" : "Ju ndatë %1$s me grupin %2$s", + "A file or folder has been <strong>shared</strong>" : "U <strong>nda me të tjerë</strong> një kartelë ose dosje", + "A file or folder was shared from <strong>another server</strong>" : "Një kartelë ose dosje u nda prej një <strong>shërbyesi tjetër</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "<strong>U shkarkua</strong> një kartelë ose dosje e ndarë me të tjerët publikisht", + "You received a new remote share %2$s from %1$s" : "Morët një ndarje të largët %2$s nga %1$s", + "You received a new remote share from %s" : "Morët një ndarje të largët nga %s", + "%1$s accepted remote share %2$s" : "%1$s pranoi ndarjen e largët %2$s", + "%1$s declined remote share %2$s" : "%1$s hodhi tej ndarjen e largët %2$s", + "Public shared folder %1$s was downloaded" : "U shkarkua dosja e ndarë publikisht %1$s", + "Public shared file %1$s was downloaded" : "U shkarkua kartela e ndarë publikisht %1$s", + "You shared %1$s with %2$s" : "Ndatë %1$s me %2$s", + "You shared %1$s with group %2$s" : "Ndatë %1$s me grupin %2$s", + "%2$s shared %1$s with %3$s" : "%2$s ndau %1$s me %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s ndau %1$s me grupin %3$s", + "%2$s shared %1$s via link" : "%2$s ndau %1$s përmes një lidhjeje", "%2$s shared %1$s with you" : "%2$s ndau %1$s me ju", - "You shared %1$s via link" : "Ju ndatë %1$s me lidhje", - "Shares" : "ndarjet", + "You shared %1$s via link" : "Ndatë %1$s përmes një lidhjeje", + "Downloaded via public link" : "Shkarkuar përmes një lidhjeje publike", + "Shared with %2$s" : "U nda me %2$s", + "Shared with group %2$s" : "U nda me grupin %2$s", + "Shared with %3$s by %2$s" : "U nda me %3$s nga %2$s", + "Shared with group %3$s by %2$s" : "U nda me grupin %3$s nga %2$s", + "Shared via link by %2$s" : "U nda përmes një lidhje nga %2$s", + "Shared by %2$s" : "U nda nga %2$s", + "Shared via public link" : "U nda përmes një lidhje publike", + "Shares" : "Ndarje", + "You received %2$s as a remote share from %1$s" : "%2$s e morët si një ndarje të largët prej %1$s", + "Accept" : "Pranoje", + "Decline" : "Hidhe poshtë", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud, shihni %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud", "This share is password-protected" : "Kjo pjesë është e mbrojtur me fjalëkalim", - "The password is wrong. Try again." : "Kodi është i gabuar. Provojeni përsëri.", - "Password" : "Kodi", - "Name" : "Emri", - "Sorry, this link doesn’t seem to work anymore." : "Ju kërkojmë ndjesë, kjo lidhje duket sikur nuk punon më.", + "The password is wrong. Try again." : "Fjalëkalimi është i gabuar. Riprovoni.", + "Password" : "Fjalëkalim", + "No entries found in this folder" : "S’u gjetën zëra në këtë dosje", + "Name" : "Emër", + "Share time" : "Kohë ndarjeje", + "Sorry, this link doesn’t seem to work anymore." : "Na ndjeni, kjo lidhje duket se nuk funksionon më.", "Reasons might be:" : "Arsyet mund të jenë:", - "the item was removed" : "elementi është eliminuar", + "the item was removed" : "objekti është hequr", "the link expired" : "lidhja ka skaduar", - "sharing is disabled" : "ndarja është çaktivizuar", - "For more info, please ask the person who sent this link." : "Për më shumë informacione, ju lutem pyesni personin që iu dërgoi këtë lidhje.", + "sharing is disabled" : "ndarjet janë çaktivizuar", + "For more info, please ask the person who sent this link." : "Për më shumë të dhëna, ju lutemi, pyetni personin që ju dërgoi këtë lidhje.", + "Add to your ownCloud" : "Shtojeni te ownCloud-i juaj", "Download" : "Shkarko", - "Direct link" : "Lidhje direkte" + "Download %s" : "Shkarko %s", + "Direct link" : "Lidhje e drejtpërdrejtë", + "Open documentation" : "Hap dokumentimin", + "Allow users on this server to send shares to other servers" : "Lejoju përdoruesve në këtë shërbyes të dërgojnë ndarje në shërbyes të tjerë", + "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë", + "Your Federated Cloud ID:" : "ID-ja juaj Federated Cloud:", + "Share it:" : "Ndajeni:", + "Add to your website" : "Shtojeni te sajti juaj", + "Share with me via ownCloud" : "Ndani me mua përmes ownCloud-it", + "HTML Code:" : "Kod HTML:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/th_TH.js b/apps/files_sharing/l10n/th_TH.js index 07aa56dfe18..b1400469af8 100644 --- a/apps/files_sharing/l10n/th_TH.js +++ b/apps/files_sharing/l10n/th_TH.js @@ -38,8 +38,19 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "ไฟล์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด", "You shared %1$s with %2$s" : "คุณแชร์ %1$s กับ %2$s", "You shared %1$s with group %2$s" : "คุณแชร์ %1$s กับกลุ่ม %2$s", + "%2$s shared %1$s with %3$s" : "%2$s ได้แชร์ %1$s กับ %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s ได้แชร์ %1$s กับกลุ่ม %3$s", + "%2$s shared %1$s via link" : "%2$s ได้แชร์ %1$s ผ่านลิงค์", "%2$s shared %1$s with you" : "%2$s ถูกแชร์ %1$s กับคุณ", "You shared %1$s via link" : "คุณแชร์ %1$s ผ่านลิงค์", + "Downloaded via public link" : "ดาวน์โหลดผ่านลิงค์สาธารณะ", + "Shared with %2$s" : "แชร์กับ %2$s", + "Shared with group %2$s" : "แชร์กับกลุ่ม %2$s", + "Shared with %3$s by %2$s" : "แชร์กับ %3$s โดย %2$s", + "Shared with group %3$s by %2$s" : "แชร์กับกลุ่ม %3$s โดย %2$s", + "Shared via link by %2$s" : "แชร์ผ่านลิงค์โดย %2$s", + "Shared by %2$s" : "แชร์โดย %2$s", + "Shared via public link" : "แชร์ผ่านลิงค์สาธารณะ", "Shares" : "แชร์", "You received %2$s as a remote share from %1$s" : "คุณได้รับรีโมทแชร์ %2$s จาก %1$s", "Accept" : "ยอมรับ", diff --git a/apps/files_sharing/l10n/th_TH.json b/apps/files_sharing/l10n/th_TH.json index 3edd0d18ab1..a9ee8d6eb53 100644 --- a/apps/files_sharing/l10n/th_TH.json +++ b/apps/files_sharing/l10n/th_TH.json @@ -36,8 +36,19 @@ "Public shared file %1$s was downloaded" : "ไฟล์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด", "You shared %1$s with %2$s" : "คุณแชร์ %1$s กับ %2$s", "You shared %1$s with group %2$s" : "คุณแชร์ %1$s กับกลุ่ม %2$s", + "%2$s shared %1$s with %3$s" : "%2$s ได้แชร์ %1$s กับ %3$s", + "%2$s shared %1$s with group %3$s" : "%2$s ได้แชร์ %1$s กับกลุ่ม %3$s", + "%2$s shared %1$s via link" : "%2$s ได้แชร์ %1$s ผ่านลิงค์", "%2$s shared %1$s with you" : "%2$s ถูกแชร์ %1$s กับคุณ", "You shared %1$s via link" : "คุณแชร์ %1$s ผ่านลิงค์", + "Downloaded via public link" : "ดาวน์โหลดผ่านลิงค์สาธารณะ", + "Shared with %2$s" : "แชร์กับ %2$s", + "Shared with group %2$s" : "แชร์กับกลุ่ม %2$s", + "Shared with %3$s by %2$s" : "แชร์กับ %3$s โดย %2$s", + "Shared with group %3$s by %2$s" : "แชร์กับกลุ่ม %3$s โดย %2$s", + "Shared via link by %2$s" : "แชร์ผ่านลิงค์โดย %2$s", + "Shared by %2$s" : "แชร์โดย %2$s", + "Shared via public link" : "แชร์ผ่านลิงค์สาธารณะ", "Shares" : "แชร์", "You received %2$s as a remote share from %1$s" : "คุณได้รับรีโมทแชร์ %2$s จาก %1$s", "Accept" : "ยอมรับ", diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js index bb00dd4295a..5e99aaf3993 100644 --- a/apps/files_sharing/l10n/tr.js +++ b/apps/files_sharing/l10n/tr.js @@ -38,10 +38,23 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Herkese açık paylaşılan dosya %1$s indirildi", "You shared %1$s with %2$s" : "%1$s dosyasını %2$s ile paylaştınız", "You shared %1$s with group %2$s" : "%1$s dosyasını %2$s grubu ile paylaştınız", + "%2$s shared %1$s with %3$s" : "%2$s %3$s ile %1$s dosyasını paylaştı", + "%2$s shared %1$s with group %3$s" : "%2$s %3$s grubu ile %1$s dosyasını paylaştı", + "%2$s shared %1$s via link" : "%2$s bağlantı ile %1$s dosyasını paylaştı", "%2$s shared %1$s with you" : "%2$s sizinle %1$s dosyasını paylaştı", "You shared %1$s via link" : "Bağlantı ile %1$s paylaşımını yaptınız", + "Downloaded via public link" : "Herkese açık bağlantı ile indirildi", + "Shared with %2$s" : "%2$s ile paylaşıldı", + "Shared with group %2$s" : "%2$s grubu ile paylaşıldı", + "Shared with %3$s by %2$s" : "%3$s ile %2$s tarafından paylaşıldı", + "Shared with group %3$s by %2$s" : "%2$s tarafından %3$s grubu ile paylaşıldı", + "Shared via link by %2$s" : "%2$s tarafından bağlantı ile paylaşıldı", + "Shared by %2$s" : "%2$s tarafından paylaşıldı", + "Shared via public link" : "Herkese açık bağlantı ile paylaşıldı", "Shares" : "Paylaşımlar", + "You received %2$s as a remote share from %1$s" : "%1$s kişisinden %2$s paylaşımını uzak paylaşım olarak aldınız", "Accept" : "Kabul et", + "Decline" : "Reddet", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaşıldı, bkz %s", "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaşıldı", "This share is password-protected" : "Bu paylaşım parola korumalı", @@ -67,6 +80,7 @@ OC.L10N.register( "Federated Cloud" : "Birleşmiş Bulut", "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:", "Share it:" : "Paylaşın:", + "Add to your website" : "Web sitenize ekleyin", "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşıldı", "HTML Code:" : "HTML Kodu:" }, diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json index 1371bf37447..581ef2e0ffc 100644 --- a/apps/files_sharing/l10n/tr.json +++ b/apps/files_sharing/l10n/tr.json @@ -36,10 +36,23 @@ "Public shared file %1$s was downloaded" : "Herkese açık paylaşılan dosya %1$s indirildi", "You shared %1$s with %2$s" : "%1$s dosyasını %2$s ile paylaştınız", "You shared %1$s with group %2$s" : "%1$s dosyasını %2$s grubu ile paylaştınız", + "%2$s shared %1$s with %3$s" : "%2$s %3$s ile %1$s dosyasını paylaştı", + "%2$s shared %1$s with group %3$s" : "%2$s %3$s grubu ile %1$s dosyasını paylaştı", + "%2$s shared %1$s via link" : "%2$s bağlantı ile %1$s dosyasını paylaştı", "%2$s shared %1$s with you" : "%2$s sizinle %1$s dosyasını paylaştı", "You shared %1$s via link" : "Bağlantı ile %1$s paylaşımını yaptınız", + "Downloaded via public link" : "Herkese açık bağlantı ile indirildi", + "Shared with %2$s" : "%2$s ile paylaşıldı", + "Shared with group %2$s" : "%2$s grubu ile paylaşıldı", + "Shared with %3$s by %2$s" : "%3$s ile %2$s tarafından paylaşıldı", + "Shared with group %3$s by %2$s" : "%2$s tarafından %3$s grubu ile paylaşıldı", + "Shared via link by %2$s" : "%2$s tarafından bağlantı ile paylaşıldı", + "Shared by %2$s" : "%2$s tarafından paylaşıldı", + "Shared via public link" : "Herkese açık bağlantı ile paylaşıldı", "Shares" : "Paylaşımlar", + "You received %2$s as a remote share from %1$s" : "%1$s kişisinden %2$s paylaşımını uzak paylaşım olarak aldınız", "Accept" : "Kabul et", + "Decline" : "Reddet", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaşıldı, bkz %s", "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaşıldı", "This share is password-protected" : "Bu paylaşım parola korumalı", @@ -65,6 +78,7 @@ "Federated Cloud" : "Birleşmiş Bulut", "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:", "Share it:" : "Paylaşın:", + "Add to your website" : "Web sitenize ekleyin", "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşıldı", "HTML Code:" : "HTML Kodu:" },"pluralForm" :"nplurals=2; plural=(n > 1);" diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js index a5f97c92092..bc49d1d8a48 100644 --- a/apps/files_sharing/l10n/zh_TW.js +++ b/apps/files_sharing/l10n/zh_TW.js @@ -35,6 +35,7 @@ OC.L10N.register( "Add to your ownCloud" : "加入到你的 ownCloud", "Download" : "下載", "Download %s" : "下載 %s", - "Direct link" : "直接連結" + "Direct link" : "直接連結", + "Federated Cloud Sharing" : "聯盟式雲端分享" }, "nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json index 67150e495b9..3567ed51df4 100644 --- a/apps/files_sharing/l10n/zh_TW.json +++ b/apps/files_sharing/l10n/zh_TW.json @@ -33,6 +33,7 @@ "Add to your ownCloud" : "加入到你的 ownCloud", "Download" : "下載", "Download %s" : "下載 %s", - "Direct link" : "直接連結" + "Direct link" : "直接連結", + "Federated Cloud Sharing" : "聯盟式雲端分享" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php index 1257e7a445c..c5eb7d09ede 100644 --- a/apps/files_sharing/lib/activity.php +++ b/apps/files_sharing/lib/activity.php @@ -24,6 +24,8 @@ namespace OCA\Files_Sharing; use OCP\Activity\IExtension; +use OCP\Activity\IManager; +use OCP\IL10N; use OCP\IURLGenerator; use OCP\L10N\IFactory; @@ -58,6 +60,7 @@ class Activity implements IExtension { const SUBJECT_RESHARED_GROUP_BY = 'reshared_group_by'; const SUBJECT_RESHARED_LINK_BY = 'reshared_link_by'; const SUBJECT_RESHARED_USER_BY = 'reshared_user_by'; + const SUBJECT_SHARED_EMAIL = 'shared_with_email'; const SUBJECT_SHARED_WITH_BY = 'shared_with_by'; /** @var IFactory */ @@ -66,13 +69,18 @@ class Activity implements IExtension { /** @var IURLGenerator */ protected $URLGenerator; + /** @var IManager */ + protected $activityManager; + /** * @param IFactory $languageFactory * @param IURLGenerator $URLGenerator + * @param IManager $activityManager */ - public function __construct(IFactory $languageFactory, IURLGenerator $URLGenerator) { + public function __construct(IFactory $languageFactory, IURLGenerator $URLGenerator, IManager $activityManager) { $this->languageFactory = $languageFactory; $this->URLGenerator = $URLGenerator; + $this->activityManager = $activityManager; } protected function getL10N($languageCode = null) { @@ -148,47 +156,102 @@ class Activity implements IExtension { * @return string|false */ public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { + if ($app !== self::FILES_SHARING_APP) { + return false; + } + $l = $this->getL10N($languageCode); - if ($app === self::FILES_SHARING_APP) { - switch ($text) { - case self::SUBJECT_REMOTE_SHARE_RECEIVED: - if (sizeof($params) === 2) { - // New activity ownCloud 8.2+ - return (string) $l->t('You received a new remote share %2$s from %1$s', $params); - } - return (string) $l->t('You received a new remote share from %s', $params); - case self::SUBJECT_REMOTE_SHARE_ACCEPTED: - return (string) $l->t('%1$s accepted remote share %2$s', $params); - case self::SUBJECT_REMOTE_SHARE_DECLINED: - return (string) $l->t('%1$s declined remote share %2$s', $params); - case self::SUBJECT_REMOTE_SHARE_UNSHARED: - return (string) $l->t('%1$s unshared %2$s from you', $params); - case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED: - return (string) $l->t('Public shared folder %1$s was downloaded', $params); - case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED: - return (string) $l->t('Public shared file %1$s was downloaded', $params); - case self::SUBJECT_SHARED_USER_SELF: - return (string) $l->t('You shared %1$s with %2$s', $params); - case self::SUBJECT_SHARED_GROUP_SELF: - return (string) $l->t('You shared %1$s with group %2$s', $params); - case self::SUBJECT_RESHARED_USER_BY: - return (string) $l->t('%2$s shared %1$s with %3$s', $params); - case self::SUBJECT_RESHARED_GROUP_BY: - return (string) $l->t('%2$s shared %1$s with group %3$s', $params); - case self::SUBJECT_RESHARED_LINK_BY: - return (string) $l->t('%2$s shared %1$s via link', $params); - case self::SUBJECT_SHARED_WITH_BY: - return (string) $l->t('%2$s shared %1$s with you', $params); - case self::SUBJECT_SHARED_LINK_SELF: - return (string) $l->t('You shared %1$s via link', $params); + if ($this->activityManager->isFormattingFilteredObject()) { + $translation = $this->translateShort($text, $l, $params); + if ($translation !== false) { + return $translation; } } + return $this->translateLong($text, $l, $params); + } + + /** + * @param string $text + * @param IL10N $l + * @param array $params + * @return bool|string + */ + protected function translateLong($text, IL10N $l, array $params) { + + switch ($text) { + case self::SUBJECT_REMOTE_SHARE_RECEIVED: + if (sizeof($params) === 2) { + // New activity ownCloud 8.2+ + return (string) $l->t('You received a new remote share %2$s from %1$s', $params); + } + return (string) $l->t('You received a new remote share from %s', $params); + case self::SUBJECT_REMOTE_SHARE_ACCEPTED: + return (string) $l->t('%1$s accepted remote share %2$s', $params); + case self::SUBJECT_REMOTE_SHARE_DECLINED: + return (string) $l->t('%1$s declined remote share %2$s', $params); + case self::SUBJECT_REMOTE_SHARE_UNSHARED: + return (string) $l->t('%1$s unshared %2$s from you', $params); + case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED: + return (string) $l->t('Public shared folder %1$s was downloaded', $params); + case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED: + return (string) $l->t('Public shared file %1$s was downloaded', $params); + case self::SUBJECT_SHARED_USER_SELF: + return (string) $l->t('You shared %1$s with %2$s', $params); + case self::SUBJECT_SHARED_GROUP_SELF: + return (string) $l->t('You shared %1$s with group %2$s', $params); + case self::SUBJECT_RESHARED_USER_BY: + return (string) $l->t('%2$s shared %1$s with %3$s', $params); + case self::SUBJECT_RESHARED_GROUP_BY: + return (string) $l->t('%2$s shared %1$s with group %3$s', $params); + case self::SUBJECT_RESHARED_LINK_BY: + return (string) $l->t('%2$s shared %1$s via link', $params); + case self::SUBJECT_SHARED_WITH_BY: + return (string) $l->t('%2$s shared %1$s with you', $params); + case self::SUBJECT_SHARED_LINK_SELF: + return (string) $l->t('You shared %1$s via link', $params); + case self::SUBJECT_SHARED_EMAIL: + return (string) $l->t('You shared %1$s with %2$s', $params); + } + return false; } /** + * @param string $text + * @param IL10N $l + * @param array $params + * @return bool|string + */ + protected function translateShort($text, IL10N $l, array $params) { + switch ($text) { + case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED: + case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED: + return (string) $l->t('Downloaded via public link'); + case self::SUBJECT_SHARED_USER_SELF: + return (string) $l->t('Shared with %2$s', $params); + case self::SUBJECT_SHARED_GROUP_SELF: + return (string) $l->t('Shared with group %2$s', $params); + case self::SUBJECT_RESHARED_USER_BY: + return (string) $l->t('Shared with %3$s by %2$s', $params); + case self::SUBJECT_RESHARED_GROUP_BY: + return (string) $l->t('Shared with group %3$s by %2$s', $params); + case self::SUBJECT_RESHARED_LINK_BY: + return (string) $l->t('Shared via link by %2$s', $params); + case self::SUBJECT_SHARED_WITH_BY: + return (string) $l->t('Shared by %2$s', $params); + case self::SUBJECT_SHARED_LINK_SELF: + return (string) $l->t('Shared via public link'); + case self::SUBJECT_SHARED_EMAIL: + return (string) $l->t('Shared with %2$s', $params); + + default: + return false; + } + } + + /** * The extension can define the type of parameters for translation * * Currently known types are: @@ -227,6 +290,11 @@ class Activity implements IExtension { 1 => 'username', 2 => '', ]; + case self::SUBJECT_SHARED_EMAIL: + return array( + 0 => 'file', + 1 => '',// 'email' is neither supported nor planned for now + ); case self::SUBJECT_SHARED_USER_SELF: case self::SUBJECT_SHARED_WITH_BY: diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 377c9f02253..fa6c2d4c4f5 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -8,6 +8,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> diff --git a/apps/files_sharing/lib/capabilities.php b/apps/files_sharing/lib/capabilities.php index b24eb8d61f0..c8ba1273281 100644 --- a/apps/files_sharing/lib/capabilities.php +++ b/apps/files_sharing/lib/capabilities.php @@ -45,28 +45,36 @@ class Capabilities implements ICapability { public function getCapabilities() { $res = []; - $public = []; - $public['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes'; - if ($public['enabled']) { - $public['password'] = []; - $public['password']['enforced'] = ($this->config->getAppValue('core', 'shareapi_enforce_links_password', 'no') === 'yes'); + if ($this->config->getAppValue('core', 'shareapi_enabled', 'yes') !== 'yes') { + $res['api_enabled'] = false; + $res['public'] = ['enabled' => false]; + $res['user'] = ['send_mail' => false]; + $res['resharing'] = false; + } else { + $res['api_enabled'] = true; - $public['expire_date'] = []; - $public['expire_date']['enabled'] = $this->config->getAppValue('core', 'shareapi_default_expire_date', 'no') === 'yes'; - if ($public['expire_date']['enabled']) { - $public['expire_date']['days'] = $this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7'); - $public['expire_date']['enforced'] = $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'no') === 'yes'; - } + $public = []; + $public['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes'; + if ($public['enabled']) { + $public['password'] = []; + $public['password']['enforced'] = ($this->config->getAppValue('core', 'shareapi_enforce_links_password', 'no') === 'yes'); - $public['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no') === 'yes'; - $public['upload'] = $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes') === 'yes'; - } - $res["public"] = $public; + $public['expire_date'] = []; + $public['expire_date']['enabled'] = $this->config->getAppValue('core', 'shareapi_default_expire_date', 'no') === 'yes'; + if ($public['expire_date']['enabled']) { + $public['expire_date']['days'] = $this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7'); + $public['expire_date']['enforced'] = $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'no') === 'yes'; + } - $res['user']['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no') === 'yes'; + $public['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no') === 'yes'; + $public['upload'] = $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes') === 'yes'; + } + $res["public"] = $public; - $res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes'; + $res['user']['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no') === 'yes'; + $res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes'; + } //Federated sharing $res['federation'] = [ diff --git a/apps/files_sharing/lib/controllers/externalsharescontroller.php b/apps/files_sharing/lib/controllers/externalsharescontroller.php index 6eb9d3c13d9..71cc956ec98 100644 --- a/apps/files_sharing/lib/controllers/externalsharescontroller.php +++ b/apps/files_sharing/lib/controllers/externalsharescontroller.php @@ -3,6 +3,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -36,8 +37,6 @@ use OCP\AppFramework\Http\DataResponse; */ class ExternalSharesController extends Controller { - /** @var bool */ - private $incomingShareEnabled; /** @var \OCA\Files_Sharing\External\Manager */ private $externalManager; /** @var IClientService */ @@ -52,53 +51,44 @@ class ExternalSharesController extends Controller { */ public function __construct($appName, IRequest $request, - $incomingShareEnabled, \OCA\Files_Sharing\External\Manager $externalManager, IClientService $clientService) { parent::__construct($appName, $request); - $this->incomingShareEnabled = $incomingShareEnabled; $this->externalManager = $externalManager; $this->clientService = $clientService; } /** * @NoAdminRequired + * @NoOutgoingFederatedSharingRequired * * @return JSONResponse */ public function index() { - $shares = []; - if ($this->incomingShareEnabled) { - $shares = $this->externalManager->getOpenShares(); - } - return new JSONResponse($shares); + return new JSONResponse($this->externalManager->getOpenShares()); } /** * @NoAdminRequired + * @NoOutgoingFederatedSharingRequired * * @param int $id * @return JSONResponse */ public function create($id) { - if ($this->incomingShareEnabled) { - $this->externalManager->acceptShare($id); - } - + $this->externalManager->acceptShare($id); return new JSONResponse(); } /** * @NoAdminRequired + * @NoOutgoingFederatedSharingRequired * * @param $id * @return JSONResponse */ public function destroy($id) { - if ($this->incomingShareEnabled) { - $this->externalManager->declineShare($id); - } - + $this->externalManager->declineShare($id); return new JSONResponse(); } @@ -127,6 +117,8 @@ class ExternalSharesController extends Controller { /** * @PublicPage + * @NoOutgoingFederatedSharingRequired + * @NoIncomingFederatedSharingRequired * * @param string $remote * @return DataResponse diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php index ecf3ee853ee..616b64e6c59 100644 --- a/apps/files_sharing/lib/controllers/sharecontroller.php +++ b/apps/files_sharing/lib/controllers/sharecontroller.php @@ -46,6 +46,7 @@ use OCA\Files_Sharing\Helper; use OCP\User; use OCP\Util; use OCA\Files_Sharing\Activity; +use \OCP\Files\NotFoundException; /** * Class ShareController @@ -148,6 +149,7 @@ class ShareController extends Controller { * @param string $token * @param string $path * @return TemplateResponse|RedirectResponse + * @throws NotFoundException */ public function showShare($token, $path = '') { \OC_User::setIncognitoMode(true); @@ -171,7 +173,7 @@ class ShareController extends Controller { $getPath = Filesystem::normalizePath($path); $originalSharePath .= $path; } else { - throw new OCP\Files\NotFoundException(); + throw new NotFoundException(); } $file = basename($originalSharePath); @@ -231,9 +233,10 @@ class ShareController extends Controller { * @param string $token * @param string $files * @param string $path + * @param string $downloadStartSecret * @return void|RedirectResponse */ - public function downloadShare($token, $files = null, $path = '') { + public function downloadShare($token, $files = null, $path = '', $downloadStartSecret = '') { \OC_User::setIncognitoMode(true); $linkItem = OCP\Share::getShareByToken($token, false); @@ -286,6 +289,19 @@ class ShareController extends Controller { } } + /** + * this sets a cookie to be able to recognize the start of the download + * the content must not be longer than 32 characters and must only contain + * alphanumeric characters + */ + if (!empty($downloadStartSecret) + && !isset($downloadStartSecret[32]) + && preg_match('!^[a-zA-Z0-9]+$!', $downloadStartSecret) === 1) { + + // FIXME: set on the response once we use an actual app framework response + setcookie('ocDownloadStarted', $downloadStartSecret, time() + 20, '/'); + } + // download selected files if (!is_null($files)) { // FIXME: The exit is required here because otherwise the AppFramework is trying to add headers as well @@ -303,7 +319,7 @@ class ShareController extends Controller { /** * @param string $token * @return string Resolved file path of the token - * @throws \Exception In case share could not get properly resolved + * @throws NotFoundException In case share could not get properly resolved */ private function getPath($token) { $linkItem = Share::getShareByToken($token, false); @@ -312,7 +328,7 @@ class ShareController extends Controller { $rootLinkItem = Share::resolveReShare($linkItem); if (isset($rootLinkItem['uid_owner'])) { if(!$this->userManager->userExists($rootLinkItem['uid_owner'])) { - throw new \Exception('Owner of the share does not exist anymore'); + throw new NotFoundException('Owner of the share does not exist anymore'); } OC_Util::tearDownFS(); OC_Util::setupFS($rootLinkItem['uid_owner']); @@ -324,6 +340,6 @@ class ShareController extends Controller { } } - throw new \Exception('No file found belonging to file.'); + throw new NotFoundException('No file found belonging to file.'); } } diff --git a/apps/files_sharing/lib/exceptions.php b/apps/files_sharing/lib/exceptions/brokenpath.php index 71fe93f8e92..71fe93f8e92 100644 --- a/apps/files_sharing/lib/exceptions.php +++ b/apps/files_sharing/lib/exceptions/brokenpath.php diff --git a/apps/user_webdavauth/appinfo/app.php b/apps/files_sharing/lib/exceptions/s2sexception.php index 3f76f803efd..d914e9e06db 100644 --- a/apps/user_webdavauth/appinfo/app.php +++ b/apps/files_sharing/lib/exceptions/s2sexception.php @@ -1,8 +1,6 @@ <?php /** - * @author Felix Moeller <mail@felixmoeller.de> - * @author Frank Karlitschek <frank@owncloud.org> - * @author j-ed <juergen@eisfair.org> + * @author Björn Schießle <schiessle@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Roeland Jago Douma <roeland@famdouma.nl> * @@ -23,17 +21,10 @@ * */ -require_once OC_App::getAppPath('user_webdavauth').'/user_webdavauth.php'; +namespace OCA\Files_Sharing\Exceptions; -OC_APP::registerAdmin('user_webdavauth', 'settings'); - -OC_User::registerBackend("WEBDAVAUTH"); -OC_User::useBackend( "WEBDAVAUTH" ); - -// add settings page to navigation -$entry = array( - 'id' => "user_webdavauth_settings", - 'order'=>1, - 'href' => \OCP\Util::linkTo( "user_webdavauth", "settings.php" ), - 'name' => 'WEBDAVAUTH' -); +/** + * S2S sharing not allowed + */ +class S2SException extends \Exception { +} diff --git a/apps/files_sharing/lib/expiresharesjob.php b/apps/files_sharing/lib/expiresharesjob.php new file mode 100644 index 00000000000..bcd3fbe4605 --- /dev/null +++ b/apps/files_sharing/lib/expiresharesjob.php @@ -0,0 +1,76 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing; + +use OC\BackgroundJob\TimedJob; + +/** + * Delete all shares that are expired + */ +class ExpireSharesJob extends TimedJob { + + /** + * sets the correct interval for this timed job + */ + public function __construct() { + // Run once a day + $this->setInterval(24 * 60 * 60); + } + + /** + * Makes the background job do its work + * + * @param array $argument unused argument + */ + public function run($argument) { + $connection = \OC::$server->getDatabaseConnection(); + $logger = \OC::$server->getLogger(); + + //Current time + $now = new \DateTime(); + $now = $now->format('Y-m-d H:i:s'); + + /* + * Expire file link shares only (for now) + */ + $qb = $connection->getQueryBuilder(); + $qb->select('id', 'file_source', 'uid_owner', 'item_type') + ->from('share') + ->where( + $qb->expr()->andX( + $qb->expr()->eq('share_type', $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK)), + $qb->expr()->lte('expiration', $qb->expr()->literal($now)), + $qb->expr()->orX( + $qb->expr()->eq('item_type', $qb->expr()->literal('file')), + $qb->expr()->eq('item_type', $qb->expr()->literal('folder')) + ) + ) + ); + + $shares = $qb->execute(); + while($share = $shares->fetch()) { + \OCP\Share::unshare($share['item_type'], $share['file_source'], \OCP\Share::SHARE_TYPE_LINK, null, $share['uid_owner']); + } + $shares->closeCursor(); + } + +} diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index 8552b2fbd34..86b8904cc9a 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -5,6 +5,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -152,37 +153,15 @@ class Manager { return $this->mountShare($options); } - private function setupMounts() { - // don't setup server-to-server shares if the admin disabled it - if (\OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled() === false) { - return false; - } - - if (!is_null($this->uid)) { - $query = $this->connection->prepare(' - SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` - FROM `*PREFIX*share_external` - WHERE `user` = ? AND `accepted` = ? - '); - $query->execute(array($this->uid, 1)); - - while ($row = $query->fetch()) { - $row['manager'] = $this; - $row['token'] = $row['share_token']; - $this->mountShare($row); - } - } - } - /** * get share * * @param int $id share id * @return mixed share of false */ - private function getShare($id) { + public function getShare($id) { $getShare = $this->connection->prepare(' - SELECT `remote`, `remote_id`, `share_token`, `name` + SELECT `id`, `remote`, `remote_id`, `share_token`, `name`, `owner`, `user`, `mountpoint`, `accepted` FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?'); $result = $getShare->execute(array($id, $this->uid)); @@ -276,24 +255,6 @@ class Manager { } /** - * setup the server-to-server mounts - * - * @param array $params - */ - public static function setup(array $params) { - $externalManager = new \OCA\Files_Sharing\External\Manager( - \OC::$server->getDatabaseConnection(), - \OC\Files\Filesystem::getMountManager(), - \OC\Files\Filesystem::getLoader(), - \OC::$server->getHTTPHelper(), - \OC::$server->getNotificationManager(), - $params['user'] - ); - - $externalManager->setupMounts(); - } - - /** * remove '/user/files' from the path and trailing slashes * * @param string $path @@ -304,16 +265,20 @@ class Manager { return rtrim(substr($path, strlen($prefix)), '/'); } + public function getMount($data) { + $data['manager'] = $this; + $mountPoint = '/' . $this->uid . '/files' . $data['mountpoint']; + $data['mountpoint'] = $mountPoint; + $data['certificateManager'] = \OC::$server->getCertificateManager($this->uid); + return new Mount(self::STORAGE, $mountPoint, $data, $this, $this->storageLoader); + } + /** * @param array $data * @return Mount */ protected function mountShare($data) { - $data['manager'] = $this; - $mountPoint = '/' . $this->uid . '/files' . $data['mountpoint']; - $data['mountpoint'] = $mountPoint; - $data['certificateManager'] = \OC::$server->getCertificateManager($this->uid); - $mount = new Mount(self::STORAGE, $mountPoint, $data, $this, $this->storageLoader); + $mount = $this->getMount($data); $this->mountManager->addMount($mount); return $mount; } @@ -407,6 +372,15 @@ class Manager { } /** + * return a list of shares wich are accepted by the user + * + * @return array list of accepted server-to-server shares + */ + public function getAcceptedShares() { + return $this->getShares(true); + } + + /** * return a list of shares for the user * * @param bool|null $accepted True for accepted only, @@ -415,7 +389,9 @@ class Manager { * @return array list of open server-to-server shares */ private function getShares($accepted) { - $query = 'SELECT * FROM `*PREFIX*share_external` WHERE `user` = ?'; + $query = 'SELECT `id`, `remote`, `remote_id`, `share_token`, `name`, `owner`, `user`, `mountpoint`, `accepted` + FROM `*PREFIX*share_external` + WHERE `user` = ?'; $parameters = [$this->uid]; if (!is_null($accepted)) { $query .= ' AND `accepted` = ?'; diff --git a/apps/files_sharing/lib/external/mountprovider.php b/apps/files_sharing/lib/external/mountprovider.php new file mode 100644 index 00000000000..1739cec543f --- /dev/null +++ b/apps/files_sharing/lib/external/mountprovider.php @@ -0,0 +1,75 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing\External; + +use OCP\Files\Config\IMountProvider; +use OCP\Files\Storage\IStorageFactory; +use OCP\IDBConnection; +use OCP\IUser; + +class MountProvider implements IMountProvider { + const STORAGE = '\OCA\Files_Sharing\External\Storage'; + + /** + * @var \OCP\IDBConnection + */ + private $connection; + + /** + * @var callable + */ + private $managerProvider; + + /** + * @param \OCP\IDBConnection $connection + * @param callable $managerProvider due to setup order we need a callable that return the manager instead of the manager itself + */ + public function __construct(IDBConnection $connection, callable $managerProvider) { + $this->connection = $connection; + $this->managerProvider = $managerProvider; + } + + public function getMount(IUser $user, $data, IStorageFactory $storageFactory) { + $data['manager'] = $this; + $mountPoint = '/' . $user->getUID() . '/files/' . ltrim($data['mountpoint'], '/'); + $data['mountpoint'] = $mountPoint; + $data['certificateManager'] = \OC::$server->getCertificateManager($user->getUID()); + $managerProvider = $this->managerProvider; + return new Mount(self::STORAGE, $mountPoint, $data, $managerProvider(), $storageFactory); + } + + public function getMountsForUser(IUser $user, IStorageFactory $loader) { + $query = $this->connection->prepare(' + SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` + FROM `*PREFIX*share_external` + WHERE `user` = ? AND `accepted` = ? + '); + $query->execute([$user->getUID(), 1]); + $mounts = []; + while ($row = $query->fetch()) { + $row['manager'] = $this; + $row['token'] = $row['share_token']; + $mounts[] = $this->getMount($user, $row, $loader); + } + return $mounts; + } +} diff --git a/apps/files_sharing/lib/external/scanner.php b/apps/files_sharing/lib/external/scanner.php index 60eb7c8dacd..455225b2b79 100644 --- a/apps/files_sharing/lib/external/scanner.php +++ b/apps/files_sharing/lib/external/scanner.php @@ -2,6 +2,7 @@ /** * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Olivier Paroz <github@oparoz.com> * @author Robin Appelman <icewind@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php index 38cb73be29c..b15f70fcde3 100644 --- a/apps/files_sharing/lib/helper.php +++ b/apps/files_sharing/lib/helper.php @@ -7,6 +7,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -30,7 +31,6 @@ namespace OCA\Files_Sharing; class Helper { public static function registerHooks() { - \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OCA\Files_Sharing\External\Manager', 'setup'); \OCP\Util::connectHook('OC_Filesystem', 'delete', '\OC\Files\Cache\Shared_Updater', 'deleteHook'); \OCP\Util::connectHook('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook'); \OCP\Util::connectHook('OC_Filesystem', 'post_delete', '\OCA\Files_Sharing\Hooks', 'unshareChildren'); diff --git a/apps/files_sharing/lib/hooks.php b/apps/files_sharing/lib/hooks.php index 1937010f390..079824f7fb0 100644 --- a/apps/files_sharing/lib/hooks.php +++ b/apps/files_sharing/lib/hooks.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * diff --git a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php index 3787ef42d9f..9170c08b59d 100644 --- a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php +++ b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php @@ -2,6 +2,7 @@ /** * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -27,7 +28,11 @@ use OCP\App\IAppManager; use OCP\AppFramework\Http\NotFoundResponse; use OCP\AppFramework\Middleware; use OCP\AppFramework\Http\TemplateResponse; +use OCP\Files\NotFoundException; use OCP\IConfig; +use OCP\AppFramework\Utility\IControllerMethodReflector; +use OCA\Files_Sharing\Exceptions\S2SException; +use OCP\AppFramework\Http\JSONResponse; /** * Checks whether the "sharing check" is enabled @@ -42,6 +47,8 @@ class SharingCheckMiddleware extends Middleware { protected $config; /** @var IAppManager */ protected $appManager; + /** @var IControllerMethodReflector */ + protected $reflector; /*** * @param string $appName @@ -50,30 +57,74 @@ class SharingCheckMiddleware extends Middleware { */ public function __construct($appName, IConfig $config, - IAppManager $appManager) { + IAppManager $appManager, + IControllerMethodReflector $reflector + ) { $this->appName = $appName; $this->config = $config; $this->appManager = $appManager; + $this->reflector = $reflector; } /** * Check if sharing is enabled before the controllers is executed + * + * @param \OCP\AppFramework\Controller $controller + * @param string $methodName + * @throws NotFoundException */ public function beforeController($controller, $methodName) { if(!$this->isSharingEnabled()) { - throw new \Exception('Sharing is disabled.'); + throw new NotFoundException('Sharing is disabled.'); + } + + if ($controller instanceof \OCA\Files_Sharing\Controllers\ExternalSharesController && + !$this->externalSharesChecks()) { + throw new S2SException('Federated sharing not allowed'); + } else if ($controller instanceof \OCA\Files_Sharing\Controllers\ShareController && + !$this->isLinkSharingEnabled()) { + throw new NotFoundException('Link sharing is disabled'); } } /** - * Return 404 page in case of an exception + * Return 404 page in case of a not found exception + * * @param \OCP\AppFramework\Controller $controller * @param string $methodName * @param \Exception $exception - * @return TemplateResponse + * @return NotFoundResponse + * @throws \Exception */ - public function afterException($controller, $methodName, \Exception $exception){ - return new NotFoundResponse(); + public function afterException($controller, $methodName, \Exception $exception) { + if(is_a($exception, '\OCP\Files\NotFoundException')) { + return new NotFoundResponse(); + } + + if (is_a($exception, '\OCA\Files_Sharing\Exceptions\S2SException')) { + return new JSONResponse($exception->getMessage(), 405); + } + + throw $exception; + } + + /** + * Checks for externalshares controller + * @return bool + */ + private function externalSharesChecks() { + + if (!$this->reflector->hasAnnotation('NoIncomingFederatedSharingRequired') && + $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') !== 'yes') { + return false; + } + + if (!$this->reflector->hasAnnotation('NoOutgoingFederatedSharingRequired') && + $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') !== 'yes') { + return false; + } + + return true; } /** @@ -87,6 +138,19 @@ class SharingCheckMiddleware extends Middleware { return false; } + return true; + } + + /** + * Check if link sharing is allowed + * @return bool + */ + private function isLinkSharingEnabled() { + // Check if the shareAPI is enabled + if ($this->config->getAppValue('core', 'shareapi_enabled', 'yes') !== 'yes') { + return false; + } + // Check whether public sharing is enabled if($this->config->getAppValue('core', 'shareapi_allow_links', 'yes') !== 'yes') { return false; diff --git a/apps/files_sharing/lib/mountprovider.php b/apps/files_sharing/lib/mountprovider.php index 14a79625993..458e7f2619b 100644 --- a/apps/files_sharing/lib/mountprovider.php +++ b/apps/files_sharing/lib/mountprovider.php @@ -69,12 +69,11 @@ class MountProvider implements IMountProvider { // for updating etags for the share owner when we make changes to this share. $ownerPropagator = $this->propagationManager->getChangePropagator($share['uid_owner']); - // for updating our etags when changes are made to the share from the owners side (probably indirectly by us trough another share) - $this->propagationManager->listenToOwnerChanges($share['uid_owner'], $user->getUID()); return new SharedMount( '\OC\Files\Storage\Shared', '/' . $user->getUID() . '/' . $share['file_target'], array( + 'propagationManager' => $this->propagationManager, 'propagator' => $ownerPropagator, 'share' => $share, 'user' => $user->getUID() diff --git a/apps/files_sharing/lib/propagation/changewatcher.php b/apps/files_sharing/lib/propagation/changewatcher.php index 9f23c19be88..e61c161da19 100644 --- a/apps/files_sharing/lib/propagation/changewatcher.php +++ b/apps/files_sharing/lib/propagation/changewatcher.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -100,4 +99,12 @@ class ChangeWatcher { $propagator->propagateChanges(); } } + + public function permissionsHook($params) { + $share = $params['share']; + + if ($share['item_type'] === 'file' || $share['item_type'] === 'folder') { + $this->recipientPropagator->markDirty($share, microtime(true)); + } + } } diff --git a/apps/files_sharing/lib/propagation/grouppropagationmanager.php b/apps/files_sharing/lib/propagation/grouppropagationmanager.php new file mode 100644 index 00000000000..ba550dccec3 --- /dev/null +++ b/apps/files_sharing/lib/propagation/grouppropagationmanager.php @@ -0,0 +1,133 @@ +<?php +/** + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing\Propagation; + +use OC\Files\Filesystem; +use OC\Files\View; +use OCP\IConfig; +use OCP\IUserSession; +use OCP\IGroup; +use OCP\IUser; +use OCP\IGroupManager; +use OCA\Files_Sharing\Propagation\PropagationManager; + +/** + * Propagate changes on group changes + */ +class GroupPropagationManager { + /** + * @var \OCP\IUserSession + */ + private $userSession; + + /** + * @var \OCP\IGroupManager + */ + private $groupManager; + + /** + * @var PropagationManager + */ + private $propagationManager; + + /** + * Items shared with a given user. + * Key is user id and value is an array of shares. + * + * @var array + */ + private $userShares = []; + + public function __construct(IUserSession $userSession, IGroupManager $groupManager, PropagationManager $propagationManager) { + $this->userSession = $userSession; + $this->groupManager = $groupManager; + $this->propagationManager = $propagationManager; + } + + public function onPreProcessUser(IGroup $group, IUser $targetUser) { + $this->userShares[$targetUser->getUID()] = $this->getUserShares($targetUser->getUID()); + } + + public function onPostAddUser(IGroup $group, IUser $targetUser) { + $targetUserId = $targetUser->getUID(); + $sharesAfter = $this->getUserShares($targetUserId); + + $this->propagateSharesDiff($targetUserId, $sharesAfter, $this->userShares[$targetUserId]); + unset($this->userShares[$targetUserId]); + } + + public function onPostRemoveUser(IGroup $group, IUser $targetUser) { + $targetUserId = $targetUser->getUID(); + $sharesAfter = $this->getUserShares($targetUserId); + + $this->propagateSharesDiff($targetUserId, $this->userShares[$targetUserId], $sharesAfter); + unset($this->userShares[$targetUserId]); + } + + private function getUserShares($targetUserId) { + return \OCP\Share::getItemsSharedWithUser('file', $targetUserId); + } + + /** + * Propagate etag for the shares that are in $shares1 but not in $shares2. + * + * @param string $targetUserId user id for which to propagate shares + * @param array $shares1 + * @param array $shares2 + */ + private function propagateSharesDiff($targetUserId, $shares1, $shares2) { + $sharesToPropagate = array_udiff( + $shares1, + $shares2, + function($share1, $share2) { + return ($share2['id'] - $share1['id']); + } + ); + + \OC\Files\Filesystem::initMountPoints($targetUserId); + $this->propagationManager->propagateSharesToUser($sharesToPropagate, $targetUserId); + } + + /** + * To be called from setupFS trough a hook + * + * Sets up listening to changes made to shares owned by the current user + */ + public function globalSetup() { + $user = $this->userSession->getUser(); + if (!$user) { + return; + } + + $this->groupManager->listen('\OC\Group', 'preAddUser', [$this, 'onPreProcessUser']); + $this->groupManager->listen('\OC\Group', 'postAddUser', [$this, 'onPostAddUser']); + $this->groupManager->listen('\OC\Group', 'preRemoveUser', [$this, 'onPreProcessUser']); + $this->groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'onPostRemoveUser']); + } + + public function tearDown() { + $this->groupManager->removeListener('\OC\Group', 'preAddUser', [$this, 'onPreProcessUser']); + $this->groupManager->removeListener('\OC\Group', 'postAddUser', [$this, 'onPostAddUser']); + $this->groupManager->removeListener('\OC\Group', 'preRemoveUser', [$this, 'onPreProcessUser']); + $this->groupManager->removeListener('\OC\Group', 'postRemoveUser', [$this, 'onPostRemoveUser']); + } +} diff --git a/apps/files_sharing/lib/propagation/propagationmanager.php b/apps/files_sharing/lib/propagation/propagationmanager.php index 7929c2aa5bb..6ed70e93f84 100644 --- a/apps/files_sharing/lib/propagation/propagationmanager.php +++ b/apps/files_sharing/lib/propagation/propagationmanager.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -26,6 +25,7 @@ use OC\Files\Filesystem; use OC\Files\View; use OCP\IConfig; use OCP\IUserSession; +use OCP\Util; /** @@ -82,6 +82,21 @@ class PropagationManager { } /** + * Propagates etag changes for the given shares to the given user + * + * @param array array of shares for which to trigger etag change + * @param string $user + */ + public function propagateSharesToUser($shares, $user) { + $changePropagator = $this->getChangePropagator($user); + foreach ($shares as $share) { + $changePropagator->addChange($share['file_target']); + } + $time = microtime(true); + $changePropagator->propagateChanges(floor($time)); + } + + /** * @param string $user * @return \OCA\Files_Sharing\Propagation\RecipientPropagator */ @@ -120,8 +135,9 @@ class PropagationManager { // for marking shares owned by the active user as dirty when a file inside them changes $this->listenToOwnerChanges($user->getUID(), $user->getUID()); - \OC_Hook::connect('OC_Filesystem', 'post_write', $watcher, 'writeHook'); - \OC_Hook::connect('OC_Filesystem', 'post_delete', $watcher, 'writeHook'); - \OC_Hook::connect('OC_Filesystem', 'post_rename', $watcher, 'renameHook'); + Util::connectHook('OC_Filesystem', 'post_write', $watcher, 'writeHook'); + Util::connectHook('OC_Filesystem', 'post_delete', $watcher, 'writeHook'); + Util::connectHook('OC_Filesystem', 'post_rename', $watcher, 'renameHook'); + Util::connectHook('OCP\Share', 'post_update_permissions', $watcher, 'permissionsHook'); } } diff --git a/apps/files_sharing/lib/propagation/recipientpropagator.php b/apps/files_sharing/lib/propagation/recipientpropagator.php index 420cacb3d2f..8e064e2ee54 100644 --- a/apps/files_sharing/lib/propagation/recipientpropagator.php +++ b/apps/files_sharing/lib/propagation/recipientpropagator.php @@ -105,7 +105,7 @@ class RecipientPropagator { /** * @param array $share - * @param int $time + * @param float $time */ public function markDirty($share, $time = null) { if ($time === null) { diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php index 7bbc2083702..6c676f47a0c 100644 --- a/apps/files_sharing/lib/share/file.php +++ b/apps/files_sharing/lib/share/file.php @@ -5,6 +5,8 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_sharing/lib/share/folder.php b/apps/files_sharing/lib/share/folder.php index ef42393f58d..daa5b5e9eb8 100644 --- a/apps/files_sharing/lib/share/folder.php +++ b/apps/files_sharing/lib/share/folder.php @@ -4,6 +4,8 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index 9aa9bbf562b..85eb264ce09 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -1,8 +1,10 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 1ac401f3cf8..b0e56f5f054 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -50,13 +50,34 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { */ private $ownerView; + /** + * @var \OCA\Files_Sharing\Propagation\PropagationManager + */ + private $propagationManager; + + /** + * @var string + */ + private $user; + + private $initialized = false; + public function __construct($arguments) { $this->share = $arguments['share']; $this->ownerView = $arguments['ownerView']; + $this->propagationManager = $arguments['propagationManager']; + $this->user = $arguments['user']; } private function init() { + if ($this->initialized) { + return; + } + $this->initialized = true; Filesystem::initMountPoints($this->share['uid_owner']); + + // for updating our etags when changes are made to the share from the owners side (probably indirectly by us trough another share) + $this->propagationManager->listenToOwnerChanges($this->share['uid_owner'], $this->user); } /** @@ -562,9 +583,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public function getETag($path) { - if ($path == '') { - $path = $this->getMountPoint(); - } if ($source = $this->getSourcePath($path)) { list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source); return $storage->getETag($internalPath); diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php index 9dd106a548c..d70ed23b941 100644 --- a/apps/files_sharing/lib/updater.php +++ b/apps/files_sharing/lib/updater.php @@ -4,6 +4,8 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index 2cf8476f721..772419e64e4 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -1,6 +1,5 @@ <?php /** - * @author Felix Moeller <mail@felixmoeller.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * diff --git a/apps/files_sharing/settings-personal.php b/apps/files_sharing/settings-personal.php index f4c9c6cd308..deaa7b92ac7 100644 --- a/apps/files_sharing/settings-personal.php +++ b/apps/files_sharing/settings-personal.php @@ -3,6 +3,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Jan-Christoph Borchardt <hey@jancborchardt.net> * @author Morris Jobke <hey@morrisjobke.de> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_sharing/templates/list.php b/apps/files_sharing/templates/list.php index 55ad55a0a4f..fa0365c749c 100644 --- a/apps/files_sharing/templates/list.php +++ b/apps/files_sharing/templates/list.php @@ -1,7 +1,4 @@ <?php /** @var $l OC_L10N */ ?> -<div id="controls"> - <div id="file_action_panel"></div> -</div> <div id='notification'></div> <div id="emptycontent" class="hidden"></div> diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index cde28c80fc4..b5dd653d718 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -76,7 +76,7 @@ $thumbSize = 1024; <button id="save-button"><?php p($l->t('Add to your ownCloud')) ?></button> <form class="save-form hidden" action="#"> <input type="text" id="remote_address" placeholder="example.com/owncloud"/> - <button id="save-button-confirm" class="icon-confirm svg"></button> + <button id="save-button-confirm" class="icon-confirm svg" disabled></button> </form> </span> <?php } ?> @@ -86,38 +86,39 @@ $thumbSize = 1024; </a> </span> </div> - </div></header> -<div id="content"> - <div id="preview"> - <?php if (isset($_['folder'])): ?> - <?php print_unescaped($_['folder']); ?> - <?php else: ?> - <?php if ($_['previewEnabled'] && substr($_['mimetype'], 0, strpos($_['mimetype'], '/')) == 'video'): ?> - <div id="imgframe"> - <video tabindex="0" controls="" preload="none"> - <source src="<?php p($_['downloadURL']); ?>" type="<?php p($_['mimetype']); ?>" /> - </video> - </div> +</div></header> +<div id="content-wrapper"> + <div id="content"> + <div id="preview"> + <?php if (isset($_['folder'])): ?> + <?php print_unescaped($_['folder']); ?> <?php else: ?> - <!-- Preview frame is filled via JS to support SVG images for modern browsers --> - <div id="imgframe"></div> + <?php if ($_['previewEnabled'] && substr($_['mimetype'], 0, strpos($_['mimetype'], '/')) == 'video'): ?> + <div id="imgframe"> + <video tabindex="0" controls="" preload="none"> + <source src="<?php p($_['downloadURL']); ?>" type="<?php p($_['mimetype']); ?>" /> + </video> + </div> + <?php else: ?> + <!-- Preview frame is filled via JS to support SVG images for modern browsers --> + <div id="imgframe"></div> + <?php endif; ?> + <div class="directDownload"> + <a href="<?php p($_['downloadURL']); ?>" id="downloadFile" class="button"> + <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>"/> + <?php p($l->t('Download %s', array($_['filename'])))?> (<?php p($_['fileSize']) ?>) + </a> + </div> + <div class="directLink"> + <label for="directLink"><?php p($l->t('Direct link')) ?></label> + <input id="directLink" type="text" readonly value="<?php p($_['downloadURL']); ?>"> + </div> <?php endif; ?> - <div class="directDownload"> - <a href="<?php p($_['downloadURL']); ?>" id="downloadFile" class="button"> - <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>"/> - <?php p($l->t('Download %s', array($_['filename'])))?> (<?php p($_['fileSize']) ?>) - </a> - </div> - <div class="directLink"> - <label for="directLink"><?php p($l->t('Direct link')) ?></label> - <input id="directLink" type="text" readonly value="<?php p($_['downloadURL']); ?>"> - </div> - <?php endif; ?> + </div> </div> - + <footer> + <p class="info"> + <?php print_unescaped($theme->getLongFooter()); ?> + </p> + </footer> </div> -<footer> - <p class="info"> - <?php print_unescaped($theme->getLongFooter()); ?> - </p> -</footer> diff --git a/apps/files_sharing/templates/settings-admin.php b/apps/files_sharing/templates/settings-admin.php index 376f2b71aee..31bfa78e67d 100644 --- a/apps/files_sharing/templates/settings-admin.php +++ b/apps/files_sharing/templates/settings-admin.php @@ -9,7 +9,7 @@ href="<?php p(link_to_docs('admin-sharing-federated')); ?>"></a> <p> - <input type="checkbox" name="outgoing_server2server_share_enabled" id="outgoingServer2serverShareEnabled" + <input type="checkbox" name="outgoing_server2server_share_enabled" id="outgoingServer2serverShareEnabled" class="checkbox" value="1" <?php if ($_['outgoingServer2serverShareEnabled']) print_unescaped('checked="checked"'); ?> /> <label for="outgoingServer2serverShareEnabled"> <?php p($l->t('Allow users on this server to send shares to other servers'));?> @@ -17,7 +17,7 @@ </p> <p> - <input type="checkbox" name="incoming_server2server_share_enabled" id="incomingServer2serverShareEnabled" + <input type="checkbox" name="incoming_server2server_share_enabled" id="incomingServer2serverShareEnabled" class="checkbox" value="1" <?php if ($_['incomingServer2serverShareEnabled']) print_unescaped('checked="checked"'); ?> /> <label for="incomingServer2serverShareEnabled"> <?php p($l->t('Allow users on this server to receive shares from other servers'));?> diff --git a/apps/files_sharing/tests/activity.php b/apps/files_sharing/tests/activity.php index 53a306b70f7..f7f324cdfc3 100644 --- a/apps/files_sharing/tests/activity.php +++ b/apps/files_sharing/tests/activity.php @@ -36,7 +36,10 @@ class Activity extends \OCA\Files_Sharing\Tests\TestCase{ parent::setUp(); $this->activity = new \OCA\Files_Sharing\Activity( $this->getMock('\OC\L10N\Factory'), - $this->getMockBuilder('\OC\URLGenerator') + $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(), + $this->getMockBuilder('\OCP\Activity\IManager') ->disableOriginalConstructor() ->getMock() ); diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php index 5c5d5b0d309..923881d4569 100644 --- a/apps/files_sharing/tests/api/shareestest.php +++ b/apps/files_sharing/tests/api/shareestest.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -110,16 +111,30 @@ class ShareesTest extends TestCase { public function dataGetUsers() { return [ - ['test', false, [], [], [], [], true, false], - ['test', true, [], [], [], [], true, false], + ['test', false, true, [], [], [], [], true, false], + ['test', false, false, [], [], [], [], true, false], + ['test', true, true, [], [], [], [], true, false], + ['test', true, false, [], [], [], [], true, false], [ - 'test', false, [], [], + 'test', false, true, [], [], [ ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], ], [], true, $this->getUserMock('test', 'Test') ], [ - 'test', true, [], [], + 'test', false, false, [], [], + [ + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ], [], true, $this->getUserMock('test', 'Test') + ], + [ + 'test', true, true, [], [], + [ + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ], [], true, $this->getUserMock('test', 'Test') + ], + [ + 'test', true, false, [], [], [ ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], ], [], true, $this->getUserMock('test', 'Test') @@ -127,6 +142,7 @@ class ShareesTest extends TestCase { [ 'test', false, + true, [], [ $this->getUserMock('test1', 'Test One'), @@ -141,6 +157,20 @@ class ShareesTest extends TestCase { [ 'test', false, + false, + [], + [ + $this->getUserMock('test1', 'Test One'), + ], + [], + [], + true, + false, + ], + [ + 'test', + false, + true, [], [ $this->getUserMock('test1', 'Test One'), @@ -157,6 +187,21 @@ class ShareesTest extends TestCase { [ 'test', false, + false, + [], + [ + $this->getUserMock('test1', 'Test One'), + $this->getUserMock('test2', 'Test Two'), + ], + [], + [], + true, + false, + ], + [ + 'test', + false, + true, [], [ $this->getUserMock('test0', 'Test'), @@ -175,6 +220,24 @@ class ShareesTest extends TestCase { ], [ 'test', + false, + false, + [], + [ + $this->getUserMock('test0', 'Test'), + $this->getUserMock('test1', 'Test One'), + $this->getUserMock('test2', 'Test Two'), + ], + [ + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test0']], + ], + [], + true, + false, + ], + [ + 'test', + true, true, ['abc', 'xyz'], [ @@ -191,6 +254,21 @@ class ShareesTest extends TestCase { [ 'test', true, + false, + ['abc', 'xyz'], + [ + ['abc', 'test', 2, 0, ['test1' => 'Test One']], + ['xyz', 'test', 2, 0, []], + ], + [], + [], + true, + false, + ], + [ + 'test', + true, + true, ['abc', 'xyz'], [ ['abc', 'test', 2, 0, [ @@ -213,6 +291,27 @@ class ShareesTest extends TestCase { [ 'test', true, + false, + ['abc', 'xyz'], + [ + ['abc', 'test', 2, 0, [ + 'test1' => 'Test One', + 'test2' => 'Test Two', + ]], + ['xyz', 'test', 2, 0, [ + 'test1' => 'Test One', + 'test2' => 'Test Two', + ]], + ], + [], + [], + true, + false, + ], + [ + 'test', + true, + true, ['abc', 'xyz'], [ ['abc', 'test', 2, 0, [ @@ -231,6 +330,26 @@ class ShareesTest extends TestCase { false, false, ], + [ + 'test', + true, + false, + ['abc', 'xyz'], + [ + ['abc', 'test', 2, 0, [ + 'test' => 'Test One', + ]], + ['xyz', 'test', 2, 0, [ + 'test2' => 'Test Two', + ]], + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ], + [], + true, + false, + ], ]; } @@ -239,6 +358,7 @@ class ShareesTest extends TestCase { * * @param string $searchTerm * @param bool $shareWithGroupOnly + * @param bool $shareeEnumeration * @param array $groupResponse * @param array $userResponse * @param array $exactExpected @@ -246,10 +366,11 @@ class ShareesTest extends TestCase { * @param bool $reachedEnd * @param mixed $singleUser */ - public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd, $singleUser) { + public function testGetUsers($searchTerm, $shareWithGroupOnly, $shareeEnumeration, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd, $singleUser) { $this->invokePrivate($this->sharees, 'limit', [2]); $this->invokePrivate($this->sharees, 'offset', [0]); $this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]); + $this->invokePrivate($this->sharees, 'shareeEnumeration', [$shareeEnumeration]); $user = $this->getUserMock('admin', 'Administrator'); $this->session->expects($this->any()) @@ -290,9 +411,10 @@ class ShareesTest extends TestCase { public function dataGetGroups() { return [ - ['test', false, [], [], [], [], true, false], + ['test', false, true, [], [], [], [], true, false], + ['test', false, false, [], [], [], [], true, false], [ - 'test', false, + 'test', false, true, [$this->getGroupMock('test1')], [], [], @@ -301,7 +423,16 @@ class ShareesTest extends TestCase { false, ], [ - 'test', false, + 'test', false, false, + [$this->getGroupMock('test1')], + [], + [], + [], + true, + false, + ], + [ + 'test', false, true, [ $this->getGroupMock('test'), $this->getGroupMock('test1'), @@ -313,7 +444,19 @@ class ShareesTest extends TestCase { false, ], [ - 'test', false, + 'test', false, false, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [], + [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], + [], + true, + false, + ], + [ + 'test', false, true, [ $this->getGroupMock('test0'), $this->getGroupMock('test1'), @@ -328,7 +471,19 @@ class ShareesTest extends TestCase { null, ], [ - 'test', false, + 'test', false, false, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [], + [], + [], + true, + null, + ], + [ + 'test', false, true, [ $this->getGroupMock('test0'), $this->getGroupMock('test1'), @@ -344,9 +499,24 @@ class ShareesTest extends TestCase { false, $this->getGroupMock('test'), ], - ['test', true, [], [], [], [], true, false], [ - 'test', true, + 'test', false, false, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [], + [ + ['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']], + ], + [], + true, + $this->getGroupMock('test'), + ], + ['test', true, true, [], [], [], [], true, false], + ['test', true, false, [], [], [], [], true, false], + [ + 'test', true, true, [ $this->getGroupMock('test1'), $this->getGroupMock('test2'), @@ -358,7 +528,19 @@ class ShareesTest extends TestCase { false, ], [ - 'test', true, + 'test', true, false, + [ + $this->getGroupMock('test1'), + $this->getGroupMock('test2'), + ], + [$this->getGroupMock('test1')], + [], + [], + true, + false, + ], + [ + 'test', true, true, [ $this->getGroupMock('test'), $this->getGroupMock('test1'), @@ -370,7 +552,19 @@ class ShareesTest extends TestCase { false, ], [ - 'test', true, + 'test', true, false, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test')], + [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], + [], + true, + false, + ], + [ + 'test', true, true, [ $this->getGroupMock('test'), $this->getGroupMock('test1'), @@ -382,7 +576,19 @@ class ShareesTest extends TestCase { false, ], [ - 'test', true, + 'test', true, false, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test1')], + [], + [], + true, + false, + ], + [ + 'test', true, true, [ $this->getGroupMock('test'), $this->getGroupMock('test1'), @@ -394,7 +600,19 @@ class ShareesTest extends TestCase { false, ], [ - 'test', true, + 'test', true, false, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')], + [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], + [], + true, + false, + ], + [ + 'test', true, true, [ $this->getGroupMock('test0'), $this->getGroupMock('test1'), @@ -409,7 +627,19 @@ class ShareesTest extends TestCase { null, ], [ - 'test', true, + 'test', true, false, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')], + [], + [], + true, + null, + ], + [ + 'test', true, true, [ $this->getGroupMock('test0'), $this->getGroupMock('test1'), @@ -425,6 +655,20 @@ class ShareesTest extends TestCase { false, $this->getGroupMock('test'), ], + [ + 'test', true, false, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')], + [ + ['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']], + ], + [], + true, + $this->getGroupMock('test'), + ], ]; } @@ -433,6 +677,7 @@ class ShareesTest extends TestCase { * * @param string $searchTerm * @param bool $shareWithGroupOnly + * @param bool $shareeEnumeration * @param array $groupResponse * @param array $userGroupsResponse * @param array $exactExpected @@ -440,10 +685,11 @@ class ShareesTest extends TestCase { * @param bool $reachedEnd * @param mixed $singleGroup */ - public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd, $singleGroup) { + public function testGetGroups($searchTerm, $shareWithGroupOnly, $shareeEnumeration, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd, $singleGroup) { $this->invokePrivate($this->sharees, 'limit', [2]); $this->invokePrivate($this->sharees, 'offset', [0]); $this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]); + $this->invokePrivate($this->sharees, 'shareeEnumeration', [$shareeEnumeration]); $this->groupManager->expects($this->once()) ->method('search') @@ -480,10 +726,22 @@ class ShareesTest extends TestCase { public function dataGetRemote() { return [ - ['test', [], [], [], true], + ['test', [], true, [], [], true], + ['test', [], false, [], [], true], + [ + 'test@remote', + [], + true, + [ + ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], + ], + [], + true, + ], [ 'test@remote', [], + false, [ ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], ], @@ -508,6 +766,7 @@ class ShareesTest extends TestCase { ], ], ], + true, [], [ ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], @@ -515,6 +774,29 @@ class ShareesTest extends TestCase { true, ], [ + 'test', + [ + [ + 'FN' => 'User3 @ Localhost', + ], + [ + 'FN' => 'User2 @ Localhost', + 'CLOUD' => [ + ], + ], + [ + 'FN' => 'User @ Localhost', + 'CLOUD' => [ + 'username@localhost', + ], + ], + ], + false, + [], + [], + true, + ], + [ 'test@remote', [ [ @@ -532,6 +814,7 @@ class ShareesTest extends TestCase { ], ], ], + true, [ ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], ], @@ -541,6 +824,31 @@ class ShareesTest extends TestCase { true, ], [ + 'test@remote', + [ + [ + 'FN' => 'User3 @ Localhost', + ], + [ + 'FN' => 'User2 @ Localhost', + 'CLOUD' => [ + ], + ], + [ + 'FN' => 'User @ Localhost', + 'CLOUD' => [ + 'username@localhost', + ], + ], + ], + false, + [ + ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], + ], + [], + true, + ], + [ 'username@localhost', [ [ @@ -558,11 +866,36 @@ class ShareesTest extends TestCase { ], ], ], + true, [ ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], ], + [], + true, + ], + [ + 'username@localhost', [ + [ + 'FN' => 'User3 @ Localhost', + ], + [ + 'FN' => 'User2 @ Localhost', + 'CLOUD' => [ + ], + ], + [ + 'FN' => 'User @ Localhost', + 'CLOUD' => [ + 'username@localhost', + ], + ], ], + false, + [ + ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], + ], + [], true, ], ]; @@ -573,11 +906,13 @@ class ShareesTest extends TestCase { * * @param string $searchTerm * @param array $contacts + * @param bool $shareeEnumeration * @param array $exactExpected * @param array $expected * @param bool $reachedEnd */ - public function testGetRemote($searchTerm, $contacts, $exactExpected, $expected, $reachedEnd) { + public function testGetRemote($searchTerm, $contacts, $shareeEnumeration, $exactExpected, $expected, $reachedEnd) { + $this->invokePrivate($this->sharees, 'shareeEnumeration', [$shareeEnumeration]); $this->contactsManager->expects($this->any()) ->method('search') ->with($searchTerm, ['CLOUD', 'FN']) @@ -595,80 +930,84 @@ class ShareesTest extends TestCase { $allTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE]; return [ - [[], '', true, '', null, $allTypes, 1, 200, false], + [[], '', 'yes', true, '', null, $allTypes, 1, 200, false, true], // Test itemType [[ 'search' => '', - ], '', true, '', null, $allTypes, 1, 200, false], + ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true], [[ 'search' => 'foobar', - ], '', true, 'foobar', null, $allTypes, 1, 200, false], + ], '', 'yes', true, 'foobar', null, $allTypes, 1, 200, false, true], [[ 'search' => 0, - ], '', true, '0', null, $allTypes, 1, 200, false], + ], '', 'yes', true, '0', null, $allTypes, 1, 200, false, true], // Test itemType [[ 'itemType' => '', - ], '', true, '', '', $allTypes, 1, 200, false], + ], '', 'yes', true, '', '', $allTypes, 1, 200, false, true], [[ 'itemType' => 'folder', - ], '', true, '', 'folder', $allTypes, 1, 200, false], + ], '', 'yes', true, '', 'folder', $allTypes, 1, 200, false, true], [[ 'itemType' => 0, - ], '', true, '', '0', $allTypes, 1, 200, false], + ], '', 'yes', true, '', '0', $allTypes, 1, 200, false, true], // Test shareType [[ - ], '', true, '', null, $allTypes, 1, 200, false], + ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true], [[ 'shareType' => 0, - ], '', true, '', null, [0], 1, 200, false], + ], '', 'yes', true, '', null, [0], 1, 200, false, true], [[ 'shareType' => '0', - ], '', true, '', null, [0], 1, 200, false], + ], '', 'yes', true, '', null, [0], 1, 200, false, true], [[ 'shareType' => 1, - ], '', true, '', null, [1], 1, 200, false], + ], '', 'yes', true, '', null, [1], 1, 200, false, true], [[ 'shareType' => 12, - ], '', true, '', null, [], 1, 200, false], + ], '', 'yes', true, '', null, [], 1, 200, false, true], [[ 'shareType' => 'foobar', - ], '', true, '', null, $allTypes, 1, 200, false], + ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true], [[ 'shareType' => [0, 1, 2], - ], '', true, '', null, [0, 1], 1, 200, false], + ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true], [[ 'shareType' => [0, 1], - ], '', true, '', null, [0, 1], 1, 200, false], + ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true], [[ 'shareType' => $allTypes, - ], '', true, '', null, $allTypes, 1, 200, false], + ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true], [[ 'shareType' => $allTypes, - ], '', false, '', null, [0, 1], 1, 200, false], + ], '', 'yes', false, '', null, [0, 1], 1, 200, false, true], // Test pagination [[ 'page' => 1, - ], '', true, '', null, $allTypes, 1, 200, false], + ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true], [[ 'page' => 10, - ], '', true, '', null, $allTypes, 10, 200, false], + ], '', 'yes', true, '', null, $allTypes, 10, 200, false, true], // Test perPage [[ 'perPage' => 1, - ], '', true, '', null, $allTypes, 1, 1, false], + ], '', 'yes', true, '', null, $allTypes, 1, 1, false, true], [[ 'perPage' => 10, - ], '', true, '', null, $allTypes, 1, 10, false], + ], '', 'yes', true, '', null, $allTypes, 1, 10, false, true], // Test $shareWithGroupOnly setting - [[], 'no', true, '', null, $allTypes, 1, 200, false], - [[], 'yes', true, '', null, $allTypes, 1, 200, true], + [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true], + [[], 'yes', 'yes', true, '', null, $allTypes, 1, 200, true, true], + + // Test $shareeEnumeration setting + [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true], + [[], 'no', 'no', true, '', null, $allTypes, 1, 200, false, false], ]; } @@ -678,6 +1017,7 @@ class ShareesTest extends TestCase { * * @param array $getData * @param string $apiSetting + * @param string $enumSetting * @param bool $remoteSharingEnabled * @param string $search * @param string $itemType @@ -685,18 +1025,22 @@ class ShareesTest extends TestCase { * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly + * @param bool $shareeEnumeration */ - public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly) { + public function testSearch($getData, $apiSetting, $enumSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly, $shareeEnumeration) { $oldGet = $_GET; $_GET = $getData; $config = $this->getMockBuilder('OCP\IConfig') ->disableOriginalConstructor() ->getMock(); - $config->expects($this->once()) + $config->expects($this->exactly(2)) ->method('getAppValue') - ->with('core', 'shareapi_only_share_with_group_members', 'no') - ->willReturn($apiSetting); + ->with('core', $this->anything(), $this->anything()) + ->willReturnMap([ + ['core', 'shareapi_only_share_with_group_members', 'no', $apiSetting], + ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', $enumSetting], + ]); $sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees') ->setConstructorArgs([ @@ -735,6 +1079,7 @@ class ShareesTest extends TestCase { $this->assertInstanceOf('\OC_OCS_Result', $sharees->search()); $this->assertSame($shareWithGroupOnly, $this->invokePrivate($sharees, 'shareWithGroupOnly')); + $this->assertSame($shareeEnumeration, $this->invokePrivate($sharees, 'shareeEnumeration')); $_GET = $oldGet; } diff --git a/apps/files_sharing/tests/capabilities.php b/apps/files_sharing/tests/capabilities.php index f1a9626db9b..b151f47a468 100644 --- a/apps/files_sharing/tests/capabilities.php +++ b/apps/files_sharing/tests/capabilities.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -56,8 +57,31 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { return $result; } + public function testEnabledSharingAPI() { + $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], + ]; + $result = $this->getResults($map); + $this->assertTrue($result['api_enabled']); + $this->assertContains('public', $result); + $this->assertContains('user', $result); + $this->assertContains('resharing', $result); + } + + public function testDisabledSharingAPI() { + $map = [ + ['core', 'shareapi_enabled', 'yes', 'no'], + ]; + $result = $this->getResults($map); + $this->assertFalse($result['api_enabled']); + $this->assertNotContains('public', $result); + $this->assertNotContains('user', $result); + $this->assertNotContains('resharing', $result); + } + public function testNoLinkSharing() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'no'], ]; $result = $this->getResults($map); @@ -67,6 +91,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testOnlyLinkSharing() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ]; $result = $this->getResults($map); @@ -76,6 +101,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkPassword() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_enforce_links_password', 'no', 'yes'], ]; @@ -87,6 +113,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkNoPassword() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_enforce_links_password', 'no', 'no'], ]; @@ -98,6 +125,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkNoExpireDate() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_default_expire_date', 'no', 'no'], ]; @@ -109,6 +137,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkExpireDate() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_default_expire_date', 'no', 'yes'], ['core', 'shareapi_expire_after_n_days', '7', '7'], @@ -124,6 +153,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkExpireDateEnforced() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_default_expire_date', 'no', 'yes'], ['core', 'shareapi_enforce_expire_date', 'no', 'yes'], @@ -136,6 +166,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkSendMail() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_allow_public_notification', 'no', 'yes'], ]; @@ -145,6 +176,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkNoSendMail() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_allow_public_notification', 'no', 'no'], ]; @@ -154,6 +186,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testUserSendMail() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_mail_notification', 'no', 'yes'], ]; $result = $this->getResults($map); @@ -162,6 +195,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testUserNoSendMail() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_mail_notification', 'no', 'no'], ]; $result = $this->getResults($map); @@ -170,6 +204,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testResharing() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_resharing', 'yes', 'yes'], ]; $result = $this->getResults($map); @@ -178,6 +213,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testNoResharing() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_resharing', 'yes', 'no'], ]; $result = $this->getResults($map); @@ -186,6 +222,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkPublicUpload() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_allow_public_upload', 'yes', 'yes'], ]; @@ -195,6 +232,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase { public function testLinkNoPublicUpload() { $map = [ + ['core', 'shareapi_enabled', 'yes', 'yes'], ['core', 'shareapi_allow_links', 'yes', 'yes'], ['core', 'shareapi_allow_public_upload', 'yes', 'no'], ]; diff --git a/apps/files_sharing/tests/controller/externalsharecontroller.php b/apps/files_sharing/tests/controller/externalsharecontroller.php index 3dc34bca7a4..7bc11f7fb94 100644 --- a/apps/files_sharing/tests/controller/externalsharecontroller.php +++ b/apps/files_sharing/tests/controller/externalsharecontroller.php @@ -1,6 +1,7 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -32,8 +33,6 @@ use OCP\IRequest; * @package OCA\Files_Sharing\Controllers */ class ExternalShareControllerTest extends \Test\TestCase { - /** @var bool */ - private $incomingShareEnabled; /** @var IRequest */ private $request; /** @var \OCA\Files_Sharing\External\Manager */ @@ -57,22 +56,12 @@ class ExternalShareControllerTest extends \Test\TestCase { return new ExternalSharesController( 'files_sharing', $this->request, - $this->incomingShareEnabled, $this->externalManager, $this->clientService ); } - public function testIndexDisabled() { - $this->externalManager - ->expects($this->never()) - ->method('getOpenShares'); - - $this->assertEquals(new JSONResponse(), $this->getExternalShareController()->index()); - } - - public function testIndexEnabled() { - $this->incomingShareEnabled = true; + public function testIndex() { $this->externalManager ->expects($this->once()) ->method('getOpenShares') @@ -81,16 +70,7 @@ class ExternalShareControllerTest extends \Test\TestCase { $this->assertEquals(new JSONResponse(['MyDummyArray']), $this->getExternalShareController()->index()); } - public function testCreateDisabled() { - $this->externalManager - ->expects($this->never()) - ->method('acceptShare'); - - $this->assertEquals(new JSONResponse(), $this->getExternalShareController()->create(4)); - } - - public function testCreateEnabled() { - $this->incomingShareEnabled = true; + public function testCreate() { $this->externalManager ->expects($this->once()) ->method('acceptShare') @@ -99,16 +79,7 @@ class ExternalShareControllerTest extends \Test\TestCase { $this->assertEquals(new JSONResponse(), $this->getExternalShareController()->create(4)); } - public function testDestroyDisabled() { - $this->externalManager - ->expects($this->never()) - ->method('destroy'); - - $this->assertEquals(new JSONResponse(), $this->getExternalShareController()->destroy(4)); - } - - public function testDestroyEnabled() { - $this->incomingShareEnabled = true; + public function testDestroy() { $this->externalManager ->expects($this->once()) ->method('declineShare') diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php index 8da4e6f29bd..2490fef03e1 100644 --- a/apps/files_sharing/tests/etagpropagation.php +++ b/apps/files_sharing/tests/etagpropagation.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * @@ -48,6 +47,7 @@ class EtagPropagation extends TestCase { \OC_Hook::clear('OC_Filesystem', 'post_write'); \OC_Hook::clear('OC_Filesystem', 'post_delete'); \OC_Hook::clear('OC_Filesystem', 'post_rename'); + \OC_Hook::clear('OCP\Share', 'post_update_permissions'); parent::tearDown(); } @@ -75,11 +75,14 @@ class EtagPropagation extends TestCase { $view1->file_put_contents('/sub1/sub2/folder/file.txt', 'foobar'); $view1->file_put_contents('/sub1/sub2/folder/inside/file.txt', 'foobar'); $folderInfo = $view1->getFileInfo('/sub1/sub2/folder'); + $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo); $fileInfo = $view1->getFileInfo('/foo.txt'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); \OCP\Share::shareItem('file', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31); \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31); \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER3, 31); $folderInfo = $view1->getFileInfo('/directReshare'); + $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo); \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31); $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId(); $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1'] = $view1->getFileInfo('sub1')->getId(); @@ -90,8 +93,10 @@ class EtagPropagation extends TestCase { $view2->mkdir('/sub1/sub2'); $view2->rename('/folder', '/sub1/sub2/folder'); $insideInfo = $view2->getFileInfo('/sub1/sub2/folder/inside'); + $this->assertInstanceOf('\OC\Files\FileInfo', $insideInfo); \OCP\Share::shareItem('folder', $insideInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER4, 31); $folderInfo = $view2->getFileInfo('/directReshare'); + $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo); \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER4, 31); $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId(); $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1'] = $view2->getFileInfo('sub1')->getId(); @@ -261,6 +266,7 @@ class EtagPropagation extends TestCase { public function testOwnerUnshares() { $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); $folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder'); + $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo); $folderId = $folderInfo->getId(); $this->assertTrue( \OCP\Share::unshare( @@ -407,4 +413,17 @@ class EtagPropagation extends TestCase { $this->assertAllUnchaged(); } + + public function testEtagChangeOnPermissionsChange() { + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); + + $view = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + $folderInfo = $view->getFileInfo('/sub1/sub2/folder'); + + \OCP\Share::setPermissions('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 17); + + $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]); + + $this->assertAllUnchaged(); + } } diff --git a/apps/files_sharing/tests/expiresharesjobtest.php b/apps/files_sharing/tests/expiresharesjobtest.php new file mode 100644 index 00000000000..90da4011d8b --- /dev/null +++ b/apps/files_sharing/tests/expiresharesjobtest.php @@ -0,0 +1,204 @@ +<?php +/** + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing\Tests; + +use OCA\Files_Sharing\ExpireSharesJob; + +class ExpireSharesJobTest extends \Test\TestCase { + + /** + * @var ExpireSharesJob + */ + private $job; + + /** + * @var \OCP\IDBConnection + */ + private $connection; + + /** + * @var string + */ + private $user1; + + /** + * @var string + */ + private $user2; + + protected function setup() { + parent::setUp(); + + $this->connection = \OC::$server->getDatabaseConnection(); + // clear occasional leftover shares from other tests + $this->connection->executeUpdate('DELETE FROM `*PREFIX*share`'); + + $this->user1 = $this->getUniqueID('user1_'); + $this->user2 = $this->getUniqueID('user2_'); + + $userManager = \OC::$server->getUserManager(); + $userManager->createUser($this->user1, 'pass'); + $userManager->createUser($this->user2, 'pass'); + + \OC::registerShareHooks(); + + $this->job = new ExpireSharesJob(); + } + + protected function tearDown() { + $this->connection->executeUpdate('DELETE FROM `*PREFIX*share`'); + + $userManager = \OC::$server->getUserManager(); + $user1 = $userManager->get($this->user1); + if($user1) { + $user1->delete(); + } + $user2 = $userManager->get($this->user2); + if($user2) { + $user2->delete(); + } + + $this->logout(); + + parent::tearDown(); + } + + private function getShares() { + $shares = []; + $qb = $this->connection->getQueryBuilder(); + + $result = $qb->select('*') + ->from('share') + ->execute(); + + while ($row = $result->fetch()) { + $shares[] = $row; + } + $result->closeCursor(); + return $shares; + } + + public function dataExpireLinkShare() { + return [ + [false, '', false, false], + [false, '', true, false], + [true, 'P1D', false, true], + [true, 'P1D', true, false], + [true, 'P1W', false, true], + [true, 'P1W', true, false], + [true, 'P1M', false, true], + [true, 'P1M', true, false], + [true, 'P1Y', false, true], + [true, 'P1Y', true, false], + ]; + } + + /** + * @dataProvider dataExpireLinkShare + * + * @param bool addExpiration Should we add an expire date + * @param string $interval The dateInterval + * @param bool $addInterval If true add to the current time if false subtract + * @param bool $shouldExpire Should this share be expired + */ + public function testExpireLinkShare($addExpiration, $interval, $addInterval, $shouldExpire) { + $this->loginAsUser($this->user1); + + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/test'); + + $fileInfo = $view->getFileInfo('files/test'); + + $this->assertNotNull( + \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ), + 'Failed asserting that user 1 successfully shared "test" by link.' + ); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + reset($shares); + $share = current($shares); + + if ($addExpiration) { + $expire = new \DateTime(); + $expire->setTime(0, 0, 0); + if ($addInterval) { + $expire->add(new \DateInterval($interval)); + } else { + $expire->sub(new \DateInterval($interval)); + } + $expire = $expire->format('Y-m-d 00:00:00'); + + // Set expiration date to yesterday + $qb = $this->connection->getQueryBuilder(); + $qb->update('share') + ->set('expiration', $qb->createParameter('expiration')) + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $share['id']) + ->setParameter('expiration', $expire) + ->execute(); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + } + + $this->logout(); + + $this->job->run([]); + + $shares = $this->getShares(); + + if ($shouldExpire) { + $this->assertCount(0, $shares); + } else { + $this->assertCount(1, $shares); + } + } + + public function testDoNotExpireOtherShares() { + $this->loginAsUser($this->user1); + + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/test'); + + $fileInfo = $view->getFileInfo('files/test'); + + $this->assertNotNull( + \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ), + 'Failed asserting that user 1 successfully shared "test" by link with user2.' + ); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + reset($shares); + $share = current($shares); + + $this->logout(); + + $this->job->run([]); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + } + +} + diff --git a/apps/files_sharing/tests/external/managertest.php b/apps/files_sharing/tests/external/managertest.php index 8e03c67a9a3..7242779d455 100644 --- a/apps/files_sharing/tests/external/managertest.php +++ b/apps/files_sharing/tests/external/managertest.php @@ -23,9 +23,12 @@ namespace OCA\Files_Sharing\Tests\External; use OC\Files\Storage\StorageFactory; use OCA\Files_Sharing\External\Manager; +use OCA\Files_Sharing\External\MountProvider; use OCA\Files_Sharing\Tests\TestCase; +use Test\Traits\UserTrait; class ManagerTest extends TestCase { + use UserTrait; /** @var Manager **/ private $manager; @@ -38,10 +41,18 @@ class ManagerTest extends TestCase { private $uid; + /** + * @var \OCP\IUser + */ + private $user; + private $mountProvider; + protected function setUp() { parent::setUp(); $this->uid = $this->getUniqueID('user'); + $this->createUser($this->uid, ''); + $this->user = \OC::$server->getUserManager()->get($this->uid); $this->mountManager = new \OC\Files\Mount\Manager(); $this->httpHelper = $httpHelper = $this->getMockBuilder('\OC\HTTPHelper')->disableOriginalConstructor()->getMock(); /** @var \OC\HTTPHelper $httpHelper */ @@ -53,6 +64,16 @@ class ManagerTest extends TestCase { \OC::$server->getNotificationManager(), $this->uid ); + $this->mountProvider = new MountProvider(\OC::$server->getDatabaseConnection(), function() { + return $this->manager; + }); + } + + private function setupMounts() { + $mounts = $this->mountProvider->getMountsForUser($this->user, new StorageFactory()); + foreach ($mounts as $mount) { + $this->mountManager->addMount($mount); + } } public function testAddShare() { @@ -77,7 +98,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, $openShares); $this->assertExternalShareEntry($shareData1, $openShares[0], 1, '{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertNotMount('SharedFolder'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); @@ -89,7 +110,7 @@ class ManagerTest extends TestCase { // New share falls back to "-1" appendix, because the name is already taken $this->assertExternalShareEntry($shareData2, $openShares[1], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}-1'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertNotMount('SharedFolder'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -111,7 +132,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, $openShares); $this->assertExternalShareEntry($shareData2, $openShares[0], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}-1'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -124,7 +145,7 @@ class ManagerTest extends TestCase { // New share falls back to the original name (no "-\d", because the name is not taken) $this->assertExternalShareEntry($shareData3, $openShares[1], 3, '{{TemporaryMountPointName#' . $shareData3['name'] . '}}'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -136,7 +157,7 @@ class ManagerTest extends TestCase { // Decline the third share $this->manager->declineShare($openShares[1]['id']); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); @@ -151,7 +172,7 @@ class ManagerTest extends TestCase { $this->assertCount(1, $openShares); $this->assertExternalShareEntry($shareData2, $openShares[0], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}-1'); - self::invokePrivate($this->manager, 'setupMounts'); + $this->setupMounts(); $this->assertMount($shareData1['name']); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}'); $this->assertNotMount('{{TemporaryMountPointName#' . $shareData1['name'] . '}}-1'); diff --git a/apps/files_sharing/tests/grouppropagationmanager.php b/apps/files_sharing/tests/grouppropagationmanager.php new file mode 100644 index 00000000000..6fc6ef7a532 --- /dev/null +++ b/apps/files_sharing/tests/grouppropagationmanager.php @@ -0,0 +1,175 @@ +<?php +/** + * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_sharing\Tests; + +use OC\Files\View; +use OCP\IGroupManager; +use OCP\IGroup; +use OCP\IUser; +use OCP\Share; +use OCA\Files_Sharing\Propagation\GroupPropagationManager; +use OCA\Files_Sharing\Propagation\PropagationManager; + +class GroupPropagationManagerTest extends TestCase { + + /** + * @var GroupPropagationManager + */ + private $groupPropagationManager; + + /** + * @var IGroupManager + */ + private $groupManager; + + /** + * @var PropagationManager + */ + private $propagationManager; + + /** + * @var IGroup + */ + private $recipientGroup; + + /** + * @var IUser + */ + private $recipientUser; + + /** + * @var array + */ + private $fileInfo; + + protected function setUp() { + parent::setUp(); + + $user = $this->getMockBuilder('\OCP\IUser') + ->disableOriginalConstructor() + ->getMock(); + $user->method('getUID')->willReturn(self::TEST_FILES_SHARING_API_USER1); + $userSession = $this->getMockBuilder('\OCP\IUserSession') + ->disableOriginalConstructor() + ->getMock(); + $userSession->method('getUser')->willReturn(selF::TEST_FILES_SHARING_API_USER1); + + $this->propagationManager = $this->getMockBuilder('OCA\Files_Sharing\Propagation\PropagationManager') + ->disableOriginalConstructor() + ->getMock(); + + $this->groupManager = \OC::$server->getGroupManager(); + $this->groupPropagationManager = new GroupPropagationManager( + $userSession, + $this->groupManager, + $this->propagationManager + ); + $this->groupPropagationManager->globalSetup(); + + // since the sharing code is not mockable, we have to create a real folder + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); + $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + $view1->mkdir('/folder'); + + $this->fileInfo = $view1->getFileInfo('/folder'); + + $this->recipientGroup = $this->groupManager->get(self::TEST_FILES_SHARING_API_GROUP1); + $this->recipientUser = \OC::$server->getUserManager()->get(self::TEST_FILES_SHARING_API_USER3); + + Share::shareItem( + 'folder', + $this->fileInfo['fileid'], + Share::SHARE_TYPE_GROUP, + $this->recipientGroup->getGID(), + \OCP\Constants::PERMISSION_READ + ); + + $this->loginAsUser($this->recipientUser->getUID()); + } + + protected function tearDown() { + $this->groupPropagationManager->tearDown(); + $this->recipientGroup->removeUser($this->recipientUser); + parent::tearDown(); + } + + public function testPropagateWhenAddedToGroup() { + $this->propagationManager->expects($this->once()) + ->method('propagateSharesToUser') + ->with($this->callback(function($shares) { + if (count($shares) !== 1) { + return false; + } + $share = array_values($shares)[0]; + return $share['file_source'] === $this->fileInfo['fileid'] && + $share['share_with'] === $this->recipientGroup->getGID() && + $share['file_target'] === '/folder'; + }), $this->recipientUser->getUID()); + + $this->recipientGroup->addUser($this->recipientUser); + } + + public function testPropagateWhenRemovedFromGroup() { + $this->recipientGroup->addUser($this->recipientUser); + + $this->propagationManager->expects($this->once()) + ->method('propagateSharesToUser') + ->with($this->callback(function($shares) { + if (count($shares) !== 1) { + return false; + } + $share = array_values($shares)[0]; + return $share['file_source'] === $this->fileInfo['fileid'] && + $share['share_with'] === $this->recipientGroup->getGID() && + $share['file_target'] === '/folder'; + }), $this->recipientUser->getUID()); + + $this->recipientGroup->removeUser($this->recipientUser); + } + + public function testPropagateWhenRemovedFromGroupWithSubdirTarget() { + $this->recipientGroup->addUser($this->recipientUser); + + // relogin to refresh mount points + $this->loginAsUser($this->recipientUser->getUID()); + $recipientView = new View('/' . $this->recipientUser->getUID() . '/files'); + + $this->assertTrue($recipientView->mkdir('sub')); + $this->assertTrue($recipientView->rename('folder', 'sub/folder')); + + $this->propagationManager->expects($this->once()) + ->method('propagateSharesToUser') + ->with($this->callback(function($shares) { + if (count($shares) !== 1) { + return false; + } + $share = array_values($shares)[0]; + return $share['file_source'] === $this->fileInfo['fileid'] && + $share['share_with'] === $this->recipientGroup->getGID() && + $share['file_target'] === '/sub/folder'; + }), $this->recipientUser->getUID()); + + $this->recipientGroup->removeUser($this->recipientUser); + } +} diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js index 96a96f1b814..fd8e36d71ad 100644 --- a/apps/files_sharing/tests/js/shareSpec.js +++ b/apps/files_sharing/tests/js/shareSpec.js @@ -179,7 +179,7 @@ describe('OCA.Sharing.Util tests', function() { expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); - it('shows static share text when file shared with user that has no share permission', function() { + it('shows share action when shared with user who has no share permission', function() { var $action, $tr; fileList.setFiles([{ id: 1, @@ -193,14 +193,9 @@ describe('OCA.Sharing.Util tests', function() { shareOwner: 'User One' }]); $tr = fileList.$el.find('tbody tr:first'); - expect($tr.find('.action-share').length).toEqual(0); - $action = $tr.find('.action-share-notification'); - expect($action.find('>span').text().trim()).toEqual('User One'); - expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); - expect($action.find('img').length).toEqual(1); + expect($tr.find('.action-share').length).toEqual(1); }); - it('do not show static share text when share exists but neither permission nor owner is available', function() { + it('do not show share action when share exists but neither permission nor owner is available', function() { var $action, $tr; fileList.setFiles([{ id: 1, @@ -214,8 +209,6 @@ describe('OCA.Sharing.Util tests', function() { }]); $tr = fileList.$el.find('tbody tr:first'); expect($tr.find('.action-share').length).toEqual(0); - $action = $tr.find('.action-share-notification'); - expect($action.length).toEqual(0); }); }); describe('Share action', function() { diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js index 7fdc6345e38..90ae9c2d6da 100644 --- a/apps/files_sharing/tests/js/sharedfilelistSpec.js +++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js @@ -57,6 +57,7 @@ describe('OCA.Sharing.FileList tests', function() { describe('loading file list for incoming shares', function() { var ocsResponse; + var ocsResponseRemote; beforeEach(function() { fileList = new OCA.Sharing.FileList( @@ -95,26 +96,64 @@ describe('OCA.Sharing.FileList tests', function() { }] } }; + + /* jshint camelcase: false */ + ocsResponseRemote = { + ocs: { + meta: { + status: 'ok', + statuscode: 100, + message: null + }, + data: [{ + id: 8, + remote: 'https://foo.bar/', + remote_id: 42, + share_token: 'abc', + name: '/a.txt', + owner: 'user3', + user: 'user1', + mountpoint: '/b.txt', + mountpoint_hash: 'def', + accepted: 1, + mimetype: 'text/plain', + mtime: 22222, + permissions: 31, + type: 'file', + file_id: 1337 + }] + } + }; + }); it('render file shares', function() { - var request; - - expect(fakeServer.requests.length).toEqual(1); - request = fakeServer.requests[0]; - expect(request.url).toEqual( + expect(fakeServer.requests.length).toEqual(2); + expect(fakeServer.requests[0].url).toEqual( OC.linkToOCS('apps/files_sharing/api/v1') + 'shares?format=json&shared_with_me=true' ); + expect(fakeServer.requests[1].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'remote_shares?format=json' + ); + fakeServer.requests[0].respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify(ocsResponse) ); + fakeServer.requests[1].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponseRemote) + ); + var $rows = fileList.$el.find('tbody tr'); + expect($rows.length).toEqual(2); + var $tr = $rows.eq(0); - expect($rows.length).toEqual(1); expect($tr.attr('data-id')).toEqual('49'); expect($tr.attr('data-type')).toEqual('file'); expect($tr.attr('data-file')).toEqual('local name.txt'); @@ -132,32 +171,66 @@ describe('OCA.Sharing.FileList tests', function() { '?dir=%2Flocal%20path&files=local%20name.txt' ); expect($tr.find('.nametext').text().trim()).toEqual('local name.txt'); + + $tr = $rows.eq(1); + expect($tr.attr('data-id')).toEqual('1337'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('b.txt'); + expect($tr.attr('data-path')).toEqual(''); + expect($tr.attr('data-size')).not.toBeDefined(); + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL); // read and delete + expect($tr.attr('data-mime')).toEqual('text/plain'); + expect($tr.attr('data-mtime')).toEqual('22222000'); + expect($tr.attr('data-share-owner')).toEqual('user3@foo.bar/'); + expect($tr.attr('data-share-id')).toEqual('8'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files/ajax/download.php' + + '?dir=%2F&files=b.txt' + ); + expect($tr.find('.nametext').text().trim()).toEqual('b.txt'); }); it('render folder shares', function() { /* jshint camelcase: false */ - var request; ocsResponse.ocs.data[0] = _.extend(ocsResponse.ocs.data[0], { item_type: 'folder', file_target: '/local path/local name', path: 'files/something shared', }); - expect(fakeServer.requests.length).toEqual(1); - request = fakeServer.requests[0]; - expect(request.url).toEqual( + ocsResponseRemote.ocs.data[0] = _.extend(ocsResponseRemote.ocs.data[0], { + type: 'dir', + mimetype: 'httpd/unix-directory', + name: '/a', + mountpoint: '/b' + }); + + expect(fakeServer.requests.length).toEqual(2); + expect(fakeServer.requests[0].url).toEqual( OC.linkToOCS('apps/files_sharing/api/v1') + 'shares?format=json&shared_with_me=true' ); + expect(fakeServer.requests[1].url).toEqual( + OC.linkToOCS('apps/files_sharing/api/v1') + + 'remote_shares?format=json' + ); fakeServer.requests[0].respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify(ocsResponse) ); + fakeServer.requests[1].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(ocsResponseRemote) + ); var $rows = fileList.$el.find('tbody tr'); + expect($rows.length).toEqual(2); + var $tr = $rows.eq(0); - expect($rows.length).toEqual(1); expect($tr.attr('data-id')).toEqual('49'); expect($tr.attr('data-type')).toEqual('dir'); expect($tr.attr('data-file')).toEqual('local name'); @@ -175,6 +248,26 @@ describe('OCA.Sharing.FileList tests', function() { '?dir=/local%20path/local%20name' ); expect($tr.find('.nametext').text().trim()).toEqual('local name'); + + $tr = $rows.eq(1); + expect($tr.attr('data-id')).toEqual('1337'); + expect($tr.attr('data-type')).toEqual('dir'); + expect($tr.attr('data-file')).toEqual('b'); + expect($tr.attr('data-path')).toEqual(''); + expect($tr.attr('data-size')).not.toBeDefined(); + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL); // read and delete + expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); + expect($tr.attr('data-mtime')).toEqual('22222000'); + expect($tr.attr('data-share-owner')).toEqual('user3@foo.bar/'); + expect($tr.attr('data-share-id')).toEqual('8'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files' + + '?dir=/b' + ); + expect($tr.find('.nametext').text().trim()).toEqual('b'); + }); }); describe('loading file list for outgoing shares', function() { diff --git a/apps/files_sharing/tests/locking.php b/apps/files_sharing/tests/locking.php index 6d13fc1cda5..ae1fcf30a53 100644 --- a/apps/files_sharing/tests/locking.php +++ b/apps/files_sharing/tests/locking.php @@ -1,8 +1,7 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> - * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -30,7 +29,7 @@ use OCP\Lock\ILockingProvider; class Locking extends TestCase { /** - * @var \OC_User_Dummy + * @var \Test\Util\User\Dummy */ private $userBackend; @@ -40,7 +39,7 @@ class Locking extends TestCase { public function setUp() { parent::setUp(); - $this->userBackend = new \OC_User_Dummy(); + $this->userBackend = new \Test\Util\User\Dummy(); \OC::$server->getUserManager()->registerBackend($this->userBackend); $this->ownerUid = $this->getUniqueID('owner_'); diff --git a/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php b/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php index 0db8a1ed5bc..0269f77d0d5 100644 --- a/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php +++ b/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php @@ -1,8 +1,8 @@ <?php /** - * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -23,7 +23,11 @@ */ namespace OCA\Files_Sharing\Middleware; - +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\Files\NotFoundException; +use OCP\AppFramework\Utility\IControllerMethodReflector; +use OCA\Files_Sharing\Exceptions\S2SException; +use OCP\AppFramework\Http\JSONResponse; /** * @package OCA\Files_Sharing\Middleware\SharingCheckMiddleware @@ -36,29 +40,35 @@ class SharingCheckMiddlewareTest extends \Test\TestCase { private $appManager; /** @var SharingCheckMiddleware */ private $sharingCheckMiddleware; + /** @var \OCP\AppFramework\Controller */ + private $controllerMock; + /** @var IControllerMethodReflector */ + private $reflector; protected function setUp() { $this->config = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor()->getMock(); $this->appManager = $this->getMockBuilder('\OCP\App\IAppManager') ->disableOriginalConstructor()->getMock(); + $this->controllerMock = $this->getMockBuilder('\OCP\AppFramework\Controller') + ->disableOriginalConstructor()->getMock(); + $this->reflector = $this->getMockBuilder('\OCP\AppFramework\Utility\IControllerMethodReflector') + ->disableOriginalConstructor()->getMock(); - $this->sharingCheckMiddleware = new SharingCheckMiddleware('files_sharing', $this->config, $this->appManager); + $this->sharingCheckMiddleware = new SharingCheckMiddleware( + 'files_sharing', + $this->config, + $this->appManager, + $this->reflector); } - public function testIsSharingEnabledWithEverythingEnabled() { + public function testIsSharingEnabledWithAppEnabled() { $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->will($this->returnValue(true)); - $this->config - ->expects($this->once()) - ->method('getAppValue') - ->with('core', 'shareapi_allow_links', 'yes') - ->will($this->returnValue('yes')); - $this->assertTrue(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); } @@ -72,19 +82,206 @@ class SharingCheckMiddlewareTest extends \Test\TestCase { $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); } - public function testIsSharingEnabledWithSharingDisabled() { + public function testIsLinkSharingEnabledWithEverythinEnabled() { + $this->config + ->expects($this->at(0)) + ->method('getAppValue') + ->with('core', 'shareapi_enabled', 'yes') + ->will($this->returnValue('yes')); + + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->will($this->returnValue('yes')); + + $this->assertTrue(self::invokePrivate($this->sharingCheckMiddleware, 'isLinkSharingEnabled')); + } + + + public function testIsLinkSharingEnabledWithLinkSharingDisabled() { + $this->config + ->expects($this->at(0)) + ->method('getAppValue') + ->with('core', 'shareapi_enabled', 'yes') + ->will($this->returnValue('yes')); + + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->will($this->returnValue('no')); + + $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isLinkSharingEnabled')); + } + + public function testIsLinkSharingEnabledWithSharingAPIDisabled() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_enabled', 'yes') + ->will($this->returnValue('no')); + + $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isLinkSharingEnabled')); + } + + public function externalSharesChecksDataProvider() { + + $data = []; + + foreach ([false, true] as $annIn) { + foreach ([false, true] as $annOut) { + foreach ([false, true] as $confIn) { + foreach ([false, true] as $confOut) { + + $res = true; + if (!$annIn && !$confIn) { + $res = false; + } elseif (!$annOut && !$confOut) { + $res = false; + } + + $d = [ + [ + ['NoIncomingFederatedSharingRequired', $annIn], + ['NoOutgoingFederatedSharingRequired', $annOut], + ], + [ + ['files_sharing', 'incoming_server2server_share_enabled', 'yes', $confIn ? 'yes' : 'no'], + ['files_sharing', 'outgoing_server2server_share_enabled', 'yes', $confOut ? 'yes' : 'no'], + ], + $res + ]; + + $data[] = $d; + } + } + } + } + + return $data; + } + + /** + * @dataProvider externalSharesChecksDataProvider + */ + public function testExternalSharesChecks($annotations, $config, $expectedResult) { + $this->reflector + ->expects($this->atLeastOnce()) + ->method('hasAnnotation') + ->will($this->returnValueMap($annotations)); + + $this->config + ->method('getAppValue') + ->will($this->returnValueMap($config)); + + $this->assertEquals($expectedResult, self::invokePrivate($this->sharingCheckMiddleware, 'externalSharesChecks')); + } + + /** + * @dataProvider externalSharesChecksDataProvider + */ + public function testBeforeControllerWithExternalShareControllerWithSharingEnabled($annotations, $config, $noException) { $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->will($this->returnValue(true)); + $this->reflector + ->expects($this->atLeastOnce()) + ->method('hasAnnotation') + ->will($this->returnValueMap($annotations)); + $this->config + ->method('getAppValue') + ->will($this->returnValueMap($config)); + + $controller = $this->getMockBuilder('\OCA\Files_Sharing\Controllers\ExternalSharesController') + ->disableOriginalConstructor()->getMock(); + + $exceptionThrown = false; + + try { + $this->sharingCheckMiddleware->beforeController($controller, 'myMethod'); + } catch (\OCA\Files_Sharing\Exceptions\S2SException $exception) { + $exceptionThrown = true; + } + + $this->assertNotEquals($noException, $exceptionThrown); + } + + public function testBeforeControllerWithShareControllerWithSharingEnabled() { + $this->appManager ->expects($this->once()) + ->method('isEnabledForUser') + ->with('files_sharing') + ->will($this->returnValue(true)); + + $this->config + ->expects($this->at(0)) + ->method('getAppValue') + ->with('core', 'shareapi_enabled', 'yes') + ->will($this->returnValue('yes')); + + $this->config + ->expects($this->at(1)) ->method('getAppValue') ->with('core', 'shareapi_allow_links', 'yes') - ->will($this->returnValue('no')); + ->will($this->returnValue('yes')); - $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); + $controller = $this->getMockBuilder('\OCA\Files_Sharing\Controllers\ShareController') + ->disableOriginalConstructor()->getMock(); + + $this->sharingCheckMiddleware->beforeController($controller, 'myMethod'); } + + /** + * @expectedException \OCP\Files\NotFoundException + * @expectedExceptionMessage Link sharing is disabled + */ + public function testBeforeControllerWithShareControllerWithSharingEnabledAPIDisabled() { + $this->appManager + ->expects($this->once()) + ->method('isEnabledForUser') + ->with('files_sharing') + ->will($this->returnValue(true)); + + $controller = $this->getMockBuilder('\OCA\Files_Sharing\Controllers\ShareController') + ->disableOriginalConstructor()->getMock(); + + $this->sharingCheckMiddleware->beforeController($controller, 'myMethod'); + } + + /** + * @expectedException \OCP\Files\NotFoundException + * @expectedExceptionMessage Sharing is disabled. + */ + public function testBeforeControllerWithSharingDisabled() { + $this->appManager + ->expects($this->once()) + ->method('isEnabledForUser') + ->with('files_sharing') + ->will($this->returnValue(false)); + + $this->sharingCheckMiddleware->beforeController($this->controllerMock, 'myMethod'); + } + + /** + * @expectedException \Exception + * @expectedExceptionMessage My Exception message + */ + public function testAfterExceptionWithRegularException() { + $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new \Exception('My Exception message')); + } + + public function testAfterExceptionWithNotFoundException() { + $this->assertEquals(new NotFoundResponse(), $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new NotFoundException('My Exception message'))); + } + + public function testAfterExceptionWithS2SException() { + $this->assertEquals(new JSONResponse('My Exception message', 405), $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new S2SException('My Exception message'))); + } + + } diff --git a/apps/files_sharing/tests/permissions.php b/apps/files_sharing/tests/permissions.php index c10333defaa..80e727b7178 100644 --- a/apps/files_sharing/tests/permissions.php +++ b/apps/files_sharing/tests/permissions.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php index a4cc8209a8e..300c637c777 100644 --- a/apps/files_sharing/tests/server2server.php +++ b/apps/files_sharing/tests/server2server.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * diff --git a/apps/files_sharing/tests/share.php b/apps/files_sharing/tests/share.php index ed21e20f751..abff820c168 100644 --- a/apps/files_sharing/tests/share.php +++ b/apps/files_sharing/tests/share.php @@ -4,6 +4,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_sharing/tests/sharedmount.php b/apps/files_sharing/tests/sharedmount.php index d1db6a644f0..6f487892b8f 100644 --- a/apps/files_sharing/tests/sharedmount.php +++ b/apps/files_sharing/tests/sharedmount.php @@ -4,6 +4,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_sharing/tests/sharedstorage.php b/apps/files_sharing/tests/sharedstorage.php index de510cf1eec..3361d2cbd12 100644 --- a/apps/files_sharing/tests/sharedstorage.php +++ b/apps/files_sharing/tests/sharedstorage.php @@ -47,8 +47,10 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase { } protected function tearDown() { - $this->view->unlink($this->folder); - $this->view->unlink($this->filename); + if ($this->view) { + $this->view->unlink($this->folder); + $this->view->unlink($this->filename); + } \OC\Files\Filesystem::getLoader()->removeStorageWrapper('oc_trashbin'); @@ -85,8 +87,9 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase { $this->assertFalse($user2View->is_dir($this->folder)); // delete the local folder - $fullPath = \OC_Config::getValue('datadirectory') . '/' . self::TEST_FILES_SHARING_API_USER2 . '/files/localfolder'; - rmdir($fullPath); + /** @var \OC\Files\Storage\Storage $storage */ + list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/localfolder'); + $storage->rmdir($internalPath); //enforce reload of the mount points self::loginHelper(self::TEST_FILES_SHARING_API_USER2); diff --git a/apps/files_sharing/tests/sizepropagation.php b/apps/files_sharing/tests/sizepropagation.php index dbaa316f603..c596003de76 100644 --- a/apps/files_sharing/tests/sizepropagation.php +++ b/apps/files_sharing/tests/sizepropagation.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -36,6 +35,7 @@ class SizePropagation extends TestCase { $ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'bar'); $sharedFolderInfo = $ownerView->getFileInfo('/sharedfolder', false); + $this->assertInstanceOf('\OC\Files\FileInfo', $sharedFolderInfo); \OCP\Share::shareItem('folder', $sharedFolderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER1, 31); $ownerRootInfo = $ownerView->getFileInfo('', false); @@ -68,6 +68,7 @@ class SizePropagation extends TestCase { $ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'bar'); $sharedFolderInfo = $ownerView->getFileInfo('/sharedfolder', false); + $this->assertInstanceOf('\OC\Files\FileInfo', $sharedFolderInfo); \OCP\Share::shareItem('folder', $sharedFolderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER1, 31); $ownerRootInfo = $ownerView->getFileInfo('', false); diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php index 7533b13f79d..c91734a5b03 100644 --- a/apps/files_sharing/tests/testcase.php +++ b/apps/files_sharing/tests/testcase.php @@ -72,7 +72,7 @@ abstract class TestCase extends \Test\TestCase { \OC::registerShareHooks(); // create users - $backend = new \OC_User_Dummy(); + $backend = new \Test\Util\User\Dummy(); \OC_User::useBackend($backend); $backend->createUser(self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER1); $backend->createUser(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER2); diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php index 488792db4ef..5e96a3fe68e 100644 --- a/apps/files_sharing/tests/watcher.php +++ b/apps/files_sharing/tests/watcher.php @@ -108,9 +108,8 @@ class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase { $this->sharedCache->put('', array('mtime' => 10, 'storage_mtime' => 10, 'size' => '-1', 'mimetype' => 'httpd/unix-directory')); // run the propagation code - $result = $this->sharedStorage->getWatcher()->checkUpdate(''); - - $this->assertTrue($result); + $this->sharedStorage->getWatcher()->checkUpdate(''); + $this->sharedStorage->getCache()->correctFolderSize(''); // the owner's parent dirs must have increase size $newSizes = self::getOwnerDirSizes('files/container/shareddir'); @@ -139,9 +138,8 @@ class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase { $this->sharedCache->put('subdir', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain')); // run the propagation code - $result = $this->sharedStorage->getWatcher()->checkUpdate('subdir'); - - $this->assertTrue($result); + $this->sharedStorage->getWatcher()->checkUpdate('subdir'); + $this->sharedStorage->getCache()->correctFolderSize('subdir'); // the owner's parent dirs must have increase size $newSizes = self::getOwnerDirSizes('files/container/shareddir/subdir'); diff --git a/apps/files_trashbin/ajax/delete.php b/apps/files_trashbin/ajax/delete.php index 63002671bfa..7ce8d632e4b 100644 --- a/apps/files_trashbin/ajax/delete.php +++ b/apps/files_trashbin/ajax/delete.php @@ -4,6 +4,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_trashbin/ajax/preview.php b/apps/files_trashbin/ajax/preview.php index c8bae2c5ce9..90add53f77f 100644 --- a/apps/files_trashbin/ajax/preview.php +++ b/apps/files_trashbin/ajax/preview.php @@ -3,6 +3,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Georg Ehrke <georg@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_trashbin/ajax/undelete.php b/apps/files_trashbin/ajax/undelete.php index 8eda7a8d640..01dc91f9bac 100644 --- a/apps/files_trashbin/ajax/undelete.php +++ b/apps/files_trashbin/ajax/undelete.php @@ -4,6 +4,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/apps/files_trashbin/appinfo/app.php b/apps/files_trashbin/appinfo/app.php index 4805f9eeafd..7d99270557f 100644 --- a/apps/files_trashbin/appinfo/app.php +++ b/apps/files_trashbin/appinfo/app.php @@ -1,10 +1,10 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> - * @author Björn Schießle <schiessle@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> * @author Florin Peter <github@florin-peter.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_trashbin/appinfo/info.xml b/apps/files_trashbin/appinfo/info.xml index f8bc5e7d3d2..c4bade081b3 100644 --- a/apps/files_trashbin/appinfo/info.xml +++ b/apps/files_trashbin/appinfo/info.xml @@ -10,11 +10,14 @@ To prevent a user from running out of disk space, the ownCloud Deleted files app <licence>AGPL</licence> <author>Bjoern Schiessle</author> <shipped>true</shipped> - <requiremin>4.9</requiremin> <default_enable/> + <version>0.8.0</version> <types> <filesystem/> </types> + <dependencies> + <owncloud min-version="9.0" /> + </dependencies> <documentation> <user>user-trashbin</user> </documentation> diff --git a/apps/files_trashbin/appinfo/routes.php b/apps/files_trashbin/appinfo/routes.php index cf3d7b77ec2..caa9f0864a1 100644 --- a/apps/files_trashbin/appinfo/routes.php +++ b/apps/files_trashbin/appinfo/routes.php @@ -1,6 +1,5 @@ <?php /** - * @author Georg Ehrke <georg@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> diff --git a/apps/files_trashbin/appinfo/update.php b/apps/files_trashbin/appinfo/update.php index ae018a9da5d..bd2ee6bb390 100644 --- a/apps/files_trashbin/appinfo/update.php +++ b/apps/files_trashbin/appinfo/update.php @@ -3,6 +3,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_trashbin/appinfo/version b/apps/files_trashbin/appinfo/version deleted file mode 100644 index 844f6a91acb..00000000000 --- a/apps/files_trashbin/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.6.3 diff --git a/apps/files_trashbin/command/cleanup.php b/apps/files_trashbin/command/cleanup.php index 60717abac18..8af5dee4fcb 100644 --- a/apps/files_trashbin/command/cleanup.php +++ b/apps/files_trashbin/command/cleanup.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_trashbin/command/expire.php b/apps/files_trashbin/command/expire.php index 89b949bbcdf..f34c63b718b 100644 --- a/apps/files_trashbin/command/expire.php +++ b/apps/files_trashbin/command/expire.php @@ -1,7 +1,6 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> diff --git a/apps/files_trashbin/css/trash.css b/apps/files_trashbin/css/trash.css index 15a9249d7b2..053e2e7002c 100644 --- a/apps/files_trashbin/css/trash.css +++ b/apps/files_trashbin/css/trash.css @@ -18,3 +18,21 @@ #app-content-trashbin #filestable .summary .filesize { display: none; } + +#app-navigation > ul { + padding-bottom: 44px; +} + +/* move Deleted Files to bottom of sidebar */ +.nav-trashbin { + position: fixed !important; + bottom: 44px; + width: inherit !important; + background-color: #fff; + border-right: 1px solid #eee; +} +/* double padding to account for Deleted files entry, issue with Firefox */ +.app-files #app-navigation > ul li:nth-last-child(2) { + margin-bottom: 44px; +} + diff --git a/apps/files_trashbin/js/app.js b/apps/files_trashbin/js/app.js index 473cce88a71..364b51697bd 100644 --- a/apps/files_trashbin/js/app.js +++ b/apps/files_trashbin/js/app.js @@ -26,7 +26,8 @@ OCA.Trashbin.App = { this.fileList = new OCA.Trashbin.FileList( $('#app-content-trashbin'), { scrollContainer: $('#app-content'), - fileActions: this._createFileActions() + fileActions: this._createFileActions(), + detailsViewEnabled: false } ); }, @@ -43,22 +44,31 @@ OCA.Trashbin.App = { fileActions.setDefault('dir', 'Open'); - fileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename, context) { - var fileList = context.fileList; - var tr = fileList.findFileEl(filename); - var deleteAction = tr.children("td.date").children(".action.delete"); - deleteAction.removeClass('icon-delete').addClass('icon-loading-small'); - fileList.disableActions(); - $.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'), { - files: JSON.stringify([filename]), - dir: fileList.getCurrentDirectory() - }, - _.bind(fileList._removeCallback, fileList) - ); - }, t('files_trashbin', 'Restore')); + fileActions.registerAction({ + name: 'Restore', + displayName: t('files_trashbin', 'Restore'), + type: OCA.Files.FileActions.TYPE_INLINE, + mime: 'all', + permissions: OC.PERMISSION_READ, + icon: OC.imagePath('core', 'actions/history'), + actionHandler: function(filename, context) { + var fileList = context.fileList; + var tr = fileList.findFileEl(filename); + var deleteAction = tr.children("td.date").children(".action.delete"); + deleteAction.removeClass('icon-delete').addClass('icon-loading-small'); + fileList.disableActions(); + $.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'), { + files: JSON.stringify([filename]), + dir: fileList.getCurrentDirectory() + }, + _.bind(fileList._removeCallback, fileList) + ); + } + }); fileActions.registerAction({ name: 'Delete', + displayName: t('files', 'Delete'), mime: 'all', permissions: OC.PERMISSION_READ, icon: function() { diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js index febe3a45be3..6b624e333a0 100644 --- a/apps/files_trashbin/js/filelist.js +++ b/apps/files_trashbin/js/filelist.js @@ -268,12 +268,12 @@ enableActions: function() { this.$el.find('.action').css('display', 'inline'); - this.$el.find(':input:checkbox').css('display', 'inline'); + this.$el.find('input:checkbox').removeClass('u-hidden'); }, disableActions: function() { this.$el.find('.action').css('display', 'none'); - this.$el.find(':input:checkbox').css('display', 'none'); + this.$el.find('input:checkbox').addClass('u-hidden'); }, updateStorageStatistics: function() { diff --git a/apps/files_trashbin/l10n/ar.js b/apps/files_trashbin/l10n/ar.js index bd6a6ef89d9..964d547c42a 100644 --- a/apps/files_trashbin/l10n/ar.js +++ b/apps/files_trashbin/l10n/ar.js @@ -5,11 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "تعذّر استرجاع %s ", "Deleted files" : "حذف الملفات", "Restore" : "استعيد", + "Delete" : "إلغاء", "Delete permanently" : "حذف بشكل دائم", "Error" : "خطأ", "restored" : "تمت الاستعادة", + "No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ", + "Select all" : "تحديد الكل ", "Name" : "اسم", - "Deleted" : "تم الحذف", - "Delete" : "إلغاء" + "Deleted" : "تم الحذف" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/files_trashbin/l10n/ar.json b/apps/files_trashbin/l10n/ar.json index 4df828c0843..cb73176fda1 100644 --- a/apps/files_trashbin/l10n/ar.json +++ b/apps/files_trashbin/l10n/ar.json @@ -3,11 +3,13 @@ "Couldn't restore %s" : "تعذّر استرجاع %s ", "Deleted files" : "حذف الملفات", "Restore" : "استعيد", + "Delete" : "إلغاء", "Delete permanently" : "حذف بشكل دائم", "Error" : "خطأ", "restored" : "تمت الاستعادة", + "No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ", + "Select all" : "تحديد الكل ", "Name" : "اسم", - "Deleted" : "تم الحذف", - "Delete" : "إلغاء" + "Deleted" : "تم الحذف" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/fa.js b/apps/files_trashbin/l10n/fa.js index 8dc5f70fd68..28aa38a96a6 100644 --- a/apps/files_trashbin/l10n/fa.js +++ b/apps/files_trashbin/l10n/fa.js @@ -5,11 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "%s را نمی توان بازگرداند", "Deleted files" : "فایل های حذف شده", "Restore" : "بازیابی", + "Delete" : "حذف", "Delete permanently" : "حذف قطعی", "Error" : "خطا", "restored" : "بازیابی شد", + "No entries found in this folder" : "هیچ ورودیای در این پوشه وجود ندارد", + "Select all" : "انتخاب همه", "Name" : "نام", - "Deleted" : "حذف شده", - "Delete" : "حذف" + "Deleted" : "حذف شده" }, "nplurals=1; plural=0;"); diff --git a/apps/files_trashbin/l10n/fa.json b/apps/files_trashbin/l10n/fa.json index befa84ab15e..d8641316f44 100644 --- a/apps/files_trashbin/l10n/fa.json +++ b/apps/files_trashbin/l10n/fa.json @@ -3,11 +3,13 @@ "Couldn't restore %s" : "%s را نمی توان بازگرداند", "Deleted files" : "فایل های حذف شده", "Restore" : "بازیابی", + "Delete" : "حذف", "Delete permanently" : "حذف قطعی", "Error" : "خطا", "restored" : "بازیابی شد", + "No entries found in this folder" : "هیچ ورودیای در این پوشه وجود ندارد", + "Select all" : "انتخاب همه", "Name" : "نام", - "Deleted" : "حذف شده", - "Delete" : "حذف" + "Deleted" : "حذف شده" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/hy.js b/apps/files_trashbin/l10n/hy.js index 0ad4f14c7b7..3cc05b39236 100644 --- a/apps/files_trashbin/l10n/hy.js +++ b/apps/files_trashbin/l10n/hy.js @@ -1,6 +1,12 @@ OC.L10N.register( "files_trashbin", { - "Delete" : "Ջնջել" + "Deleted files" : "Ջնջված ֆայլեր", + "Restore" : "Վերականգնել", + "Delete" : "Ջնջել", + "Delete permanently" : "Ջնջել ընդմիշտ", + "No deleted files" : "Ջնջված ֆայլեր չկան", + "Select all" : "Նշել բոլորը", + "Name" : "Անուն" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/hy.json b/apps/files_trashbin/l10n/hy.json index 081a2c5f49e..994d6afaa58 100644 --- a/apps/files_trashbin/l10n/hy.json +++ b/apps/files_trashbin/l10n/hy.json @@ -1,4 +1,10 @@ { "translations": { - "Delete" : "Ջնջել" + "Deleted files" : "Ջնջված ֆայլեր", + "Restore" : "Վերականգնել", + "Delete" : "Ջնջել", + "Delete permanently" : "Ջնջել ընդմիշտ", + "No deleted files" : "Ջնջված ֆայլեր չկան", + "Select all" : "Նշել բոլորը", + "Name" : "Անուն" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/nds.js b/apps/files_trashbin/l10n/nds.js new file mode 100644 index 00000000000..b2dd9ff4ca6 --- /dev/null +++ b/apps/files_trashbin/l10n/nds.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "files_trashbin", + { + "Delete" : "Löschen", + "Name" : "Name" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/hi.json b/apps/files_trashbin/l10n/nds.json index 8ddb046ec63..45b0caa74ac 100644 --- a/apps/user_webdavauth/l10n/hi.json +++ b/apps/files_trashbin/l10n/nds.json @@ -1,4 +1,5 @@ { "translations": { - "Save" : "सहेजें" + "Delete" : "Löschen", + "Name" : "Name" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/oc.js b/apps/files_trashbin/l10n/oc.js index f8846950f59..390ccaea050 100644 --- a/apps/files_trashbin/l10n/oc.js +++ b/apps/files_trashbin/l10n/oc.js @@ -5,6 +5,7 @@ OC.L10N.register( "Couldn't restore %s" : "Impossible de restablir %s", "Deleted files" : "Fichièrs suprimits", "Restore" : "Restablir", + "Delete" : "Suprimir", "Delete permanently" : "Suprimir de faiçon definitiva", "Error" : "Error", "restored" : "restablit", @@ -13,7 +14,6 @@ OC.L10N.register( "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr", "Select all" : "Seleccionar tot", "Name" : "Nom", - "Deleted" : "Escafat", - "Delete" : "Suprimir" + "Deleted" : "Escafat" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_trashbin/l10n/oc.json b/apps/files_trashbin/l10n/oc.json index 60bb205efe2..e2add0b3cdb 100644 --- a/apps/files_trashbin/l10n/oc.json +++ b/apps/files_trashbin/l10n/oc.json @@ -3,6 +3,7 @@ "Couldn't restore %s" : "Impossible de restablir %s", "Deleted files" : "Fichièrs suprimits", "Restore" : "Restablir", + "Delete" : "Suprimir", "Delete permanently" : "Suprimir de faiçon definitiva", "Error" : "Error", "restored" : "restablit", @@ -11,7 +12,6 @@ "No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr", "Select all" : "Seleccionar tot", "Name" : "Nom", - "Deleted" : "Escafat", - "Delete" : "Suprimir" + "Deleted" : "Escafat" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/sq.js b/apps/files_trashbin/l10n/sq.js index be6182a94dd..3a1d0fed3bb 100644 --- a/apps/files_trashbin/l10n/sq.js +++ b/apps/files_trashbin/l10n/sq.js @@ -1,15 +1,19 @@ OC.L10N.register( "files_trashbin", { - "Couldn't delete %s permanently" : "Nuk munda ta eliminoj përfundimisht %s", - "Couldn't restore %s" : "Nuk munda ta rivendos %s", - "Deleted files" : "Skedarë të fshirë ", - "Restore" : "Rivendos", - "Delete permanently" : "Fshi përfundimisht", - "Error" : "Veprim i gabuar", - "restored" : "rivendosur", - "Name" : "Emri", - "Deleted" : "Eliminuar", - "Delete" : "Elimino" + "Couldn't delete %s permanently" : "S’u fshi dot përgjithmonë %s", + "Couldn't restore %s" : "S’u rikthye dot %s", + "Deleted files" : "Kartela të fshira", + "Restore" : "Riktheje", + "Delete" : "Fshije", + "Delete permanently" : "Fshije përgjithmonë", + "Error" : "Gabim", + "restored" : "u rikthye", + "No deleted files" : "Pa kartela të fshira", + "You will be able to recover deleted files from here" : "Që këtu do të jeni në gjendje të rimerrni kartela të fshira", + "No entries found in this folder" : "Në këtë dosje s’u gjetën zëra", + "Select all" : "Përzgjidhi krejt", + "Name" : "Emër", + "Deleted" : "U fshi" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/sq.json b/apps/files_trashbin/l10n/sq.json index 735fd8c86b1..4f2c429cb75 100644 --- a/apps/files_trashbin/l10n/sq.json +++ b/apps/files_trashbin/l10n/sq.json @@ -1,13 +1,17 @@ { "translations": { - "Couldn't delete %s permanently" : "Nuk munda ta eliminoj përfundimisht %s", - "Couldn't restore %s" : "Nuk munda ta rivendos %s", - "Deleted files" : "Skedarë të fshirë ", - "Restore" : "Rivendos", - "Delete permanently" : "Fshi përfundimisht", - "Error" : "Veprim i gabuar", - "restored" : "rivendosur", - "Name" : "Emri", - "Deleted" : "Eliminuar", - "Delete" : "Elimino" + "Couldn't delete %s permanently" : "S’u fshi dot përgjithmonë %s", + "Couldn't restore %s" : "S’u rikthye dot %s", + "Deleted files" : "Kartela të fshira", + "Restore" : "Riktheje", + "Delete" : "Fshije", + "Delete permanently" : "Fshije përgjithmonë", + "Error" : "Gabim", + "restored" : "u rikthye", + "No deleted files" : "Pa kartela të fshira", + "You will be able to recover deleted files from here" : "Që këtu do të jeni në gjendje të rimerrni kartela të fshira", + "No entries found in this folder" : "Në këtë dosje s’u gjetën zëra", + "Select all" : "Përzgjidhi krejt", + "Name" : "Emër", + "Deleted" : "U fshi" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_trashbin/lib/backgroundjob/expiretrash.php b/apps/files_trashbin/lib/backgroundjob/expiretrash.php index a222767669a..079fdd29912 100644 --- a/apps/files_trashbin/lib/backgroundjob/expiretrash.php +++ b/apps/files_trashbin/lib/backgroundjob/expiretrash.php @@ -1,5 +1,6 @@ <?php /** + * @author Lukas Reschke <lukas@owncloud.com> * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_trashbin/lib/expiration.php b/apps/files_trashbin/lib/expiration.php index 5069521aab3..1c08e2869f6 100644 --- a/apps/files_trashbin/lib/expiration.php +++ b/apps/files_trashbin/lib/expiration.php @@ -1,5 +1,6 @@ <?php /** + * @author Lukas Reschke <lukas@owncloud.com> * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php index f51185712a9..3d6a02c7776 100644 --- a/apps/files_trashbin/lib/helper.php +++ b/apps/files_trashbin/lib/helper.php @@ -5,6 +5,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -65,11 +66,14 @@ class Helper if (!\OC\Files\Filesystem::isIgnoredDir($entryName)) { $id = $entryName; if ($dir === '' || $dir === '/') { + $size = $view->filesize($id); $pathparts = pathinfo($entryName); $timestamp = substr($pathparts['extension'], 1); $id = $pathparts['filename']; + } else if ($timestamp === null) { // for subfolders we need to calculate the timestamp only once + $size = $view->filesize($dir . '/' . $id); $parts = explode('/', ltrim($dir, '/')); $timestamp = substr(pathinfo($parts[0], PATHINFO_EXTENSION), 1); } @@ -86,6 +90,7 @@ class Helper 'mimetype' => $view->is_dir($dir . '/' . $entryName) ? 'httpd/unix-directory' : \OC_Helper::getFileNameMimeType($id), 'type' => $view->is_dir($dir . '/' . $entryName) ? 'dir' : 'file', 'directory' => ($dir === '/') ? '' : $dir, + 'size' => $size, ); if ($originalPath) { $i['extraData'] = $originalPath.'/'.$id; diff --git a/apps/files_trashbin/lib/hooks.php b/apps/files_trashbin/lib/hooks.php index d11890aa4a7..57fc8d7a8d3 100644 --- a/apps/files_trashbin/lib/hooks.php +++ b/apps/files_trashbin/lib/hooks.php @@ -1,6 +1,5 @@ <?php /** - * @author Bart Visscher <bartv@thisnet.nl> * @author Björn Schießle <schiessle@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> diff --git a/apps/files_trashbin/lib/storage.php b/apps/files_trashbin/lib/storage.php index 4185fc6aec4..0e42df1e967 100644 --- a/apps/files_trashbin/lib/storage.php +++ b/apps/files_trashbin/lib/storage.php @@ -142,6 +142,13 @@ class Storage extends Wrapper { ) { return call_user_func_array([$this->storage, $method], [$path]); } + + // check permissions before we continue, this is especially important for + // shared files + if (!$this->isDeletable($path)) { + return false; + } + $normalized = Filesystem::normalizePath($this->mountPoint . '/' . $path); $result = true; if (!isset($this->deletedFiles[$normalized])) { diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php index 3b2d4cf5929..839a47a7bf2 100644 --- a/apps/files_trashbin/lib/trashbin.php +++ b/apps/files_trashbin/lib/trashbin.php @@ -7,6 +7,7 @@ * @author Georg Ehrke <georg@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Morris Jobke <hey@morrisjobke.de> * @author Qingping Hou <dave2008713@gmail.com> * @author Robin Appelman <icewind@owncloud.com> @@ -136,27 +137,28 @@ class Trashbin { * * @param string $sourcePath * @param string $owner - * @param string $ownerPath + * @param $targetPath + * @param $user * @param integer $timestamp */ - private static function copyFilesToOwner($sourcePath, $owner, $ownerPath, $timestamp) { + private static function copyFilesToUser($sourcePath, $owner, $targetPath, $user, $timestamp) { self::setUpTrash($owner); - $ownerFilename = basename($ownerPath); - $ownerLocation = dirname($ownerPath); + $targetFilename = basename($targetPath); + $targetLocation = dirname($targetPath); $sourceFilename = basename($sourcePath); $view = new \OC\Files\View('/'); - $source = \OCP\User::getUser() . '/files_trashbin/files/' . $sourceFilename . '.d' . $timestamp; - $target = $owner . '/files_trashbin/files/' . $ownerFilename . '.d' . $timestamp; + $target = $user . '/files_trashbin/files/' . $targetFilename . '.d' . $timestamp; + $source = $owner . '/files_trashbin/files/' . $sourceFilename . '.d' . $timestamp; self::copy_recursive($source, $target, $view); if ($view->file_exists($target)) { $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)"); - $result = $query->execute(array($ownerFilename, $timestamp, $ownerLocation, $owner)); + $result = $query->execute(array($targetFilename, $timestamp, $targetLocation, $user)); if (!$result) { \OCP\Util::writeLog('files_trashbin', 'trash bin database couldn\'t be updated for the files owner', \OCP\Util::ERROR); } @@ -168,6 +170,7 @@ class Trashbin { * move file to the trash bin * * @param string $file_path path to the deleted file/directory relative to the files root directory + * @return bool */ public static function move2trash($file_path) { // get the user for which the filesystem is setup @@ -176,9 +179,9 @@ class Trashbin { $size = 0; list($owner, $ownerPath) = self::getUidAndFilename($file_path); - $view = new \OC\Files\View('/' . $user); + $ownerView = new \OC\Files\View('/' . $owner); // file has been deleted in between - if (!$view->file_exists('/files/' . $file_path)) { + if (!$ownerView->file_exists('/files/' . $ownerPath)) { return true; } @@ -188,7 +191,7 @@ class Trashbin { self::setUpTrash($owner); } - $path_parts = pathinfo($file_path); + $path_parts = pathinfo($ownerPath); $filename = $path_parts['basename']; $location = $path_parts['dirname']; @@ -200,9 +203,9 @@ class Trashbin { $trashPath = '/files_trashbin/files/' . $filename . '.d' . $timestamp; /** @var \OC\Files\Storage\Storage $trashStorage */ - list($trashStorage, $trashInternalPath) = $view->resolvePath($trashPath); + list($trashStorage, $trashInternalPath) = $ownerView->resolvePath($trashPath); /** @var \OC\Files\Storage\Storage $sourceStorage */ - list($sourceStorage, $sourceInternalPath) = $view->resolvePath('/files/' . $file_path); + list($sourceStorage, $sourceInternalPath) = $ownerView->resolvePath('/files/' . $ownerPath); try { $sizeOfAddedFiles = $sourceStorage->filesize($sourceInternalPath); if ($trashStorage->file_exists($trashInternalPath)) { @@ -222,23 +225,23 @@ class Trashbin { return false; } - $view->getUpdater()->rename('/files/' . $file_path, $trashPath); + $ownerView->getUpdater()->rename('/files/' . $ownerPath, $trashPath); if ($sizeOfAddedFiles !== false) { $size = $sizeOfAddedFiles; $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)"); - $result = $query->execute(array($filename, $timestamp, $location, $user)); + $result = $query->execute(array($filename, $timestamp, $location, $owner)); if (!$result) { \OCP\Util::writeLog('files_trashbin', 'trash bin database couldn\'t be updated', \OCP\Util::ERROR); } \OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_moveToTrash', array('filePath' => \OC\Files\Filesystem::normalizePath($file_path), 'trashPath' => \OC\Files\Filesystem::normalizePath($filename . '.d' . $timestamp))); - $size += self::retainVersions($file_path, $filename, $owner, $ownerPath, $timestamp); + $size += self::retainVersions($filename, $owner, $ownerPath, $timestamp); // if owner !== user we need to also add a copy to the owners trash if ($user !== $owner) { - self::copyFilesToOwner($file_path, $owner, $ownerPath, $timestamp); + self::copyFilesToUser($ownerPath, $owner, $file_path, $user, $timestamp); } } @@ -258,7 +261,6 @@ class Trashbin { /** * Move file versions to trash so that they can be restored later * - * @param string $file_path path to original file * @param string $filename of deleted file * @param string $owner owner user id * @param string $ownerPath path relative to the owner's home storage @@ -266,7 +268,7 @@ class Trashbin { * * @return int size of stored versions */ - private static function retainVersions($file_path, $filename, $owner, $ownerPath, $timestamp) { + private static function retainVersions($filename, $owner, $ownerPath, $timestamp) { $size = 0; if (\OCP\App::isEnabled('files_versions') && !empty($ownerPath)) { @@ -579,8 +581,9 @@ class Trashbin { if ($quota === null || $quota === 'none') { $quota = \OC\Files\Filesystem::free_space('/'); $softQuota = false; - if ($quota === \OCP\Files\FileInfo::SPACE_UNKNOWN) { - $quota = 0; + // inf or unknown free space + if ($quota < 0) { + $quota = PHP_INT_MAX; } } else { $quota = \OCP\Util::computerFileSize($quota); @@ -895,7 +898,7 @@ class Trashbin { $view = new \OC\Files\View('/' . $user . '/files_trashbin'); if ($view->is_dir('/files') && $dh = $view->opendir('/files')) { while ($file = readdir($dh)) { - if ($file !== '.' and $file !== '..') { + if (!\OC\Files\Filesystem::isIgnoredDir($file)) { return false; } } @@ -908,6 +911,6 @@ class Trashbin { * @return string */ public static function preview_icon($path) { - return \OCP\Util::linkToRoute('core_ajax_trashbin_preview', array('x' => 36, 'y' => 36, 'file' => $path)); + return \OCP\Util::linkToRoute('core_ajax_trashbin_preview', array('x' => 32, 'y' => 32, 'file' => $path)); } } diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php index 0c0f955cf40..b5c1c622156 100644 --- a/apps/files_trashbin/templates/index.php +++ b/apps/files_trashbin/templates/index.php @@ -23,7 +23,7 @@ <tr> <th id='headerName' class="hidden column-name"> <div id="headerName-container"> - <input type="checkbox" id="select_all_trash" class="select-all"/> + <input type="checkbox" id="select_all_trash" class="select-all checkbox"/> <label for="select_all_trash"> <span class="hidden-visually"><?php p($l->t('Select all'))?></span> </label> diff --git a/apps/files_trashbin/tests/command/cleanuptest.php b/apps/files_trashbin/tests/command/cleanuptest.php index d4cccee448e..e928f55eb8b 100644 --- a/apps/files_trashbin/tests/command/cleanuptest.php +++ b/apps/files_trashbin/tests/command/cleanuptest.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_trashbin/tests/expiration.php b/apps/files_trashbin/tests/expiration.php index b3c6fcd95af..c142133ceb7 100644 --- a/apps/files_trashbin/tests/expiration.php +++ b/apps/files_trashbin/tests/expiration.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -207,6 +208,7 @@ class Expiration_Test extends \PHPUnit_Framework_TestCase { 'setSystemValues', 'setSystemValue', 'getSystemValue', + 'getFilteredSystemValue', 'deleteSystemValue', 'getAppKeys', 'setAppValue', diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php index 64540505d22..44b680f265c 100644 --- a/apps/files_trashbin/tests/storage.php +++ b/apps/files_trashbin/tests/storage.php @@ -1,5 +1,6 @@ <?php /** + * @author Björn Schießle <schiessle@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php index f60367a77e2..e28b854ca1f 100644 --- a/apps/files_trashbin/tests/trashbin.php +++ b/apps/files_trashbin/tests/trashbin.php @@ -5,6 +5,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -235,6 +236,8 @@ class Test_Trashbin extends \Test\TestCase { // user2-1.txt should have been expired $this->verifyArray($filesInTrashUser2AfterDelete, array('user2-2.txt', 'user1-4.txt')); + self::loginHelper(self::TEST_TRASHBIN_USER1); + // user1-1.txt and user1-3.txt should have been expired $filesInTrashUser1AfterDelete = OCA\Files_Trashbin\Helper::getTrashFiles('/', self::TEST_TRASHBIN_USER1); @@ -599,22 +602,24 @@ class Test_Trashbin extends \Test\TestCase { // delete source folder list($storage, $internalPath) = $this->rootView->resolvePath('/' . self::TEST_TRASHBIN_USER1 . '/files/folder'); - $folderAbsPath = $storage->getSourcePath($internalPath); - // make folder read-only - chmod($folderAbsPath, 0555); + if ($storage instanceof \OC\Files\Storage\Local) { + $folderAbsPath = $storage->getSourcePath($internalPath); + // make folder read-only + chmod($folderAbsPath, 0555); - $this->assertTrue( - OCA\Files_Trashbin\Trashbin::restore( - 'file1.txt.d' . $trashedFile->getMtime(), - $trashedFile->getName(), - $trashedFile->getMtime() - ) - ); + $this->assertTrue( + OCA\Files_Trashbin\Trashbin::restore( + 'file1.txt.d' . $trashedFile->getMtime(), + $trashedFile->getName(), + $trashedFile->getMtime() + ) + ); - $file = $userFolder->get('file1.txt'); - $this->assertEquals('foo', $file->getContent()); + $file = $userFolder->get('file1.txt'); + $this->assertEquals('foo', $file->getContent()); - chmod($folderAbsPath, 0755); + chmod($folderAbsPath, 0755); + } } /** diff --git a/apps/files_versions/ajax/getVersions.php b/apps/files_versions/ajax/getVersions.php index 59bd30f434f..d50545f7c69 100644 --- a/apps/files_versions/ajax/getVersions.php +++ b/apps/files_versions/ajax/getVersions.php @@ -5,6 +5,7 @@ * @author Frank Karlitschek <frank@owncloud.org> * @author Lukas Reschke <lukas@owncloud.com> * @author Sam Tuke <mail@samtuke.com> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_versions/ajax/preview.php b/apps/files_versions/ajax/preview.php index 2f33f0278ef..d7bc44f17a2 100644 --- a/apps/files_versions/ajax/preview.php +++ b/apps/files_versions/ajax/preview.php @@ -1,7 +1,9 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_versions/appinfo/app.php b/apps/files_versions/appinfo/app.php index eadc7c69a23..89990fdf0d8 100644 --- a/apps/files_versions/appinfo/app.php +++ b/apps/files_versions/appinfo/app.php @@ -2,6 +2,7 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Frank Karlitschek <frank@owncloud.org> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_versions/appinfo/application.php b/apps/files_versions/appinfo/application.php index b61b03dab13..00723e621ac 100644 --- a/apps/files_versions/appinfo/application.php +++ b/apps/files_versions/appinfo/application.php @@ -1,6 +1,7 @@ <?php /** * @author Roeland Jago Douma <roeland@famdouma.nl> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_versions/appinfo/info.xml b/apps/files_versions/appinfo/info.xml index 8eab29b0ec6..8fe6372279a 100644 --- a/apps/files_versions/appinfo/info.xml +++ b/apps/files_versions/appinfo/info.xml @@ -4,16 +4,19 @@ <name>Versions</name> <licence>AGPL</licence> <author>Frank Karlitschek, Bjoern Schiessle</author> - <requiremin>4.93</requiremin> <shipped>true</shipped> <description> This application enables ownCloud to automatically maintain older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. ownCloud then automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions. In addition to the expiry of versions, ownCloud’s versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, ownCloud will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation. </description> + <version>1.2.0</version> <types> <filesystem/> </types> + <dependencies> + <owncloud min-version="9.0" /> + </dependencies> <documentation> <user>user-versions</user> </documentation> diff --git a/apps/files_versions/appinfo/update.php b/apps/files_versions/appinfo/update.php index 687e5d3b5d4..ef6772f3079 100644 --- a/apps/files_versions/appinfo/update.php +++ b/apps/files_versions/appinfo/update.php @@ -2,6 +2,7 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version deleted file mode 100644 index af0b7ddbffd..00000000000 --- a/apps/files_versions/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.0.6 diff --git a/apps/files_versions/command/expire.php b/apps/files_versions/command/expire.php index 4492497f851..5db33f38772 100644 --- a/apps/files_versions/command/expire.php +++ b/apps/files_versions/command/expire.php @@ -1,7 +1,6 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/files_versions/js/filesplugin.js b/apps/files_versions/js/filesplugin.js index 42075ce6462..a9457c522d6 100644 --- a/apps/files_versions/js/filesplugin.js +++ b/apps/files_versions/js/filesplugin.js @@ -25,7 +25,7 @@ return; } - fileList.registerTabView(new OCA.Versions.VersionsTabView('versionsTabView')); + fileList.registerTabView(new OCA.Versions.VersionsTabView('versionsTabView', {order: -10})); } }; })(); diff --git a/apps/files_versions/js/versioncollection.js b/apps/files_versions/js/versioncollection.js index 3f8214cde8c..176f8e7529c 100644 --- a/apps/files_versions/js/versioncollection.js +++ b/apps/files_versions/js/versioncollection.js @@ -67,6 +67,11 @@ return this.fetch({remove: false}); }, + reset: function() { + this._currentIndex = 0; + OC.Backbone.Collection.prototype.reset.apply(this, arguments); + }, + parse: function(result) { var results = _.map(result.data.versions, function(version) { var revision = parseInt(version.version, 10); diff --git a/apps/files_versions/js/versionstabview.js b/apps/files_versions/js/versionstabview.js index f6a6f037988..f2b1c18bd37 100644 --- a/apps/files_versions/js/versionstabview.js +++ b/apps/files_versions/js/versionstabview.js @@ -44,6 +44,7 @@ }, initialize: function() { + OCA.Files.DetailTabView.prototype.initialize.apply(this, arguments); this.collection = new OCA.Versions.VersionCollection(); this.collection.on('request', this._onRequest, this); this.collection.on('sync', this._onEndRequest, this); @@ -84,12 +85,18 @@ ev.preventDefault(); revision = $target.attr('data-revision'); + this.$el.find('.versions, .showMoreVersions').addClass('hidden'); + var versionModel = this.collection.get(revision); versionModel.revert({ success: function() { // reset and re-fetch the updated collection + self.$versionsContainer.empty(); self.collection.setFileInfo(fileInfoModel); - self.collection.fetch(); + self.collection.reset([], {silent: true}); + self.collection.fetchNext(); + + self.$el.find('.versions').removeClass('hidden'); // update original model fileInfoModel.trigger('busy', fileInfoModel, false); @@ -156,7 +163,7 @@ if (fileInfo) { this.render(); this.collection.setFileInfo(fileInfo); - this.collection.reset({silent: true}); + this.collection.reset([], {silent: true}); this.nextPage(); } else { this.render(); @@ -188,6 +195,18 @@ this.$el.find('.has-tooltip').tooltip(); this.$versionsContainer = this.$el.find('ul.versions'); this.delegateEvents(); + }, + + /** + * Returns true for files, false for folders. + * + * @return {bool} true for files, false for folders + */ + canDisplay: function(fileInfo) { + if (!fileInfo) { + return false; + } + return !fileInfo.isDirectory(); } }); diff --git a/apps/files_versions/l10n/hy.js b/apps/files_versions/l10n/hy.js new file mode 100644 index 00000000000..3924810e149 --- /dev/null +++ b/apps/files_versions/l10n/hy.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "files_versions", + { + "Versions" : "Տարբերակներ", + "Restore" : "Վերականգնել" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_versions/l10n/hy.json b/apps/files_versions/l10n/hy.json new file mode 100644 index 00000000000..7f61c267c7c --- /dev/null +++ b/apps/files_versions/l10n/hy.json @@ -0,0 +1,5 @@ +{ "translations": { + "Versions" : "Տարբերակներ", + "Restore" : "Վերականգնել" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_versions/l10n/ko.js b/apps/files_versions/l10n/ko.js index dca7683d2da..21c30390609 100644 --- a/apps/files_versions/l10n/ko.js +++ b/apps/files_versions/l10n/ko.js @@ -3,7 +3,7 @@ OC.L10N.register( { "Could not revert: %s" : "되돌릴 수 없습니다: %s", "Versions" : "버전", - "Failed to revert {file} to revision {timestamp}." : "{file}을(를) 리비전 {timestamp}으(로) 되돌리는 데 실패하였습니다.", + "Failed to revert {file} to revision {timestamp}." : "{file}을(를) 리비전 {timestamp}으(로) 되돌리는 데 실패했습니다.", "Restore" : "복원", "No other versions available" : "다른 버전을 사용할 수 없습니다", "More versions..." : "더 많은 버전..." diff --git a/apps/files_versions/l10n/ko.json b/apps/files_versions/l10n/ko.json index 1665579ded1..22ad4b685be 100644 --- a/apps/files_versions/l10n/ko.json +++ b/apps/files_versions/l10n/ko.json @@ -1,7 +1,7 @@ { "translations": { "Could not revert: %s" : "되돌릴 수 없습니다: %s", "Versions" : "버전", - "Failed to revert {file} to revision {timestamp}." : "{file}을(를) 리비전 {timestamp}으(로) 되돌리는 데 실패하였습니다.", + "Failed to revert {file} to revision {timestamp}." : "{file}을(를) 리비전 {timestamp}으(로) 되돌리는 데 실패했습니다.", "Restore" : "복원", "No other versions available" : "다른 버전을 사용할 수 없습니다", "More versions..." : "더 많은 버전..." diff --git a/apps/files_versions/l10n/sq.js b/apps/files_versions/l10n/sq.js index 4c9f9487f28..239946a7ef2 100644 --- a/apps/files_versions/l10n/sq.js +++ b/apps/files_versions/l10n/sq.js @@ -1,11 +1,11 @@ OC.L10N.register( "files_versions", { - "Could not revert: %s" : "Nuk mund të ktheje: %s", - "Versions" : "Versioni", - "Failed to revert {file} to revision {timestamp}." : "Dështoi në ktheje {skedar} të rishikimit {kohëstampe}.", - "Restore" : "Rivendos", - "No other versions available" : "Nuk ka versione të tjera në dispozicion", - "More versions..." : "Versione m'shumë..." + "Could not revert: %s" : "S’u rikthye dot: %s", + "Versions" : "Versione", + "Failed to revert {file} to revision {timestamp}." : "Dështoi në rikthimin e {file} te rishikimi {timestamp}.", + "Restore" : "Riktheje", + "No other versions available" : "Nuk ka versione të tjera të gatshme", + "More versions..." : "Më shumë versione…" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_versions/l10n/sq.json b/apps/files_versions/l10n/sq.json index 4e1c813d9bf..ae79f017be2 100644 --- a/apps/files_versions/l10n/sq.json +++ b/apps/files_versions/l10n/sq.json @@ -1,9 +1,9 @@ { "translations": { - "Could not revert: %s" : "Nuk mund të ktheje: %s", - "Versions" : "Versioni", - "Failed to revert {file} to revision {timestamp}." : "Dështoi në ktheje {skedar} të rishikimit {kohëstampe}.", - "Restore" : "Rivendos", - "No other versions available" : "Nuk ka versione të tjera në dispozicion", - "More versions..." : "Versione m'shumë..." + "Could not revert: %s" : "S’u rikthye dot: %s", + "Versions" : "Versione", + "Failed to revert {file} to revision {timestamp}." : "Dështoi në rikthimin e {file} te rishikimi {timestamp}.", + "Restore" : "Riktheje", + "No other versions available" : "Nuk ka versione të tjera të gatshme", + "More versions..." : "Më shumë versione…" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_versions/lib/expiration.php b/apps/files_versions/lib/expiration.php index fba705251e9..4b3cecc1202 100644 --- a/apps/files_versions/lib/expiration.php +++ b/apps/files_versions/lib/expiration.php @@ -138,7 +138,7 @@ class Expiration { } if (!isset($splitValues[1])) { - $maxValue = self::NO_OBLIGATION; + $maxValue = 'auto'; } else { $maxValue = trim($splitValues[1]); } diff --git a/apps/files_versions/lib/hooks.php b/apps/files_versions/lib/hooks.php index 5ef2cc3c7d0..f9d9eddf5e2 100644 --- a/apps/files_versions/lib/hooks.php +++ b/apps/files_versions/lib/hooks.php @@ -7,6 +7,7 @@ * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Sam Tuke <mail@samtuke.com> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php index 6aa58c55e9b..dd8af1b8d18 100644 --- a/apps/files_versions/lib/storage.php +++ b/apps/files_versions/lib/storage.php @@ -13,6 +13,7 @@ * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -42,6 +43,7 @@ namespace OCA\Files_Versions; use OCA\Files_Versions\AppInfo\Application; use OCA\Files_Versions\Command\Expire; +use OCP\Lock\ILockingProvider; class Storage { @@ -315,6 +317,9 @@ class Storage { if (self::copyFileContents($users_view, 'files_versions' . $filename . '.v' . $revision, 'files' . $filename)) { $files_view->touch($file, $revision); Storage::scheduleExpire($uid, $file); + \OC_Hook::emit('\OCP\Versions', 'rollback', array( + 'path' => $filename, + )); return true; } else if ($versionCreated) { self::deleteVersion($users_view, $version); @@ -334,10 +339,31 @@ class Storage { * @return bool true for success, false otherwise */ private static function copyFileContents($view, $path1, $path2) { + /** @var \OC\Files\Storage\Storage $storage1 */ list($storage1, $internalPath1) = $view->resolvePath($path1); + /** @var \OC\Files\Storage\Storage $storage2 */ list($storage2, $internalPath2) = $view->resolvePath($path2); - $result = $storage2->moveFromStorage($storage1, $internalPath1, $internalPath2); + $view->lockFile($path1, ILockingProvider::LOCK_EXCLUSIVE); + $view->lockFile($path2, ILockingProvider::LOCK_EXCLUSIVE); + + // TODO add a proper way of overwriting a file while maintaining file ids + if ($storage1->instanceOfStorage('\OC\Files\ObjectStore\ObjectStoreStorage') || $storage2->instanceOfStorage('\OC\Files\ObjectStore\ObjectStoreStorage')) { + $source = $storage1->fopen($internalPath1, 'r'); + $target = $storage2->fopen($internalPath2, 'w'); + list(, $result) = \OC_Helper::streamCopy($source, $target); + fclose($source); + fclose($target); + + if ($result !== false) { + $storage1->unlink($internalPath1); + } + } else { + $result = $storage2->moveFromStorage($storage1, $internalPath1, $internalPath2); + } + + $view->unlockFile($path1, ILockingProvider::LOCK_EXCLUSIVE); + $view->unlockFile($path2, ILockingProvider::LOCK_EXCLUSIVE); return ($result !== false); } @@ -650,17 +676,21 @@ class Storage { // calculate available space for version history // subtract size of files and current versions size from quota - if ($softQuota) { - $files_view = new \OC\Files\View('/'.$uid.'/files'); - $rootInfo = $files_view->getFileInfo('/', false); - $free = $quota-$rootInfo['size']; // remaining free space for user - if ( $free > 0 ) { - $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - ($versionsSize + $offset); // how much space can be used for versions + if ($quota >= 0) { + if ($softQuota) { + $files_view = new \OC\Files\View('/' . $uid . '/files'); + $rootInfo = $files_view->getFileInfo('/', false); + $free = $quota - $rootInfo['size']; // remaining free space for user + if ($free > 0) { + $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - ($versionsSize + $offset); // how much space can be used for versions + } else { + $availableSpace = $free - $versionsSize - $offset; + } } else { - $availableSpace = $free - $versionsSize - $offset; + $availableSpace = $quota - $offset; } } else { - $availableSpace = $quota - $offset; + $availableSpace = PHP_INT_MAX; } $allVersions = Storage::getVersions($uid, $filename); diff --git a/apps/files_versions/tests/command/expiretest.php b/apps/files_versions/tests/command/expiretest.php index 247fb99b767..eb622689c33 100644 --- a/apps/files_versions/tests/command/expiretest.php +++ b/apps/files_versions/tests/command/expiretest.php @@ -26,7 +26,7 @@ use Test\TestCase; class ExpireTest extends TestCase { public function testExpireNonExistingUser() { - $command = new Expire('test', ''); + $command = new Expire($this->getUniqueID('test'), ''); $command->handle(); $this->assertTrue(true); diff --git a/apps/files_versions/tests/expirationtest.php b/apps/files_versions/tests/expirationtest.php index 54024b85b78..1081e412ce9 100644 --- a/apps/files_versions/tests/expirationtest.php +++ b/apps/files_versions/tests/expirationtest.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Victor Dubiniuk <dubiniuk@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -177,6 +178,7 @@ class Expiration_Test extends \Test\TestCase { 'setSystemValues', 'setSystemValue', 'getSystemValue', + 'getFilteredSystemValue', 'deleteSystemValue', 'getAppKeys', 'setAppValue', diff --git a/apps/files_versions/tests/js/versionstabviewSpec.js b/apps/files_versions/tests/js/versionstabviewSpec.js index 4435f38ef7e..306dd66be2a 100644 --- a/apps/files_versions/tests/js/versionstabviewSpec.js +++ b/apps/files_versions/tests/js/versionstabviewSpec.js @@ -76,7 +76,7 @@ describe('OCA.Versions.VersionsTabView', function() { expect($versions.length).toEqual(2); var $item = $versions.eq(0); expect($item.find('.downloadVersion').attr('href')).toEqual(version1.getDownloadUrl()); - expect($item.find('.versiondate').text()).toEqual('a few seconds ago'); + expect($item.find('.versiondate').text()).toEqual('seconds ago'); expect($item.find('.revertVersion').length).toEqual(1); expect($item.find('.preview').attr('src')).toEqual(version1.getPreviewUrl()); diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php index 7cca409ed6c..2979de2ac98 100644 --- a/apps/files_versions/tests/versions.php +++ b/apps/files_versions/tests/versions.php @@ -1,8 +1,10 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -299,11 +301,10 @@ class Test_Files_Versioning extends \Test\TestCase { // execute rename hook of versions app \OC\Files\Filesystem::rename('/folder1/test.txt', '/folder1/folder2/test.txt'); - - self::loginHelper(self::TEST_VERSIONS_USER2); - $this->runCommands(); + self::loginHelper(self::TEST_VERSIONS_USER); + $this->assertFalse($this->rootView->file_exists($v1)); $this->assertFalse($this->rootView->file_exists($v2)); @@ -580,6 +581,35 @@ class Test_Files_Versioning extends \Test\TestCase { $this->doTestRestore(); } + /** + * @param string $hookName name of hook called + * @param string $params variable to recieve parameters provided by hook + */ + private function connectMockHooks($hookName, &$params) { + if ($hookName === null) { + return; + } + + $eventHandler = $this->getMockBuilder('\stdclass') + ->setMethods(['callback']) + ->getMock(); + + $eventHandler->expects($this->any()) + ->method('callback') + ->will($this->returnCallback( + function($p) use (&$params) { + $params = $p; + } + )); + + \OCP\Util::connectHook( + '\OCP\Versions', + $hookName, + $eventHandler, + 'callback' + ); + } + private function doTestRestore() { $filePath = self::TEST_VERSIONS_USER . '/files/sub/test.txt'; $this->rootView->file_put_contents($filePath, 'test file'); @@ -608,7 +638,15 @@ class Test_Files_Versioning extends \Test\TestCase { $this->assertEquals('test file', $this->rootView->file_get_contents($filePath)); $info1 = $this->rootView->getFileInfo($filePath); + $params = array(); + $this->connectMockHooks('rollback', $params); + \OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2); + $expectedParams = array( + 'path' => '/sub/test.txt', + ); + + $this->assertEquals($expectedParams, $params); $this->assertEquals('version2', $this->rootView->file_get_contents($filePath)); $info2 = $this->rootView->getFileInfo($filePath); @@ -749,7 +787,7 @@ class Test_Files_Versioning extends \Test\TestCase { public static function loginHelper($user, $create = false) { if ($create) { - $backend = new \OC_User_Dummy(); + $backend = new \Test\Util\User\Dummy(); $backend->createUser($user, $user); \OC::$server->getUserManager()->registerBackend($backend); } diff --git a/apps/provisioning_api/appinfo/app.php b/apps/provisioning_api/appinfo/app.php index bb5c541c4fd..40d8d5d04d3 100644 --- a/apps/provisioning_api/appinfo/app.php +++ b/apps/provisioning_api/appinfo/app.php @@ -1,6 +1,6 @@ <?php /** - * @author Tom Needham <tom@owncloud.com> + * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/provisioning_api/appinfo/info.xml b/apps/provisioning_api/appinfo/info.xml index 7c662c18c09..a77b1f67e21 100644 --- a/apps/provisioning_api/appinfo/info.xml +++ b/apps/provisioning_api/appinfo/info.xml @@ -13,14 +13,17 @@ </description> <licence>AGPL</licence> <author>Tom Needham</author> - <requiremin>8</requiremin> <shipped>true</shipped> <default_enable/> <documentation> <admin>admin-provisioning-api</admin> </documentation> + <version>0.4.0</version> <types> <!-- this is used to disable the feature of enabling an app for specific groups only because this would break this app --> <filesystem/> </types> + <dependencies> + <owncloud min-version="9.0" /> + </dependencies> </info> diff --git a/apps/provisioning_api/appinfo/routes.php b/apps/provisioning_api/appinfo/routes.php index 2ee3a185dae..17cfea26572 100644 --- a/apps/provisioning_api/appinfo/routes.php +++ b/apps/provisioning_api/appinfo/routes.php @@ -2,6 +2,7 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Tom Needham <tom@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -32,7 +33,7 @@ $users = new \OCA\Provisioning_API\Users( \OC::$server->getGroupManager(), \OC::$server->getUserSession() ); -API::register('get', '/cloud/users', [$users, 'getUsers'], 'provisioning_api', API::ADMIN_AUTH); +API::register('get', '/cloud/users', [$users, 'getUsers'], 'provisioning_api', API::SUBADMIN_AUTH); API::register('post', '/cloud/users', [$users, 'addUser'], 'provisioning_api', API::ADMIN_AUTH); API::register('get', '/cloud/users/{userid}', [$users, 'getUser'], 'provisioning_api', API::USER_AUTH); API::register('put', '/cloud/users/{userid}', [$users, 'editUser'], 'provisioning_api', API::USER_AUTH); diff --git a/apps/provisioning_api/appinfo/version b/apps/provisioning_api/appinfo/version deleted file mode 100644 index 3b04cfb60da..00000000000 --- a/apps/provisioning_api/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2 diff --git a/apps/provisioning_api/lib/apps.php b/apps/provisioning_api/lib/apps.php index 80f6e7049c6..ba920c7a9c9 100644 --- a/apps/provisioning_api/lib/apps.php +++ b/apps/provisioning_api/lib/apps.php @@ -1,7 +1,9 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Tom Needham <tom@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/provisioning_api/lib/groups.php b/apps/provisioning_api/lib/groups.php index c6fbe12b34e..7e7515bc709 100644 --- a/apps/provisioning_api/lib/groups.php +++ b/apps/provisioning_api/lib/groups.php @@ -1,7 +1,9 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Tom Needham <tom@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/provisioning_api/lib/users.php b/apps/provisioning_api/lib/users.php index 617e50b403e..0b529bcea2c 100644 --- a/apps/provisioning_api/lib/users.php +++ b/apps/provisioning_api/lib/users.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -28,6 +29,7 @@ namespace OCA\Provisioning_API; use \OC_OCS_Result; use \OC_SubAdmin; use \OC_Helper; +use \OC_Group; use OCP\Files\NotFoundException; class Users { @@ -70,7 +72,31 @@ class Users { $limit = !empty($_GET['limit']) ? $_GET['limit'] : null; $offset = !empty($_GET['offset']) ? $_GET['offset'] : null; - $users = $this->userManager->search($search, $limit, $offset); + // Check if user is logged in + $user = $this->userSession->getUser(); + if ($user === null) { + return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED); + } + + // Admin? Or SubAdmin? + if($this->groupManager->isAdmin($user->getUID())){ + $users = $this->userManager->search($search, $limit, $offset); + } else if (\OC_SubAdmin::isSubAdmin($user->getUID())) { + $subAdminOfGroups = \OC_SubAdmin::getSubAdminsGroups($user->getUID()); + + if($offset === null) { + $offset = 0; + } + + $users = []; + foreach ($subAdminOfGroups as $group) { + $users = array_merge($users, $this->groupManager->displayNamesInGroup($group, $search)); + } + + $users = array_slice($users, $offset, $limit); + } else { + return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED); + } $users = array_keys($users); return new OC_OCS_Result([ @@ -114,46 +140,28 @@ class Users { return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED); } + $data = []; + // Admin? Or SubAdmin? if($this->groupManager->isAdmin($user->getUID()) || OC_SubAdmin::isUserAccessible($user->getUID(), $userId)) { // Check they exist if(!$this->userManager->userExists($userId)) { return new OC_OCS_Result(null, \OCP\API::RESPOND_NOT_FOUND, 'The requested user could not be found'); } - // Show all - $return = [ - 'email', - 'enabled', - ]; - if($user->getUID() !== $userId) { - $return[] = 'quota'; - } + $data['enabled'] = $this->config->getUserValue($userId, 'core', 'enabled', 'true'); } else { // Check they are looking up themselves if($user->getUID() !== $userId) { return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED); } - // Return some additional information compared to the core route - $return = array( - 'email', - 'displayname', - ); } // Find the data - $data = []; - $data = self::fillStorageInfo($userId, $data); - $data['enabled'] = $this->config->getUserValue($userId, 'core', 'enabled', 'true'); + $data['quota'] = self::fillStorageInfo($userId); $data['email'] = $this->config->getUserValue($userId, 'settings', 'email'); - $data['displayname'] = $this->userManager->get($parameters['userid'])->getDisplayName(); + $data['displayname'] = $this->userManager->get($userId)->getDisplayName(); - // Return the appropriate data - $responseData = array(); - foreach($return as $key) { - $responseData[$key] = $data[$key]; - } - - return new OC_OCS_Result($responseData); + return new OC_OCS_Result($data); } /** @@ -472,19 +480,20 @@ class Users { * @return mixed * @throws \OCP\Files\NotFoundException */ - private static function fillStorageInfo($userId, $data) { + private static function fillStorageInfo($userId) { + $data = []; try { \OC_Util::tearDownFS(); \OC_Util::setupFS($userId); $storage = OC_Helper::getStorageInfo('/'); - $data['quota'] = [ + $data = [ 'free' => $storage['free'], 'used' => $storage['used'], 'total' => $storage['total'], 'relative' => $storage['relative'], ]; } catch (NotFoundException $ex) { - $data['quota'] = []; + $data = []; } return $data; } diff --git a/apps/provisioning_api/tests/appstest.php b/apps/provisioning_api/tests/appstest.php index f2a3977eac4..2baea5bbc8c 100644 --- a/apps/provisioning_api/tests/appstest.php +++ b/apps/provisioning_api/tests/appstest.php @@ -2,8 +2,8 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Tom Needham <tom@owncloud.com> - * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/provisioning_api/tests/groupstest.php b/apps/provisioning_api/tests/groupstest.php index 73044e33120..4afd246abcd 100644 --- a/apps/provisioning_api/tests/groupstest.php +++ b/apps/provisioning_api/tests/groupstest.php @@ -2,8 +2,8 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Tom Needham <tom@owncloud.com> - * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/provisioning_api/tests/testcase.php b/apps/provisioning_api/tests/testcase.php index ee7eb2a5a9a..6135a6d2f96 100644 --- a/apps/provisioning_api/tests/testcase.php +++ b/apps/provisioning_api/tests/testcase.php @@ -2,6 +2,7 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -45,7 +46,7 @@ abstract class TestCase extends \Test\TestCase { /** * Generates a temp user * @param int $num number of users to generate - * @return array + * @return IUser[]|Iuser */ protected function generateUsers($num = 1) { $users = array(); diff --git a/apps/provisioning_api/tests/userstest.php b/apps/provisioning_api/tests/userstest.php index 350586f8335..673383edae6 100644 --- a/apps/provisioning_api/tests/userstest.php +++ b/apps/provisioning_api/tests/userstest.php @@ -63,10 +63,16 @@ class UsersTest extends TestCase { $this->groupManager, $this->userSession ); + + $this->userSession->setUser(null); } // Test getting the list of users - public function testGetUsers() { + public function testGetUsersAsAdmin() { + $user = $this->generateUsers(); + $this->groupManager->get('admin')->addUser($user); + $this->userSession->setUser($user); + $result = $this->api->getUsers(); $this->assertInstanceOf('OC_OCS_Result', $result); $this->assertTrue($result->succeeded()); @@ -103,6 +109,70 @@ class UsersTest extends TestCase { $this->assertEquals(array_keys($this->userManager->search('', 1, 1)), $data['users']); } + public function testGetUsersAsSubAdmin() { + $user = $this->generateUsers(10); + $this->userSession->setUser($user[0]); + $group = $this->groupManager->createGroup($this->getUniqueID()); + \OC_SubAdmin::createSubAdmin($user[0]->getUID(), $group->getGID()); + + //Empty list + $result = $this->api->getUsers([]); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals(['users' => []], $result->getData()); + + //Some users in group + $group->addUser($user[1]); + $group->addUser($user[2]); + $group->addUser($user[3]); + $group->addUser($user[4]); + + $result = $this->api->getUsers([]); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertArrayHasKey('users', $result->getData()); + + $this->assertContains($user[1]->getUID(), $result->getData()['users']); + $this->assertContains($user[2]->getUID(), $result->getData()['users']); + $this->assertContains($user[3]->getUID(), $result->getData()['users']); + $this->assertContains($user[4]->getUID(), $result->getData()['users']); + + $uids = [ + $user[1]->getUID(), + $user[2]->getUID(), + $user[3]->getUID(), + $user[4]->getUID() + ]; + sort($uids); + + $_GET['limit'] = 2; + $_GET['offset'] = 1; + $result = $this->api->getUsers([]); + + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals(['users' => array_slice($uids, 1, 2)], $result->getData()); + } + + public function testGetUsersNoUser() { + $result = $this->api->getUsers([]); + + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(\OCP\API::RESPOND_UNAUTHORISED, $result->getStatusCode()); + } + + public function testGetUsersAsUser() { + $user = $this->generateUsers(); + $this->userSession->setUser($user); + + $result = $this->api->getUsers(); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(\OCP\API::RESPOND_UNAUTHORISED, $result->getStatusCode()); + + } + public function testAddUser() { $this->resetParams(); $_POST['userid'] = $this->getUniqueID(); @@ -164,7 +234,7 @@ class UsersTest extends TestCase { $user = $this->generateUsers(); $user->setDisplayName('foobar'); $this->userSession->setUser($user); - $params['userid'] = $user->getUID(); + $params = ['userid' => $user->getUID()]; $result = $this->api->getUser($params); $this->assertInstanceOf('OC_OCS_Result', $result); $this->assertTrue($result->succeeded()); @@ -191,7 +261,7 @@ class UsersTest extends TestCase { public function testGetUserOnOtherUser() { $users = $this->generateUsers(2); - $params['userid'] = $users[0]; + $params = ['userid' => $users[0]->getUID()]; $this->userSession->setUser($users[1]); $result = $this->api->getUser($params); $this->assertInstanceOf('OC_OCS_Result', $result); @@ -794,6 +864,9 @@ class UsersTest extends TestCase { } public function testAddToGroupNoGroupId() { + $user = $this->generateUsers(); + $this->userSession->setUser($user); + $_POST['groupid'] = ''; $result = $this->api->addToGroup([ 'userid' => $this->getUniqueID(), @@ -935,6 +1008,9 @@ class UsersTest extends TestCase { } public function testRemoveFromGroupNoGroupId() { + $user = $this->generateUsers(); + $this->userSession->setUser($user); + $result = $this->api->removeFromGroup([ '_delete' => [ 'groupid' => '' diff --git a/apps/user_ldap/ajax/setConfiguration.php b/apps/user_ldap/ajax/setConfiguration.php index 9311d72d21f..3b0ba1b7754 100644 --- a/apps/user_ldap/ajax/setConfiguration.php +++ b/apps/user_ldap/ajax/setConfiguration.php @@ -2,6 +2,7 @@ /** * @author Arthur Schiwon <blizzz@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> + * @author Lennart Rosam <hello@takuto.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml index 89c1a4ea3ff..7dbce1da5fa 100644 --- a/apps/user_ldap/appinfo/info.xml +++ b/apps/user_ldap/appinfo/info.xml @@ -9,8 +9,8 @@ A user logs into ownCloud with their LDAP or AD credentials, and is granted acce </description> <licence>AGPL</licence> <author>Dominik Schmidt and Arthur Schiwon</author> - <requiremin>4.93</requiremin> <shipped>true</shipped> + <version>0.8.0</version> <types> <authentication/> </types> @@ -19,5 +19,6 @@ A user logs into ownCloud with their LDAP or AD credentials, and is granted acce </documentation> <dependencies> <lib>ldap</lib> + <owncloud min-version="9.0" /> </dependencies> </info> diff --git a/apps/user_ldap/appinfo/install.php b/apps/user_ldap/appinfo/install.php index f70eb746480..844c724ac25 100644 --- a/apps/user_ldap/appinfo/install.php +++ b/apps/user_ldap/appinfo/install.php @@ -2,6 +2,7 @@ /** * @author Arthur Schiwon <blizzz@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php index 33a7219644b..7d358e5b268 100644 --- a/apps/user_ldap/appinfo/update.php +++ b/apps/user_ldap/appinfo/update.php @@ -1,5 +1,7 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lennart Rosam <hello@takuto.de> * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version deleted file mode 100644 index 844f6a91acb..00000000000 --- a/apps/user_ldap/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.6.3 diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index a5fc59d3b07..4fd029c74da 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -5,7 +5,9 @@ * @author Arthur Schiwon <blizzz@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Christopher Schäpers <kondou@ts.unde.re> + * @author Frédéric Fortier <frederic.fortier@oronospolytechnique.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Nicolas Grekas <nicolas.grekas@gmail.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> @@ -207,7 +209,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { $subGroups = $this->_getGroupDNsFromMemberOf($group, $seen); $allGroups = array_merge($allGroups, $subGroups); } - } + } return $allGroups; } @@ -240,7 +242,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { if(empty($result)) { return false; } - $dn = $result[0]; + $dn = $result[0]['dn'][0]; //and now the group name //NOTE once we have separate ownCloud group IDs and group names we can @@ -484,7 +486,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { array($this->access->connection->ldapGroupDisplayName, 'dn')); if (is_array($groups)) { foreach ($groups as $groupobj) { - $groupDN = $groupobj['dn']; + $groupDN = $groupobj['dn'][0]; $allGroups[$groupDN] = $groupobj; $nestedGroups = $this->access->connection->ldapNestedGroups; if (!empty($nestedGroups)) { @@ -646,7 +648,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { str_replace('%uid', $member, $this->access->connection->ldapLoginFilter), $this->access->getFilterPartForUserSearch($search) )); - $ldap_users = $this->access->fetchListOfUsers($filter, 'dn'); + $ldap_users = $this->access->fetchListOfUsers($filter, 'dn', 1); if(count($ldap_users) < 1) { continue; } diff --git a/apps/user_ldap/js/wizard/wizardTabElementary.js b/apps/user_ldap/js/wizard/wizardTabElementary.js index 7c1a550c097..f5232e91010 100644 --- a/apps/user_ldap/js/wizard/wizardTabElementary.js +++ b/apps/user_ldap/js/wizard/wizardTabElementary.js @@ -137,6 +137,10 @@ OCA = OCA || {}; this.setElementValue( this.managedItems.ldap_agent_password.$element, agentPwd ); + if (agentPwd && $('html').hasClass('lte9')) { + // make it a password field again (IE fix, placeholders bug) + this.managedItems.ldap_agent_password.$element.attr('type', 'password'); + } }, /** * updates the base DN text area diff --git a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js index b73d267d168..0316db5b61c 100644 --- a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js @@ -71,7 +71,8 @@ OCA = OCA || {}; ], 'ldap_login_filter_mode' ); - _.bindAll(this, 'onVerifyClick'); + _.bindAll(this, 'onVerifyClick', 'onTestLoginnameChange'); + this.managedItems.ldap_test_loginname.$element.keyup(this.onTestLoginnameChange); this.managedItems.ldap_test_loginname.$relatedElements.click(this.onVerifyClick); }, @@ -231,6 +232,16 @@ OCA = OCA || {}; } else { this.configModel.requestWizard('ldap_test_loginname', {ldap_test_loginname: testLogin}); } + }, + + /** + * enables/disables the "Verify Settings" button, depending whether + * the corresponding text input has a value or not + */ + onTestLoginnameChange: function() { + var loginName = this.managedItems.ldap_test_loginname.$element.val(); + var beDisabled = !_.isString(loginName) || !loginName.trim(); + this.managedItems.ldap_test_loginname.$relatedElements.prop('disabled', beDisabled); } }); diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js index 9a25c8e5b9a..375b78b4526 100644 --- a/apps/user_ldap/l10n/de.js +++ b/apps/user_ldap/l10n/de.js @@ -67,7 +67,7 @@ OC.L10N.register( "LDAP Filter:" : "LDAP-Filter:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Der Filter bestimmt, welche LDAP-Gruppen Zugriff auf die %s-Instanz haben sollen.", "Verify settings and count groups" : "Einstellungen überprüfen und Gruppen zählen", - "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s die Nutzerbasis mit folgenden Attributen vorfinden:", + "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s den Nutzer basierend auf folgenden Attributen finden:", "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Erlaubt das Anmelden gegen den LDAP / AD Nutzernamen, welcher entweder eine UID oder samaccountname ist und automatisch erkannt wird.", "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json index dcea495adf6..17c0bf02c2d 100644 --- a/apps/user_ldap/l10n/de.json +++ b/apps/user_ldap/l10n/de.json @@ -65,7 +65,7 @@ "LDAP Filter:" : "LDAP-Filter:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Der Filter bestimmt, welche LDAP-Gruppen Zugriff auf die %s-Instanz haben sollen.", "Verify settings and count groups" : "Einstellungen überprüfen und Gruppen zählen", - "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s die Nutzerbasis mit folgenden Attributen vorfinden:", + "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s den Nutzer basierend auf folgenden Attributen finden:", "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Erlaubt das Anmelden gegen den LDAP / AD Nutzernamen, welcher entweder eine UID oder samaccountname ist und automatisch erkannt wird.", "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js index f7558f5ef04..49fcd8c8c69 100644 --- a/apps/user_ldap/l10n/de_DE.js +++ b/apps/user_ldap/l10n/de_DE.js @@ -67,7 +67,7 @@ OC.L10N.register( "LDAP Filter:" : "LDAP-Filter:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Der Filter bestimmt, welche LDAP-Gruppen Zugriff auf die %s-Instanz haben sollen.", "Verify settings and count groups" : "Einstellungen überprüfen und Gruppen zählen", - "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s die Nutzerbasis mit folgenden Attributen vorfinden:", + "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s den Nutzer basierend auf folgenden Attributen finden:", "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Erlaubt das Anmelden gegen den LDAP / AD Nutzernamen, welcher entweder eine UID oder samaccountname ist und automatisch erkannt wird.", "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json index fb397693095..61792d3704e 100644 --- a/apps/user_ldap/l10n/de_DE.json +++ b/apps/user_ldap/l10n/de_DE.json @@ -65,7 +65,7 @@ "LDAP Filter:" : "LDAP-Filter:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Der Filter bestimmt, welche LDAP-Gruppen Zugriff auf die %s-Instanz haben sollen.", "Verify settings and count groups" : "Einstellungen überprüfen und Gruppen zählen", - "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s die Nutzerbasis mit folgenden Attributen vorfinden:", + "When logging in, %s will find the user based on the following attributes:" : "Beim Anmelden wird %s den Nutzer basierend auf folgenden Attributen finden:", "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Erlaubt das Anmelden gegen den LDAP / AD Nutzernamen, welcher entweder eine UID oder samaccountname ist und automatisch erkannt wird.", "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index c73f54b5489..5171628428d 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -31,7 +31,7 @@ OC.L10N.register( "Confirm Deletion" : "Confirmar eliminación", "Mappings cleared successfully!" : "¡Asignaciones borradas exitosamente!", "Error while clearing the mappings." : "Error mientras se borraban las asignaciones.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Enlace anónimo no está permitido. Por favor suministre un DN de usuario y contraseña ", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Un vínculo anónimo no está permitido. Por favor, suministre un DN de usuario y contraseña. ", "LDAP Operations error. Anonymous bind might not be allowed." : "Error de operaciones LDAP. Enlace anónimo puede no estar permitido.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Guardado fallido. Por favor, asegúrese de que la base de datos está en Operación. Actualizar antes de continuar.", "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiando el modo habilitará automáticamente las consultas LDAP. Dependiendo del tamaño de su LDAP puede tardar un rato. ¿Desea cambiar el modo?", diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index 8666d1efdd9..8a896a9bda2 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -29,7 +29,7 @@ "Confirm Deletion" : "Confirmar eliminación", "Mappings cleared successfully!" : "¡Asignaciones borradas exitosamente!", "Error while clearing the mappings." : "Error mientras se borraban las asignaciones.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Enlace anónimo no está permitido. Por favor suministre un DN de usuario y contraseña ", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Un vínculo anónimo no está permitido. Por favor, suministre un DN de usuario y contraseña. ", "LDAP Operations error. Anonymous bind might not be allowed." : "Error de operaciones LDAP. Enlace anónimo puede no estar permitido.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Guardado fallido. Por favor, asegúrese de que la base de datos está en Operación. Actualizar antes de continuar.", "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiando el modo habilitará automáticamente las consultas LDAP. Dependiendo del tamaño de su LDAP puede tardar un rato. ¿Desea cambiar el modo?", diff --git a/apps/user_ldap/l10n/fa.js b/apps/user_ldap/l10n/fa.js index 81f065ef7a4..082f297f98f 100644 --- a/apps/user_ldap/l10n/fa.js +++ b/apps/user_ldap/l10n/fa.js @@ -13,6 +13,8 @@ OC.L10N.register( "Configuration OK" : "پیکربندی صحیح است", "Select groups" : "انتخاب گروه ها", "Select object classes" : "انتخاب کلاس های اشیا", + "Please specify the port, it could not be auto-detected." : "لطفا پورت را مشخص کنید، امکان تعیین خودکار وجود ندارد.", + "Could not detect Base DN, please enter it manually." : "امکان شناسایی Base DN, وجود ندارد، لطفا بصورت دستی آنرا وارد کنید.", "{nthServer}. Server" : "سرور {nthServer}.", "Do you really want to delete the current Server Configuration?" : "آیا واقعا می خواهید پیکربندی کنونی سرور را حذف کنید؟", "Confirm Deletion" : "تایید حذف", @@ -25,18 +27,29 @@ OC.L10N.register( "Groups" : "گروه ها", "Test Configuration" : "امتحان پیکربندی", "Help" : "راهنما", + "Only from these groups:" : "تنها از این گروهها:", + "Search groups" : "جستجوی گروهها", + "Available groups" : "گروههای موجود", + "Selected groups" : "گروههای انتخاب شده", + "LDAP Filter:" : "فیلتر LDAP:", + "LDAP / AD Username:" : "نامکاربری LDAP / AD :", + "LDAP / AD Email Address:" : " آدرس ایمیل LDAP / AD :", "Other Attributes:" : "مشخصه های دیگر:", "1. Server" : "1. سرور", "%s. Server:" : "%s. سرور:", "Host" : "میزبانی", "Port" : "درگاه", + "Detect Port" : "شناسایی پورت", "User DN" : "کاربر DN", "Password" : "گذرواژه", "For anonymous access, leave DN and Password empty." : "برای دسترسی ناشناس، DN را رها نموده و رمزعبور را خالی بگذارید.", "One Base DN per line" : "یک پایه DN در هر خط", "You can specify Base DN for users and groups in the Advanced tab" : "شما می توانید پایه DN را برای کاربران و گروه ها در زبانه Advanced مشخص کنید.", + "Test Base DN" : "تست DN پایه", + "Saving" : "درحال ذخیره", "Back" : "بازگشت", "Continue" : "ادامه", + "LDAP" : "LDAP", "Expert" : "حرفه ای", "Advanced" : "پیشرفته", "Connection Settings" : "تنظیمات اتصال", @@ -46,6 +59,7 @@ OC.L10N.register( "Backup (Replica) Port" : "پشتیبان گیری (بدل) پورت", "Disable Main Server" : "غیر فعال کردن سرور اصلی", "Turn off SSL certificate validation." : "غیرفعال کردن اعتبار گواهی نامه SSL .", + "Cache Time-To-Live" : "مدت زمان کش", "Directory Settings" : "تنظیمات پوشه", "User Display Name Field" : "فیلد نام کاربر", "Base User Tree" : "کاربر درخت پایه", @@ -57,6 +71,7 @@ OC.L10N.register( "One Group Base DN per line" : "یک گروه پایه DN در هر خط", "Group Search Attributes" : "گروه صفات جستجو", "Group-Member association" : "انجمن گروه کاربران", + "Nested Groups" : "گروههای زیرمجموعه", "Special Attributes" : "ویژگی های مخصوص", "Quota Field" : "سهمیه بندی انجام نشد.", "Quota Default" : "سهمیه بندی پیش فرض", @@ -67,6 +82,7 @@ OC.L10N.register( "Internal Username" : "نام کاربری داخلی", "Internal Username Attribute:" : "ویژگی نام کاربری داخلی:", "Override UUID detection" : "نادیده گرفتن تشخیص UUID ", + "UUID Attribute for Users:" : "UUID ویژگی برای کاربران:", "Username-LDAP User Mapping" : "نام کاربری - نگاشت کاربر LDAP ", "Clear Username-LDAP User Mapping" : "پاک کردن نام کاربری- LDAP نگاشت کاربر ", "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری" diff --git a/apps/user_ldap/l10n/fa.json b/apps/user_ldap/l10n/fa.json index 2716f90e10f..7a8b3e8212e 100644 --- a/apps/user_ldap/l10n/fa.json +++ b/apps/user_ldap/l10n/fa.json @@ -11,6 +11,8 @@ "Configuration OK" : "پیکربندی صحیح است", "Select groups" : "انتخاب گروه ها", "Select object classes" : "انتخاب کلاس های اشیا", + "Please specify the port, it could not be auto-detected." : "لطفا پورت را مشخص کنید، امکان تعیین خودکار وجود ندارد.", + "Could not detect Base DN, please enter it manually." : "امکان شناسایی Base DN, وجود ندارد، لطفا بصورت دستی آنرا وارد کنید.", "{nthServer}. Server" : "سرور {nthServer}.", "Do you really want to delete the current Server Configuration?" : "آیا واقعا می خواهید پیکربندی کنونی سرور را حذف کنید؟", "Confirm Deletion" : "تایید حذف", @@ -23,18 +25,29 @@ "Groups" : "گروه ها", "Test Configuration" : "امتحان پیکربندی", "Help" : "راهنما", + "Only from these groups:" : "تنها از این گروهها:", + "Search groups" : "جستجوی گروهها", + "Available groups" : "گروههای موجود", + "Selected groups" : "گروههای انتخاب شده", + "LDAP Filter:" : "فیلتر LDAP:", + "LDAP / AD Username:" : "نامکاربری LDAP / AD :", + "LDAP / AD Email Address:" : " آدرس ایمیل LDAP / AD :", "Other Attributes:" : "مشخصه های دیگر:", "1. Server" : "1. سرور", "%s. Server:" : "%s. سرور:", "Host" : "میزبانی", "Port" : "درگاه", + "Detect Port" : "شناسایی پورت", "User DN" : "کاربر DN", "Password" : "گذرواژه", "For anonymous access, leave DN and Password empty." : "برای دسترسی ناشناس، DN را رها نموده و رمزعبور را خالی بگذارید.", "One Base DN per line" : "یک پایه DN در هر خط", "You can specify Base DN for users and groups in the Advanced tab" : "شما می توانید پایه DN را برای کاربران و گروه ها در زبانه Advanced مشخص کنید.", + "Test Base DN" : "تست DN پایه", + "Saving" : "درحال ذخیره", "Back" : "بازگشت", "Continue" : "ادامه", + "LDAP" : "LDAP", "Expert" : "حرفه ای", "Advanced" : "پیشرفته", "Connection Settings" : "تنظیمات اتصال", @@ -44,6 +57,7 @@ "Backup (Replica) Port" : "پشتیبان گیری (بدل) پورت", "Disable Main Server" : "غیر فعال کردن سرور اصلی", "Turn off SSL certificate validation." : "غیرفعال کردن اعتبار گواهی نامه SSL .", + "Cache Time-To-Live" : "مدت زمان کش", "Directory Settings" : "تنظیمات پوشه", "User Display Name Field" : "فیلد نام کاربر", "Base User Tree" : "کاربر درخت پایه", @@ -55,6 +69,7 @@ "One Group Base DN per line" : "یک گروه پایه DN در هر خط", "Group Search Attributes" : "گروه صفات جستجو", "Group-Member association" : "انجمن گروه کاربران", + "Nested Groups" : "گروههای زیرمجموعه", "Special Attributes" : "ویژگی های مخصوص", "Quota Field" : "سهمیه بندی انجام نشد.", "Quota Default" : "سهمیه بندی پیش فرض", @@ -65,6 +80,7 @@ "Internal Username" : "نام کاربری داخلی", "Internal Username Attribute:" : "ویژگی نام کاربری داخلی:", "Override UUID detection" : "نادیده گرفتن تشخیص UUID ", + "UUID Attribute for Users:" : "UUID ویژگی برای کاربران:", "Username-LDAP User Mapping" : "نام کاربری - نگاشت کاربر LDAP ", "Clear Username-LDAP User Mapping" : "پاک کردن نام کاربری- LDAP نگاشت کاربر ", "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری" diff --git a/apps/user_ldap/l10n/hr.js b/apps/user_ldap/l10n/hr.js index e9c7ce4e17b..284c9ee3207 100644 --- a/apps/user_ldap/l10n/hr.js +++ b/apps/user_ldap/l10n/hr.js @@ -2,6 +2,7 @@ OC.L10N.register( "user_ldap", { "Failed to delete the server configuration" : "Greška prilikom brisanja konfiguracije poslužitelja.", + "Select groups" : "Označi grupe", "Users" : "Korisnici", "Groups" : "Grupe", "Help" : "Pomoć", diff --git a/apps/user_ldap/l10n/hr.json b/apps/user_ldap/l10n/hr.json index 8aad60517c7..9a116a6ce86 100644 --- a/apps/user_ldap/l10n/hr.json +++ b/apps/user_ldap/l10n/hr.json @@ -1,5 +1,6 @@ { "translations": { "Failed to delete the server configuration" : "Greška prilikom brisanja konfiguracije poslužitelja.", + "Select groups" : "Označi grupe", "Users" : "Korisnici", "Groups" : "Grupe", "Help" : "Pomoć", diff --git a/apps/user_ldap/l10n/hy.js b/apps/user_ldap/l10n/hy.js index bd4f60364a3..469515bc42e 100644 --- a/apps/user_ldap/l10n/hy.js +++ b/apps/user_ldap/l10n/hy.js @@ -1,6 +1,7 @@ OC.L10N.register( "user_ldap", { - "Save" : "Պահպանել" + "Groups" : "Խմբեր", + "Password" : "Գաղտնաբառ" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/hy.json b/apps/user_ldap/l10n/hy.json index cb94f4404a5..8b8bf5bd500 100644 --- a/apps/user_ldap/l10n/hy.json +++ b/apps/user_ldap/l10n/hy.json @@ -1,4 +1,5 @@ { "translations": { - "Save" : "Պահպանել" + "Groups" : "Խմբեր", + "Password" : "Գաղտնաբառ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js index 43402d94ace..2db99acf7af 100644 --- a/apps/user_ldap/l10n/ja.js +++ b/apps/user_ldap/l10n/ja.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Failed to clear the mappings." : "マッピングのクリアに失敗しました。", "Failed to delete the server configuration" : "サーバー設定の削除に失敗しました", + "The configuration is invalid: anonymous bind is not allowed." : "設定は無効です: 匿名接続は、許可されていません。", "The configuration is valid and the connection could be established!" : "設定は有効です。接続できました。", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "設定は有効ですが、接続に失敗しました。サーバー設定と資格情報を確認してください。", "The configuration is invalid. Please have a look at the logs for further details." : "設定が無効です。詳細はログを確認してください。", @@ -24,10 +25,27 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. サーバー", "No object found in the given Base DN. Please revise." : "指定されたベース DN でオブジェクトを見つけることができませんでした。修正をお願いします。", "More than 1.000 directory entries available." : "1000 以上のディレクトリエントリが利用可能です。", + " entries available within the provided Base DN" : "入力されたベースDNでエントリーが利用可能", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "エラーが発生しました。ベースDNをチェックし、接続設定と権限についても同様に確認してください。", "Do you really want to delete the current Server Configuration?" : "現在のサーバー設定を本当に削除してもよろしいですか?", "Confirm Deletion" : "削除の確認", "Mappings cleared successfully!" : "マッピングのクリアに成功しました!", + "Error while clearing the mappings." : "マッピングのクリアー中にエラー発生", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "匿名接続が許可されていません。ユーザーDNとパスワードを入力してください。", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP操作エラー。匿名接続が許可されていないのかもしれません。", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "保存に失敗。データベースが稼働中か確認してください。続ける前にリロードしてください。", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "モード切替により自動LDAP問合せが有効になります。LDAPのデータ量により時間がかかる可能性があります。モードを切り替えますか?", + "Mode switch" : "モード変更", "Select attributes" : "属性を選択", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "ユーザーは見つかりませんでした。ログインの属性とユーザー名をチェックしてください。適用されているフィルター(コピーペーストしてコマンドラインでの確認できます): <br/>", + "User found and settings verified." : "ユーザーが見つかり、設定が検証できました。", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "設定は検証できましたが、ユーザーが1名見つかりました。最初の1名だけログインできます。より厳しいフィルターを検討してください。", + "An unspecified error occurred. Please check the settings and the log." : "不明なエラーが発生しました。設定とログを確認してください。", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "検索フィルターが不正です。恐らく文法の問題で、開き括弧と閉じ括弧がマッチしていません。修正をお願いします。", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD の接続エラーが発生しました。ホスト名、ポート、権限をチェックしてください。", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "%uid のプレースフォルダがありません。プレースフォルダでは、LDAP /ADで問合せするときにログイン名で置き換えられます。", + "Please provide a login name to test against" : "テストの為にログイン名を入力してください。", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "グループボックスは無効にされました。LDAP/AD サーバーが MemberOf オプションをサポートしていないからです。", "_%s group found_::_%s groups found_" : ["%s グループが見つかりました"], "_%s user found_::_%s users found_" : ["%s ユーザーが見つかりました"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "ユーザー表示名の属性を検出できませんでした。詳細設定で対応する属性を指定してください。", @@ -40,6 +58,8 @@ OC.L10N.register( "Test Configuration" : "設定をテスト", "Help" : "ヘルプ", "Groups meeting these criteria are available in %s:" : "これらの基準を満たすグループが %s で利用可能:", + "Only these object classes:" : "このオブジェクトクラスからのみ:", + "Only from these groups:" : "これらのグループからのみ:", "Search groups" : "グループを検索", "Available groups" : "利用可能なグループ", "Selected groups" : "選択されたグループ", @@ -47,13 +67,20 @@ OC.L10N.register( "LDAP Filter:" : "LDAP フィルタ:", "The filter specifies which LDAP groups shall have access to the %s instance." : "フィルターは、どの LDAP グループが %s にアクセスするかを指定します。", "Verify settings and count groups" : "設定を検証し、グループを数える", + "When logging in, %s will find the user based on the following attributes:" : "ログイン時に、%s により次の属性からユーザーを見つけます:", "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." : "メール属性に対してログインが許可されています。メールや mailPrimaryAddress が許可されています。", "Other Attributes:" : "その他の属性:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "ログイン実行時に適用するフィルターを定義します。%%uid にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"", + "Test Loginname" : "テスト用ログイン名", "Verify settings" : "設定のチェック", "1. Server" : "1. Server", "%s. Server:" : "%s. サーバー:", + "Add a new and blank configuration" : "空欄の新しい設定を追加", + "Copy current configuration into new directory binding" : "現在の設定を新しいディレクトリ設定にコピー", + "Delete the current configuration" : "現在の設定を削除", "Host" : "ホスト", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。", "Port" : "ポート", @@ -69,8 +96,9 @@ OC.L10N.register( "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "自動的なLDAP問合せを停止します。大規模な設定には適していますが、LDAPの知識が必要になります。", "Manually enter LDAP filters (recommended for large directories)" : "手動でLDAPフィルターを入力(大規模ディレクトリ時のみ推奨)", "Limit %s access to users meeting these criteria:" : "以下のフィルターに適合するユーザーのみ %s へアクセスを許可:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "ユーザーの最も一般的なオブジェクトクラスは、organizationalPerson, person, user と inetOrgPerson です。もし、どのオブジェクトを選択すれば良いか分からない場合は、ディレクトリ管理者に相談してください。", "The filter specifies which LDAP users shall have access to the %s instance." : "フィルターは、どのLDAPユーザーが %s にアクセスするかを指定します。", - "Verify settings and count users" : "設定を検証し、ユーザを数える", + "Verify settings and count users" : "設定を検証し、ユーザーを数える", "Saving" : "保存中", "Back" : "戻る", "Continue" : "続ける", @@ -123,6 +151,7 @@ OC.L10N.register( "UUID Attribute for Users:" : "ユーザーのUUID属性:", "UUID Attribute for Groups:" : "グループの UUID 属性:", "Username-LDAP User Mapping" : "ユーザー名とLDAPユーザのマッピング", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ユーザー名は(メタ)データの保存と割り当てに使用されます。ユーザーを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザー名からLDAPユーザーへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、すべてのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。", "Clear Username-LDAP User Mapping" : "ユーザー名とLDAPユーザーのマッピングをクリアする", "Clear Groupname-LDAP Group Mapping" : "グループ名とLDAPグループのマッピングをクリアする" }, diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json index 81a918eae02..3a9475699ae 100644 --- a/apps/user_ldap/l10n/ja.json +++ b/apps/user_ldap/l10n/ja.json @@ -1,6 +1,7 @@ { "translations": { "Failed to clear the mappings." : "マッピングのクリアに失敗しました。", "Failed to delete the server configuration" : "サーバー設定の削除に失敗しました", + "The configuration is invalid: anonymous bind is not allowed." : "設定は無効です: 匿名接続は、許可されていません。", "The configuration is valid and the connection could be established!" : "設定は有効です。接続できました。", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "設定は有効ですが、接続に失敗しました。サーバー設定と資格情報を確認してください。", "The configuration is invalid. Please have a look at the logs for further details." : "設定が無効です。詳細はログを確認してください。", @@ -22,10 +23,27 @@ "{nthServer}. Server" : "{nthServer}. サーバー", "No object found in the given Base DN. Please revise." : "指定されたベース DN でオブジェクトを見つけることができませんでした。修正をお願いします。", "More than 1.000 directory entries available." : "1000 以上のディレクトリエントリが利用可能です。", + " entries available within the provided Base DN" : "入力されたベースDNでエントリーが利用可能", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "エラーが発生しました。ベースDNをチェックし、接続設定と権限についても同様に確認してください。", "Do you really want to delete the current Server Configuration?" : "現在のサーバー設定を本当に削除してもよろしいですか?", "Confirm Deletion" : "削除の確認", "Mappings cleared successfully!" : "マッピングのクリアに成功しました!", + "Error while clearing the mappings." : "マッピングのクリアー中にエラー発生", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "匿名接続が許可されていません。ユーザーDNとパスワードを入力してください。", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP操作エラー。匿名接続が許可されていないのかもしれません。", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "保存に失敗。データベースが稼働中か確認してください。続ける前にリロードしてください。", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "モード切替により自動LDAP問合せが有効になります。LDAPのデータ量により時間がかかる可能性があります。モードを切り替えますか?", + "Mode switch" : "モード変更", "Select attributes" : "属性を選択", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "ユーザーは見つかりませんでした。ログインの属性とユーザー名をチェックしてください。適用されているフィルター(コピーペーストしてコマンドラインでの確認できます): <br/>", + "User found and settings verified." : "ユーザーが見つかり、設定が検証できました。", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "設定は検証できましたが、ユーザーが1名見つかりました。最初の1名だけログインできます。より厳しいフィルターを検討してください。", + "An unspecified error occurred. Please check the settings and the log." : "不明なエラーが発生しました。設定とログを確認してください。", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "検索フィルターが不正です。恐らく文法の問題で、開き括弧と閉じ括弧がマッチしていません。修正をお願いします。", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD の接続エラーが発生しました。ホスト名、ポート、権限をチェックしてください。", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "%uid のプレースフォルダがありません。プレースフォルダでは、LDAP /ADで問合せするときにログイン名で置き換えられます。", + "Please provide a login name to test against" : "テストの為にログイン名を入力してください。", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "グループボックスは無効にされました。LDAP/AD サーバーが MemberOf オプションをサポートしていないからです。", "_%s group found_::_%s groups found_" : ["%s グループが見つかりました"], "_%s user found_::_%s users found_" : ["%s ユーザーが見つかりました"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "ユーザー表示名の属性を検出できませんでした。詳細設定で対応する属性を指定してください。", @@ -38,6 +56,8 @@ "Test Configuration" : "設定をテスト", "Help" : "ヘルプ", "Groups meeting these criteria are available in %s:" : "これらの基準を満たすグループが %s で利用可能:", + "Only these object classes:" : "このオブジェクトクラスからのみ:", + "Only from these groups:" : "これらのグループからのみ:", "Search groups" : "グループを検索", "Available groups" : "利用可能なグループ", "Selected groups" : "選択されたグループ", @@ -45,13 +65,20 @@ "LDAP Filter:" : "LDAP フィルタ:", "The filter specifies which LDAP groups shall have access to the %s instance." : "フィルターは、どの LDAP グループが %s にアクセスするかを指定します。", "Verify settings and count groups" : "設定を検証し、グループを数える", + "When logging in, %s will find the user based on the following attributes:" : "ログイン時に、%s により次の属性からユーザーを見つけます:", "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." : "メール属性に対してログインが許可されています。メールや mailPrimaryAddress が許可されています。", "Other Attributes:" : "その他の属性:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "ログイン実行時に適用するフィルターを定義します。%%uid にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"", + "Test Loginname" : "テスト用ログイン名", "Verify settings" : "設定のチェック", "1. Server" : "1. Server", "%s. Server:" : "%s. サーバー:", + "Add a new and blank configuration" : "空欄の新しい設定を追加", + "Copy current configuration into new directory binding" : "現在の設定を新しいディレクトリ設定にコピー", + "Delete the current configuration" : "現在の設定を削除", "Host" : "ホスト", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。", "Port" : "ポート", @@ -67,8 +94,9 @@ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "自動的なLDAP問合せを停止します。大規模な設定には適していますが、LDAPの知識が必要になります。", "Manually enter LDAP filters (recommended for large directories)" : "手動でLDAPフィルターを入力(大規模ディレクトリ時のみ推奨)", "Limit %s access to users meeting these criteria:" : "以下のフィルターに適合するユーザーのみ %s へアクセスを許可:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "ユーザーの最も一般的なオブジェクトクラスは、organizationalPerson, person, user と inetOrgPerson です。もし、どのオブジェクトを選択すれば良いか分からない場合は、ディレクトリ管理者に相談してください。", "The filter specifies which LDAP users shall have access to the %s instance." : "フィルターは、どのLDAPユーザーが %s にアクセスするかを指定します。", - "Verify settings and count users" : "設定を検証し、ユーザを数える", + "Verify settings and count users" : "設定を検証し、ユーザーを数える", "Saving" : "保存中", "Back" : "戻る", "Continue" : "続ける", @@ -121,6 +149,7 @@ "UUID Attribute for Users:" : "ユーザーのUUID属性:", "UUID Attribute for Groups:" : "グループの UUID 属性:", "Username-LDAP User Mapping" : "ユーザー名とLDAPユーザのマッピング", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ユーザー名は(メタ)データの保存と割り当てに使用されます。ユーザーを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザー名からLDAPユーザーへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、すべてのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。", "Clear Username-LDAP User Mapping" : "ユーザー名とLDAPユーザーのマッピングをクリアする", "Clear Groupname-LDAP Group Mapping" : "グループ名とLDAPグループのマッピングをクリアする" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/user_ldap/l10n/ka_GE.js b/apps/user_ldap/l10n/ka_GE.js index c2fc858d153..0fdf25fea6f 100644 --- a/apps/user_ldap/l10n/ka_GE.js +++ b/apps/user_ldap/l10n/ka_GE.js @@ -1,6 +1,7 @@ OC.L10N.register( "user_ldap", { + "Failed to clear the mappings." : "ბმების წაშლის დროს მოხდა შეცდომა", "Failed to delete the server configuration" : "შეცდომა სერვერის კონფიგურაციის წაშლისას", "The configuration is valid and the connection could be established!" : "კონფიგურაცია მართებულია და კავშირი დამყარდება!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "კონფიგურაცია მართებულია, მაგრამ მიერთება ვერ მოხერხდა. გთხოვთ შეამოწმოთ სერვერის პარამეტრები და აუთენთიკაციის პარამეტრები.", diff --git a/apps/user_ldap/l10n/ka_GE.json b/apps/user_ldap/l10n/ka_GE.json index be93dc5a626..7ddaaef5bda 100644 --- a/apps/user_ldap/l10n/ka_GE.json +++ b/apps/user_ldap/l10n/ka_GE.json @@ -1,4 +1,5 @@ { "translations": { + "Failed to clear the mappings." : "ბმების წაშლის დროს მოხდა შეცდომა", "Failed to delete the server configuration" : "შეცდომა სერვერის კონფიგურაციის წაშლისას", "The configuration is valid and the connection could be established!" : "კონფიგურაცია მართებულია და კავშირი დამყარდება!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "კონფიგურაცია მართებულია, მაგრამ მიერთება ვერ მოხერხდა. გთხოვთ შეამოწმოთ სერვერის პარამეტრები და აუთენთიკაციის პარამეტრები.", diff --git a/apps/user_ldap/l10n/ko.js b/apps/user_ldap/l10n/ko.js index 566b67bf98e..6a14df58855 100644 --- a/apps/user_ldap/l10n/ko.js +++ b/apps/user_ldap/l10n/ko.js @@ -5,7 +5,7 @@ OC.L10N.register( "Failed to delete the server configuration" : "서버 설정을 삭제할 수 없습니다.", "The configuration is invalid: anonymous bind is not allowed." : "설정이 잘못되었습니다: 익명 연결은 허용되지 않습니다.", "The configuration is valid and the connection could be established!" : "설정 정보가 올바르고 연결할 수 있습니다!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "설정 정보가 올바르지만 바인딩이 실패하였습니다. 서버 설정과 인증 정보를 확인하십시오.", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "설정 정보가 올바르지만 바인딩이 실패했습니다. 서버 설정과 인증 정보를 확인하십시오.", "The configuration is invalid. Please have a look at the logs for further details." : "설정이 올바르지 않습니다. 자세한 사항은 로그를 참고하십시오.", "No action specified" : "동작이 지정되지 않음", "No configuration specified" : "설정이 지정되지 않음", @@ -26,11 +26,11 @@ OC.L10N.register( "No object found in the given Base DN. Please revise." : "입력한 기본 DN에서 객체를 찾을 수 없습니다. 다시 입력하십시오.", "More than 1.000 directory entries available." : "디렉터리 항목이 1,000개 이상 존재합니다.", " entries available within the provided Base DN" : "개(지정한 DN의 기본 항목 수)", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "오류가 발생하였습니다. 기본 DN, 연결 설정, 인증 정보를 확인하십시오.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "오류가 발생했습니다. 기본 DN, 연결 설정, 인증 정보를 확인하십시오.", "Do you really want to delete the current Server Configuration?" : "현재 서버 설정을 지우시겠습니까?", "Confirm Deletion" : "삭제 확인", - "Mappings cleared successfully!" : "매핑을 삭제하였습니다!", - "Error while clearing the mappings." : "매핑을 삭제하는 중 오류가 발생하였습니다.", + "Mappings cleared successfully!" : "매핑을 삭제했습니다!", + "Error while clearing the mappings." : "매핑을 삭제하는 중 오류가 발생했습니다.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "익명 연결은 허용되지 않습니다. 사용자 DN과 암호를 입력하십시오.", "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP 작업 오류입니다. 익명 연결이 비활성화 되었을 수 있습니다.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "저장할 수 없습니다. 데이터베이스 상태를 확인하십시오. 계속하기 전에 새로 고치십시오.", @@ -38,11 +38,11 @@ OC.L10N.register( "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 found and settings verified." : "사용자를 찾았고 설정을 확인하였습니다.", + "User found and settings verified." : "사용자를 찾았고 설정을 확인했습니다.", "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "설정을 확인하였으나 한 명의 사용자만 찾았습니다. 첫 사용자만 로그인할 수 있습니다. 더 좁은 필터를 지정하십시오.", - "An unspecified error occurred. Please check the settings and the log." : "알 수 없는 오류가 발생하였습니다. 설정과 로그를 확인하십시오.", + "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 연결 오류가 발생하였습니다. 호스트, 포트, 인증 정보를 확인하십시오.", + "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를 지원하지 않아서 그룹 상자를 비활성화합니다.", diff --git a/apps/user_ldap/l10n/ko.json b/apps/user_ldap/l10n/ko.json index b8f649bc24e..40fd85ca809 100644 --- a/apps/user_ldap/l10n/ko.json +++ b/apps/user_ldap/l10n/ko.json @@ -3,7 +3,7 @@ "Failed to delete the server configuration" : "서버 설정을 삭제할 수 없습니다.", "The configuration is invalid: anonymous bind is not allowed." : "설정이 잘못되었습니다: 익명 연결은 허용되지 않습니다.", "The configuration is valid and the connection could be established!" : "설정 정보가 올바르고 연결할 수 있습니다!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "설정 정보가 올바르지만 바인딩이 실패하였습니다. 서버 설정과 인증 정보를 확인하십시오.", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "설정 정보가 올바르지만 바인딩이 실패했습니다. 서버 설정과 인증 정보를 확인하십시오.", "The configuration is invalid. Please have a look at the logs for further details." : "설정이 올바르지 않습니다. 자세한 사항은 로그를 참고하십시오.", "No action specified" : "동작이 지정되지 않음", "No configuration specified" : "설정이 지정되지 않음", @@ -24,11 +24,11 @@ "No object found in the given Base DN. Please revise." : "입력한 기본 DN에서 객체를 찾을 수 없습니다. 다시 입력하십시오.", "More than 1.000 directory entries available." : "디렉터리 항목이 1,000개 이상 존재합니다.", " entries available within the provided Base DN" : "개(지정한 DN의 기본 항목 수)", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "오류가 발생하였습니다. 기본 DN, 연결 설정, 인증 정보를 확인하십시오.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "오류가 발생했습니다. 기본 DN, 연결 설정, 인증 정보를 확인하십시오.", "Do you really want to delete the current Server Configuration?" : "현재 서버 설정을 지우시겠습니까?", "Confirm Deletion" : "삭제 확인", - "Mappings cleared successfully!" : "매핑을 삭제하였습니다!", - "Error while clearing the mappings." : "매핑을 삭제하는 중 오류가 발생하였습니다.", + "Mappings cleared successfully!" : "매핑을 삭제했습니다!", + "Error while clearing the mappings." : "매핑을 삭제하는 중 오류가 발생했습니다.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "익명 연결은 허용되지 않습니다. 사용자 DN과 암호를 입력하십시오.", "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP 작업 오류입니다. 익명 연결이 비활성화 되었을 수 있습니다.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "저장할 수 없습니다. 데이터베이스 상태를 확인하십시오. 계속하기 전에 새로 고치십시오.", @@ -36,11 +36,11 @@ "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 found and settings verified." : "사용자를 찾았고 설정을 확인하였습니다.", + "User found and settings verified." : "사용자를 찾았고 설정을 확인했습니다.", "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "설정을 확인하였으나 한 명의 사용자만 찾았습니다. 첫 사용자만 로그인할 수 있습니다. 더 좁은 필터를 지정하십시오.", - "An unspecified error occurred. Please check the settings and the log." : "알 수 없는 오류가 발생하였습니다. 설정과 로그를 확인하십시오.", + "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 연결 오류가 발생하였습니다. 호스트, 포트, 인증 정보를 확인하십시오.", + "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를 지원하지 않아서 그룹 상자를 비활성화합니다.", diff --git a/apps/user_ldap/l10n/lt_LT.js b/apps/user_ldap/l10n/lt_LT.js index 84d3cb8463e..e9429c0de2a 100644 --- a/apps/user_ldap/l10n/lt_LT.js +++ b/apps/user_ldap/l10n/lt_LT.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select groups" : "Pasirinkti grupes", "Do you really want to delete the current Server Configuration?" : "Ar tikrai norite ištrinti dabartinę serverio konfigūraciją?", "Confirm Deletion" : "Patvirtinkite trynimą", + "Server" : "Serveris", "Users" : "Vartotojai", "Groups" : "Grupės", "Test Configuration" : "Bandyti konfigūraciją", diff --git a/apps/user_ldap/l10n/lt_LT.json b/apps/user_ldap/l10n/lt_LT.json index fd385a1e8dc..19ca042b62f 100644 --- a/apps/user_ldap/l10n/lt_LT.json +++ b/apps/user_ldap/l10n/lt_LT.json @@ -5,6 +5,7 @@ "Select groups" : "Pasirinkti grupes", "Do you really want to delete the current Server Configuration?" : "Ar tikrai norite ištrinti dabartinę serverio konfigūraciją?", "Confirm Deletion" : "Patvirtinkite trynimą", + "Server" : "Serveris", "Users" : "Vartotojai", "Groups" : "Grupės", "Test Configuration" : "Bandyti konfigūraciją", diff --git a/apps/user_ldap/l10n/nds.js b/apps/user_ldap/l10n/nds.js index 37042a4f412..7fe0e420a11 100644 --- a/apps/user_ldap/l10n/nds.js +++ b/apps/user_ldap/l10n/nds.js @@ -1,7 +1,9 @@ OC.L10N.register( "user_ldap", { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] + "Host" : "Host", + "Port" : "Port", + "Password" : "Passwort", + "Continue" : "Fortsetzen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/nds.json b/apps/user_ldap/l10n/nds.json index 521de7ba1a8..78a3e1c8efd 100644 --- a/apps/user_ldap/l10n/nds.json +++ b/apps/user_ldap/l10n/nds.json @@ -1,5 +1,7 @@ { "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] + "Host" : "Host", + "Port" : "Port", + "Password" : "Passwort", + "Continue" : "Fortsetzen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/oc.js b/apps/user_ldap/l10n/oc.js index 695647833cd..16a136649d7 100644 --- a/apps/user_ldap/l10n/oc.js +++ b/apps/user_ldap/l10n/oc.js @@ -1,14 +1,158 @@ OC.L10N.register( "user_ldap", { + "Failed to clear the mappings." : "Error al moment de la supression de las associacions.", + "Failed to delete the server configuration" : "Fracàs de la supression de la configuracion del servidor", + "The configuration is invalid: anonymous bind is not allowed." : "La configuracion es pas valida : lo ligam anonim es pas autorizat.", + "The configuration is valid and the connection could be established!" : "La configuracion es valida e la connexion pòt èsser establida !", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuracion es valabla, mas lo bind a fracassat. Verificatz los paramètres del servidor e tanben vòstres identificants de connexion.", + "The configuration is invalid. Please have a look at the logs for further details." : "La configuracion es pas valabla. Consultatz los logs per mai de detalhs.", + "No action specified" : "Cap d'accion pas especificada", + "No configuration specified" : "Cap de configuration pas especificada", + "No data specified" : "Cap de donada pas especificada", + " Could not set configuration %s" : "Impossible d'especificar la configuracion %s", + "Action does not exist" : "L'accion existís pas", + "The Base DN appears to be wrong" : "Lo DN de basa es erronèu", + "Configuration incorrect" : "Configuracion incorrècta", + "Configuration incomplete" : "Configuracion incompleta", + "Configuration OK" : "Configuracion OK", + "Select groups" : "Seleccionatz los gropes", + "Select object classes" : "Seleccionar las classas d'objècte", + "Please check the credentials, they seem to be wrong." : "Verificatz vòstras informacions d'identificacion", + "Please specify the port, it could not be auto-detected." : "Especificatz lo pòrt, a pas pogut èsser detectat automaticament", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Lo DN de basa a pas pogut èsser detectat automaticament. Verificatz las informacions d'identificacion, l'òste e lo pòrt.", + "Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de basa, especificatz-lo manualament", + "{nthServer}. Server" : "{nthServer}. Servidor", + "No object found in the given Base DN. Please revise." : "Cap d'objècte pas trobat dins lo DN de basa especificat. Verificatz-lo.", + "More than 1.000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.", + " entries available within the provided Base DN" : "entradas disponiblas dins lo DN de basa especificat", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error s'es produsida. Verificatz lo DN de basa, e tanben los paramètres de connexion e las informacions d'identificacion.", + "Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?", + "Confirm Deletion" : "Confirmar la supression", + "Mappings cleared successfully!" : "Associacions suprimidas amb succès !", + "Error while clearing the mappings." : "Error al moment de la supression de las associacions.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Lo ligam anonim es pas autorizat. Mercé de provesir lo DN d'un utilizaire e un senhal.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Error LDAP. La connexion anonima al servidor es probablament pas acceptada.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Lo salvament a fracassat. Verificatz que la banca de donadas es operacionala. Recargatz abans de contunhar.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar de mòde activarà las requèstas LDAP automaticas. Segon la talha de vòstre annuari LDAP, aquò pòt préner del temps. Volètz totjorn cambiar de mòde ?", + "Mode switch" : "Cambiar de mòde", + "Select attributes" : "Seleccionar los atributs", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilizaire introbable. Verificatz los atributs de login e lo nom d'utilizaire. Filtre efectiu (de copiar-pegar per validar en linha de comanda):<br/>", + "User found and settings verified." : "Utilizaire trobat e paramètres verificats.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Paramètres verificats, mas sol lo primièr utilizaire se poirà connectar. Utilizatz puslèu un filtre mens restrictiu.", + "An unspecified error occurred. Please check the settings and the log." : "Una error desconeguda s'es produsida. Verificatz los paramètres e lo log.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Lo filtre de recèrca es pas valid, probablament a causa de problèmas de sintaxi tals coma de parentèsis mancantas. Corregissètz-los.", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Una error s'es produsida al moment de la connexion al LDAP / AD. Verificatz l'òste, lo pòrt e las informacions d'identificacion.", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La cadena %uid es mancanta. Aquesta cadena es remplaçada per l'identificant de connexion al moment de las requèstas LDAP / AD.", + "Please provide a login name to test against" : "Indicatz un identificant de connexion amb lo qual cal testar.", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Los gropes son desactivats perque lo servidor LDAP / AD pren pas en carga memberOf.", + "_%s group found_::_%s groups found_" : ["%s grop trobat","%s gropes trobats"], + "_%s user found_::_%s users found_" : ["%s utilizaire trobat","%s utilizaires trobats"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de detectar l'atribut que conten lo nom d'afichatge des utilizaires. Indicatz-lo vos-meteis dins los paramètres ldap avançats.", + "Could not find the desired feature" : "Impossible de trobar la foncion desirada", + "Invalid Host" : "Òste invalid", "Server" : "Servidor", - "Users" : "Usancièrs", - "Groups" : "Grops", + "Users" : "Utilizaires", + "Login Attributes" : "Atributs de login", + "Groups" : "Gropes", + "Test Configuration" : "Testar la configuracion", "Help" : "Ajuda", + "Groups meeting these criteria are available in %s:" : "Los gropes que respèctan aquestes critèris son disponibles dins %s :", + "Only these object classes:" : "Solament aquestas classes d'objèctes :", + "Only from these groups:" : "Solament dins aquestes gropes :", + "Search groups" : "Cercar dins los gropes", + "Available groups" : "Gropes disponibles", + "Selected groups" : "Gropes seleccionats", + "Edit LDAP Query" : "Modificar la requèsta LDAP", + "LDAP Filter:" : "Filtre LDAP :", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Lo filtre especifica quins gropes LDAP an accès a l'instància %s.", + "Verify settings and count groups" : "Verificar los paramètres e comptar los gropes", + "When logging in, %s will find the user based on the following attributes:" : "Al login, %s cercarà l'utilizaire sus basa d'aquestes atributs :", + "LDAP / AD Username:" : "Nom d'utilizaire LDAP / AD :", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Autorizar lo login amb lo nom d'utilizaire LDAP / AD (uid o samaccountname, la deteccion es automatica). ", + "LDAP / AD Email Address:" : "Adreça mail LDAP / AD :", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Autorizar lo login amb una adreça mail. Mail e mailPrimaryAddress son autorizats.", + "Other Attributes:" : "Autres atributs :", + "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definís lo filtre d'aplicar al moment d'una temptativa de connexion. %%uid remplaça lo nom d'utilizaire. Exemple : \"uid=%%uid\"", + "Test Loginname" : "Loginname de tèst", + "Verify settings" : "Testar los paramètres", + "1. Server" : "1. Servidor", + "%s. Server:" : "%s. Servidor :", + "Add a new and blank configuration" : "Apondre una novèla configuracion verge", + "Copy current configuration into new directory binding" : "Copiar la configuracion actuala cap a una novèla", + "Delete the current configuration" : "Suprimir la configuracion actuala", "Host" : "Òste", + "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Podètz ometre lo protocòl, levat se avètz besonh de SSL. Dins aqueste cas, prefixatz amb ldaps://", "Port" : "Pòrt", + "Detect Port" : "Detectar lo pòrt", + "User DN" : "DN Utilizaire", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilizaire client pel qual la ligason se deu far, per exemple uid=agent,dc=example,dc=com. Per un accès anonim, daissar lo DN e lo senhal voids.", "Password" : "Senhal", + "For anonymous access, leave DN and Password empty." : "Per un accès anonim, daissar lo DN utilizaire e lo senhal voids.", + "One Base DN per line" : "Un DN de basa per linha", + "You can specify Base DN for users and groups in the Advanced tab" : "Podètz especificar los DN de basa de vòstres utilizaires e gropes via l'onglet Avançat", + "Detect Base DN" : "Detectar lo DN de basa", + "Test Base DN" : "Testar lo DN de basa", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita las requèstas LDAP automaticas. Melhor per las installacions de grand ample, mas demanda de coneissenças en LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Sasir los filtres LDAP manualament (recomandat pels annuaris de grand ample)", + "Limit %s access to users meeting these criteria:" : "Limitar l'accès a %s als utilizaires que respèctan aquestes critèris :", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las classas d'objèctes frequentas pels utilizaires son : organizationalPerson, person, user e inetOrgPerson. Se sètz pas segur de la classa d'utilizar, demandatz a l'administrator de l'annuari.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Lo filtre especifica quins utilizaires LDAP auràn accès a l'instància %s.", + "Verify settings and count users" : "Verificar los paramètres e comptar los utilizaires", + "Saving" : "Enregistrament...", + "Back" : "Retorn", "Continue" : "Contunhar", - "Advanced" : "Avançat" + "LDAP" : "LDAP", + "Expert" : "Expèrt", + "Advanced" : "Avançat", + "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Avertiment :</b> Las aplicacions user_ldap e user_webdavauth son incompatiblas. De disfoncionaments se pòdon provesir. Contactatz vòstre administrator sistèma per que ne desactive una.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atencion :</b> Lo modul php LDAP es pas installat, per consequéncia aquesta extension poirà pas foncionar. Contactatz vòstre administrator sistèma per tal que l'installe.", + "Connection Settings" : "Paramètres de connexion", + "Configuration Active" : "Configuracion activa", + "When unchecked, this configuration will be skipped." : "Quand pas marcada, la configuracion serà ignorada.", + "Backup (Replica) Host" : "Servidor de backup (replica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Provesir un servidor de backup opcional. Se deu agir d'una replica del servidor LDAP/AD principal.", + "Backup (Replica) Port" : "Pòrt del servidor de backup (replica)", + "Disable Main Server" : "Desactivar lo servidor principal", + "Only connect to the replica server." : "Se connectar unicament a la replica", + "Turn off SSL certificate validation." : "Desactivar la validacion dels certificats SSL", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Pas recomandat, d'utilizar amb d'objectius de tèsts unicament. Se la connexion fonciona pas qu'amb aquesta opcion, importatz lo certificat SSL del servidor LDAP dins lo servidor %s.", + "Cache Time-To-Live" : "Durada de vida de l'escondedor (TTL)", + "in seconds. A change empties the cache." : "en segondas. Tot cambiament voida l'escondedor.", + "Directory Settings" : "Paramètres del repertòri", + "User Display Name Field" : "Camp \"nom d'afichatge\" de l'utilizaire", + "The LDAP attribute to use to generate the user's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge de l'utilizaire.", + "Base User Tree" : "DN raiç de l'arbre utilizaires", + "One User Base DN per line" : "Un DN de basa utilizaire per linha", + "User Search Attributes" : "Atributs de recèrca utilizaires", + "Optional; one attribute per line" : "Opcional, un atribut per linha", + "Group Display Name Field" : "Camp \"nom d'afichatge\" del grop", + "The LDAP attribute to use to generate the groups's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge del grop.", + "Base Group Tree" : "DN raiç de l'arbre gropes", + "One Group Base DN per line" : "Un DN de basa grop per linha", + "Group Search Attributes" : "Atributs de recèrca des gropes", + "Group-Member association" : "Associacion grop-membre", + "Nested Groups" : "Gropes imbricats", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se activat, los gropes que contenon d'autres gropes son preses en carga (fonciona unicament se l'atribut membre del grop conten de DNs).", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilizada per las recèrcas LDAP paginadas que pòdon tornar de resultats per lòts coma una enumeracion d'utilizaires o de gropes. (Configurar a 0 per desactivar las recèrcas LDAP paginadas)", + "Special Attributes" : "Atributs especials", + "Quota Field" : "Camp del quòta", + "Quota Default" : "Quòta per defaut", + "in bytes" : "en octets", + "Email Field" : "Camp Email", + "User Home Folder Naming Rule" : "Règla de nomenatge del repertòri utilizaire", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Daissar void per user name (defaut). Podètz tanben especificar un atribut LDAP / AD.", + "Internal Username" : "Nom d'utilizaire intèrne", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Per defaut lo nom d'utilizaire intèrne serà creat a partir de l'atribut UUID. Aquò permet d'assegurar que lo nom d'utilizaire es unic e que los caractèrs necessitan pas de conversion. Lo nom d'utilizaire intèrne deu contenir unicament los caractèrs seguents : [ a-zA-Z0-9_.@- ]. Los autres caractèrs son remplaçats per lor correspondéncia ASCII o simplament omeses. En cas de collision, un nombre es apondut/incrementat. Lo nom d'utilizaire intèrne es utilizat per identificar l'utilizaire al dintre del sistèma. Es tanben lo nom per defaut del repertòri utilizaire dins ownCloud. Fa tanben partida de certans URL de servicis, per exemple per totes los servicis *DAV. Lo comportament per defaut pòt èsser modificat amb l'ajuda d'aqueste paramètre. Per obtenir un comportament similar a las versions precedentas a ownCloud 5, sasir lo nom d'utilizaire d'afichar dins lo camp seguent. Daissar a blanc pel comportement per defaut. Las modificacions prendràn efièch solament pels novèls (aponduts) utilizaires LDAP.", + "Internal Username Attribute:" : "Nom d'utilizaire intèrne :", + "Override UUID detection" : "Passar outra la deteccion des UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defaut, l'atribut UUID es detectat automaticament. Aqueste atribut es utilizat per identificar los utilizaires e gropes de faiçon fisabla. Un nom d'utilizaire intèrne basat sus l'UUID serà automaticament creat, levat s'es especificat autrament çaisús. Podètz modificar aqueste comportament e definir l'atribut que volètz. Vos cal alara vos assegurar que l'atribut que volètz pòt èsser recuperat pels utilizaires e tanben pels gropes e que siá unic. Daissar a blanc pel comportament per defaut. Las modificacions seràn efectivas unicament pels novèls (aponduts) utilizaires e gropes LDAP.", + "UUID Attribute for Users:" : "Atribut UUID pels Utilizaires :", + "UUID Attribute for Groups:" : "Atribut UUID pels Gropes :", + "Username-LDAP User Mapping" : "Associacion Nom d'utilizaire-Utilizaire LDAP", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los noms d'utilizaires son utilizats per l'emmagazinatge e l'assignacion de (meta) donadas. Per identificar e reconéisser precisament los utilizaires, cada utilizaire LDAP aurà un nom intèrne especific. Aquò requerís l'associacion d'un nom d'utilizaire ownCloud a un nom d'utilizaire LDAP. Lo nom d'utilizaire creat es associat a l'atribut UUID de l'utilizaire LDAP. Amai, lo DN es memorizat en escondedor per limitar las interaccions LDAP mas es pas utilizat per l'identificacion. Se lo DN es modificat, aquelas modificacions seràn retrobadas. Sol lo nom intèrne a ownCloud es utilizat al dintre del produch. Suprimir las associacions crearà d'orfanèls e l'accion afectarà totas las configuracions LDAP. SUPRIMISSÈTZ PAS JAMAI LAS ASSOCIACIONS EN ENVIRONAMENT DE PRODUCCION, mas unicament sus d'environaments de tèsts e d'experimentacions.", + "Clear Username-LDAP User Mapping" : "Suprimir l'associacion utilizaire intèrne-utilizaire LDAP", + "Clear Groupname-LDAP Group Mapping" : "Suprimir l'associacion nom de grop-grop LDAP" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/oc.json b/apps/user_ldap/l10n/oc.json index dc6fb8b6270..c7489f3f2b4 100644 --- a/apps/user_ldap/l10n/oc.json +++ b/apps/user_ldap/l10n/oc.json @@ -1,12 +1,156 @@ { "translations": { + "Failed to clear the mappings." : "Error al moment de la supression de las associacions.", + "Failed to delete the server configuration" : "Fracàs de la supression de la configuracion del servidor", + "The configuration is invalid: anonymous bind is not allowed." : "La configuracion es pas valida : lo ligam anonim es pas autorizat.", + "The configuration is valid and the connection could be established!" : "La configuracion es valida e la connexion pòt èsser establida !", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuracion es valabla, mas lo bind a fracassat. Verificatz los paramètres del servidor e tanben vòstres identificants de connexion.", + "The configuration is invalid. Please have a look at the logs for further details." : "La configuracion es pas valabla. Consultatz los logs per mai de detalhs.", + "No action specified" : "Cap d'accion pas especificada", + "No configuration specified" : "Cap de configuration pas especificada", + "No data specified" : "Cap de donada pas especificada", + " Could not set configuration %s" : "Impossible d'especificar la configuracion %s", + "Action does not exist" : "L'accion existís pas", + "The Base DN appears to be wrong" : "Lo DN de basa es erronèu", + "Configuration incorrect" : "Configuracion incorrècta", + "Configuration incomplete" : "Configuracion incompleta", + "Configuration OK" : "Configuracion OK", + "Select groups" : "Seleccionatz los gropes", + "Select object classes" : "Seleccionar las classas d'objècte", + "Please check the credentials, they seem to be wrong." : "Verificatz vòstras informacions d'identificacion", + "Please specify the port, it could not be auto-detected." : "Especificatz lo pòrt, a pas pogut èsser detectat automaticament", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Lo DN de basa a pas pogut èsser detectat automaticament. Verificatz las informacions d'identificacion, l'òste e lo pòrt.", + "Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de basa, especificatz-lo manualament", + "{nthServer}. Server" : "{nthServer}. Servidor", + "No object found in the given Base DN. Please revise." : "Cap d'objècte pas trobat dins lo DN de basa especificat. Verificatz-lo.", + "More than 1.000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.", + " entries available within the provided Base DN" : "entradas disponiblas dins lo DN de basa especificat", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error s'es produsida. Verificatz lo DN de basa, e tanben los paramètres de connexion e las informacions d'identificacion.", + "Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?", + "Confirm Deletion" : "Confirmar la supression", + "Mappings cleared successfully!" : "Associacions suprimidas amb succès !", + "Error while clearing the mappings." : "Error al moment de la supression de las associacions.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Lo ligam anonim es pas autorizat. Mercé de provesir lo DN d'un utilizaire e un senhal.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Error LDAP. La connexion anonima al servidor es probablament pas acceptada.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Lo salvament a fracassat. Verificatz que la banca de donadas es operacionala. Recargatz abans de contunhar.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar de mòde activarà las requèstas LDAP automaticas. Segon la talha de vòstre annuari LDAP, aquò pòt préner del temps. Volètz totjorn cambiar de mòde ?", + "Mode switch" : "Cambiar de mòde", + "Select attributes" : "Seleccionar los atributs", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilizaire introbable. Verificatz los atributs de login e lo nom d'utilizaire. Filtre efectiu (de copiar-pegar per validar en linha de comanda):<br/>", + "User found and settings verified." : "Utilizaire trobat e paramètres verificats.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Paramètres verificats, mas sol lo primièr utilizaire se poirà connectar. Utilizatz puslèu un filtre mens restrictiu.", + "An unspecified error occurred. Please check the settings and the log." : "Una error desconeguda s'es produsida. Verificatz los paramètres e lo log.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Lo filtre de recèrca es pas valid, probablament a causa de problèmas de sintaxi tals coma de parentèsis mancantas. Corregissètz-los.", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Una error s'es produsida al moment de la connexion al LDAP / AD. Verificatz l'òste, lo pòrt e las informacions d'identificacion.", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La cadena %uid es mancanta. Aquesta cadena es remplaçada per l'identificant de connexion al moment de las requèstas LDAP / AD.", + "Please provide a login name to test against" : "Indicatz un identificant de connexion amb lo qual cal testar.", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Los gropes son desactivats perque lo servidor LDAP / AD pren pas en carga memberOf.", + "_%s group found_::_%s groups found_" : ["%s grop trobat","%s gropes trobats"], + "_%s user found_::_%s users found_" : ["%s utilizaire trobat","%s utilizaires trobats"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de detectar l'atribut que conten lo nom d'afichatge des utilizaires. Indicatz-lo vos-meteis dins los paramètres ldap avançats.", + "Could not find the desired feature" : "Impossible de trobar la foncion desirada", + "Invalid Host" : "Òste invalid", "Server" : "Servidor", - "Users" : "Usancièrs", - "Groups" : "Grops", + "Users" : "Utilizaires", + "Login Attributes" : "Atributs de login", + "Groups" : "Gropes", + "Test Configuration" : "Testar la configuracion", "Help" : "Ajuda", + "Groups meeting these criteria are available in %s:" : "Los gropes que respèctan aquestes critèris son disponibles dins %s :", + "Only these object classes:" : "Solament aquestas classes d'objèctes :", + "Only from these groups:" : "Solament dins aquestes gropes :", + "Search groups" : "Cercar dins los gropes", + "Available groups" : "Gropes disponibles", + "Selected groups" : "Gropes seleccionats", + "Edit LDAP Query" : "Modificar la requèsta LDAP", + "LDAP Filter:" : "Filtre LDAP :", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Lo filtre especifica quins gropes LDAP an accès a l'instància %s.", + "Verify settings and count groups" : "Verificar los paramètres e comptar los gropes", + "When logging in, %s will find the user based on the following attributes:" : "Al login, %s cercarà l'utilizaire sus basa d'aquestes atributs :", + "LDAP / AD Username:" : "Nom d'utilizaire LDAP / AD :", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Autorizar lo login amb lo nom d'utilizaire LDAP / AD (uid o samaccountname, la deteccion es automatica). ", + "LDAP / AD Email Address:" : "Adreça mail LDAP / AD :", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Autorizar lo login amb una adreça mail. Mail e mailPrimaryAddress son autorizats.", + "Other Attributes:" : "Autres atributs :", + "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definís lo filtre d'aplicar al moment d'una temptativa de connexion. %%uid remplaça lo nom d'utilizaire. Exemple : \"uid=%%uid\"", + "Test Loginname" : "Loginname de tèst", + "Verify settings" : "Testar los paramètres", + "1. Server" : "1. Servidor", + "%s. Server:" : "%s. Servidor :", + "Add a new and blank configuration" : "Apondre una novèla configuracion verge", + "Copy current configuration into new directory binding" : "Copiar la configuracion actuala cap a una novèla", + "Delete the current configuration" : "Suprimir la configuracion actuala", "Host" : "Òste", + "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Podètz ometre lo protocòl, levat se avètz besonh de SSL. Dins aqueste cas, prefixatz amb ldaps://", "Port" : "Pòrt", + "Detect Port" : "Detectar lo pòrt", + "User DN" : "DN Utilizaire", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilizaire client pel qual la ligason se deu far, per exemple uid=agent,dc=example,dc=com. Per un accès anonim, daissar lo DN e lo senhal voids.", "Password" : "Senhal", + "For anonymous access, leave DN and Password empty." : "Per un accès anonim, daissar lo DN utilizaire e lo senhal voids.", + "One Base DN per line" : "Un DN de basa per linha", + "You can specify Base DN for users and groups in the Advanced tab" : "Podètz especificar los DN de basa de vòstres utilizaires e gropes via l'onglet Avançat", + "Detect Base DN" : "Detectar lo DN de basa", + "Test Base DN" : "Testar lo DN de basa", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita las requèstas LDAP automaticas. Melhor per las installacions de grand ample, mas demanda de coneissenças en LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Sasir los filtres LDAP manualament (recomandat pels annuaris de grand ample)", + "Limit %s access to users meeting these criteria:" : "Limitar l'accès a %s als utilizaires que respèctan aquestes critèris :", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las classas d'objèctes frequentas pels utilizaires son : organizationalPerson, person, user e inetOrgPerson. Se sètz pas segur de la classa d'utilizar, demandatz a l'administrator de l'annuari.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Lo filtre especifica quins utilizaires LDAP auràn accès a l'instància %s.", + "Verify settings and count users" : "Verificar los paramètres e comptar los utilizaires", + "Saving" : "Enregistrament...", + "Back" : "Retorn", "Continue" : "Contunhar", - "Advanced" : "Avançat" + "LDAP" : "LDAP", + "Expert" : "Expèrt", + "Advanced" : "Avançat", + "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Avertiment :</b> Las aplicacions user_ldap e user_webdavauth son incompatiblas. De disfoncionaments se pòdon provesir. Contactatz vòstre administrator sistèma per que ne desactive una.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atencion :</b> Lo modul php LDAP es pas installat, per consequéncia aquesta extension poirà pas foncionar. Contactatz vòstre administrator sistèma per tal que l'installe.", + "Connection Settings" : "Paramètres de connexion", + "Configuration Active" : "Configuracion activa", + "When unchecked, this configuration will be skipped." : "Quand pas marcada, la configuracion serà ignorada.", + "Backup (Replica) Host" : "Servidor de backup (replica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Provesir un servidor de backup opcional. Se deu agir d'una replica del servidor LDAP/AD principal.", + "Backup (Replica) Port" : "Pòrt del servidor de backup (replica)", + "Disable Main Server" : "Desactivar lo servidor principal", + "Only connect to the replica server." : "Se connectar unicament a la replica", + "Turn off SSL certificate validation." : "Desactivar la validacion dels certificats SSL", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Pas recomandat, d'utilizar amb d'objectius de tèsts unicament. Se la connexion fonciona pas qu'amb aquesta opcion, importatz lo certificat SSL del servidor LDAP dins lo servidor %s.", + "Cache Time-To-Live" : "Durada de vida de l'escondedor (TTL)", + "in seconds. A change empties the cache." : "en segondas. Tot cambiament voida l'escondedor.", + "Directory Settings" : "Paramètres del repertòri", + "User Display Name Field" : "Camp \"nom d'afichatge\" de l'utilizaire", + "The LDAP attribute to use to generate the user's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge de l'utilizaire.", + "Base User Tree" : "DN raiç de l'arbre utilizaires", + "One User Base DN per line" : "Un DN de basa utilizaire per linha", + "User Search Attributes" : "Atributs de recèrca utilizaires", + "Optional; one attribute per line" : "Opcional, un atribut per linha", + "Group Display Name Field" : "Camp \"nom d'afichatge\" del grop", + "The LDAP attribute to use to generate the groups's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge del grop.", + "Base Group Tree" : "DN raiç de l'arbre gropes", + "One Group Base DN per line" : "Un DN de basa grop per linha", + "Group Search Attributes" : "Atributs de recèrca des gropes", + "Group-Member association" : "Associacion grop-membre", + "Nested Groups" : "Gropes imbricats", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se activat, los gropes que contenon d'autres gropes son preses en carga (fonciona unicament se l'atribut membre del grop conten de DNs).", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilizada per las recèrcas LDAP paginadas que pòdon tornar de resultats per lòts coma una enumeracion d'utilizaires o de gropes. (Configurar a 0 per desactivar las recèrcas LDAP paginadas)", + "Special Attributes" : "Atributs especials", + "Quota Field" : "Camp del quòta", + "Quota Default" : "Quòta per defaut", + "in bytes" : "en octets", + "Email Field" : "Camp Email", + "User Home Folder Naming Rule" : "Règla de nomenatge del repertòri utilizaire", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Daissar void per user name (defaut). Podètz tanben especificar un atribut LDAP / AD.", + "Internal Username" : "Nom d'utilizaire intèrne", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Per defaut lo nom d'utilizaire intèrne serà creat a partir de l'atribut UUID. Aquò permet d'assegurar que lo nom d'utilizaire es unic e que los caractèrs necessitan pas de conversion. Lo nom d'utilizaire intèrne deu contenir unicament los caractèrs seguents : [ a-zA-Z0-9_.@- ]. Los autres caractèrs son remplaçats per lor correspondéncia ASCII o simplament omeses. En cas de collision, un nombre es apondut/incrementat. Lo nom d'utilizaire intèrne es utilizat per identificar l'utilizaire al dintre del sistèma. Es tanben lo nom per defaut del repertòri utilizaire dins ownCloud. Fa tanben partida de certans URL de servicis, per exemple per totes los servicis *DAV. Lo comportament per defaut pòt èsser modificat amb l'ajuda d'aqueste paramètre. Per obtenir un comportament similar a las versions precedentas a ownCloud 5, sasir lo nom d'utilizaire d'afichar dins lo camp seguent. Daissar a blanc pel comportement per defaut. Las modificacions prendràn efièch solament pels novèls (aponduts) utilizaires LDAP.", + "Internal Username Attribute:" : "Nom d'utilizaire intèrne :", + "Override UUID detection" : "Passar outra la deteccion des UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defaut, l'atribut UUID es detectat automaticament. Aqueste atribut es utilizat per identificar los utilizaires e gropes de faiçon fisabla. Un nom d'utilizaire intèrne basat sus l'UUID serà automaticament creat, levat s'es especificat autrament çaisús. Podètz modificar aqueste comportament e definir l'atribut que volètz. Vos cal alara vos assegurar que l'atribut que volètz pòt èsser recuperat pels utilizaires e tanben pels gropes e que siá unic. Daissar a blanc pel comportament per defaut. Las modificacions seràn efectivas unicament pels novèls (aponduts) utilizaires e gropes LDAP.", + "UUID Attribute for Users:" : "Atribut UUID pels Utilizaires :", + "UUID Attribute for Groups:" : "Atribut UUID pels Gropes :", + "Username-LDAP User Mapping" : "Associacion Nom d'utilizaire-Utilizaire LDAP", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los noms d'utilizaires son utilizats per l'emmagazinatge e l'assignacion de (meta) donadas. Per identificar e reconéisser precisament los utilizaires, cada utilizaire LDAP aurà un nom intèrne especific. Aquò requerís l'associacion d'un nom d'utilizaire ownCloud a un nom d'utilizaire LDAP. Lo nom d'utilizaire creat es associat a l'atribut UUID de l'utilizaire LDAP. Amai, lo DN es memorizat en escondedor per limitar las interaccions LDAP mas es pas utilizat per l'identificacion. Se lo DN es modificat, aquelas modificacions seràn retrobadas. Sol lo nom intèrne a ownCloud es utilizat al dintre del produch. Suprimir las associacions crearà d'orfanèls e l'accion afectarà totas las configuracions LDAP. SUPRIMISSÈTZ PAS JAMAI LAS ASSOCIACIONS EN ENVIRONAMENT DE PRODUCCION, mas unicament sus d'environaments de tèsts e d'experimentacions.", + "Clear Username-LDAP User Mapping" : "Suprimir l'associacion utilizaire intèrne-utilizaire LDAP", + "Clear Groupname-LDAP Group Mapping" : "Suprimir l'associacion nom de grop-grop LDAP" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/pt_PT.js b/apps/user_ldap/l10n/pt_PT.js index 2170def2922..459fe817603 100644 --- a/apps/user_ldap/l10n/pt_PT.js +++ b/apps/user_ldap/l10n/pt_PT.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Failed to clear the mappings." : "Falhou a limpar os mapas.", "Failed to delete the server configuration" : "Erro ao eliminar a configuração do servidor", + "The configuration is invalid: anonymous bind is not allowed." : "A configuração é inválida: ligação anónima não é permitida.", "The configuration is valid and the connection could be established!" : "A configuração está correcta e foi possível estabelecer a ligação!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "A configuração está correcta, mas não foi possível estabelecer o \"laço\", por favor, verifique as configurações do servidor e as credenciais.", "The configuration is invalid. Please have a look at the logs for further details." : "A configuração é inválida. Por favor, veja o log do ownCloud para mais detalhes.", @@ -22,6 +23,7 @@ OC.L10N.register( "Base DN could not be auto-detected, please revise credentials, host and port." : "O ND de base não pode ser detetado automaticamente, por favor verifique as credenciais, host e porta.", "Could not detect Base DN, please enter it manually." : "Não foi possível detetar o ND de base, por favor introduza-o manualmente.", "{nthServer}. Server" : "{nthServer}. Servidor", + "No object found in the given Base DN. Please revise." : "Nenhum objecto encontrado na Base DN fornecida. Por favor verifique.", "More than 1.000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.", " entries available within the provided Base DN" : "entradas disponíveis no ND de base fornecido", "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor verifique o ND de base, bem como as definições de ligação e as credenciais.", @@ -31,6 +33,9 @@ OC.L10N.register( "Error while clearing the mappings." : "Erro a limpar os mapas.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Ligação anónima não permitida. Por favor forneça um ND de utilizador e password.", "LDAP Operations error. Anonymous bind might not be allowed." : "Erro de operações LDAP. Ligação anónima pode não ser permitida.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Falha na gravação. Por favor verifique que a base de dados está operacional. Recarregar antes de continuar.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Trocando o modo vai permitir a busca automática no LDAP. Dependendo do tamanho do seu LDAP poderá demorar um pouco. Ainda pretende trocar o modo?", + "Mode switch" : "Trocar de modo", "Select attributes" : "Selecionar atributos", "User found and settings verified." : "Utilizador encontrado e as definilções verificadas", "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], @@ -44,8 +49,11 @@ OC.L10N.register( "Test Configuration" : "Testar a configuração", "Help" : "Ajuda", "Groups meeting these criteria are available in %s:" : "Grupos que satisfazerem estes critérios estão disponíveis em %s:", + "Available groups" : "Grupos disponiveis", "Selected groups" : "Grupos seleccionados", + "LDAP Filter:" : "Filtro LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica quais grupos LDAP devem ter acesso à instância %s.", + "LDAP / AD Username:" : "Nome de Utilizador LDAP / AD:", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a aplicar, quando se tenta uma sessão. %%uid substitui o nome de utilizador na ação de início de sessão. Exemplo: \"uid=%%uid\"", "Verify settings" : "Verificar definições", @@ -62,10 +70,13 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "Para acesso anónimo, deixe DN e a Palavra-passe vazios.", "One Base DN per line" : "Uma base DN por linho", "You can specify Base DN for users and groups in the Advanced tab" : "Pode especificar o ND Base para utilizadores e grupos no separador Avançado", + "Detect Base DN" : "Detectar Base DN", + "Test Base DN" : "Testar Base DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita pedidos LDAP automáticos. Melhor para grandes configurações, mas requer conhecimentos LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Introduzir filtros LDAP manualmente (recomendado para directórios grandes)", "Limit %s access to users meeting these criteria:" : "Limitar o acesso a %s de utilizadores com estes critérios:", "The filter specifies which LDAP users shall have access to the %s instance." : "O filtro especifica quais utilizadores do LDAP devem ter acesso à instância %s.", + "Verify settings and count users" : "Verificar definições e contar utilizadores", "Saving" : "Guardando", "Back" : "Voltar", "Continue" : "Continuar", diff --git a/apps/user_ldap/l10n/pt_PT.json b/apps/user_ldap/l10n/pt_PT.json index f6fd6e48067..c7358f61bd5 100644 --- a/apps/user_ldap/l10n/pt_PT.json +++ b/apps/user_ldap/l10n/pt_PT.json @@ -1,6 +1,7 @@ { "translations": { "Failed to clear the mappings." : "Falhou a limpar os mapas.", "Failed to delete the server configuration" : "Erro ao eliminar a configuração do servidor", + "The configuration is invalid: anonymous bind is not allowed." : "A configuração é inválida: ligação anónima não é permitida.", "The configuration is valid and the connection could be established!" : "A configuração está correcta e foi possível estabelecer a ligação!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "A configuração está correcta, mas não foi possível estabelecer o \"laço\", por favor, verifique as configurações do servidor e as credenciais.", "The configuration is invalid. Please have a look at the logs for further details." : "A configuração é inválida. Por favor, veja o log do ownCloud para mais detalhes.", @@ -20,6 +21,7 @@ "Base DN could not be auto-detected, please revise credentials, host and port." : "O ND de base não pode ser detetado automaticamente, por favor verifique as credenciais, host e porta.", "Could not detect Base DN, please enter it manually." : "Não foi possível detetar o ND de base, por favor introduza-o manualmente.", "{nthServer}. Server" : "{nthServer}. Servidor", + "No object found in the given Base DN. Please revise." : "Nenhum objecto encontrado na Base DN fornecida. Por favor verifique.", "More than 1.000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.", " entries available within the provided Base DN" : "entradas disponíveis no ND de base fornecido", "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor verifique o ND de base, bem como as definições de ligação e as credenciais.", @@ -29,6 +31,9 @@ "Error while clearing the mappings." : "Erro a limpar os mapas.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Ligação anónima não permitida. Por favor forneça um ND de utilizador e password.", "LDAP Operations error. Anonymous bind might not be allowed." : "Erro de operações LDAP. Ligação anónima pode não ser permitida.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Falha na gravação. Por favor verifique que a base de dados está operacional. Recarregar antes de continuar.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Trocando o modo vai permitir a busca automática no LDAP. Dependendo do tamanho do seu LDAP poderá demorar um pouco. Ainda pretende trocar o modo?", + "Mode switch" : "Trocar de modo", "Select attributes" : "Selecionar atributos", "User found and settings verified." : "Utilizador encontrado e as definilções verificadas", "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], @@ -42,8 +47,11 @@ "Test Configuration" : "Testar a configuração", "Help" : "Ajuda", "Groups meeting these criteria are available in %s:" : "Grupos que satisfazerem estes critérios estão disponíveis em %s:", + "Available groups" : "Grupos disponiveis", "Selected groups" : "Grupos seleccionados", + "LDAP Filter:" : "Filtro LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica quais grupos LDAP devem ter acesso à instância %s.", + "LDAP / AD Username:" : "Nome de Utilizador LDAP / AD:", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a aplicar, quando se tenta uma sessão. %%uid substitui o nome de utilizador na ação de início de sessão. Exemplo: \"uid=%%uid\"", "Verify settings" : "Verificar definições", @@ -60,10 +68,13 @@ "For anonymous access, leave DN and Password empty." : "Para acesso anónimo, deixe DN e a Palavra-passe vazios.", "One Base DN per line" : "Uma base DN por linho", "You can specify Base DN for users and groups in the Advanced tab" : "Pode especificar o ND Base para utilizadores e grupos no separador Avançado", + "Detect Base DN" : "Detectar Base DN", + "Test Base DN" : "Testar Base DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita pedidos LDAP automáticos. Melhor para grandes configurações, mas requer conhecimentos LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Introduzir filtros LDAP manualmente (recomendado para directórios grandes)", "Limit %s access to users meeting these criteria:" : "Limitar o acesso a %s de utilizadores com estes critérios:", "The filter specifies which LDAP users shall have access to the %s instance." : "O filtro especifica quais utilizadores do LDAP devem ter acesso à instância %s.", + "Verify settings and count users" : "Verificar definições e contar utilizadores", "Saving" : "Guardando", "Back" : "Voltar", "Continue" : "Continuar", diff --git a/apps/user_ldap/l10n/sq.js b/apps/user_ldap/l10n/sq.js index 48ec0616b0e..0c46ff72a98 100644 --- a/apps/user_ldap/l10n/sq.js +++ b/apps/user_ldap/l10n/sq.js @@ -1,61 +1,156 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "dështoi së pastruari planifikimet", - "Failed to delete the server configuration" : "dështoi fshirjen e konfigurimit të serverit", - "The configuration is valid and the connection could be established!" : "Konfigurimi është i vlefshem dhe lidhja mund të kryhet", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurimi është i saktë por lidhja dështoi. Kontrolloni konfigurimete serverit dhe kredencialet.", - "Do you really want to delete the current Server Configuration?" : "Jeni vërtetë të sigurt të fshini konfigurimet aktuale të serverit?", - "Confirm Deletion" : "Konfirmoni Fshirjen", - "Users" : "Përdoruesit", - "Groups" : "Grupet", + "Failed to clear the mappings." : "Dështoi në heqjen e përshoqërimeve.", + "Failed to delete the server configuration" : "Dështoi në fshirjen e formësimit të shërbyesit", + "The configuration is invalid: anonymous bind is not allowed." : "Formësimi është i pavlefshëm: nuk lejohen bind-e anonimë.", + "The configuration is valid and the connection could be established!" : "Formësimi është i vlefshëm dhe lidhja mund të vendoset!", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Formësimi është i vlefshëm, por Bind-i dështoi. Ju lutemi, kontrolloni rregullimet dhe kredencialet e shërbyesit.", + "The configuration is invalid. Please have a look at the logs for further details." : "Formësimi është i pavlefshëm. Ju lutemi, për hollësi të mëtejshme, hidhuni një sy regjistrave.", + "No action specified" : "S’është treguar veprim", + "No configuration specified" : "S’u dha formësim", + "No data specified" : "S’u treguan të dhëna", + " Could not set configuration %s" : "S’vuri dot në punë formësimin %s", + "Action does not exist" : "Veprimi s’ekziston", + "The Base DN appears to be wrong" : "DN-ja Bazë duket se është e gabuar", + "Configuration incorrect" : "Formësim i pasaktë", + "Configuration incomplete" : "Formësim jo i plotë", + "Configuration OK" : "Formësimi OK", + "Select groups" : "Përzgjidhni grupe", + "Select object classes" : "Përzgjidhni klasa objektesh", + "Please check the credentials, they seem to be wrong." : "Ju lutemi, kontrolloni kredencialet, duket se janë gabim.", + "Please specify the port, it could not be auto-detected." : "Ju lutemi, përcaktoni portën, s’u arrit të vetëzbulohet.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "DN-ja Bazë s’u vetëzbulua dot, ju lutemi, rishikoni kredencialet, strehën dhe portën.", + "Could not detect Base DN, please enter it manually." : "S’u zbulua dot DN Bazë, ju lutemi, jepeni dorazi.", + "{nthServer}. Server" : "{nthServer}. Shërbyes", + "No object found in the given Base DN. Please revise." : "Në DN Bazë të dhën s’u gjet objekt. Ju lutemi, rishikojeni.", + "More than 1.000 directory entries available." : "Më tepër se 1.000 zëra drejtorie gati.", + " entries available within the provided Base DN" : " zëra të gatshëm brenda DN-së Bazë të dhënë", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ndodhi një gabim. Ju lutemi, kontrolloni DN-në Bazë, sie dhe rregullimet për lidhjen dhe kredencialet.", + "Do you really want to delete the current Server Configuration?" : "Doni vërtet të fshihet Formësimi i tanishëm i Shërbyesit?", + "Confirm Deletion" : "Ripohoni Fshirjen", + "Mappings cleared successfully!" : "Përshoqërimet u hoqën me sukses!", + "Error while clearing the mappings." : "Gabim gjatë heqjes së përshoqërimeve.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "S’lejohet bind anonim. Ju lutemi, jepni një DN Përodruesi dhe Fjalëkalim.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Gabim Veprimesh LDAP. Mund të mos lejohen bind-e anonimë.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Ruajta dështoi. Ju lutemi, sigurohuni që baza e të dhënave është në punë. Ringarkojemi përpara se të vazhdohet.", + "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?" : "Këmbimi i mënyrë do të lejojë kërkesa LDAP automatike. Në varësi të madhësisë për LDAP-in tuaj, kjo mund të hajë ca kohë. Doni prapë të këmbehet mënyra?", + "Mode switch" : "Këmbim mënyre", + "Select attributes" : "Përzgjidhni atribute", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "S’u gjet përdorues. Ju lutemi, kontrolloni atributet tuaja për hyrje dhe emrin e përdoruesit. Filtër efektiv (për kopjim dhe hedhje në rresht urdhrash për vleftësim): <br/>", + "User found and settings verified." : "Përdoruesi u gjet dhe rregullimet u verifikuan.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Rregullimet u verifikuan, por u gjet një përdorues. Vetëm i pari do të jetë në gjendje të bëjë hyrje. Shihni mundësinë e një filtri më të ngushtë.", + "An unspecified error occurred. Please check the settings and the log." : "Ndodhi një gabim i papërcaktuar. Ju lutemi, kontrolloni rregullimet dhe regjistrin.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtri i kërkimit është i pavlefshëm, ndoshta për shkak problemesh sintakse, të tillë si një numër jo i njëjtë kllpash të hapura dhe mbyllura. Ju lutemi, rishikojeni.", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ndodhi një gabim lidhje te LDAP / AD, ju lutemi, kontrolloni strehën, portën dhe kredencialet.", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Vendmbajtësja %uid mungon. Do të zëvendësohet me emrin e hyrjes, kur të kërkohet te LDAP / AD.", + "Please provide a login name to test against" : "Ju lutemi, jepni një emër hyrjesh që të ritestohet", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kutia e grupeve u çaktivizua, ngaqë shërbyesi LDAP / AD nuk mbulon memberOf.", + "_%s group found_::_%s groups found_" : ["U gjet %s grup","U gjetën %s grupe"], + "_%s user found_::_%s users found_" : ["U gjet %s përdorues","U gjetën %s përdorues"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "S’u zbulua dot atribut emri përdoruesi në ekran. Ju lutemi, caktojeni ju vetë te rregullime e mëtejshme për LDAP.", + "Could not find the desired feature" : "S’u gjet dot veçoria e dëshiruar", + "Invalid Host" : "Strehë e Pavlefshme", + "Server" : "Shërbyes", + "Users" : "Përdorues", + "Login Attributes" : "Atribute Hyrjesh", + "Groups" : "Grupe", "Test Configuration" : "Provoni konfigurimet", "Help" : "Ndihmë", + "Groups meeting these criteria are available in %s:" : "Grupet që i plotësojnë këto kushte gjenden te %s:", + "Only these object classes:" : "Vetëm këto klasa objektesh:", + "Only from these groups:" : "Vetëm prej këtyre grupesh:", + "Search groups" : "Kërko në grupe", + "Available groups" : "Grupe të mundshëm", + "Selected groups" : "Grupe të përzgjedhur", + "Edit LDAP Query" : "Përpunoni Kërkesë LDAP", + "LDAP Filter:" : "Filtër LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtri përcakton se cilët grupe LDAP do të kenë hyrje te instanca %s.", + "Verify settings and count groups" : "Verifiko rregullimet dhe numëro grupet", + "When logging in, %s will find the user based on the following attributes:" : "Kur hyhet, %s do ta gjejë përdoruesin duke u bazuar në atributet vijues:", + "LDAP / AD Username:" : "Emër përdoruesi LDAP / AD:", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Lejon hyrje kundrejt emrin të përdoruesit LDAP / AD, që është ose uid, ose samaccountname, dhe do të zbulohet.", + "LDAP / AD Email Address:" : "Adresë Email LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Lejon hyrje kundrejt një atributi email. Do të lejohen Mail dhe mailPrimaryAddress.", + "Other Attributes:" : "Atribute të Tjerë:", + "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Përcakton filtrin që duhet zbatuar kur përpiqet të bëhet hyrje. %%uid zëvendëson emrin e përdoruesi te veprimi i hyrjes. Shembull: \"uid=%%uid\"", + "Test Loginname" : "Testo Emër hyrjesh", + "Verify settings" : "Verifikoni rregullimet", + "1. Server" : "1. Shërbyes", + "%s. Server:" : "%s. Shërbyes:", + "Add a new and blank configuration" : "Shtoni një formësim të ri të zbrazët", + "Copy current configuration into new directory binding" : "Kopjojeni formësimin e tanishëm te një lidhmë e re drejtorie", + "Delete the current configuration" : "Fshije formësimin e tanishëm", "Host" : "Pritësi", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Ju mund të mos vendosni protokollin ,vetëm nëse ju nevojitet SSL. atherë filloni me ldaps://", - "Port" : "Porta", - "User DN" : "Përdoruesi DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN -ja e klientit për përdoruesin që kërkon të lidhet duhet të jetë si psh,uid=agent,dc=example,dc=com. Për lidhjet anonime lini boshe hapsirat e DN dhe fjalëkalim ", - "Password" : "fjalëkalim", - "For anonymous access, leave DN and Password empty." : "Për tu lidhur në mënyre anonime, lini bosh hapsirat e DN dhe fjalëkalim", - "One Base DN per line" : "Një baze DN për rrjesht", - "You can specify Base DN for users and groups in the Advanced tab" : "Ju mund të specifikoni Bazen DN për përdorues dhe grupe në butonin 'Të Përparuara'", + "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Protokollin mund ta lini pa vënë, hiq rastin kur ju duhet SSL. Në atë rast filloni me ldaps://", + "Port" : "Portë", + "Detect Port" : "Zbulo Portë", + "User DN" : "DN Përdoruesi", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN -ja e klientit të përdoruesit për të cilin duhet kryer bind, p.sh,uid=agent,dc=example,dc=com. Për hyrje anonime, DN-në dhe Fjalëkalimin lëreni të zbrazët.", + "Password" : "Fjalëkalim", + "For anonymous access, leave DN and Password empty." : "Për hyrje anonime, lini të zbrazët DN-në dhe Fjalëkalimim.", + "One Base DN per line" : "Një DN Bazë për rresht", + "You can specify Base DN for users and groups in the Advanced tab" : "DN Bazë për përdorues dhe grupe mund të përcaktoni që nga skeda Të mëtejshme", + "Detect Base DN" : "Zbulo DN Bazë", + "Test Base DN" : "Testo DN Bazë", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Shmang kërkesa LDAP automatike. Më e përshtatshme për instalime më të mëdha, por lyp ca dije rreth LDAP-it.", + "Manually enter LDAP filters (recommended for large directories)" : "Jepni filtra LDAP dorazi (e këshilluar për drejtori të mëdha)", + "Limit %s access to users meeting these criteria:" : "Kufizo hyrje %s vetëm për përdorues që plotësojnë këtë kusht:", + "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." : "Klasat më të rëndomta objektesht për përdoruesit janë organizationalPerson, person, user, dhe inetOrgPerson. Nëse s’jeni i sigurt cilën klasë objekti të përzgjidhniI, ju lutemi, lidhuni me përgjegjësin e drejtorisë suaj.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Filtri përcakton se cilët përdorues LDAP do të kenë hyrje te instanca %s.", + "Verify settings and count users" : "Verifiko rregullimet dhe numëro përdoruesit", + "Saving" : "Po ruhet", + "Back" : "Mbrapsht", "Continue" : "Vazhdo", - "Advanced" : "E përparuar", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Njoftim:</b> moduli PHP LDAP nuk është instaluar, motori nuk do të funksionojë.Kontaktoni me administratorin e sistemit.", - "Connection Settings" : "Të dhënat e lidhjes", - "Configuration Active" : "Konfigurimi Aktiv", - "When unchecked, this configuration will be skipped." : "Nëse nuk është i zgjedhur, ky konfigurim do të anashkalohet.", - "Backup (Replica) Host" : "Pritësi rezervë (Replika)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Jepni një pritës rezervë. Duhet të jetë replikimi i serverit AD/LDAP kryesor.", - "Backup (Replica) Port" : "Porta rezervë (Replika)", - "Disable Main Server" : "Ç'aktivizoni serverin kryesor", - "Turn off SSL certificate validation." : "Ç'aktivizoni kontrollin e certifikatës SSL.", + "LDAP" : "LDAP", + "Expert" : "Ekspert", + "Advanced" : "Të mëtejshme", + "<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>Kujdes:</b> user_ldap dhe user_webdavauth të aplikacionit janë të papërputhshëm. Mund t’ju ndodhin sjellje të papritura. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj të çaktivizojë një prej tyre.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Kujdes:</b> Moduli PHP LDAP s’është i instaluar, pjesa përkatëse në shërbyes nuk do të funksionojë. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "Connection Settings" : "Rregullime Lidhjeje", + "Configuration Active" : "Formësimi Aktiv", + "When unchecked, this configuration will be skipped." : "Po u la pa shenjë, ky formësim do të anashkalohet.", + "Backup (Replica) Host" : "Strehë Kopjeruajtjeje (Replica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Jepni një strehë opsionale kopjeruajtjesh. Duhet të jetë një kopje identike e shërbyesit kryesor LDAP/AD.", + "Backup (Replica) Port" : "Portë Kopjeruajtjeje (Replica)", + "Disable Main Server" : "Çaktivizoni Shërbyesin Kryesor", + "Only connect to the replica server." : "Lidhu vetëm te shërbyesi kopje.", + "Turn off SSL certificate validation." : "Çaktivizoni vleftësim dëshmish SSL.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "E pakëshillueshme, përdoreni vetëm për testim! Nëse lidhja funksionon vetëm me këtë mundësi, importoni te shërbyesi juaj %s dëshminë SSL të shërbyesit LDAP.", "Cache Time-To-Live" : "Cache Time-To-Live", - "in seconds. A change empties the cache." : "në sekonda Ndryshimi boshatis 'cache'-n.", - "Directory Settings" : "Konfigurimet e Dosjeve", - "User Display Name Field" : "Hapsira e Emrit të Përdoruesit", + "in seconds. A change empties the cache." : "në sekonda. Ndryshimi e zbraz fshehtinën.", + "Directory Settings" : "Rregullime Drejtorie", + "User Display Name Field" : "Fushë Emri Përdoruesi Në Ekran", + "The LDAP attribute to use to generate the user's display name." : "Atribut LDAP që përdoret për të prodhuar emër ekrani për përdoruesin.", "Base User Tree" : "Struktura bazë e përdoruesit", - "One User Base DN per line" : "Një përdorues baze DN për rrjesht", + "One User Base DN per line" : "Një DN Bazë Përdoruesi për rresht", "User Search Attributes" : "Atributet e kërkimit të përdoruesëve", - "Optional; one attribute per line" : "Opsionale; një atribut për rrjesht", - "Group Display Name Field" : "Hapsira e Emrit të Grupit", + "Optional; one attribute per line" : "Opsionale; një atribut për rresht", + "Group Display Name Field" : "Fushë Emri Grupi Në Ekran", + "The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP që përdoret për të prodhuar emër ekrani për grupin.", "Base Group Tree" : "Struktura bazë e grupit", - "One Group Base DN per line" : "Një grup baze DN për rrjesht", - "Group Search Attributes" : "Atributet e kërkimit të grupit", + "One Group Base DN per line" : "Një DN Bazë Grupi për rresht", + "Group Search Attributes" : "Atribute Kërkimi Grupi", "Group-Member association" : "Pjestar Grup-Përdorues ", - "Special Attributes" : "Atribute të veçanta", - "Quota Field" : "Hapsira e Kuotës", - "Quota Default" : "Kuota e paracaktuar", - "in bytes" : "në byte", - "Email Field" : "Hapsira e Postës Elektronike", - "User Home Folder Naming Rule" : "Rregulli i emërimit të dosjes së përdoruesit", + "Nested Groups" : "Grupe Brenda Njëri-Tjetrit", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Kur aktivizohet, grupet që përmbajnë grupe mbulohen. (Funksionon vetëm nëse atributi për anëtar grupi përmban DN-ra.)", + "Special Attributes" : "Atribute Speciale", + "Quota Field" : "Fushë Kuotash", + "Quota Default" : "Parazgjedhje Kuotash", + "in bytes" : "në bajte", + "Email Field" : "Fushë Email-i", + "User Home Folder Naming Rule" : "Rregull Emërtimi Dosjeje Kreu të Përdoruesit", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lëreni bosh për emrin e përdoruesit (I Paracaktuar). Ose, përcaktoni një atribut LDAP/AD.", - "Internal Username" : "Emër i brëndshëm i përdoruesit", - "Internal Username Attribute:" : "Atributet e emrit të përdoruesit të brëndshëm", - "Override UUID detection" : "Mbivendosni gjetjen e UUID", - "Username-LDAP User Mapping" : "Emri përdoruesit-LAPD përcaktues përdoruesi", - "Clear Username-LDAP User Mapping" : "Fshini Emër përdoruesi-LAPD Përcaktues përdoruesi", - "Clear Groupname-LDAP Group Mapping" : "Fshini Emër Grupi-LADP Përcaktues grupi" + "Internal Username" : "Emër i Brendshëm Përdoruesi", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Si parazgjedhje, emri i brendshëm i përdoruesit do të krijohet prej atributit UUID. Kjo siguron që emri i përdoruesit të jetë unik dhe shenjat që e përbëjnë s’do të jetë e nevojshme të shndërrohen. Emri i brendshëm i përdoruesi ka kufizimin që për të lejohen vetëm këto shenja: [ a-zA-Z0-9_.@- ]. Shenjat e tjera zëvendësohen me shenjën përgjegjëse në ASCII ose thjesht lihen pa u vënë. Kur ka përplasje, do të shtohet/rritet një numër. Emri i brendshëm i përdoruesit përdoret për ta identifikuar një përdorues së brendshmi. Është gjithashtu emri parazgjedhje për dosjen Home të përdoruesit. Është gjithashtu pjesë e URL-ve të largëta, për shembull, për krejt shërbimet *DAV. Me këtë rregullim mund të anashkalohet sjellja parazgjedhje. Që të arrini një sjellje të ngjashme si para ownCloud 5, jepni atributin emër përdoruesi në ekran te fusha vijuese. Lëreni të zbrazët, që të ruhet sjellja parazgjedhje. Ndryshimet do të kenë efekt vetëm mbi përdorues LDAP të përshoqëruar (shtuar) rishtas.", + "Internal Username Attribute:" : "Atribut Emër i Brendshëm Përdoruesi:", + "Override UUID detection" : "Anashkalo zbullim UUID-je", + "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." : "Si parazgjedhje, atributi UUID zbulohet automatikisht. Atributi UUID përdoret për të identifikuar pa dyshime përdorues dhe grupe LDAP. Gjithashtu, emri i brendshëm i përdoruesi do të krijohet mbi bazën e UUID-së, në mos u përcaktoftë ndryshe më sipër. Mund ta anashkaloni rregullimin dhe të jepni një atribut tuajin sipas dëshirës. Duhet të siguroni që atributi sipas dëshirës të mund të jepet si për përdorues, ashtu edhe për grupe, dhe se është unik. Lëreni të zbrazët që të ruhet sjellja parazgjedhje. Ndryshimet do të kenë efekt vetëm etëm mbi përdorues LDAP të përshoqëruar (shtuar) rishtas.", + "UUID Attribute for Users:" : "Atribut UUID për Përdorues:", + "UUID Attribute for Groups:" : "Atribut UUID për Grupe:", + "Username-LDAP User Mapping" : "Përshoqërim Emër përdoruesi-Përdorues LDAP", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Emrat e përdoruesve përdoren për të depozituar dhe shpërndarë (tej) të dhëna. Që të mund të identifikohen dhe pranohen saktësisht përdoruesit, çdo përdorues LDAP do të ketë një emër të brendshëm përdoruesi. Kjo kërkon përshoqërim nga emër përdoruesi te përdorues LDAP. Emri i përdoruesit i krijuar i përshoqërohet UUID-së së përdoruesit LDAP. Tej kësaj, edhe DN-ja ruhet në fshehtinë, për të zvogëluar ndërveprim LDAP, por s’përdoret për identifikim. Nëse ndryshon DN-ja, ndryshimet do të gjenden. Emri i brendshëm i përdoruesi përdoret gjithandej. Heqja e përshoqërimeve do të lërë thërrime ngado. Heqja e përshoqërimeve nuk preket nga formësimi, prek krejt formësimet për LDAP-në! Mos i hiqni kurrë përshoqërimet në një mjedis prodhimi, vetëm në një faqë testimi ose eksperimetale.", + "Clear Username-LDAP User Mapping" : "Pastro Përshoqërimin Emër përdoruesi-Përdorues LDAP", + "Clear Groupname-LDAP Group Mapping" : "Pastro Përshoqërimin Emër grupi-Grup LDAP" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/sq.json b/apps/user_ldap/l10n/sq.json index 595aee41fad..246adb316c2 100644 --- a/apps/user_ldap/l10n/sq.json +++ b/apps/user_ldap/l10n/sq.json @@ -1,59 +1,154 @@ { "translations": { - "Failed to clear the mappings." : "dështoi së pastruari planifikimet", - "Failed to delete the server configuration" : "dështoi fshirjen e konfigurimit të serverit", - "The configuration is valid and the connection could be established!" : "Konfigurimi është i vlefshem dhe lidhja mund të kryhet", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurimi është i saktë por lidhja dështoi. Kontrolloni konfigurimete serverit dhe kredencialet.", - "Do you really want to delete the current Server Configuration?" : "Jeni vërtetë të sigurt të fshini konfigurimet aktuale të serverit?", - "Confirm Deletion" : "Konfirmoni Fshirjen", - "Users" : "Përdoruesit", - "Groups" : "Grupet", + "Failed to clear the mappings." : "Dështoi në heqjen e përshoqërimeve.", + "Failed to delete the server configuration" : "Dështoi në fshirjen e formësimit të shërbyesit", + "The configuration is invalid: anonymous bind is not allowed." : "Formësimi është i pavlefshëm: nuk lejohen bind-e anonimë.", + "The configuration is valid and the connection could be established!" : "Formësimi është i vlefshëm dhe lidhja mund të vendoset!", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Formësimi është i vlefshëm, por Bind-i dështoi. Ju lutemi, kontrolloni rregullimet dhe kredencialet e shërbyesit.", + "The configuration is invalid. Please have a look at the logs for further details." : "Formësimi është i pavlefshëm. Ju lutemi, për hollësi të mëtejshme, hidhuni një sy regjistrave.", + "No action specified" : "S’është treguar veprim", + "No configuration specified" : "S’u dha formësim", + "No data specified" : "S’u treguan të dhëna", + " Could not set configuration %s" : "S’vuri dot në punë formësimin %s", + "Action does not exist" : "Veprimi s’ekziston", + "The Base DN appears to be wrong" : "DN-ja Bazë duket se është e gabuar", + "Configuration incorrect" : "Formësim i pasaktë", + "Configuration incomplete" : "Formësim jo i plotë", + "Configuration OK" : "Formësimi OK", + "Select groups" : "Përzgjidhni grupe", + "Select object classes" : "Përzgjidhni klasa objektesh", + "Please check the credentials, they seem to be wrong." : "Ju lutemi, kontrolloni kredencialet, duket se janë gabim.", + "Please specify the port, it could not be auto-detected." : "Ju lutemi, përcaktoni portën, s’u arrit të vetëzbulohet.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "DN-ja Bazë s’u vetëzbulua dot, ju lutemi, rishikoni kredencialet, strehën dhe portën.", + "Could not detect Base DN, please enter it manually." : "S’u zbulua dot DN Bazë, ju lutemi, jepeni dorazi.", + "{nthServer}. Server" : "{nthServer}. Shërbyes", + "No object found in the given Base DN. Please revise." : "Në DN Bazë të dhën s’u gjet objekt. Ju lutemi, rishikojeni.", + "More than 1.000 directory entries available." : "Më tepër se 1.000 zëra drejtorie gati.", + " entries available within the provided Base DN" : " zëra të gatshëm brenda DN-së Bazë të dhënë", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ndodhi një gabim. Ju lutemi, kontrolloni DN-në Bazë, sie dhe rregullimet për lidhjen dhe kredencialet.", + "Do you really want to delete the current Server Configuration?" : "Doni vërtet të fshihet Formësimi i tanishëm i Shërbyesit?", + "Confirm Deletion" : "Ripohoni Fshirjen", + "Mappings cleared successfully!" : "Përshoqërimet u hoqën me sukses!", + "Error while clearing the mappings." : "Gabim gjatë heqjes së përshoqërimeve.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "S’lejohet bind anonim. Ju lutemi, jepni një DN Përodruesi dhe Fjalëkalim.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Gabim Veprimesh LDAP. Mund të mos lejohen bind-e anonimë.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Ruajta dështoi. Ju lutemi, sigurohuni që baza e të dhënave është në punë. Ringarkojemi përpara se të vazhdohet.", + "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?" : "Këmbimi i mënyrë do të lejojë kërkesa LDAP automatike. Në varësi të madhësisë për LDAP-in tuaj, kjo mund të hajë ca kohë. Doni prapë të këmbehet mënyra?", + "Mode switch" : "Këmbim mënyre", + "Select attributes" : "Përzgjidhni atribute", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "S’u gjet përdorues. Ju lutemi, kontrolloni atributet tuaja për hyrje dhe emrin e përdoruesit. Filtër efektiv (për kopjim dhe hedhje në rresht urdhrash për vleftësim): <br/>", + "User found and settings verified." : "Përdoruesi u gjet dhe rregullimet u verifikuan.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Rregullimet u verifikuan, por u gjet një përdorues. Vetëm i pari do të jetë në gjendje të bëjë hyrje. Shihni mundësinë e një filtri më të ngushtë.", + "An unspecified error occurred. Please check the settings and the log." : "Ndodhi një gabim i papërcaktuar. Ju lutemi, kontrolloni rregullimet dhe regjistrin.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtri i kërkimit është i pavlefshëm, ndoshta për shkak problemesh sintakse, të tillë si një numër jo i njëjtë kllpash të hapura dhe mbyllura. Ju lutemi, rishikojeni.", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ndodhi një gabim lidhje te LDAP / AD, ju lutemi, kontrolloni strehën, portën dhe kredencialet.", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Vendmbajtësja %uid mungon. Do të zëvendësohet me emrin e hyrjes, kur të kërkohet te LDAP / AD.", + "Please provide a login name to test against" : "Ju lutemi, jepni një emër hyrjesh që të ritestohet", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kutia e grupeve u çaktivizua, ngaqë shërbyesi LDAP / AD nuk mbulon memberOf.", + "_%s group found_::_%s groups found_" : ["U gjet %s grup","U gjetën %s grupe"], + "_%s user found_::_%s users found_" : ["U gjet %s përdorues","U gjetën %s përdorues"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "S’u zbulua dot atribut emri përdoruesi në ekran. Ju lutemi, caktojeni ju vetë te rregullime e mëtejshme për LDAP.", + "Could not find the desired feature" : "S’u gjet dot veçoria e dëshiruar", + "Invalid Host" : "Strehë e Pavlefshme", + "Server" : "Shërbyes", + "Users" : "Përdorues", + "Login Attributes" : "Atribute Hyrjesh", + "Groups" : "Grupe", "Test Configuration" : "Provoni konfigurimet", "Help" : "Ndihmë", + "Groups meeting these criteria are available in %s:" : "Grupet që i plotësojnë këto kushte gjenden te %s:", + "Only these object classes:" : "Vetëm këto klasa objektesh:", + "Only from these groups:" : "Vetëm prej këtyre grupesh:", + "Search groups" : "Kërko në grupe", + "Available groups" : "Grupe të mundshëm", + "Selected groups" : "Grupe të përzgjedhur", + "Edit LDAP Query" : "Përpunoni Kërkesë LDAP", + "LDAP Filter:" : "Filtër LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtri përcakton se cilët grupe LDAP do të kenë hyrje te instanca %s.", + "Verify settings and count groups" : "Verifiko rregullimet dhe numëro grupet", + "When logging in, %s will find the user based on the following attributes:" : "Kur hyhet, %s do ta gjejë përdoruesin duke u bazuar në atributet vijues:", + "LDAP / AD Username:" : "Emër përdoruesi LDAP / AD:", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Lejon hyrje kundrejt emrin të përdoruesit LDAP / AD, që është ose uid, ose samaccountname, dhe do të zbulohet.", + "LDAP / AD Email Address:" : "Adresë Email LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Lejon hyrje kundrejt një atributi email. Do të lejohen Mail dhe mailPrimaryAddress.", + "Other Attributes:" : "Atribute të Tjerë:", + "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Përcakton filtrin që duhet zbatuar kur përpiqet të bëhet hyrje. %%uid zëvendëson emrin e përdoruesi te veprimi i hyrjes. Shembull: \"uid=%%uid\"", + "Test Loginname" : "Testo Emër hyrjesh", + "Verify settings" : "Verifikoni rregullimet", + "1. Server" : "1. Shërbyes", + "%s. Server:" : "%s. Shërbyes:", + "Add a new and blank configuration" : "Shtoni një formësim të ri të zbrazët", + "Copy current configuration into new directory binding" : "Kopjojeni formësimin e tanishëm te një lidhmë e re drejtorie", + "Delete the current configuration" : "Fshije formësimin e tanishëm", "Host" : "Pritësi", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Ju mund të mos vendosni protokollin ,vetëm nëse ju nevojitet SSL. atherë filloni me ldaps://", - "Port" : "Porta", - "User DN" : "Përdoruesi DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN -ja e klientit për përdoruesin që kërkon të lidhet duhet të jetë si psh,uid=agent,dc=example,dc=com. Për lidhjet anonime lini boshe hapsirat e DN dhe fjalëkalim ", - "Password" : "fjalëkalim", - "For anonymous access, leave DN and Password empty." : "Për tu lidhur në mënyre anonime, lini bosh hapsirat e DN dhe fjalëkalim", - "One Base DN per line" : "Një baze DN për rrjesht", - "You can specify Base DN for users and groups in the Advanced tab" : "Ju mund të specifikoni Bazen DN për përdorues dhe grupe në butonin 'Të Përparuara'", + "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Protokollin mund ta lini pa vënë, hiq rastin kur ju duhet SSL. Në atë rast filloni me ldaps://", + "Port" : "Portë", + "Detect Port" : "Zbulo Portë", + "User DN" : "DN Përdoruesi", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN -ja e klientit të përdoruesit për të cilin duhet kryer bind, p.sh,uid=agent,dc=example,dc=com. Për hyrje anonime, DN-në dhe Fjalëkalimin lëreni të zbrazët.", + "Password" : "Fjalëkalim", + "For anonymous access, leave DN and Password empty." : "Për hyrje anonime, lini të zbrazët DN-në dhe Fjalëkalimim.", + "One Base DN per line" : "Një DN Bazë për rresht", + "You can specify Base DN for users and groups in the Advanced tab" : "DN Bazë për përdorues dhe grupe mund të përcaktoni që nga skeda Të mëtejshme", + "Detect Base DN" : "Zbulo DN Bazë", + "Test Base DN" : "Testo DN Bazë", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Shmang kërkesa LDAP automatike. Më e përshtatshme për instalime më të mëdha, por lyp ca dije rreth LDAP-it.", + "Manually enter LDAP filters (recommended for large directories)" : "Jepni filtra LDAP dorazi (e këshilluar për drejtori të mëdha)", + "Limit %s access to users meeting these criteria:" : "Kufizo hyrje %s vetëm për përdorues që plotësojnë këtë kusht:", + "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." : "Klasat më të rëndomta objektesht për përdoruesit janë organizationalPerson, person, user, dhe inetOrgPerson. Nëse s’jeni i sigurt cilën klasë objekti të përzgjidhniI, ju lutemi, lidhuni me përgjegjësin e drejtorisë suaj.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Filtri përcakton se cilët përdorues LDAP do të kenë hyrje te instanca %s.", + "Verify settings and count users" : "Verifiko rregullimet dhe numëro përdoruesit", + "Saving" : "Po ruhet", + "Back" : "Mbrapsht", "Continue" : "Vazhdo", - "Advanced" : "E përparuar", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Njoftim:</b> moduli PHP LDAP nuk është instaluar, motori nuk do të funksionojë.Kontaktoni me administratorin e sistemit.", - "Connection Settings" : "Të dhënat e lidhjes", - "Configuration Active" : "Konfigurimi Aktiv", - "When unchecked, this configuration will be skipped." : "Nëse nuk është i zgjedhur, ky konfigurim do të anashkalohet.", - "Backup (Replica) Host" : "Pritësi rezervë (Replika)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Jepni një pritës rezervë. Duhet të jetë replikimi i serverit AD/LDAP kryesor.", - "Backup (Replica) Port" : "Porta rezervë (Replika)", - "Disable Main Server" : "Ç'aktivizoni serverin kryesor", - "Turn off SSL certificate validation." : "Ç'aktivizoni kontrollin e certifikatës SSL.", + "LDAP" : "LDAP", + "Expert" : "Ekspert", + "Advanced" : "Të mëtejshme", + "<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>Kujdes:</b> user_ldap dhe user_webdavauth të aplikacionit janë të papërputhshëm. Mund t’ju ndodhin sjellje të papritura. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj të çaktivizojë një prej tyre.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Kujdes:</b> Moduli PHP LDAP s’është i instaluar, pjesa përkatëse në shërbyes nuk do të funksionojë. Ju lutemi, kërkojini përgjegjësit të sistemit tuaj ta instalojë.", + "Connection Settings" : "Rregullime Lidhjeje", + "Configuration Active" : "Formësimi Aktiv", + "When unchecked, this configuration will be skipped." : "Po u la pa shenjë, ky formësim do të anashkalohet.", + "Backup (Replica) Host" : "Strehë Kopjeruajtjeje (Replica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Jepni një strehë opsionale kopjeruajtjesh. Duhet të jetë një kopje identike e shërbyesit kryesor LDAP/AD.", + "Backup (Replica) Port" : "Portë Kopjeruajtjeje (Replica)", + "Disable Main Server" : "Çaktivizoni Shërbyesin Kryesor", + "Only connect to the replica server." : "Lidhu vetëm te shërbyesi kopje.", + "Turn off SSL certificate validation." : "Çaktivizoni vleftësim dëshmish SSL.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "E pakëshillueshme, përdoreni vetëm për testim! Nëse lidhja funksionon vetëm me këtë mundësi, importoni te shërbyesi juaj %s dëshminë SSL të shërbyesit LDAP.", "Cache Time-To-Live" : "Cache Time-To-Live", - "in seconds. A change empties the cache." : "në sekonda Ndryshimi boshatis 'cache'-n.", - "Directory Settings" : "Konfigurimet e Dosjeve", - "User Display Name Field" : "Hapsira e Emrit të Përdoruesit", + "in seconds. A change empties the cache." : "në sekonda. Ndryshimi e zbraz fshehtinën.", + "Directory Settings" : "Rregullime Drejtorie", + "User Display Name Field" : "Fushë Emri Përdoruesi Në Ekran", + "The LDAP attribute to use to generate the user's display name." : "Atribut LDAP që përdoret për të prodhuar emër ekrani për përdoruesin.", "Base User Tree" : "Struktura bazë e përdoruesit", - "One User Base DN per line" : "Një përdorues baze DN për rrjesht", + "One User Base DN per line" : "Një DN Bazë Përdoruesi për rresht", "User Search Attributes" : "Atributet e kërkimit të përdoruesëve", - "Optional; one attribute per line" : "Opsionale; një atribut për rrjesht", - "Group Display Name Field" : "Hapsira e Emrit të Grupit", + "Optional; one attribute per line" : "Opsionale; një atribut për rresht", + "Group Display Name Field" : "Fushë Emri Grupi Në Ekran", + "The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP që përdoret për të prodhuar emër ekrani për grupin.", "Base Group Tree" : "Struktura bazë e grupit", - "One Group Base DN per line" : "Një grup baze DN për rrjesht", - "Group Search Attributes" : "Atributet e kërkimit të grupit", + "One Group Base DN per line" : "Një DN Bazë Grupi për rresht", + "Group Search Attributes" : "Atribute Kërkimi Grupi", "Group-Member association" : "Pjestar Grup-Përdorues ", - "Special Attributes" : "Atribute të veçanta", - "Quota Field" : "Hapsira e Kuotës", - "Quota Default" : "Kuota e paracaktuar", - "in bytes" : "në byte", - "Email Field" : "Hapsira e Postës Elektronike", - "User Home Folder Naming Rule" : "Rregulli i emërimit të dosjes së përdoruesit", + "Nested Groups" : "Grupe Brenda Njëri-Tjetrit", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Kur aktivizohet, grupet që përmbajnë grupe mbulohen. (Funksionon vetëm nëse atributi për anëtar grupi përmban DN-ra.)", + "Special Attributes" : "Atribute Speciale", + "Quota Field" : "Fushë Kuotash", + "Quota Default" : "Parazgjedhje Kuotash", + "in bytes" : "në bajte", + "Email Field" : "Fushë Email-i", + "User Home Folder Naming Rule" : "Rregull Emërtimi Dosjeje Kreu të Përdoruesit", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lëreni bosh për emrin e përdoruesit (I Paracaktuar). Ose, përcaktoni një atribut LDAP/AD.", - "Internal Username" : "Emër i brëndshëm i përdoruesit", - "Internal Username Attribute:" : "Atributet e emrit të përdoruesit të brëndshëm", - "Override UUID detection" : "Mbivendosni gjetjen e UUID", - "Username-LDAP User Mapping" : "Emri përdoruesit-LAPD përcaktues përdoruesi", - "Clear Username-LDAP User Mapping" : "Fshini Emër përdoruesi-LAPD Përcaktues përdoruesi", - "Clear Groupname-LDAP Group Mapping" : "Fshini Emër Grupi-LADP Përcaktues grupi" + "Internal Username" : "Emër i Brendshëm Përdoruesi", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Si parazgjedhje, emri i brendshëm i përdoruesit do të krijohet prej atributit UUID. Kjo siguron që emri i përdoruesit të jetë unik dhe shenjat që e përbëjnë s’do të jetë e nevojshme të shndërrohen. Emri i brendshëm i përdoruesi ka kufizimin që për të lejohen vetëm këto shenja: [ a-zA-Z0-9_.@- ]. Shenjat e tjera zëvendësohen me shenjën përgjegjëse në ASCII ose thjesht lihen pa u vënë. Kur ka përplasje, do të shtohet/rritet një numër. Emri i brendshëm i përdoruesit përdoret për ta identifikuar një përdorues së brendshmi. Është gjithashtu emri parazgjedhje për dosjen Home të përdoruesit. Është gjithashtu pjesë e URL-ve të largëta, për shembull, për krejt shërbimet *DAV. Me këtë rregullim mund të anashkalohet sjellja parazgjedhje. Që të arrini një sjellje të ngjashme si para ownCloud 5, jepni atributin emër përdoruesi në ekran te fusha vijuese. Lëreni të zbrazët, që të ruhet sjellja parazgjedhje. Ndryshimet do të kenë efekt vetëm mbi përdorues LDAP të përshoqëruar (shtuar) rishtas.", + "Internal Username Attribute:" : "Atribut Emër i Brendshëm Përdoruesi:", + "Override UUID detection" : "Anashkalo zbullim UUID-je", + "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." : "Si parazgjedhje, atributi UUID zbulohet automatikisht. Atributi UUID përdoret për të identifikuar pa dyshime përdorues dhe grupe LDAP. Gjithashtu, emri i brendshëm i përdoruesi do të krijohet mbi bazën e UUID-së, në mos u përcaktoftë ndryshe më sipër. Mund ta anashkaloni rregullimin dhe të jepni një atribut tuajin sipas dëshirës. Duhet të siguroni që atributi sipas dëshirës të mund të jepet si për përdorues, ashtu edhe për grupe, dhe se është unik. Lëreni të zbrazët që të ruhet sjellja parazgjedhje. Ndryshimet do të kenë efekt vetëm etëm mbi përdorues LDAP të përshoqëruar (shtuar) rishtas.", + "UUID Attribute for Users:" : "Atribut UUID për Përdorues:", + "UUID Attribute for Groups:" : "Atribut UUID për Grupe:", + "Username-LDAP User Mapping" : "Përshoqërim Emër përdoruesi-Përdorues LDAP", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Emrat e përdoruesve përdoren për të depozituar dhe shpërndarë (tej) të dhëna. Që të mund të identifikohen dhe pranohen saktësisht përdoruesit, çdo përdorues LDAP do të ketë një emër të brendshëm përdoruesi. Kjo kërkon përshoqërim nga emër përdoruesi te përdorues LDAP. Emri i përdoruesit i krijuar i përshoqërohet UUID-së së përdoruesit LDAP. Tej kësaj, edhe DN-ja ruhet në fshehtinë, për të zvogëluar ndërveprim LDAP, por s’përdoret për identifikim. Nëse ndryshon DN-ja, ndryshimet do të gjenden. Emri i brendshëm i përdoruesi përdoret gjithandej. Heqja e përshoqërimeve do të lërë thërrime ngado. Heqja e përshoqërimeve nuk preket nga formësimi, prek krejt formësimet për LDAP-në! Mos i hiqni kurrë përshoqërimet në një mjedis prodhimi, vetëm në një faqë testimi ose eksperimetale.", + "Clear Username-LDAP User Mapping" : "Pastro Përshoqërimin Emër përdoruesi-Përdorues LDAP", + "Clear Groupname-LDAP Group Mapping" : "Pastro Përshoqërimin Emër grupi-Grup LDAP" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/zh_CN.js b/apps/user_ldap/l10n/zh_CN.js index 15d0154921b..eae37fb3a19 100644 --- a/apps/user_ldap/l10n/zh_CN.js +++ b/apps/user_ldap/l10n/zh_CN.js @@ -3,9 +3,21 @@ OC.L10N.register( { "Failed to clear the mappings." : "清除映射失败。", "Failed to delete the server configuration" : "未能删除服务器配置", + "The configuration is invalid: anonymous bind is not allowed." : "配置无效:不允许匿名绑定。", "The configuration is valid and the connection could be established!" : "配置有效,能够建立连接!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "配置有效但绑定失败。请检查服务器设置和认证信息。", + "The configuration is invalid. Please have a look at the logs for further details." : "配置无效。更多细节请查看 ownCloud 日志。", + "No action specified" : "未指定操作", + "No configuration specified" : "未指定配置文件", + "No data specified" : "未指定数据", + " Could not set configuration %s" : " 无法设定配置文件 %s", + "Action does not exist" : "操作不存在", + "The Base DN appears to be wrong" : "Base DN似乎错了", + "Configuration incorrect" : "配置错误", + "Configuration incomplete" : "配置未完成", + "Configuration OK" : "配置完成", "Select groups" : "选择分组", + "Could not detect Base DN, please enter it manually." : "无法探测Base DN,请手动输入。", "Do you really want to delete the current Server Configuration?" : "您真的想要删除当前服务器配置吗?", "Confirm Deletion" : "确认删除", "Invalid Host" : "无效的主机", diff --git a/apps/user_ldap/l10n/zh_CN.json b/apps/user_ldap/l10n/zh_CN.json index 18c87aa6c6f..8234f24247d 100644 --- a/apps/user_ldap/l10n/zh_CN.json +++ b/apps/user_ldap/l10n/zh_CN.json @@ -1,9 +1,21 @@ { "translations": { "Failed to clear the mappings." : "清除映射失败。", "Failed to delete the server configuration" : "未能删除服务器配置", + "The configuration is invalid: anonymous bind is not allowed." : "配置无效:不允许匿名绑定。", "The configuration is valid and the connection could be established!" : "配置有效,能够建立连接!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "配置有效但绑定失败。请检查服务器设置和认证信息。", + "The configuration is invalid. Please have a look at the logs for further details." : "配置无效。更多细节请查看 ownCloud 日志。", + "No action specified" : "未指定操作", + "No configuration specified" : "未指定配置文件", + "No data specified" : "未指定数据", + " Could not set configuration %s" : " 无法设定配置文件 %s", + "Action does not exist" : "操作不存在", + "The Base DN appears to be wrong" : "Base DN似乎错了", + "Configuration incorrect" : "配置错误", + "Configuration incomplete" : "配置未完成", + "Configuration OK" : "配置完成", "Select groups" : "选择分组", + "Could not detect Base DN, please enter it manually." : "无法探测Base DN,请手动输入。", "Do you really want to delete the current Server Configuration?" : "您真的想要删除当前服务器配置吗?", "Confirm Deletion" : "确认删除", "Invalid Host" : "无效的主机", diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index a2eb834b496..32472c13b03 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -12,6 +12,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Lyonel Vincent <lyonel@ezix.org> * @author Morris Jobke <hey@morrisjobke.de> + * @author Nicolas Grekas <nicolas.grekas@gmail.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @@ -215,7 +216,9 @@ class Access extends LDAPUtility implements user\IUserTools { $resemblingAttributes = array( 'dn', 'uniquemember', - 'member' + 'member', + // memberOf is an "operational" attribute, without a definition in any RFC + 'memberof' ); return in_array($attr, $resemblingAttributes); } @@ -486,7 +489,7 @@ class Access extends LDAPUtility implements user\IUserTools { /** * gives back the user names as they are used ownClod internally - * @param array $ldapUsers an array with the ldap Users result in style of array ( array ('dn' => foo, 'uid' => bar), ... ) + * @param array $ldapUsers as returned by fetchList() * @return array an array with the user names to use in ownCloud * * gives back the user names as they are used ownClod internally @@ -497,7 +500,7 @@ class Access extends LDAPUtility implements user\IUserTools { /** * gives back the group names as they are used ownClod internally - * @param array $ldapGroups an array with the ldap Groups result in style of array ( array ('dn' => foo, 'cn' => bar), ... ) + * @param array $ldapGroups as returned by fetchList() * @return array an array with the group names to use in ownCloud * * gives back the group names as they are used ownClod internally @@ -507,7 +510,7 @@ class Access extends LDAPUtility implements user\IUserTools { } /** - * @param array $ldapObjects + * @param array $ldapObjects as returned by fetchList() * @param bool $isUsers * @return array */ @@ -520,15 +523,25 @@ class Access extends LDAPUtility implements user\IUserTools { $ownCloudNames = array(); foreach($ldapObjects as $ldapObject) { - $nameByLDAP = isset($ldapObject[$nameAttribute]) ? $ldapObject[$nameAttribute] : null; - $ocName = $this->dn2ocname($ldapObject['dn'], $nameByLDAP, $isUsers); + $nameByLDAP = null; + if( isset($ldapObject[$nameAttribute]) + && is_array($ldapObject[$nameAttribute]) + && isset($ldapObject[$nameAttribute][0]) + ) { + // might be set, but not necessarily. if so, we use it. + $nameByLDAP = $ldapObject[$nameAttribute][0]; + } + + $ocName = $this->dn2ocname($ldapObject['dn'][0], $nameByLDAP, $isUsers); if($ocName) { $ownCloudNames[] = $ocName; if($isUsers) { //cache the user names so it does not need to be retrieved //again later (e.g. sharing dialogue). $this->cacheUserExists($ocName); - $this->cacheUserDisplayName($ocName, $nameByLDAP); + if(!is_null($nameByLDAP)) { + $this->cacheUserDisplayName($ocName, $nameByLDAP); + } } } continue; @@ -537,6 +550,16 @@ class Access extends LDAPUtility implements user\IUserTools { } /** + * caches the user display name + * @param string $ocName the internal ownCloud username + * @param string|false $home the home directory path + */ + public function cacheUserHome($ocName, $home) { + $cacheKey = 'getHome'.$ocName; + $this->connection->writeToCache($cacheKey, $home); + } + + /** * caches a user as existing * @param string $ocName the internal ownCloud username */ @@ -656,7 +679,24 @@ class Access extends LDAPUtility implements user\IUserTools { * @return array */ public function fetchListOfUsers($filter, $attr, $limit = null, $offset = null) { - return $this->fetchList($this->searchUsers($filter, $attr, $limit, $offset), (count($attr) > 1)); + $ldapRecords = $this->searchUsers($filter, $attr, $limit, $offset); + $this->batchApplyUserAttributes($ldapRecords); + return $this->fetchList($ldapRecords, (count($attr) > 1)); + } + + /** + * provided with an array of LDAP user records the method will fetch the + * user object and requests it to process the freshly fetched attributes and + * and their values + * @param array $ldapRecords + */ + public function batchApplyUserAttributes(array $ldapRecords){ + foreach($ldapRecords as $userRecord) { + $ocName = $this->dn2ocname($userRecord['dn'][0], $userRecord[$this->connection->ldapUserDisplayName]); + $this->cacheUserExists($ocName); + $user = $this->userManager->get($ocName); + $user->processAttributes($userRecord); + } } /** @@ -680,6 +720,11 @@ class Access extends LDAPUtility implements user\IUserTools { if($manyAttributes) { return $list; } else { + $list = array_reduce($list, function($carry, $item) { + $attribute = array_keys($item)[0]; + $carry[] = $item[$attribute][0]; + return $carry; + }, array()); return array_unique($list, SORT_LOCALE_STRING); } } @@ -952,44 +997,29 @@ class Access extends LDAPUtility implements user\IUserTools { if(!is_null($attr)) { $selection = array(); - $multiArray = false; - if(count($attr) > 1) { - $multiArray = true; - $i = 0; - } + $i = 0; foreach($findings as $item) { if(!is_array($item)) { continue; } $item = \OCP\Util::mb_array_change_key_case($item, MB_CASE_LOWER, 'UTF-8'); - - if($multiArray) { - foreach($attr as $key) { - $key = mb_strtolower($key, 'UTF-8'); - if(isset($item[$key])) { - if($key !== 'dn') { - $selection[$i][$key] = $this->resemblesDN($key) ? - $this->sanitizeDN($item[$key][0]) - : $item[$key][0]; - } else { - $selection[$i][$key] = $this->sanitizeDN($item[$key]); - } - } - - } - $i++; - } else { - //tribute to case insensitivity - $key = mb_strtolower($attr[0], 'UTF-8'); - + foreach($attr as $key) { + $key = mb_strtolower($key, 'UTF-8'); if(isset($item[$key])) { - if($this->resemblesDN($key)) { - $selection[] = $this->sanitizeDN($item[$key]); + if(is_array($item[$key]) && isset($item[$key]['count'])) { + unset($item[$key]['count']); + } + if($key !== 'dn') { + $selection[$i][$key] = $this->resemblesDN($key) ? + $this->sanitizeDN($item[$key]) + : $item[$key]; } else { - $selection[] = $item[$key]; + $selection[$i][$key] = [$this->sanitizeDN($item[$key])]; } } + } + $i++; } $findings = $selection; } @@ -1438,6 +1468,30 @@ class Access extends LDAPUtility implements user\IUserTools { } /** + * checks whether an LDAP paged search operation has more pages that can be + * retrieved, typically when offset and limit are provided. + * + * Be very careful to use it: the last cookie value, which is inspected, can + * be reset by other operations. Best, call it immediately after a search(), + * searchUsers() or searchGroups() call. count-methods are probably safe as + * well. Don't rely on it with any fetchList-method. + * @return bool + */ + public function hasMoreResults() { + if(!$this->connection->hasPagedResultSupport) { + return false; + } + + if(empty($this->lastCookie) && $this->lastCookie !== '0') { + // as in RFC 2696, when all results are returned, the cookie will + // be empty. + return false; + } + + return true; + } + + /** * set a cookie for LDAP paged search run * @param string $base a string with the base DN for the search * @param string $filter the search filter to identify the correct search diff --git a/apps/user_ldap/lib/backendutility.php b/apps/user_ldap/lib/backendutility.php index 2b500595569..b0fee7cd25e 100644 --- a/apps/user_ldap/lib/backendutility.php +++ b/apps/user_ldap/lib/backendutility.php @@ -23,7 +23,6 @@ namespace OCA\user_ldap\lib; -use OCA\user_ldap\lib\Access; abstract class BackendUtility { protected $access; diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php index 1cbe45a82c2..4a6263de9aa 100644 --- a/apps/user_ldap/lib/configuration.php +++ b/apps/user_ldap/lib/configuration.php @@ -146,9 +146,13 @@ class Configuration { $setMethod = 'setValue'; switch($key) { + case 'ldapAgentPassword': + $setMethod = 'setRawValue'; + break; case 'homeFolderNamingRule': - if(!empty($val) && strpos($val, 'attr:') === false) { - $val = 'attr:'.$val; + $trimmedVal = trim($val); + if(!empty($trimmedVal) && strpos($val, 'attr:') === false) { + $val = 'attr:'.$trimmedVal; } break; case 'ldapBase': @@ -272,8 +276,11 @@ class Configuration { } /** - * @param string $varName - * @param array|string $value + * Sets multi-line values as arrays + * + * @param string $varName name of config-key + * @param array|string $value to set + * @param boolean $trim Trim value? (default: false) */ protected function setMultiLine($varName, $value) { if(empty($value)) { @@ -285,7 +292,25 @@ class Configuration { } } - $this->setValue($varName, $value); + if(!is_array($value)) { + $finalValue = trim($value); + } else { + $finalValue = []; + foreach($value as $key => $val) { + if(is_string($val)) { + $val = trim($val); + if(!empty($val)) { + //accidental line breaks are not wanted and can cause + // odd behaviour. Thus, away with them. + $finalValue[] = $val; + } + } else { + $finalValue[] = $val; + } + } + } + + $this->setRawValue($varName, $finalValue); } /** @@ -328,10 +353,25 @@ class Configuration { } /** - * @param string $varName - * @param mixed $value + * Sets a scalar value. + * + * @param string $varName name of config key + * @param mixed $value to set */ protected function setValue($varName, $value) { + if(is_string($value)) { + $value = trim($value); + } + $this->config[$varName] = $value; + } + + /** + * Sets a scalar value without trimming. + * + * @param string $varName name of config key + * @param mixed $value to set + */ + protected function setRawValue($varName, $value) { $this->config[$varName] = $value; } diff --git a/apps/user_ldap/lib/filesystemhelper.php b/apps/user_ldap/lib/filesystemhelper.php index 7c45d25ed31..6d431f6cb43 100644 --- a/apps/user_ldap/lib/filesystemhelper.php +++ b/apps/user_ldap/lib/filesystemhelper.php @@ -37,7 +37,7 @@ class FilesystemHelper { /** * @brief initializes the filesystem for the given user - * @param string the ownCloud username of the user + * @param string $uid the ownCloud username of the user */ public function setup($uid) { \OC_Util::setupFS($uid); diff --git a/apps/user_ldap/lib/helper.php b/apps/user_ldap/lib/helper.php index 57b75823a1d..f05a4afad2c 100644 --- a/apps/user_ldap/lib/helper.php +++ b/apps/user_ldap/lib/helper.php @@ -27,7 +27,6 @@ namespace OCA\user_ldap\lib; -use OCA\user_ldap\lib\LDAP; use OCA\user_ldap\User_Proxy; class Helper { diff --git a/apps/user_ldap/lib/user/deletedusersindex.php b/apps/user_ldap/lib/user/deletedusersindex.php index acea80bb9d0..f8c1406d77e 100644 --- a/apps/user_ldap/lib/user/deletedusersindex.php +++ b/apps/user_ldap/lib/user/deletedusersindex.php @@ -22,7 +22,6 @@ namespace OCA\user_ldap\lib\user; -use OCA\user_ldap\lib\user\OfflineUser; use OCA\User_LDAP\Mapping\UserMapping; /** @@ -51,9 +50,9 @@ class DeletedUsersIndex { protected $deletedUsers; /** - * @param OCP\IConfig $config - * @param OCP\IDBConnection $db - * @param OCA\User_LDAP\Mapping\UserMapping $mapping + * @param \OCP\IConfig $config + * @param \OCP\IDBConnection $db + * @param \OCA\User_LDAP\Mapping\UserMapping $mapping */ public function __construct(\OCP\IConfig $config, \OCP\IDBConnection $db, UserMapping $mapping) { $this->config = $config; @@ -63,7 +62,7 @@ class DeletedUsersIndex { /** * reads LDAP users marked as deleted from the database - * @return OCA\user_ldap\lib\user\OfflineUser[] + * @return \OCA\user_ldap\lib\user\OfflineUser[] */ private function fetchDeletedUsers() { $deletedUsers = $this->config->getUsersForUserValue( @@ -80,7 +79,7 @@ class DeletedUsersIndex { /** * returns all LDAP users that are marked as deleted - * @return OCA\user_ldap\lib\user\OfflineUser[] + * @return \OCA\user_ldap\lib\user\OfflineUser[] */ public function getUsers() { if(is_array($this->deletedUsers)) { @@ -105,7 +104,7 @@ class DeletedUsersIndex { /** * marks a user as deleted - * @param string ocName + * @param string $ocName */ public function markUser($ocName) { $this->config->setUserValue($ocName, 'user_ldap', 'isDeleted', '1'); diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php index b70e057741f..89bbc849887 100644 --- a/apps/user_ldap/lib/user/manager.php +++ b/apps/user_ldap/lib/user/manager.php @@ -75,7 +75,7 @@ class Manager { * @param \OCP\IAvatarManager $avatarManager * @param \OCP\Image $image an empty image instance * @param \OCP\IDBConnection $db - * @throws Exception when the methods mentioned above do not exist + * @throws \Exception when the methods mentioned above do not exist */ public function __construct(\OCP\IConfig $ocConfig, FilesystemHelper $ocFilesystem, LogWrapper $ocLog, @@ -101,9 +101,9 @@ class Manager { /** * @brief creates an instance of User and caches (just runtime) it in the * property array - * @param string the DN of the user - * @param string the internal (owncloud) username - * @return \OCA\user_ldap\lib\User + * @param string $dn the DN of the user + * @param string $uid the internal (owncloud) username + * @return \OCA\user_ldap\lib\User\User */ private function createAndCache($dn, $uid) { $this->checkAccess(); @@ -117,7 +117,7 @@ class Manager { /** * @brief checks whether the Access instance has been set - * @throws Exception if Access has not been set + * @throws \Exception if Access has not been set * @return null */ private function checkAccess() { @@ -127,6 +127,43 @@ class Manager { } /** + * returns a list of attributes that will be processed further, e.g. quota, + * email, displayname, or others. + * @param bool $minimal - optional, set to true to skip attributes with big + * payload + * @return string[] + */ + public function getAttributes($minimal = false) { + $attributes = array('dn', 'uid', 'samaccountname', 'memberof'); + $possible = array( + $this->access->getConnection()->ldapQuotaAttribute, + $this->access->getConnection()->ldapEmailAttribute, + $this->access->getConnection()->ldapUserDisplayName, + ); + foreach($possible as $attr) { + if(!is_null($attr)) { + $attributes[] = $attr; + } + } + + $homeRule = $this->access->getConnection()->homeFolderNamingRule; + if(strpos($homeRule, 'attr:') === 0) { + $attributes[] = substr($homeRule, strlen('attr:')); + } + + if(!$minimal) { + // attributes that are not really important but may come with big + // payload. + $attributes = array_merge($attributes, array( + 'jpegphoto', + 'thumbnailphoto' + )); + } + + return $attributes; + } + + /** * Checks whether the specified user is marked as deleted * @param string $id the ownCloud user name * @return bool @@ -152,7 +189,7 @@ class Manager { /** * @brief returns a User object by it's ownCloud username - * @param string the DN or username of the user + * @param string $id the DN or username of the user * @return \OCA\user_ldap\lib\user\User|\OCA\user_ldap\lib\user\OfflineUser|null */ protected function createInstancyByUserName($id) { @@ -169,7 +206,7 @@ class Manager { /** * @brief returns a User object by it's DN or ownCloud username - * @param string the DN or username of the user + * @param string $id the DN or username of the user * @return \OCA\user_ldap\lib\user\User|\OCA\user_ldap\lib\user\OfflineUser|null * @throws \Exception when connection could not be established */ diff --git a/apps/user_ldap/lib/user/offlineuser.php b/apps/user_ldap/lib/user/offlineuser.php index 0727eb5b584..8177e84346f 100644 --- a/apps/user_ldap/lib/user/offlineuser.php +++ b/apps/user_ldap/lib/user/offlineuser.php @@ -72,9 +72,9 @@ class OfflineUser { /** * @param string $ocName - * @param OCP\IConfig $config - * @param OCP\IDBConnection $db - * @param OCA\User_LDAP\Mapping\UserMapping $mapping + * @param \OCP\IConfig $config + * @param \OCP\IDBConnection $db + * @param \OCA\User_LDAP\Mapping\UserMapping $mapping */ public function __construct($ocName, \OCP\IConfig $config, \OCP\IDBConnection $db, UserMapping $mapping) { $this->ocName = $ocName; diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php index ac5d8f5a374..756b923e7e5 100644 --- a/apps/user_ldap/lib/user/user.php +++ b/apps/user_ldap/lib/user/user.php @@ -87,15 +87,15 @@ class User { /** * @brief constructor, make sure the subclasses call this one! - * @param string the internal username - * @param string the LDAP DN + * @param string $username the internal username + * @param string $dn the LDAP DN * @param IUserTools $access an instance that implements IUserTools for * LDAP interaction - * @param \OCP\IConfig - * @param FilesystemHelper - * @param \OCP\Image any empty instance - * @param LogWrapper - * @param \OCP\IAvatarManager + * @param \OCP\IConfig $config + * @param FilesystemHelper $fs + * @param \OCP\Image $image any empty instance + * @param LogWrapper $log + * @param \OCP\IAvatarManager $avatarManager */ public function __construct($username, $dn, IUserTools $access, \OCP\IConfig $config, FilesystemHelper $fs, \OCP\Image $image, @@ -139,6 +139,72 @@ class User { } /** + * processes results from LDAP for attributes as returned by getAttributesToRead() + * @param array $ldapEntry the user entry as retrieved from LDAP + */ + public function processAttributes($ldapEntry) { + $this->markRefreshTime(); + //Quota + $attr = strtolower($this->connection->ldapQuotaAttribute); + if(isset($ldapEntry[$attr])) { + $this->updateQuota($ldapEntry[$attr][0]); + } + unset($attr); + + //Email + $attr = strtolower($this->connection->ldapEmailAttribute); + if(isset($ldapEntry[$attr])) { + $this->updateEmail($ldapEntry[$attr][0]); + } + unset($attr); + + //displayName + $attr = strtolower($this->connection->ldapUserDisplayName); + if(isset($ldapEntry[$attr])) { + $displayName = $ldapEntry[$attr][0]; + if(!empty($displayName)) { + $this->storeDisplayName($displayName); + $this->access->cacheUserDisplayName($this->getUsername(), $displayName); + } + } + unset($attr); + + // LDAP Username, needed for s2s sharing + if(isset($ldapEntry['uid'])) { + $this->storeLDAPUserName($ldapEntry['uid'][0]); + } else if(isset($ldapEntry['samaccountname'])) { + $this->storeLDAPUserName($ldapEntry['samaccountname'][0]); + } + + //homePath + if(strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) { + $attr = strtolower(substr($this->connection->homeFolderNamingRule, strlen('attr:'))); + if(isset($ldapEntry[$attr])) { + $this->access->cacheUserHome( + $this->getUsername(), $this->getHomePath($ldapEntry[$attr][0])); + } + } + + //memberOf groups + $cacheKey = 'getMemberOf'.$this->getUsername(); + $groups = false; + if(isset($ldapEntry['memberof'])) { + $groups = $ldapEntry['memberof']; + } + $this->connection->writeToCache($cacheKey, $groups); + + //Avatar + $attrs = array('jpegphoto', 'thumbnailphoto'); + foreach ($attrs as $attr) { + if(isset($ldapEntry[$attr])) { + $this->avatarImage = $ldapEntry[$attr][0]; + $this->updateAvatar(); + break; + } + } + } + + /** * @brief returns the LDAP DN of the user * @return string */ @@ -155,6 +221,68 @@ class User { } /** + * returns the home directory of the user if specified by LDAP settings + * @param string $valueFromLDAP + * @return bool|string + * @throws \Exception + */ + public function getHomePath($valueFromLDAP = null) { + $path = $valueFromLDAP; + $attr = null; + + if( is_null($path) + && strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0 + && $this->access->connection->homeFolderNamingRule !== 'attr:') + { + $attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:')); + $homedir = $this->access->readAttribute( + $this->access->username2dn($this->getUsername()), $attr); + if ($homedir && isset($homedir[0])) { + $path = $homedir[0]; + } + } + + if(!empty($path)) { + //if attribute's value is an absolute path take this, otherwise append it to data dir + //check for / at the beginning or pattern c:\ resp. c:/ + if( '/' !== $path[0] + && !(3 < strlen($path) && ctype_alpha($path[0]) + && $path[1] === ':' && ('\\' === $path[2] || '/' === $path[2])) + ) { + $path = $this->config->getSystemValue('datadirectory', + \OC::$SERVERROOT.'/data' ) . '/' . $path; + } + //we need it to store it in the DB as well in case a user gets + //deleted so we can clean up afterwards + $this->config->setUserValue( + $this->getUsername(), 'user_ldap', 'homePath', $path + ); + return $path; + } + + if( !is_null($attr) + && $this->config->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', true) + ) { + // a naming rule attribute is defined, but it doesn't exist for that LDAP user + throw new \Exception('Home dir attribute can\'t be read from LDAP for uid: ' . $this->getUsername()); + } + + //false will apply default behaviour as defined and done by OC_User + $this->config->setUserValue($this->getUsername(), 'user_ldap', 'homePath', ''); + return false; + } + + public function getMemberOfGroups() { + $cacheKey = 'getMemberOf'.$this->getUsername(); + if($this->connection->isCached($cacheKey)) { + return $this->connection->getFromCache($cacheKey); + } + $groupDNs = $this->access->readAttribute($this->getDN(), 'memberOf'); + $this->connection->writeToCache($cacheKey, $groupDNs); + return $groupDNs; + } + + /** * @brief reads the image from LDAP that shall be used as Avatar * @return string data (provided by LDAP) | false */ @@ -189,7 +317,7 @@ class User { * @brief marks the time when user features like email have been updated * @return null */ - private function markRefreshTime() { + public function markRefreshTime() { $this->config->setUserValue( $this->uid, 'user_ldap', self::USER_PREFKEY_LASTREFRESH, time()); } @@ -240,7 +368,7 @@ class User { * @brief checks whether an update method specified by feature was run * already. If not, it will marked like this, because it is expected that * the method will be run, when false is returned. - * @param string email | quota | avatar (can be extended) + * @param string $feature email | quota | avatar (can be extended) * @return bool */ private function wasRefreshed($feature) { @@ -252,48 +380,52 @@ class User { } /** - * @brief fetches the email from LDAP and stores it as ownCloud user value + * fetches the email from LDAP and stores it as ownCloud user value + * @param string $valueFromLDAP if known, to save an LDAP read request * @return null */ - public function updateEmail() { + public function updateEmail($valueFromLDAP = null) { if($this->wasRefreshed('email')) { return; } - - $email = null; - $emailAttribute = $this->connection->ldapEmailAttribute; - if(!empty($emailAttribute)) { - $aEmail = $this->access->readAttribute($this->dn, $emailAttribute); - if($aEmail && (count($aEmail) > 0)) { - $email = $aEmail[0]; - } - if(!is_null($email)) { - $this->config->setUserValue( - $this->uid, 'settings', 'email', $email); + $email = $valueFromLDAP; + if(is_null($valueFromLDAP)) { + $emailAttribute = $this->connection->ldapEmailAttribute; + if(!empty($emailAttribute)) { + $aEmail = $this->access->readAttribute($this->dn, $emailAttribute); + if(is_array($aEmail) && (count($aEmail) > 0)) { + $email = $aEmail[0]; + } } } + if(!is_null($email)) { + $this->config->setUserValue( + $this->uid, 'settings', 'email', $email); + } } /** - * @brief fetches the quota from LDAP and stores it as ownCloud user value + * fetches the quota from LDAP and stores it as ownCloud user value + * @param string $valueFromLDAP the quota attribute's value can be passed, + * to save the readAttribute request * @return null */ - public function updateQuota() { + public function updateQuota($valueFromLDAP = null) { if($this->wasRefreshed('quota')) { return; } - - $quota = null; + //can be null $quotaDefault = $this->connection->ldapQuotaDefault; - $quotaAttribute = $this->connection->ldapQuotaAttribute; - if(!empty($quotaDefault)) { - $quota = $quotaDefault; - } - if(!empty($quotaAttribute)) { - $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute); - - if($aQuota && (count($aQuota) > 0)) { - $quota = $aQuota[0]; + $quota = !is_null($valueFromLDAP) + ? $valueFromLDAP + : $quotaDefault !== '' ? $quotaDefault : null; + if(is_null($valueFromLDAP)) { + $quotaAttribute = $this->connection->ldapQuotaAttribute; + if(!empty($quotaAttribute)) { + $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute); + if($aQuota && (count($aQuota) > 0)) { + $quota = $aQuota[0]; + } } } if(!is_null($quota)) { diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php index 13ccf805b69..a819b2e0e46 100644 --- a/apps/user_ldap/lib/wizard.php +++ b/apps/user_ldap/lib/wizard.php @@ -7,6 +7,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Nicolas Grekas <nicolas.grekas@gmail.com> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> @@ -434,11 +435,15 @@ class Wizard extends LDAPUtility { // detection will fail later $result = $this->access->searchGroups($filter, array('cn', 'dn'), $limit, $offset); foreach($result as $item) { - $groupNames[] = $item['cn']; + if(!isset($item['cn']) && !is_array($item['cn']) && !isset($item['cn'][0])) { + // just in case - no issue known + continue; + } + $groupNames[] = $item['cn'][0]; $groupEntries[] = $item; } $offset += $limit; - } while (count($groupNames) > 0 && count($groupNames) % $limit === 0); + } while ($this->access->hasMoreResults()); if(count($groupNames) > 0) { natsort($groupNames); @@ -661,12 +666,13 @@ class Wizard extends LDAPUtility { //connectAndBind may throw Exception, it needs to be catched by the //callee of this method - // unallowed anonymous bind throws 48. But if it throws 48, we - // detected port and TLS, i.e. it is successful. try { $settingsFound = $this->connectAndBind($p, $t); } catch (\Exception $e) { - if($e->getCode() === 48) { + // any reply other than -1 (= cannot connect) is already okay, + // because then we found the server + // unavailable startTLS returns -11 + if($e->getCode() > 0) { $settingsFound = true; } else { throw $e; @@ -1084,7 +1090,7 @@ class Wizard extends LDAPUtility { } else if ($errNo === 2) { return $this->connectAndBind($port, $tls, true); } - throw new \Exception($error); + throw new \Exception($error, $errNo); } /** diff --git a/apps/user_ldap/templates/part.wizard-loginfilter.php b/apps/user_ldap/templates/part.wizard-loginfilter.php index 8d9fccf24b8..a13931d9327 100644 --- a/apps/user_ldap/templates/part.wizard-loginfilter.php +++ b/apps/user_ldap/templates/part.wizard-loginfilter.php @@ -52,7 +52,7 @@ placeholder="<?php p($l->t('Test Loginname'));?>" class="ldapVerifyInput" title="Attempts to receive a DN for the given loginname and the current login filter"/> - <button class="ldapVerifyLoginName" name="ldapTestLoginSettings" type="button"> + <button class="ldapVerifyLoginName" name="ldapTestLoginSettings" type="button" disabled="disabled"> <?php p($l->t('Verify settings'));?> </button> </p> diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php index c4cd2036461..cb6dbf0cd5d 100644 --- a/apps/user_ldap/tests/access.php +++ b/apps/user_ldap/tests/access.php @@ -29,7 +29,7 @@ use \OCA\user_ldap\lib\Connection; use \OCA\user_ldap\lib\ILDAPWrapper; class Test_Access extends \Test\TestCase { - private function getConnecterAndLdapMock() { + private function getConnectorAndLdapMock() { static $conMethods; static $accMethods; static $umMethods; @@ -56,7 +56,7 @@ class Test_Access extends \Test\TestCase { } public function testEscapeFilterPartValidChars() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $input = 'okay'; @@ -64,7 +64,7 @@ class Test_Access extends \Test\TestCase { } public function testEscapeFilterPartEscapeWildcard() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $input = '*'; @@ -73,7 +73,7 @@ class Test_Access extends \Test\TestCase { } public function testEscapeFilterPartEscapeWildcard2() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $input = 'foo*bar'; @@ -83,7 +83,7 @@ class Test_Access extends \Test\TestCase { /** @dataProvider convertSID2StrSuccessData */ public function testConvertSID2StrSuccess(array $sidArray, $sidExpected) { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $sidBinary = implode('', $sidArray); @@ -118,7 +118,7 @@ class Test_Access extends \Test\TestCase { } public function testConvertSID2StrInputError() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $sidIllegal = 'foobar'; @@ -128,7 +128,7 @@ class Test_Access extends \Test\TestCase { } public function testGetDomainDNFromDNSuccess() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $inputDN = 'uid=zaphod,cn=foobar,dc=my,dc=server,dc=com'; @@ -143,7 +143,7 @@ class Test_Access extends \Test\TestCase { } public function testGetDomainDNFromDNError() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $inputDN = 'foobar'; @@ -178,7 +178,7 @@ class Test_Access extends \Test\TestCase { } public function testStringResemblesDN() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $access = new Access($con, $lw, $um); $cases = $this->getResemblesDNInputData(); @@ -199,7 +199,7 @@ class Test_Access extends \Test\TestCase { } public function testStringResemblesDNLDAPmod() { - list($lw, $con, $um) = $this->getConnecterAndLdapMock(); + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); $lw = new \OCA\user_ldap\lib\LDAP(); $access = new Access($con, $lw, $um); @@ -213,4 +213,85 @@ class Test_Access extends \Test\TestCase { $this->assertSame($case['expectedResult'], $access->stringResemblesDN($case['input'])); } } + + public function testCacheUserHome() { + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); + $access = new Access($con, $lw, $um); + + $con->expects($this->once()) + ->method('writeToCache'); + + $access->cacheUserHome('foobar', '/foobars/path'); + } + + public function testBatchApplyUserAttributes() { + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); + $access = new Access($con, $lw, $um); + $mapperMock = $this->getMockBuilder('\OCA\User_LDAP\Mapping\UserMapping') + ->disableOriginalConstructor() + ->getMock(); + $userMock = $this->getMockBuilder('\OCA\user_ldap\lib\user\User') + ->disableOriginalConstructor() + ->getMock(); + + $access->setUserMapper($mapperMock); + + $data = array( + array( + 'dn' => 'foobar', + $con->ldapUserDisplayName => 'barfoo' + ), + array( + 'dn' => 'foo', + $con->ldapUserDisplayName => 'bar' + ), + array( + 'dn' => 'raboof', + $con->ldapUserDisplayName => 'oofrab' + ) + ); + + $userMock->expects($this->exactly(count($data))) + ->method('processAttributes'); + + $um->expects($this->exactly(count($data))) + ->method('get') + ->will($this->returnValue($userMock)); + + $access->batchApplyUserAttributes($data); + } + + public function dNAttributeProvider() { + // corresponds to Access::resemblesDN() + return array( + 'dn' => array('dn'), + 'uniqueMember' => array('uniquemember'), + 'member' => array('member'), + 'memberOf' => array('memberof') + ); + } + + /** + * @dataProvider dNAttributeProvider + */ + public function testSanitizeDN($attribute) { + list($lw, $con, $um) = $this->getConnectorAndLdapMock(); + + + $dnFromServer = 'cn=Mixed Cases,ou=Are Sufficient To,ou=Test,dc=example,dc=org'; + + $lw->expects($this->any()) + ->method('isResource') + ->will($this->returnValue(true)); + + $lw->expects($this->any()) + ->method('getAttributes') + ->will($this->returnValue(array( + $attribute => array('count' => 1, $dnFromServer) + ))); + + $access = new Access($con, $lw, $um); + $values = $access->readAttribute('uid=whoever,dc=example,dc=org', $attribute); + $this->assertSame($values[0], strtolower($dnFromServer)); + } } diff --git a/apps/user_ldap/tests/configuration.php b/apps/user_ldap/tests/configuration.php new file mode 100644 index 00000000000..efe4d7eec83 --- /dev/null +++ b/apps/user_ldap/tests/configuration.php @@ -0,0 +1,106 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\user_ldap\tests; + +class Test_Configuration extends \Test\TestCase { + + public function configurationDataProvider() { + $inputWithDN = array( + 'cn=someUsers,dc=example,dc=org', + ' ', + ' cn=moreUsers,dc=example,dc=org ' + ); + $expectWithDN = array( + 'cn=someUsers,dc=example,dc=org', + 'cn=moreUsers,dc=example,dc=org' + ); + + $inputNames = array( + ' uid ', + 'cn ', + ' ', + '', + ' whats my name', + ' ' + ); + $expectedNames = array('uid', 'cn', 'whats my name'); + + $inputString = ' alea iacta est '; + $expectedString = 'alea iacta est'; + + $inputHomeFolder = array( + ' homeDirectory ', + ' attr:homeDirectory ', + ' ' + ); + + $expectedHomeFolder = array( + 'attr:homeDirectory', 'attr:homeDirectory', '' + ); + + $password = ' such a passw0rd '; + + return array( + 'set general base' => array('ldapBase', $inputWithDN, $expectWithDN), + 'set user base' => array('ldapBaseUsers', $inputWithDN, $expectWithDN), + 'set group base' => array('ldapBaseGroups', $inputWithDN, $expectWithDN), + + 'set search attributes users' => array('ldapAttributesForUserSearch', $inputNames, $expectedNames), + 'set search attributes groups' => array('ldapAttributesForGroupSearch', $inputNames, $expectedNames), + + 'set user filter objectclasses' => array('ldapUserFilterObjectclass', $inputNames, $expectedNames), + 'set user filter groups' => array('ldapUserFilterGroups', $inputNames, $expectedNames), + 'set group filter objectclasses' => array('ldapGroupFilterObjectclass', $inputNames, $expectedNames), + 'set group filter groups' => array('ldapGroupFilterGroups', $inputNames, $expectedNames), + 'set login filter attributes' => array('ldapLoginFilterAttributes', $inputNames, $expectedNames), + + 'set agent password' => array('ldapAgentPassword', $password, $password), + + 'set home folder, variant 1' => array('homeFolderNamingRule', $inputHomeFolder[0], $expectedHomeFolder[0]), + 'set home folder, variant 2' => array('homeFolderNamingRule', $inputHomeFolder[1], $expectedHomeFolder[1]), + 'set home folder, empty' => array('homeFolderNamingRule', $inputHomeFolder[2], $expectedHomeFolder[2]), + + // default behaviour, one case is enough, special needs must be tested + // individually + 'set string value' => array('ldapHost', $inputString, $expectedString), + ); + } + + /** + * @dataProvider configurationDataProvider + */ + public function testSetValue($key, $input, $expected) { + $configuration = new \OCA\user_ldap\lib\Configuration('t01', false); + + $settingsInput = array( + 'ldapBaseUsers' => array( + 'cn=someUsers,dc=example,dc=org', + ' ', + ' cn=moreUsers,dc=example,dc=org ' + ) + ); + + $configuration->setConfiguration([$key => $input]); + $this->assertSame($configuration->$key, $expected); + } + +} diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php index 805238e7d37..49af5e3fe34 100644 --- a/apps/user_ldap/tests/group_ldap.php +++ b/apps/user_ldap/tests/group_ldap.php @@ -1,6 +1,7 @@ <?php /** * @author Arthur Schiwon <blizzz@owncloud.com> + * @author Frédéric Fortier <frederic.fortier@oronospolytechnique.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @@ -41,18 +42,17 @@ class Test_Group_Ldap extends \Test\TestCase { $connector = $this->getMock('\OCA\user_ldap\lib\Connection', $conMethods, array($lw, null, null)); - $um = new \OCA\user_ldap\lib\user\Manager( - $this->getMock('\OCP\IConfig'), - $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'), - $this->getMock('\OCA\user_ldap\lib\LogWrapper'), - $this->getMock('\OCP\IAvatarManager'), - $this->getMock('\OCP\Image'), - $this->getMock('\OCP\IDBConnection') - ); + $um = $this->getMockBuilder('\OCA\user_ldap\lib\user\Manager') + ->disableOriginalConstructor() + ->getMock(); $access = $this->getMock('\OCA\user_ldap\lib\Access', $accMethods, array($connector, $lw, $um)); + $access->expects($this->any()) + ->method('getConnection') + ->will($this->returnValue($connector)); + return $access; } @@ -140,7 +140,7 @@ class Test_Group_Ldap extends \Test\TestCase { $access->expects($this->once()) ->method('searchGroups') - ->will($this->returnValue(array('cn=foo,dc=barfoo,dc=bar'))); + ->will($this->returnValue([['dn' => ['cn=foo,dc=barfoo,dc=bar']]])); $access->expects($this->once()) ->method('dn2groupname') @@ -216,7 +216,7 @@ class Test_Group_Ldap extends \Test\TestCase { $access->expects($this->once()) ->method('searchGroups') - ->will($this->returnValue(array('cn=foo,dc=barfoo,dc=bar'))); + ->will($this->returnValue([['dn' => ['cn=foo,dc=barfoo,dc=bar']]])); $access->expects($this->once()) ->method('dn2groupname') @@ -391,7 +391,7 @@ class Test_Group_Ldap extends \Test\TestCase { $access->connection->hasPrimaryGroups = false; - $access->expects($this->once()) + $access->expects($this->any()) ->method('username2dn') ->will($this->returnValue($dn)); diff --git a/apps/user_ldap/tests/integration/lib/integrationtestpaging.php b/apps/user_ldap/tests/integration/lib/integrationtestpaging.php new file mode 100644 index 00000000000..f8d008d065f --- /dev/null +++ b/apps/user_ldap/tests/integration/lib/integrationtestpaging.php @@ -0,0 +1,81 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\user_ldap\tests\integration\lib; + +use OCA\user_ldap\lib\user\Manager as LDAPUserManager; +use OCA\user_ldap\tests\integration\AbstractIntegrationTest; +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\user_ldap\USER_LDAP; + +require_once __DIR__ . '/../../../../../lib/base.php'; + +class IntegrationTestPaging extends AbstractIntegrationTest { + /** @var UserMapping */ + protected $mapping; + + /** @var USER_LDAP */ + protected $backend; + + /** + * prepares the LDAP environment and sets up a test configuration for + * the LDAP backend. + */ + public function init() { + require(__DIR__ . '/../setup-scripts/createExplicitUsers.php'); + parent::init(); + + $this->backend = new \OCA\user_ldap\USER_LDAP($this->access, \OC::$server->getConfig()); + } + + /** + * tests that paging works properly against a simple example (reading all + * of few users in smallest steps) + * + * @return bool + */ + protected function case1() { + $limit = 1; + $offset = 0; + + $filter = 'objectclass=inetorgperson'; + $attributes = ['cn', 'dn']; + $users = []; + do { + $result = $this->access->searchUsers($filter, $attributes, $limit, $offset); + foreach($result as $user) { + $users[] = $user['cn']; + } + $offset += $limit; + } while ($this->access->hasMoreResults()); + + if(count($users) === 2) { + return true; + } + + return false; + } +} + +require_once(__DIR__ . '/../setup-scripts/config.php'); +$test = new IntegrationTestPaging($host, $port, $adn, $apwd, $bdn); +$test->init(); +$test->run(); diff --git a/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php b/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php index f34fca81c2d..ef000286109 100644 --- a/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php +++ b/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php @@ -1,9 +1,22 @@ <?php /** - * Created by PhpStorm. - * User: blizzz - * Date: 06.08.15 - * Time: 08:19 + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * */ namespace OCA\user_ldap\tests\integration\lib; diff --git a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php index a03d6b0c0c6..6bb8afc01a2 100644 --- a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php +++ b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php @@ -1,5 +1,24 @@ <?php - +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ use OCA\user_ldap\lib\user\User; use OCA\User_LDAP\Mapping\UserMapping; use OCA\user_ldap\tests\integration\AbstractIntegrationTest; diff --git a/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroups.php b/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroups.php index 68854de5571..8ac35a54528 100644 --- a/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroups.php +++ b/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroups.php @@ -1,5 +1,24 @@ <?php - +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ if(php_sapi_name() !== 'cli') { print('Only via CLI, please.'); exit(1); diff --git a/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroupsDifferentOU.php b/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroupsDifferentOU.php index 361881969cc..e22b72c452c 100644 --- a/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroupsDifferentOU.php +++ b/apps/user_ldap/tests/integration/setup-scripts/createExplicitGroupsDifferentOU.php @@ -1,5 +1,24 @@ <?php - +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ if(php_sapi_name() !== 'cli') { print('Only via CLI, please.'); exit(1); diff --git a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php index bb784d60f7b..3e9cb674254 100644 --- a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php +++ b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php @@ -1,5 +1,24 @@ <?php - +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ if(php_sapi_name() !== 'cli') { print('Only via CLI, please.'); exit(1); diff --git a/apps/user_ldap/tests/user/manager.php b/apps/user_ldap/tests/user/manager.php index d659323fc7f..98e48638d8b 100644 --- a/apps/user_ldap/tests/user/manager.php +++ b/apps/user_ldap/tests/user/manager.php @@ -37,6 +37,16 @@ class Test_User_Manager extends \Test\TestCase { $image = $this->getMock('\OCP\Image'); $dbc = $this->getMock('\OCP\IDBConnection'); + $connection = new \OCA\user_ldap\lib\Connection( + $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper'), + '', + null + ); + + $access->expects($this->any()) + ->method('getConnection') + ->will($this->returnValue($connection)); + return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc); } @@ -206,4 +216,36 @@ class Test_User_Manager extends \Test\TestCase { $this->assertNull($user); } + public function testGetAttributesAll() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + $this->getTestInstances(); + + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager->setLdapAccess($access); + + $connection = $access->getConnection(); + $connection->setConfiguration(array('ldapEmailAttribute' => 'mail')); + + $attributes = $manager->getAttributes(); + + $this->assertTrue(in_array('dn', $attributes)); + $this->assertTrue(in_array($access->getConnection()->ldapEmailAttribute, $attributes)); + $this->assertTrue(in_array('jpegphoto', $attributes)); + $this->assertTrue(in_array('thumbnailphoto', $attributes)); + } + + public function testGetAttributesMinimal() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + $this->getTestInstances(); + + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager->setLdapAccess($access); + + $attributes = $manager->getAttributes(true); + + $this->assertTrue(in_array('dn', $attributes)); + $this->assertTrue(!in_array('jpegphoto', $attributes)); + $this->assertTrue(!in_array('thumbnailphoto', $attributes)); + } + } diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php index 80baafcb250..1c41eb71ec2 100644 --- a/apps/user_ldap/tests/user/user.php +++ b/apps/user_ldap/tests/user/user.php @@ -221,7 +221,7 @@ class Test_User_User extends \Test\TestCase { $connection->expects($this->at(0)) ->method('__get') ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('23 GB')); + ->will($this->returnValue('25 GB')); $connection->expects($this->at(1)) ->method('__get') @@ -242,7 +242,7 @@ class Test_User_User extends \Test\TestCase { ->with($this->equalTo('alice'), $this->equalTo('files'), $this->equalTo('quota'), - $this->equalTo('23 GB')) + $this->equalTo('25 GB')) ->will($this->returnValue(true)); $uid = 'alice'; @@ -278,14 +278,14 @@ class Test_User_User extends \Test\TestCase { ->method('readAttribute') ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), $this->equalTo('myquota')) - ->will($this->returnValue(array('23 GB'))); + ->will($this->returnValue(array('27 GB'))); $config->expects($this->once()) ->method('setUserValue') ->with($this->equalTo('alice'), $this->equalTo('files'), $this->equalTo('quota'), - $this->equalTo('23 GB')) + $this->equalTo('27 GB')) ->will($this->returnValue(true)); $uid = 'alice'; @@ -679,4 +679,164 @@ class Test_User_User extends \Test\TestCase { //photo is returned $photo = $user->getAvatarImage(); } + + public function testProcessAttributes() { + list(, $config, $filesys, $image, $log, $avaMgr, $dbc) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $uid = 'alice'; + $dn = 'uid=alice'; + + $requiredMethods = array( + 'markRefreshTime', + 'updateQuota', + 'updateEmail', + 'storeDisplayName', + 'storeLDAPUserName', + 'getHomePath', + 'updateAvatar' + ); + + $userMock = $this->getMockBuilder('OCA\user_ldap\lib\user\User') + ->setConstructorArgs(array($uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr)) + ->setMethods($requiredMethods) + ->getMock(); + + $connection->setConfiguration(array( + 'homeFolderNamingRule' => 'homeDirectory' + )); + + $connection->expects($this->any()) + ->method('__get') + //->will($this->returnArgument(0)); + ->will($this->returnCallback(function($name) { + if($name === 'homeFolderNamingRule') { + return 'attr:homeDirectory'; + } + return $name; + })); + + $record = array( + strtolower($connection->ldapQuotaAttribute) => array('4096'), + strtolower($connection->ldapEmailAttribute) => array('alice@wonderland.org'), + strtolower($connection->ldapUserDisplayName) => array('Aaaaalice'), + 'uid' => array($uid), + 'homedirectory' => array('Alice\'s Folder'), + 'memberof' => array('cn=groupOne', 'cn=groupTwo'), + 'jpegphoto' => array('here be an image') + ); + + foreach($requiredMethods as $method) { + $userMock->expects($this->once()) + ->method($method); + } + + $userMock->processAttributes($record); + } + + public function emptyHomeFolderAttributeValueProvider() { + return array( + 'empty' => array(''), + 'prefixOnly' => array('attr:'), + ); + } + + /** + * @dataProvider emptyHomeFolderAttributeValueProvider + */ + public function testGetHomePathNotConfigured($attributeValue) { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->any()) + ->method('__get') + ->with($this->equalTo('homeFolderNamingRule')) + ->will($this->returnValue($attributeValue)); + + $access->expects($this->never()) + ->method('readAttribute'); + + $config->expects($this->never()) + ->method('getAppValue'); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + + $path = $user->getHomePath(); + $this->assertSame($path, false); + } + + public function testGetHomePathConfiguredNotAvailableAllowed() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->any()) + ->method('__get') + ->with($this->equalTo('homeFolderNamingRule')) + ->will($this->returnValue('attr:foobar')); + + $access->expects($this->once()) + ->method('readAttribute') + ->will($this->returnValue(false)); + + // asks for "enforce_home_folder_naming_rule" + $config->expects($this->once()) + ->method('getAppValue') + ->will($this->returnValue(false)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + + $path = $user->getHomePath(); + + $this->assertSame($path, false); + } + + /** + * @expectedException \Exception + */ + public function testGetHomePathConfiguredNotAvailableNotAllowed() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->any()) + ->method('__get') + ->with($this->equalTo('homeFolderNamingRule')) + ->will($this->returnValue('attr:foobar')); + + $access->expects($this->once()) + ->method('readAttribute') + ->will($this->returnValue(false)); + + // asks for "enforce_home_folder_naming_rule" + $config->expects($this->once()) + ->method('getAppValue') + ->will($this->returnValue(true)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + + $user->getHomePath(); + } } diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php index 2b99e1c2dc8..0f70c43fc11 100644 --- a/apps/user_ldap/tests/user_ldap.php +++ b/apps/user_ldap/tests/user_ldap.php @@ -34,6 +34,7 @@ use \OCA\user_ldap\lib\ILDAPWrapper; class Test_User_Ldap_Direct extends \Test\TestCase { protected $backend; protected $access; + protected $configMock; protected function setUp() { parent::setUp(); @@ -61,8 +62,9 @@ class Test_User_Ldap_Direct extends \Test\TestCase { $conMethods, array($lw, null, null)); + $this->configMock = $this->getMock('\OCP\IConfig'); $um = new \OCA\user_ldap\lib\user\Manager( - $this->getMock('\OCP\IConfig'), + $this->configMock, $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'), $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), @@ -122,7 +124,7 @@ class Test_User_Ldap_Direct extends \Test\TestCase { ->method('fetchListOfUsers') ->will($this->returnCallback(function($filter) { if($filter === 'roland') { - return array(array('dn' => 'dnOfRoland,dc=test')); + return array(array('dn' => ['dnOfRoland,dc=test'])); } return array(); })); @@ -131,7 +133,7 @@ class Test_User_Ldap_Direct extends \Test\TestCase { ->method('fetchUsersByLoginName') ->will($this->returnCallback(function($uid) { if($uid === 'roland') { - return array(array('dn' => 'dnOfRoland,dc=test')); + return array(array('dn' => ['dnOfRoland,dc=test'])); } return array(); })); @@ -586,6 +588,13 @@ class Test_User_Ldap_Direct extends \Test\TestCase { $backend = new UserLDAP($access, $config); $this->prepareMockForUserExists($access); + $dataDir = \OC::$server->getConfig()->getSystemValue( + 'datadirectory', \OC::$SERVERROOT.'/data'); + + $this->configMock->expects($this->once()) + ->method('getSystemValue') + ->will($this->returnValue($dataDir)); + $access->connection->expects($this->any()) ->method('__get') ->will($this->returnCallback(function($name) { @@ -609,14 +618,9 @@ class Test_User_Ldap_Direct extends \Test\TestCase { return false; } })); - //datadir-relativ path - $datadir = '/my/data/dir'; - $config->expects($this->once()) - ->method('getSystemValue') - ->will($this->returnValue($datadir)); $result = $backend->getHome('ladyofshadows'); - $this->assertEquals($datadir.'/susannah/', $result); + $this->assertEquals($dataDir.'/susannah/', $result); } /** diff --git a/apps/user_ldap/tests/wizard.php b/apps/user_ldap/tests/wizard.php index 525364390bc..7b046187831 100644 --- a/apps/user_ldap/tests/wizard.php +++ b/apps/user_ldap/tests/wizard.php @@ -3,6 +3,7 @@ * @author Arthur Schiwon <blizzz@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Viktor Szépe <viktor@szepe.net> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 00cba718369..fc8ce361637 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -1,11 +1,10 @@ <?php /** - * @author Andreas Fischer <bantu@owncloud.com> * @author Arthur Schiwon <blizzz@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> - * @author Christopher Schäpers <kondou@ts.unde.re> * @author Dominik Schmidt <dev@dominik-schmidt.de> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> @@ -79,7 +78,7 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn public function loginName2UserName($loginName) { try { $ldapRecord = $this->getLDAPUserByLoginName($loginName); - $user = $this->access->userManager->get($ldapRecord['dn']); + $user = $this->access->userManager->get($ldapRecord['dn'][0]); if($user instanceof OfflineUser) { return false; } @@ -98,9 +97,8 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn */ public function getLDAPUserByLoginName($loginName) { //find out dn of the user name - $attrs = array($this->access->connection->ldapUserDisplayName, 'dn', - 'uid', 'samaccountname'); - $users = $this->access->fetchUsersByLoginName($loginName, $attrs); + $attrs = $this->access->userManager->getAttributes(); + $users = $this->access->fetchUsersByLoginName($loginName, $attrs, 1); if(count($users) < 1) { throw new \Exception('No user available for the given login name.'); } @@ -121,7 +119,7 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn } catch(\Exception $e) { return false; } - $dn = $ldapRecord['dn']; + $dn = $ldapRecord['dn'][0]; $user = $this->access->userManager->get($dn); if(!$user instanceof User) { @@ -137,16 +135,9 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn return false; } + $this->access->cacheUserExists($user->getUsername()); + $user->processAttributes($ldapRecord); $user->markLogin(); - if(isset($ldapRecord[$this->access->connection->ldapUserDisplayName])) { - $dpn = $ldapRecord[$this->access->connection->ldapUserDisplayName]; - $user->storeDisplayName($dpn); - } - if(isset($ldapRecord['uid'])) { - $user->storeLDAPUserName($ldapRecord['uid']); - } else if(isset($ldapRecord['samaccountname'])) { - $user->storeLDAPUserName($ldapRecord['samaccountname']); - } return $user->getUsername(); } @@ -188,7 +179,7 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn //do the search and translate results to owncloud names $ldap_users = $this->access->fetchListOfUsers( $filter, - array($this->access->connection->ldapUserDisplayName, 'dn'), + $this->access->userManager->getAttributes(true), $limit, $offset); $ldap_users = $this->access->ownCloudUserNames($ldap_users); \OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::DEBUG); @@ -302,44 +293,12 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn if($this->access->connection->isCached($cacheKey)) { return $this->access->connection->getFromCache($cacheKey); } - if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0 && - $this->access->connection->homeFolderNamingRule !== 'attr:') { - $attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:')); - $homedir = $this->access->readAttribute( - $this->access->username2dn($uid), $attr); - if($homedir && isset($homedir[0])) { - $path = $homedir[0]; - //if attribute's value is an absolute path take this, otherwise append it to data dir - //check for / at the beginning or pattern c:\ resp. c:/ - if( - '/' === $path[0] - || (3 < strlen($path) && ctype_alpha($path[0]) - && $path[1] === ':' && ('\\' === $path[2] || '/' === $path[2])) - ) { - $homedir = $path; - } else { - $homedir = $this->ocConfig->getSystemValue('datadirectory', - \OC::$SERVERROOT.'/data' ) . '/' . $homedir[0]; - } - $this->access->connection->writeToCache($cacheKey, $homedir); - //we need it to store it in the DB as well in case a user gets - //deleted so we can clean up afterwards - $this->ocConfig->setUserValue( - $uid, 'user_ldap', 'homePath', $homedir - ); - //TODO: if home directory changes, the old one needs to be removed. - return $homedir; - } - if($this->ocConfig->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', true)) { - // a naming rule attribute is defined, but it doesn't exist for that LDAP user - throw new \Exception('Home dir attribute can\'t be read from LDAP for uid: ' . $uid); - } - } - //false will apply default behaviour as defined and done by OC_User - $this->access->connection->writeToCache($cacheKey, false); - $this->ocConfig->setUserValue($uid, 'user_ldap', 'homePath', ''); - return false; + $user = $this->access->userManager->get($uid); + $path = $user->getHomePath(); + $this->access->cacheUserHome($uid, $path); + + return $path; } /** diff --git a/apps/user_ldap/user_proxy.php b/apps/user_ldap/user_proxy.php index 1491be3f394..2582355e4a3 100644 --- a/apps/user_ldap/user_proxy.php +++ b/apps/user_ldap/user_proxy.php @@ -2,6 +2,7 @@ /** * @author Arthur Schiwon <blizzz@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> diff --git a/apps/user_webdavauth/appinfo/info.xml b/apps/user_webdavauth/appinfo/info.xml deleted file mode 100644 index b0827fb51f8..00000000000 --- a/apps/user_webdavauth/appinfo/info.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0"?> -<info> - <id>user_webdavauth</id> - <name>User backend using remote HTTP servers</name> - <description>Authenticate users by a WebDAV call. You can use any WebDAV server, ownCloud server or other web server to authenticate. It should return http 200 for right credentials and http 401 for wrong ones. - - Attention: This app is not compatible with the LDAP user and group backend. This app is not the WebDAV interface of ownCloud, if you don't understand what it does then do not enable it.</description> - <licence>AGPL</licence> - <author>Frank Karlitschek</author> - <requiremin>4.93</requiremin> - <shipped>true</shipped> - <types> - <authentication/> - </types> -</info> diff --git a/apps/user_webdavauth/appinfo/version b/apps/user_webdavauth/appinfo/version deleted file mode 100644 index a3fdef3af89..00000000000 --- a/apps/user_webdavauth/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.1.0.2 diff --git a/apps/user_webdavauth/img/app.svg b/apps/user_webdavauth/img/app.svg deleted file mode 100644 index 0ce7ed867bd..00000000000 --- a/apps/user_webdavauth/img/app.svg +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <rect style="color:#000000" fill-opacity="0" height="97.986" width="163.31" y="-32.993" x="-62.897"/> - <path style="block-progression:tb;color:#000000;text-transform:none;text-indent:0" fill="#fff" d="m8.4036 1c-1.7312 0-3.1998 1.2661-3.1998 2.9 0.012287 0.51643 0.058473 1.1532 0.36664 2.5v0.033333l0.033328 0.033333c0.098928 0.28338 0.24289 0.44549 0.4333 0.66666s0.41742 0.48149 0.63328 0.69999c0.025397 0.025708 0.041676 0.041633 0.066656 0.066677 0.04281 0.18631 0.094672 0.38681 0.13332 0.56666 0.10284 0.47851 0.092296 0.81737 0.066668 0.93332-0.74389 0.26121-1.6694 0.57228-2.4998 0.93332-0.46622 0.2027-0.8881 0.3837-1.2332 0.59999-0.34513 0.2163-0.68837 0.37971-0.79994 0.86666-0.16004 0.63293-0.19866 0.7539-0.39997 1.5333-0.027212 0.20914 0.083011 0.42961 0.26665 0.53333 1.5078 0.81451 3.824 1.1423 6.1329 1.1333s4.6066-0.35609 6.0662-1.1333c0.11739-0.07353 0.14304-0.10869 0.13332-0.2333-0.04365-0.68908-0.08154-1.3669-0.13332-1.7666-0.01807-0.09908-0.06492-0.19275-0.13332-0.26666-0.46366-0.5537-1.1564-0.89218-1.9665-1.2333-0.7396-0.31144-1.6067-0.63486-2.4665-0.99999-0.048123-0.10721-0.095926-0.41912 0-0.89999 0.025759-0.12912 0.066096-0.26742 0.099994-0.4 0.0808-0.090507 0.14378-0.16447 0.23332-0.26666 0.19096-0.21796 0.39614-0.44661 0.56662-0.66666s0.30996-0.40882 0.39997-0.66666l0.03333-0.033333c0.34839-1.4062 0.34857-1.9929 0.36664-2.5v-0.033333c0-1.6339-1.4686-2.9-3.1998-2.9z"/> -</svg> diff --git a/apps/user_webdavauth/l10n/.gitkeep b/apps/user_webdavauth/l10n/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 --- a/apps/user_webdavauth/l10n/.gitkeep +++ /dev/null diff --git a/apps/user_webdavauth/l10n/ar.js b/apps/user_webdavauth/l10n/ar.js deleted file mode 100644 index 4b78f99ec6f..00000000000 --- a/apps/user_webdavauth/l10n/ar.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "تأكد شخصية ال WebDAV", - "Address:" : "العنوان:", - "Save" : "حفظ", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "سيتم إرسال معلومات المستخدم إلى هذا العنوان. يقوم هذا البرنامج بالتحقق من البيانات ويقوم بإعتبار رودود حالة HTTP برقم 401 و403 كمعلومات غير صحيحة, أما غيرها فسيعتبر صحيح." -}, -"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/user_webdavauth/l10n/ar.json b/apps/user_webdavauth/l10n/ar.json deleted file mode 100644 index d424faf0abc..00000000000 --- a/apps/user_webdavauth/l10n/ar.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "تأكد شخصية ال WebDAV", - "Address:" : "العنوان:", - "Save" : "حفظ", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "سيتم إرسال معلومات المستخدم إلى هذا العنوان. يقوم هذا البرنامج بالتحقق من البيانات ويقوم بإعتبار رودود حالة HTTP برقم 401 و403 كمعلومات غير صحيحة, أما غيرها فسيعتبر صحيح." -},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ast.js b/apps/user_webdavauth/l10n/ast.js deleted file mode 100644 index 87a890666cb..00000000000 --- a/apps/user_webdavauth/l10n/ast.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticación per aciu de WevDAV", - "Address:" : "Direición:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les credenciales d'usuariu van unviase a esta direición. Esti complementu verifica la rempuesta y va interpretar los códigos de rempuesta HTTP 401 y 403 como credenciales inválides y toles otres rempuestes como credenciales válides." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/ast.json b/apps/user_webdavauth/l10n/ast.json deleted file mode 100644 index 52172d5afb9..00000000000 --- a/apps/user_webdavauth/l10n/ast.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticación per aciu de WevDAV", - "Address:" : "Direición:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les credenciales d'usuariu van unviase a esta direición. Esti complementu verifica la rempuesta y va interpretar los códigos de rempuesta HTTP 401 y 403 como credenciales inválides y toles otres rempuestes como credenciales válides." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/az.js b/apps/user_webdavauth/l10n/az.js deleted file mode 100644 index e39b9a160e0..00000000000 --- a/apps/user_webdavauth/l10n/az.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV qeydiyyatı", - "Address:" : "Ünvan: ", - "Save" : "Saxla", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "İstifadəçi verilənləri bu ünvana göndəriləcək. Bu əlavə imkan cavabı yoxlayır və HTTP status code-lari 401,403-ü yalnış verilənlər kimi interpretasiya edir. Bütün digər cavablar isə dügün verilənlərdir." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/az.json b/apps/user_webdavauth/l10n/az.json deleted file mode 100644 index cd63759e75c..00000000000 --- a/apps/user_webdavauth/l10n/az.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV qeydiyyatı", - "Address:" : "Ünvan: ", - "Save" : "Saxla", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "İstifadəçi verilənləri bu ünvana göndəriləcək. Bu əlavə imkan cavabı yoxlayır və HTTP status code-lari 401,403-ü yalnış verilənlər kimi interpretasiya edir. Bütün digər cavablar isə dügün verilənlərdir." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/bg_BG.js b/apps/user_webdavauth/l10n/bg_BG.js deleted file mode 100644 index 7a1272be90c..00000000000 --- a/apps/user_webdavauth/l10n/bg_BG.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV Идентификация", - "Address:" : "Адрес:", - "Save" : "Запиши", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Потребителското име и парола ще да бъдат изптатени до този адрес. Добавката ще провери отговора и ще интрепретира HTTP кодове 401 и 403 като невалидни, а всички останали като потвърдена идентификация." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/bg_BG.json b/apps/user_webdavauth/l10n/bg_BG.json deleted file mode 100644 index 4ab9458e8e4..00000000000 --- a/apps/user_webdavauth/l10n/bg_BG.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV Идентификация", - "Address:" : "Адрес:", - "Save" : "Запиши", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Потребителското име и парола ще да бъдат изптатени до този адрес. Добавката ще провери отговора и ще интрепретира HTTP кодове 401 и 403 като невалидни, а всички останали като потвърдена идентификация." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/bn_BD.js b/apps/user_webdavauth/l10n/bn_BD.js deleted file mode 100644 index 9773db8bef6..00000000000 --- a/apps/user_webdavauth/l10n/bn_BD.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV অনুমোদন", - "Address:" : "ঠিকানা", - "Save" : "সংরক্ষণ", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ব্যবহারকারীর তথ্যাদি এই ঠিকানায় পাঠানো হবে। এই প্লাগইন প্রত্যুত্তর পরীক্ষা করে দেখবে এবং HTTP statuscodes 401 and 403 কে অবৈধ তথ্যাদিরূপে অনুবাদ করে অন্য সকল প্রত্যুত্তরকে বৈধতা দেবে। " -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/bn_BD.json b/apps/user_webdavauth/l10n/bn_BD.json deleted file mode 100644 index cda6cf08e31..00000000000 --- a/apps/user_webdavauth/l10n/bn_BD.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV অনুমোদন", - "Address:" : "ঠিকানা", - "Save" : "সংরক্ষণ", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ব্যবহারকারীর তথ্যাদি এই ঠিকানায় পাঠানো হবে। এই প্লাগইন প্রত্যুত্তর পরীক্ষা করে দেখবে এবং HTTP statuscodes 401 and 403 কে অবৈধ তথ্যাদিরূপে অনুবাদ করে অন্য সকল প্রত্যুত্তরকে বৈধতা দেবে। " -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/bn_IN.js b/apps/user_webdavauth/l10n/bn_IN.js deleted file mode 100644 index 6790de24520..00000000000 --- a/apps/user_webdavauth/l10n/bn_IN.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV প্রমাণীকরণ", - "Address:" : "ঠিকানা", - "Save" : "সেভ", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ব্যবহারকারীর শংসাপত্র এই ঠিকানায় পাঠানো হবে।এই প্লাগিন প্রতিক্রিয়া পরীক্ষা করে এবং HTTP-statuscodes 401 এবং 403 কে অবৈধ প্রমাণপত্রাদি হিসাবে ব্যাখা করে,এবং সমস্ত অন্যান্য প্রত্যুত্তর বৈধ প্রমাণপত্রাদি হিসেবে ব্যাখ্যা করে।" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/bn_IN.json b/apps/user_webdavauth/l10n/bn_IN.json deleted file mode 100644 index 3542f14a7b1..00000000000 --- a/apps/user_webdavauth/l10n/bn_IN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV প্রমাণীকরণ", - "Address:" : "ঠিকানা", - "Save" : "সেভ", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ব্যবহারকারীর শংসাপত্র এই ঠিকানায় পাঠানো হবে।এই প্লাগিন প্রতিক্রিয়া পরীক্ষা করে এবং HTTP-statuscodes 401 এবং 403 কে অবৈধ প্রমাণপত্রাদি হিসাবে ব্যাখা করে,এবং সমস্ত অন্যান্য প্রত্যুত্তর বৈধ প্রমাণপত্রাদি হিসেবে ব্যাখ্যা করে।" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/bs.js b/apps/user_webdavauth/l10n/bs.js deleted file mode 100644 index 5cdb03a07f1..00000000000 --- a/apps/user_webdavauth/l10n/bs.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV autentifikacija", - "Address:" : "Adresa:", - "Save" : "Spasi", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnikovi akreditivi biti će poslani na ovu adresu. Ovaj plugin proverava odgovor i tumači status HTTP kodova 401 i 403 kao nevažeće akreditive, i sve druge odgovore kao validne akreditive." -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/bs.json b/apps/user_webdavauth/l10n/bs.json deleted file mode 100644 index 823be754a41..00000000000 --- a/apps/user_webdavauth/l10n/bs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV autentifikacija", - "Address:" : "Adresa:", - "Save" : "Spasi", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnikovi akreditivi biti će poslani na ovu adresu. Ovaj plugin proverava odgovor i tumači status HTTP kodova 401 i 403 kao nevažeće akreditive, i sve druge odgovore kao validne akreditive." -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ca.js b/apps/user_webdavauth/l10n/ca.js deleted file mode 100644 index baaa239098f..00000000000 --- a/apps/user_webdavauth/l10n/ca.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticació WebDAV", - "Address:" : "Adreça:", - "Save" : "Desa", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les credencials d'usuari s'enviaran a aquesta adreça. Aquest connector comprova la resposta i interpreta els codis d'estat 401 i 403 com a credencials no vàlides, i qualsevol altra resposta com a credencials vàlides." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/ca.json b/apps/user_webdavauth/l10n/ca.json deleted file mode 100644 index 715c286af48..00000000000 --- a/apps/user_webdavauth/l10n/ca.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticació WebDAV", - "Address:" : "Adreça:", - "Save" : "Desa", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les credencials d'usuari s'enviaran a aquesta adreça. Aquest connector comprova la resposta i interpreta els codis d'estat 401 i 403 com a credencials no vàlides, i qualsevol altra resposta com a credencials vàlides." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/cs_CZ.js b/apps/user_webdavauth/l10n/cs_CZ.js deleted file mode 100644 index 0fbf38d53ef..00000000000 --- a/apps/user_webdavauth/l10n/cs_CZ.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Ověření WebDAV", - "Address:" : "Adresa:", - "Save" : "Uložit", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Uživatelské přihlašovací údaje budou odeslány na tuto adresu. Tento plugin zkontroluje odpověď serveru a interpretuje návratový kód HTTP 401 a 403 jako neplatné přihlašovací údaje a jakýkoli jiný jako platné přihlašovací údaje." -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/user_webdavauth/l10n/cs_CZ.json b/apps/user_webdavauth/l10n/cs_CZ.json deleted file mode 100644 index 0ee73e9a9dd..00000000000 --- a/apps/user_webdavauth/l10n/cs_CZ.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Ověření WebDAV", - "Address:" : "Adresa:", - "Save" : "Uložit", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Uživatelské přihlašovací údaje budou odeslány na tuto adresu. Tento plugin zkontroluje odpověď serveru a interpretuje návratový kód HTTP 401 a 403 jako neplatné přihlašovací údaje a jakýkoli jiný jako platné přihlašovací údaje." -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/cy_GB.js b/apps/user_webdavauth/l10n/cy_GB.js deleted file mode 100644 index 739908abf4b..00000000000 --- a/apps/user_webdavauth/l10n/cy_GB.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Cadw" -}, -"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/apps/user_webdavauth/l10n/cy_GB.json b/apps/user_webdavauth/l10n/cy_GB.json deleted file mode 100644 index e0ec790857f..00000000000 --- a/apps/user_webdavauth/l10n/cy_GB.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Cadw" -},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/da.js b/apps/user_webdavauth/l10n/da.js deleted file mode 100644 index f545d82413b..00000000000 --- a/apps/user_webdavauth/l10n/da.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-godkendelse", - "Address:" : "Adresse:", - "Save" : "Gem", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Bruger oplysningerne vil blive sendt til denne adresse. Udvidelsen registrerer svaret og fortolker HTTP-statuskode 401 og 403 som ugyldige oplysninger, men alle andre besvarelser som gyldige oplysninger." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/da.json b/apps/user_webdavauth/l10n/da.json deleted file mode 100644 index c0e7a709b57..00000000000 --- a/apps/user_webdavauth/l10n/da.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-godkendelse", - "Address:" : "Adresse:", - "Save" : "Gem", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Bruger oplysningerne vil blive sendt til denne adresse. Udvidelsen registrerer svaret og fortolker HTTP-statuskode 401 og 403 som ugyldige oplysninger, men alle andre besvarelser som gyldige oplysninger." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/de.js b/apps/user_webdavauth/l10n/de.js deleted file mode 100644 index 6e667dca0b7..00000000000 --- a/apps/user_webdavauth/l10n/de.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-Authentifizierung", - "Address:" : "Adresse:", - "Save" : "Speichern", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/de.json b/apps/user_webdavauth/l10n/de.json deleted file mode 100644 index f347f7724e5..00000000000 --- a/apps/user_webdavauth/l10n/de.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-Authentifizierung", - "Address:" : "Adresse:", - "Save" : "Speichern", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/de_AT.js b/apps/user_webdavauth/l10n/de_AT.js deleted file mode 100644 index 61b244f4ae4..00000000000 --- a/apps/user_webdavauth/l10n/de_AT.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Speichern" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/de_AT.json b/apps/user_webdavauth/l10n/de_AT.json deleted file mode 100644 index a61814a0978..00000000000 --- a/apps/user_webdavauth/l10n/de_AT.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Speichern" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/de_DE.js b/apps/user_webdavauth/l10n/de_DE.js deleted file mode 100644 index 6e667dca0b7..00000000000 --- a/apps/user_webdavauth/l10n/de_DE.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-Authentifizierung", - "Address:" : "Adresse:", - "Save" : "Speichern", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/de_DE.json b/apps/user_webdavauth/l10n/de_DE.json deleted file mode 100644 index f347f7724e5..00000000000 --- a/apps/user_webdavauth/l10n/de_DE.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-Authentifizierung", - "Address:" : "Adresse:", - "Save" : "Speichern", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/el.js b/apps/user_webdavauth/l10n/el.js deleted file mode 100644 index 81a2cea52fd..00000000000 --- a/apps/user_webdavauth/l10n/el.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Πιστοποίηση μέσω WebDAV ", - "Address:" : "Διεύθυνση:", - "Save" : "Αποθήκευση", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Τα διαπιστευτήρια του χρήστη θα σταλούν σε αυτή την διεύθυνση. Αυτό το πρόσθετο ελέγχει την απόκριση και θα ερμηνεύσει τους κωδικούς κατάστασης HTTP 401 και 402 ως μη έγκυρα διαπιστευτήρια και όλες τις άλλες αποκρίσεις ως έγκυρα διαπιστευτήρια." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/el.json b/apps/user_webdavauth/l10n/el.json deleted file mode 100644 index 2335801c723..00000000000 --- a/apps/user_webdavauth/l10n/el.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Πιστοποίηση μέσω WebDAV ", - "Address:" : "Διεύθυνση:", - "Save" : "Αποθήκευση", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Τα διαπιστευτήρια του χρήστη θα σταλούν σε αυτή την διεύθυνση. Αυτό το πρόσθετο ελέγχει την απόκριση και θα ερμηνεύσει τους κωδικούς κατάστασης HTTP 401 και 402 ως μη έγκυρα διαπιστευτήρια και όλες τις άλλες αποκρίσεις ως έγκυρα διαπιστευτήρια." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/en_GB.js b/apps/user_webdavauth/l10n/en_GB.js deleted file mode 100644 index 5eaa8449d4d..00000000000 --- a/apps/user_webdavauth/l10n/en_GB.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV Authentication", - "Address:" : "Address:", - "Save" : "Save", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/en_GB.json b/apps/user_webdavauth/l10n/en_GB.json deleted file mode 100644 index 12957ea2b02..00000000000 --- a/apps/user_webdavauth/l10n/en_GB.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV Authentication", - "Address:" : "Address:", - "Save" : "Save", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/eo.js b/apps/user_webdavauth/l10n/eo.js deleted file mode 100644 index 657042a08f6..00000000000 --- a/apps/user_webdavauth/l10n/eo.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-aŭtentigo", - "Save" : "Konservi" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/eo.json b/apps/user_webdavauth/l10n/eo.json deleted file mode 100644 index 17bb6935824..00000000000 --- a/apps/user_webdavauth/l10n/eo.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-aŭtentigo", - "Save" : "Konservi" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/es.js b/apps/user_webdavauth/l10n/es.js deleted file mode 100644 index 107e7332e4e..00000000000 --- a/apps/user_webdavauth/l10n/es.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticación mediante WevDAV", - "Address:" : "Dirección:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/es.json b/apps/user_webdavauth/l10n/es.json deleted file mode 100644 index 57d2c4f7027..00000000000 --- a/apps/user_webdavauth/l10n/es.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticación mediante WevDAV", - "Address:" : "Dirección:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/es_AR.js b/apps/user_webdavauth/l10n/es_AR.js deleted file mode 100644 index ab1e59432ba..00000000000 --- a/apps/user_webdavauth/l10n/es_AR.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticación de WebDAV", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las credenciales del usuario serán enviadas a esta dirección. Este plug-in verificará la respuesta e interpretará los códigos de estado HTTP 401 y 403 como credenciales inválidas y cualquier otra respuesta como válida." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/es_AR.json b/apps/user_webdavauth/l10n/es_AR.json deleted file mode 100644 index 36947d9c1a6..00000000000 --- a/apps/user_webdavauth/l10n/es_AR.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticación de WebDAV", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las credenciales del usuario serán enviadas a esta dirección. Este plug-in verificará la respuesta e interpretará los códigos de estado HTTP 401 y 403 como credenciales inválidas y cualquier otra respuesta como válida." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/es_MX.js b/apps/user_webdavauth/l10n/es_MX.js deleted file mode 100644 index 57412d0c230..00000000000 --- a/apps/user_webdavauth/l10n/es_MX.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticación mediante WevDAV", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/es_MX.json b/apps/user_webdavauth/l10n/es_MX.json deleted file mode 100644 index 26b45a98600..00000000000 --- a/apps/user_webdavauth/l10n/es_MX.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticación mediante WevDAV", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/et_EE.js b/apps/user_webdavauth/l10n/et_EE.js deleted file mode 100644 index 3644bb8cd8d..00000000000 --- a/apps/user_webdavauth/l10n/et_EE.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV autentimine", - "Address:" : "Aadress:", - "Save" : "Salvesta", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud saadab kasutajatunnused sellel aadressil. See vidin kontrollib vastust ning tuvastab ning tõlgendab HTTP olekukoodid 401 ja 403 valedeks andmeteks ning kõik teised vastused korrektseteks andmeteks." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/et_EE.json b/apps/user_webdavauth/l10n/et_EE.json deleted file mode 100644 index 5893006b4a5..00000000000 --- a/apps/user_webdavauth/l10n/et_EE.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV autentimine", - "Address:" : "Aadress:", - "Save" : "Salvesta", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud saadab kasutajatunnused sellel aadressil. See vidin kontrollib vastust ning tuvastab ning tõlgendab HTTP olekukoodid 401 ja 403 valedeks andmeteks ning kõik teised vastused korrektseteks andmeteks." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/eu.js b/apps/user_webdavauth/l10n/eu.js deleted file mode 100644 index abc45c1adf3..00000000000 --- a/apps/user_webdavauth/l10n/eu.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV Autentikazioa", - "Address:" : "Helbidea:", - "Save" : "Gorde", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Erabiltzailearen kredentzialak helbide honetara bidaliko dira. Plugin honek erantzuna aztertu eta HTTP 401 eta 403 egoera-kodeak kredentzial ez-egokitzat hartuko ditu, eta beste edozein erantzun, aldiz, kredentzial egokitzat." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/eu.json b/apps/user_webdavauth/l10n/eu.json deleted file mode 100644 index 83763ecaaff..00000000000 --- a/apps/user_webdavauth/l10n/eu.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV Autentikazioa", - "Address:" : "Helbidea:", - "Save" : "Gorde", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Erabiltzailearen kredentzialak helbide honetara bidaliko dira. Plugin honek erantzuna aztertu eta HTTP 401 eta 403 egoera-kodeak kredentzial ez-egokitzat hartuko ditu, eta beste edozein erantzun, aldiz, kredentzial egokitzat." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/fa.js b/apps/user_webdavauth/l10n/fa.js deleted file mode 100644 index 13f994c5520..00000000000 --- a/apps/user_webdavauth/l10n/fa.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "اعتبار سنجی WebDAV ", - "Address:" : "آدرس:", - "Save" : "ذخیره", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "جزئیات کاربر به این آدرس ارسال خواهد شد. این پلاگین پاسخ را بررسی خواهد کرد و کدهای حالت HTTP شماره 401 و 403 را به عنوان اعتبارات غیر معتبر ترجمه می کند، و باقی موارد را به عنوان موارد معتبر تشخیص می دهد." -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/fa.json b/apps/user_webdavauth/l10n/fa.json deleted file mode 100644 index e200dc46986..00000000000 --- a/apps/user_webdavauth/l10n/fa.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "اعتبار سنجی WebDAV ", - "Address:" : "آدرس:", - "Save" : "ذخیره", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "جزئیات کاربر به این آدرس ارسال خواهد شد. این پلاگین پاسخ را بررسی خواهد کرد و کدهای حالت HTTP شماره 401 و 403 را به عنوان اعتبارات غیر معتبر ترجمه می کند، و باقی موارد را به عنوان موارد معتبر تشخیص می دهد." -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/fi_FI.js b/apps/user_webdavauth/l10n/fi_FI.js deleted file mode 100644 index 4d98c51d778..00000000000 --- a/apps/user_webdavauth/l10n/fi_FI.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-todennus", - "Address:" : "Osoite:", - "Save" : "Tallenna", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Käyttäjätiedot lähetetään tähän osoitteeseen. Liitännäinen tarkistaa vastauksen, ja tulkitsee HTTP-tilakoodit 401 ja 403 vääriksi käyttäjätiedoiksi. Kaikki muut vastaukset tulkitaan kelvollisiksi käyttäjätiedoiksi." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/fi_FI.json b/apps/user_webdavauth/l10n/fi_FI.json deleted file mode 100644 index 412813eea4a..00000000000 --- a/apps/user_webdavauth/l10n/fi_FI.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-todennus", - "Address:" : "Osoite:", - "Save" : "Tallenna", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Käyttäjätiedot lähetetään tähän osoitteeseen. Liitännäinen tarkistaa vastauksen, ja tulkitsee HTTP-tilakoodit 401 ja 403 vääriksi käyttäjätiedoiksi. Kaikki muut vastaukset tulkitaan kelvollisiksi käyttäjätiedoiksi." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/fr.js b/apps/user_webdavauth/l10n/fr.js deleted file mode 100644 index 5a89cf211ef..00000000000 --- a/apps/user_webdavauth/l10n/fr.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Authentification WebDAV", - "Address:" : "Adresse :", - "Save" : "Sauvegarder", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification invalide et toute autre valeur comme une authentification valide." -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_webdavauth/l10n/fr.json b/apps/user_webdavauth/l10n/fr.json deleted file mode 100644 index 72336cad0b2..00000000000 --- a/apps/user_webdavauth/l10n/fr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Authentification WebDAV", - "Address:" : "Adresse :", - "Save" : "Sauvegarder", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification invalide et toute autre valeur comme une authentification valide." -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/gl.js b/apps/user_webdavauth/l10n/gl.js deleted file mode 100644 index cd561a4ee56..00000000000 --- a/apps/user_webdavauth/l10n/gl.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticación WebDAV", - "Address:" : "Enderezo:", - "Save" : "Gardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "As credenciais do usuario serán enviadas a este enderezo. Este engadido comproba a resposta e interpretará os códigos de estado 401 e 403 como credenciais incorrectas, e todas as outras respostas como credenciais correctas." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/gl.json b/apps/user_webdavauth/l10n/gl.json deleted file mode 100644 index 54a2af90867..00000000000 --- a/apps/user_webdavauth/l10n/gl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticación WebDAV", - "Address:" : "Enderezo:", - "Save" : "Gardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "As credenciais do usuario serán enviadas a este enderezo. Este engadido comproba a resposta e interpretará os códigos de estado 401 e 403 como credenciais incorrectas, e todas as outras respostas como credenciais correctas." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/he.js b/apps/user_webdavauth/l10n/he.js deleted file mode 100644 index b88c6b72aac..00000000000 --- a/apps/user_webdavauth/l10n/he.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "הזדהות מול WebDAV", - "Save" : "שמירה" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/he.json b/apps/user_webdavauth/l10n/he.json deleted file mode 100644 index fc168aae3d6..00000000000 --- a/apps/user_webdavauth/l10n/he.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "הזדהות מול WebDAV", - "Save" : "שמירה" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/hi.js b/apps/user_webdavauth/l10n/hi.js deleted file mode 100644 index 840317d2906..00000000000 --- a/apps/user_webdavauth/l10n/hi.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "सहेजें" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/hr.js b/apps/user_webdavauth/l10n/hr.js deleted file mode 100644 index 1c3044b69b3..00000000000 --- a/apps/user_webdavauth/l10n/hr.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV autentifikacija", - "Address:" : "Adresa:", - "Save" : "Spremi", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnički podaci će biti poslani na tu adresu. Ovaj dodatak provjerava odgovor i interpretira HTTP status 401 i 403 kao neuspječnu prijavu, svi ostali statusi znače da je prijava uspješna i da su korisnički podaci točni." -}, -"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/user_webdavauth/l10n/hr.json b/apps/user_webdavauth/l10n/hr.json deleted file mode 100644 index 20ff7796fbb..00000000000 --- a/apps/user_webdavauth/l10n/hr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV autentifikacija", - "Address:" : "Adresa:", - "Save" : "Spremi", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnički podaci će biti poslani na tu adresu. Ovaj dodatak provjerava odgovor i interpretira HTTP status 401 i 403 kao neuspječnu prijavu, svi ostali statusi znače da je prijava uspješna i da su korisnički podaci točni." -},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/hu_HU.js b/apps/user_webdavauth/l10n/hu_HU.js deleted file mode 100644 index 354283be7b9..00000000000 --- a/apps/user_webdavauth/l10n/hu_HU.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV hitelesítés", - "Address:" : "Cím:", - "Save" : "Mentés", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/hu_HU.json b/apps/user_webdavauth/l10n/hu_HU.json deleted file mode 100644 index 6631ee61c63..00000000000 --- a/apps/user_webdavauth/l10n/hu_HU.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV hitelesítés", - "Address:" : "Cím:", - "Save" : "Mentés", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/hy.js b/apps/user_webdavauth/l10n/hy.js deleted file mode 100644 index 83f869e3dbd..00000000000 --- a/apps/user_webdavauth/l10n/hy.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV նույնականացում", - "Address:" : "Հասցե՝", - "Save" : "Պահպանել" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/hy.json b/apps/user_webdavauth/l10n/hy.json deleted file mode 100644 index 17703f4e54e..00000000000 --- a/apps/user_webdavauth/l10n/hy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV նույնականացում", - "Address:" : "Հասցե՝", - "Save" : "Պահպանել" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ia.js b/apps/user_webdavauth/l10n/ia.js deleted file mode 100644 index 651840bf0c1..00000000000 --- a/apps/user_webdavauth/l10n/ia.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Salveguardar" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/ia.json b/apps/user_webdavauth/l10n/ia.json deleted file mode 100644 index 91d310a33b7..00000000000 --- a/apps/user_webdavauth/l10n/ia.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Salveguardar" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/id.js b/apps/user_webdavauth/l10n/id.js deleted file mode 100644 index d71da240e27..00000000000 --- a/apps/user_webdavauth/l10n/id.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Otentikasi WebDAV", - "Address:" : "Alamat:", - "Save" : "Simpan", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan mengartikan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid." -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/id.json b/apps/user_webdavauth/l10n/id.json deleted file mode 100644 index ba327c72dda..00000000000 --- a/apps/user_webdavauth/l10n/id.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Otentikasi WebDAV", - "Address:" : "Alamat:", - "Save" : "Simpan", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan mengartikan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid." -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/is.js b/apps/user_webdavauth/l10n/is.js deleted file mode 100644 index 1a09c2729e5..00000000000 --- a/apps/user_webdavauth/l10n/is.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV Auðkenni", - "Address:" : "Netfang:", - "Save" : "Vista", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Notanda auðkenni verður sent á þetta netfang. Þessi viðbót fer yfir viðbrögð og túlkar HTTP statuscodes 401 og 403 sem ógilda auðkenni, og öll önnur svör sem gilt auðkenni." -}, -"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/user_webdavauth/l10n/is.json b/apps/user_webdavauth/l10n/is.json deleted file mode 100644 index 08ff2d6df30..00000000000 --- a/apps/user_webdavauth/l10n/is.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV Auðkenni", - "Address:" : "Netfang:", - "Save" : "Vista", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Notanda auðkenni verður sent á þetta netfang. Þessi viðbót fer yfir viðbrögð og túlkar HTTP statuscodes 401 og 403 sem ógilda auðkenni, og öll önnur svör sem gilt auðkenni." -},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/it.js b/apps/user_webdavauth/l10n/it.js deleted file mode 100644 index cd129949e0b..00000000000 --- a/apps/user_webdavauth/l10n/it.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticazione WebDAV", - "Address:" : "Indirizzo:", - "Save" : "Salva", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Le credenziali dell'utente saranno inviate a questo indirizzo. Questa estensione controlla la risposta e interpreterà i codici di stato HTTP 401 e 403 come credenziali non valide, e tutte le altre risposte come credenziali valide." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/it.json b/apps/user_webdavauth/l10n/it.json deleted file mode 100644 index c842c6c19e6..00000000000 --- a/apps/user_webdavauth/l10n/it.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticazione WebDAV", - "Address:" : "Indirizzo:", - "Save" : "Salva", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Le credenziali dell'utente saranno inviate a questo indirizzo. Questa estensione controlla la risposta e interpreterà i codici di stato HTTP 401 e 403 come credenziali non valide, e tutte le altre risposte come credenziali valide." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ja.js b/apps/user_webdavauth/l10n/ja.js deleted file mode 100644 index 52e8445ff00..00000000000 --- a/apps/user_webdavauth/l10n/ja.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV認証", - "Address:" : "アドレス:", - "Save" : "保存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ユーザー資格情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTPステータスコードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/ja.json b/apps/user_webdavauth/l10n/ja.json deleted file mode 100644 index dbf17d776e0..00000000000 --- a/apps/user_webdavauth/l10n/ja.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV認証", - "Address:" : "アドレス:", - "Save" : "保存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ユーザー資格情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTPステータスコードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ka_GE.js b/apps/user_webdavauth/l10n/ka_GE.js deleted file mode 100644 index c8eb069dc21..00000000000 --- a/apps/user_webdavauth/l10n/ka_GE.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV აუთენთიფიკაცია", - "Save" : "შენახვა" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/ka_GE.json b/apps/user_webdavauth/l10n/ka_GE.json deleted file mode 100644 index 05851e83eed..00000000000 --- a/apps/user_webdavauth/l10n/ka_GE.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV აუთენთიფიკაცია", - "Save" : "შენახვა" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/km.js b/apps/user_webdavauth/l10n/km.js deleted file mode 100644 index 118d2c483d9..00000000000 --- a/apps/user_webdavauth/l10n/km.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ WebDAV", - "Save" : "រក្សាទុក", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "អត្តសញ្ញាណអ្នកប្រើនឹងត្រូវផ្ញើទៅអាសយដ្ឋាននេះ។ កម្មវិធីបន្ថែមនេះពិនិត្យចម្លើយតប ហើយនឹងបកស្រាយកូដស្ថានភាព HTTP ដូចជា 401 និង 403 ថាជាអត្តសញ្ញាណមិនត្រឹមត្រូវ ហើយនិងចម្លើយតបផ្សេងៗថាត្រឹមត្រូវ។" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/km.json b/apps/user_webdavauth/l10n/km.json deleted file mode 100644 index a93f04a0e31..00000000000 --- a/apps/user_webdavauth/l10n/km.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ WebDAV", - "Save" : "រក្សាទុក", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "អត្តសញ្ញាណអ្នកប្រើនឹងត្រូវផ្ញើទៅអាសយដ្ឋាននេះ។ កម្មវិធីបន្ថែមនេះពិនិត្យចម្លើយតប ហើយនឹងបកស្រាយកូដស្ថានភាព HTTP ដូចជា 401 និង 403 ថាជាអត្តសញ្ញាណមិនត្រឹមត្រូវ ហើយនិងចម្លើយតបផ្សេងៗថាត្រឹមត្រូវ។" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/kn.js b/apps/user_webdavauth/l10n/kn.js deleted file mode 100644 index 2c7f6526c06..00000000000 --- a/apps/user_webdavauth/l10n/kn.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "ಉಳಿಸಿ" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/kn.json b/apps/user_webdavauth/l10n/kn.json deleted file mode 100644 index 5699698e22c..00000000000 --- a/apps/user_webdavauth/l10n/kn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "ಉಳಿಸಿ" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ko.js b/apps/user_webdavauth/l10n/ko.js deleted file mode 100644 index 331e65c0200..00000000000 --- a/apps/user_webdavauth/l10n/ko.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV 인증", - "Address:" : "주소:", - "Save" : "저장", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud에서 이 URL로 사용자 인증 정보를 보냅니다. 이 플러그인은 응답을 확인하여 HTTP 상태 코드 401이나 403이 돌아온 경우에 잘못된 인증 정보로 간주합니다. 다른 모든 상태 코드는 올바른 인증 정보로 간주합니다." -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/ko.json b/apps/user_webdavauth/l10n/ko.json deleted file mode 100644 index 7e42e9d3fd7..00000000000 --- a/apps/user_webdavauth/l10n/ko.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV 인증", - "Address:" : "주소:", - "Save" : "저장", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud에서 이 URL로 사용자 인증 정보를 보냅니다. 이 플러그인은 응답을 확인하여 HTTP 상태 코드 401이나 403이 돌아온 경우에 잘못된 인증 정보로 간주합니다. 다른 모든 상태 코드는 올바른 인증 정보로 간주합니다." -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ku_IQ.js b/apps/user_webdavauth/l10n/ku_IQ.js deleted file mode 100644 index cdfe62f14ba..00000000000 --- a/apps/user_webdavauth/l10n/ku_IQ.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "پاشکهوتکردن" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/ku_IQ.json b/apps/user_webdavauth/l10n/ku_IQ.json deleted file mode 100644 index 63f5aac1d28..00000000000 --- a/apps/user_webdavauth/l10n/ku_IQ.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "پاشکهوتکردن" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/lb.js b/apps/user_webdavauth/l10n/lb.js deleted file mode 100644 index b358220a867..00000000000 --- a/apps/user_webdavauth/l10n/lb.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Späicheren" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/lb.json b/apps/user_webdavauth/l10n/lb.json deleted file mode 100644 index e6ae53e9625..00000000000 --- a/apps/user_webdavauth/l10n/lb.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Späicheren" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/lt_LT.js b/apps/user_webdavauth/l10n/lt_LT.js deleted file mode 100644 index 33b674d7a73..00000000000 --- a/apps/user_webdavauth/l10n/lt_LT.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV autentikacija", - "Address:" : "Adresas:", - "Save" : "Išsaugoti", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Naudotojo duomenys bus nusiųsti šiuo adresu. Šis įskiepis patikrins gautą atsakymą ir interpretuos HTTP būsenos kodą 401 ir 403 kaip negaliojančius duomenis, ir visus kitus gautus atsakymus kaip galiojančius duomenis. " -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/lt_LT.json b/apps/user_webdavauth/l10n/lt_LT.json deleted file mode 100644 index 0d43b99518d..00000000000 --- a/apps/user_webdavauth/l10n/lt_LT.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV autentikacija", - "Address:" : "Adresas:", - "Save" : "Išsaugoti", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Naudotojo duomenys bus nusiųsti šiuo adresu. Šis įskiepis patikrins gautą atsakymą ir interpretuos HTTP būsenos kodą 401 ir 403 kaip negaliojančius duomenis, ir visus kitus gautus atsakymus kaip galiojančius duomenis. " -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/lv.js b/apps/user_webdavauth/l10n/lv.js deleted file mode 100644 index 4fe05c1e1f3..00000000000 --- a/apps/user_webdavauth/l10n/lv.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV autentifikācija", - "Save" : "Saglabāt" -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/lv.json b/apps/user_webdavauth/l10n/lv.json deleted file mode 100644 index 5887d845d79..00000000000 --- a/apps/user_webdavauth/l10n/lv.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV autentifikācija", - "Save" : "Saglabāt" -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/mk.js b/apps/user_webdavauth/l10n/mk.js deleted file mode 100644 index 6a853ecbd9e..00000000000 --- a/apps/user_webdavauth/l10n/mk.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Сними" -}, -"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/user_webdavauth/l10n/mk.json b/apps/user_webdavauth/l10n/mk.json deleted file mode 100644 index 2960717f448..00000000000 --- a/apps/user_webdavauth/l10n/mk.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Сними" -},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/mn.js b/apps/user_webdavauth/l10n/mn.js deleted file mode 100644 index ecbe9c6693c..00000000000 --- a/apps/user_webdavauth/l10n/mn.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV Нотолгоо", - "Address:" : "Хаяг:", - "Save" : "Хадгалах" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/mn.json b/apps/user_webdavauth/l10n/mn.json deleted file mode 100644 index ba322132591..00000000000 --- a/apps/user_webdavauth/l10n/mn.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV Нотолгоо", - "Address:" : "Хаяг:", - "Save" : "Хадгалах" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ms_MY.js b/apps/user_webdavauth/l10n/ms_MY.js deleted file mode 100644 index 50d5a443e6a..00000000000 --- a/apps/user_webdavauth/l10n/ms_MY.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Pengesahan WebDAV", - "Address:" : "Alamat:", - "Save" : "Simpan", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Butiran pengguna akan dihantar ke alamat ini. Plugin ini memeriksa maklum balas dan akan mentafsir kod status HTTP 401 dan 403 sebagai butiran tidak sah, dan semua maklum balas lain sebagai butiran yang sah." -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/ms_MY.json b/apps/user_webdavauth/l10n/ms_MY.json deleted file mode 100644 index 875c2f6c288..00000000000 --- a/apps/user_webdavauth/l10n/ms_MY.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Pengesahan WebDAV", - "Address:" : "Alamat:", - "Save" : "Simpan", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Butiran pengguna akan dihantar ke alamat ini. Plugin ini memeriksa maklum balas dan akan mentafsir kod status HTTP 401 dan 403 sebagai butiran tidak sah, dan semua maklum balas lain sebagai butiran yang sah." -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/nb_NO.js b/apps/user_webdavauth/l10n/nb_NO.js deleted file mode 100644 index 72a099875e9..00000000000 --- a/apps/user_webdavauth/l10n/nb_NO.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-autentisering", - "Address:" : "Adresse:", - "Save" : "Lagre", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Brukerens påloggingsinformasjon vil bli sendt til denne adressen. Denne utvidelsen sjekker svaret og vil tolke HTTP-statuskodene 401 og 403 som ugyldig bruker eller passord, og alle andre svar tolkes som gyldig påloggings." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/nb_NO.json b/apps/user_webdavauth/l10n/nb_NO.json deleted file mode 100644 index 0ef46124f93..00000000000 --- a/apps/user_webdavauth/l10n/nb_NO.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-autentisering", - "Address:" : "Adresse:", - "Save" : "Lagre", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Brukerens påloggingsinformasjon vil bli sendt til denne adressen. Denne utvidelsen sjekker svaret og vil tolke HTTP-statuskodene 401 og 403 som ugyldig bruker eller passord, og alle andre svar tolkes som gyldig påloggings." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/nl.js b/apps/user_webdavauth/l10n/nl.js deleted file mode 100644 index 8633c851fbc..00000000000 --- a/apps/user_webdavauth/l10n/nl.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV authenticatie", - "Address:" : "Adres:", - "Save" : "Bewaren", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "De inloggegevens worden opgestuurd naar dit adres. Deze plugin controleert de terugkoppeling en interpreteert HTTP statuscodes 401 en 403 als ongeldige inloggegevens en alle andere terugkoppelingen als valide inloggegevens." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/nl.json b/apps/user_webdavauth/l10n/nl.json deleted file mode 100644 index 73bb6f40e51..00000000000 --- a/apps/user_webdavauth/l10n/nl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV authenticatie", - "Address:" : "Adres:", - "Save" : "Bewaren", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "De inloggegevens worden opgestuurd naar dit adres. Deze plugin controleert de terugkoppeling en interpreteert HTTP statuscodes 401 en 403 als ongeldige inloggegevens en alle andere terugkoppelingen als valide inloggegevens." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/nn_NO.js b/apps/user_webdavauth/l10n/nn_NO.js deleted file mode 100644 index 4777921772f..00000000000 --- a/apps/user_webdavauth/l10n/nn_NO.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-autentisering", - "Save" : "Lagra", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Innloggingsinformasjon blir sendt til denne nettadressa. Dette programtillegget kontrollerer svaret og tolkar HTTP-statuskodane 401 og 403 som ugyldige, og alle andre svar som gyldige." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/nn_NO.json b/apps/user_webdavauth/l10n/nn_NO.json deleted file mode 100644 index 2ad0b5b6448..00000000000 --- a/apps/user_webdavauth/l10n/nn_NO.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-autentisering", - "Save" : "Lagra", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Innloggingsinformasjon blir sendt til denne nettadressa. Dette programtillegget kontrollerer svaret og tolkar HTTP-statuskodane 401 og 403 som ugyldige, og alle andre svar som gyldige." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/oc.js b/apps/user_webdavauth/l10n/oc.js deleted file mode 100644 index 704e791756b..00000000000 --- a/apps/user_webdavauth/l10n/oc.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autentificacion WebDAV", - "Address:" : "Adreça :", - "Save" : "Salvar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las informacions de connexion de l'utilizaire seràn mandadas a aquesta adreça. Aqueste modul analisa lo còde de la responsa HTTP e considèra los còdes 401 e 403 coma una autentificacion invalida e tota autra valor coma una autentificacion valida." -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_webdavauth/l10n/oc.json b/apps/user_webdavauth/l10n/oc.json deleted file mode 100644 index a2e3daa93c3..00000000000 --- a/apps/user_webdavauth/l10n/oc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autentificacion WebDAV", - "Address:" : "Adreça :", - "Save" : "Salvar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Las informacions de connexion de l'utilizaire seràn mandadas a aquesta adreça. Aqueste modul analisa lo còde de la responsa HTTP e considèra los còdes 401 e 403 coma una autentificacion invalida e tota autra valor coma una autentificacion valida." -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/pl.js b/apps/user_webdavauth/l10n/pl.js deleted file mode 100644 index 4104adfa6b0..00000000000 --- a/apps/user_webdavauth/l10n/pl.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Uwierzytelnienie WebDAV", - "Address:" : "Adres:", - "Save" : "Zapisz", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Dane uwierzytelniające użytkownika zostaną wysłane na ten adres. Ta wtyczka sprawdza odpowiedź i będzie interpretować kody 401 i 403 statusów HTTP jako nieprawidłowe dane uwierzytelniające, a wszystkie inne odpowiedzi jako prawidłowe uwierzytelnienie." -}, -"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/pl.json b/apps/user_webdavauth/l10n/pl.json deleted file mode 100644 index 64cc4899d07..00000000000 --- a/apps/user_webdavauth/l10n/pl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Uwierzytelnienie WebDAV", - "Address:" : "Adres:", - "Save" : "Zapisz", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Dane uwierzytelniające użytkownika zostaną wysłane na ten adres. Ta wtyczka sprawdza odpowiedź i będzie interpretować kody 401 i 403 statusów HTTP jako nieprawidłowe dane uwierzytelniające, a wszystkie inne odpowiedzi jako prawidłowe uwierzytelnienie." -},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/pt_BR.js b/apps/user_webdavauth/l10n/pt_BR.js deleted file mode 100644 index b553c1b50fc..00000000000 --- a/apps/user_webdavauth/l10n/pt_BR.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticação WebDAV", - "Address:" : "Endereço:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "As credenciais de usuário serão enviadas para este endereço. Este plugin verifica a resposta e interpretará os códigos de status HTTP 401 e 403 como \"credenciais inválidas\", e todas as outras respostas como \"credenciais válidas\"." -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_webdavauth/l10n/pt_BR.json b/apps/user_webdavauth/l10n/pt_BR.json deleted file mode 100644 index b42d7a6b514..00000000000 --- a/apps/user_webdavauth/l10n/pt_BR.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticação WebDAV", - "Address:" : "Endereço:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "As credenciais de usuário serão enviadas para este endereço. Este plugin verifica a resposta e interpretará os códigos de status HTTP 401 e 403 como \"credenciais inválidas\", e todas as outras respostas como \"credenciais válidas\"." -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/pt_PT.js b/apps/user_webdavauth/l10n/pt_PT.js deleted file mode 100644 index c06d80a3e7d..00000000000 --- a/apps/user_webdavauth/l10n/pt_PT.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autenticação WebDAV", - "Address:" : "Endereço:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "As credenciais do utilizador vão ser enviadas para endereço URL. Este plugin verifica a resposta e vai interpretar os códigos de estado HTTP 401 e 403 como credenciais inválidas, e todas as outras respostas como válidas." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/pt_PT.json b/apps/user_webdavauth/l10n/pt_PT.json deleted file mode 100644 index c2a7ebf3685..00000000000 --- a/apps/user_webdavauth/l10n/pt_PT.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autenticação WebDAV", - "Address:" : "Endereço:", - "Save" : "Guardar", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "As credenciais do utilizador vão ser enviadas para endereço URL. Este plugin verifica a resposta e vai interpretar os códigos de estado HTTP 401 e 403 como credenciais inválidas, e todas as outras respostas como válidas." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ro.js b/apps/user_webdavauth/l10n/ro.js deleted file mode 100644 index 46637452e5f..00000000000 --- a/apps/user_webdavauth/l10n/ro.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Autentificare WebDAV", - "Address:" : "Adresa:", - "Save" : "Salvează" -}, -"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/user_webdavauth/l10n/ro.json b/apps/user_webdavauth/l10n/ro.json deleted file mode 100644 index c3b2bcdc970..00000000000 --- a/apps/user_webdavauth/l10n/ro.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Autentificare WebDAV", - "Address:" : "Adresa:", - "Save" : "Salvează" -},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ru.js b/apps/user_webdavauth/l10n/ru.js deleted file mode 100644 index 2af520e8396..00000000000 --- a/apps/user_webdavauth/l10n/ru.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Аутентификация WebDAV", - "Address:" : "Адрес:", - "Save" : "Сохранить", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Учётные данные пользователя будут отправлены на этот адрес. Плагин проверит ответ и будет рассматривать HTTP коды 401 и 403 как неверные учётные данные, при любом другом ответе - учётные данные пользователя верны." -}, -"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/user_webdavauth/l10n/ru.json b/apps/user_webdavauth/l10n/ru.json deleted file mode 100644 index 88b53330acc..00000000000 --- a/apps/user_webdavauth/l10n/ru.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Аутентификация WebDAV", - "Address:" : "Адрес:", - "Save" : "Сохранить", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Учётные данные пользователя будут отправлены на этот адрес. Плагин проверит ответ и будет рассматривать HTTP коды 401 и 403 как неверные учётные данные, при любом другом ответе - учётные данные пользователя верны." -},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/si_LK.js b/apps/user_webdavauth/l10n/si_LK.js deleted file mode 100644 index 4a408625e4f..00000000000 --- a/apps/user_webdavauth/l10n/si_LK.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "සුරකින්න" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/si_LK.json b/apps/user_webdavauth/l10n/si_LK.json deleted file mode 100644 index cf286f67edf..00000000000 --- a/apps/user_webdavauth/l10n/si_LK.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "සුරකින්න" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sk_SK.js b/apps/user_webdavauth/l10n/sk_SK.js deleted file mode 100644 index 455d18213e3..00000000000 --- a/apps/user_webdavauth/l10n/sk_SK.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV overenie", - "Address:" : "Adresa:", - "Save" : "Uložiť", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Používateľské prihlasovacie údaje budú odoslané na túto adresu. Tento plugin skontroluje odpoveď servera a interpretuje návratový kód HTTP 401 a 403 ako neplatné prihlasovacie údaje a akýkoľvek iný ako platné prihlasovacie údaje." -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/user_webdavauth/l10n/sk_SK.json b/apps/user_webdavauth/l10n/sk_SK.json deleted file mode 100644 index bffebf3f253..00000000000 --- a/apps/user_webdavauth/l10n/sk_SK.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV overenie", - "Address:" : "Adresa:", - "Save" : "Uložiť", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Používateľské prihlasovacie údaje budú odoslané na túto adresu. Tento plugin skontroluje odpoveď servera a interpretuje návratový kód HTTP 401 a 403 ako neplatné prihlasovacie údaje a akýkoľvek iný ako platné prihlasovacie údaje." -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sl.js b/apps/user_webdavauth/l10n/sl.js deleted file mode 100644 index e175c9b3c0c..00000000000 --- a/apps/user_webdavauth/l10n/sl.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Overitev WebDAV", - "Address:" : "Naslov:", - "Save" : "Shrani", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Uporabniška poverila bodo poslana na naveden naslov. Vstavek preveri odziv in kodi stanja 401 in 403 obravnava kot neveljavna poverila, vse ostale odzive pa kot veljavna." -}, -"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/user_webdavauth/l10n/sl.json b/apps/user_webdavauth/l10n/sl.json deleted file mode 100644 index 184d2df74b2..00000000000 --- a/apps/user_webdavauth/l10n/sl.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Overitev WebDAV", - "Address:" : "Naslov:", - "Save" : "Shrani", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Uporabniška poverila bodo poslana na naveden naslov. Vstavek preveri odziv in kodi stanja 401 in 403 obravnava kot neveljavna poverila, vse ostale odzive pa kot veljavna." -},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sq.js b/apps/user_webdavauth/l10n/sq.js deleted file mode 100644 index 73b3024dce2..00000000000 --- a/apps/user_webdavauth/l10n/sq.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Ruaj" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/sq.json b/apps/user_webdavauth/l10n/sq.json deleted file mode 100644 index c3290a31319..00000000000 --- a/apps/user_webdavauth/l10n/sq.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Ruaj" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sr.js b/apps/user_webdavauth/l10n/sr.js deleted file mode 100644 index a68c0e94395..00000000000 --- a/apps/user_webdavauth/l10n/sr.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "ВебДАВ аутентификација", - "Address:" : "Адреса:", - "Save" : "Сачувај", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Кориснички акредитиви биће послати на ову адресу. Прикључак проверава одговор и ХТТП кодове 401 и 403 тумачиће као неисправне акредитиве а све остале одговоре као исправне." -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/sr.json b/apps/user_webdavauth/l10n/sr.json deleted file mode 100644 index 5a999a10e71..00000000000 --- a/apps/user_webdavauth/l10n/sr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "ВебДАВ аутентификација", - "Address:" : "Адреса:", - "Save" : "Сачувај", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Кориснички акредитиви биће послати на ову адресу. Прикључак проверава одговор и ХТТП кодове 401 и 403 тумачиће као неисправне акредитиве а све остале одговоре као исправне." -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sr@latin.js b/apps/user_webdavauth/l10n/sr@latin.js deleted file mode 100644 index cd7a973d450..00000000000 --- a/apps/user_webdavauth/l10n/sr@latin.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV autentifikacija", - "Address:" : "Adresa:", - "Save" : "Sačuvaj", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnički akreditivi biće poslati na ovu adresu. Priključak proverava odgovor i HTTP kodove 401 i 403 tumačiće kao neispravne akreditive a sve ostale odgovore kao ispravne." -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/sr@latin.json b/apps/user_webdavauth/l10n/sr@latin.json deleted file mode 100644 index a26e0f73765..00000000000 --- a/apps/user_webdavauth/l10n/sr@latin.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV autentifikacija", - "Address:" : "Adresa:", - "Save" : "Sačuvaj", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnički akreditivi biće poslati na ovu adresu. Priključak proverava odgovor i HTTP kodove 401 i 403 tumačiće kao neispravne akreditive a sve ostale odgovore kao ispravne." -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sv.js b/apps/user_webdavauth/l10n/sv.js deleted file mode 100644 index b16f60985ea..00000000000 --- a/apps/user_webdavauth/l10n/sv.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-autentisering", - "Address:" : "Adress:", - "Save" : "Spara", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/sv.json b/apps/user_webdavauth/l10n/sv.json deleted file mode 100644 index fa09724c784..00000000000 --- a/apps/user_webdavauth/l10n/sv.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-autentisering", - "Address:" : "Adress:", - "Save" : "Spara", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ta_LK.js b/apps/user_webdavauth/l10n/ta_LK.js deleted file mode 100644 index d71f18fe198..00000000000 --- a/apps/user_webdavauth/l10n/ta_LK.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "சேமிக்க " -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/ta_LK.json b/apps/user_webdavauth/l10n/ta_LK.json deleted file mode 100644 index e881e682241..00000000000 --- a/apps/user_webdavauth/l10n/ta_LK.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "சேமிக்க " -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/te.js b/apps/user_webdavauth/l10n/te.js deleted file mode 100644 index e632cc07e4f..00000000000 --- a/apps/user_webdavauth/l10n/te.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "భద్రపరచు" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/te.json b/apps/user_webdavauth/l10n/te.json deleted file mode 100644 index d250e26411e..00000000000 --- a/apps/user_webdavauth/l10n/te.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "భద్రపరచు" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/th_TH.js b/apps/user_webdavauth/l10n/th_TH.js deleted file mode 100644 index 4dd22b61ed5..00000000000 --- a/apps/user_webdavauth/l10n/th_TH.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "ยืนยันตัวตน WebDAV", - "Address:" : "ที่อยู่:", - "Save" : "บันทึก", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "สิทธิของผู้ใช้จะถูกส่งไปยังที่อยู่นี้ ปลั๊กอินนี้จะตรวจสอบการตอบสนองและจะแปลรหัสสถานะ HTTP 401 และ 403 ข้อมูลประจำตัวที่ไม่ถูกต้องและการตอบสนองอื่นๆ ทั้งหมดให้เป็นข้อมูลประจำตัวที่ถูกต้อง" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/th_TH.json b/apps/user_webdavauth/l10n/th_TH.json deleted file mode 100644 index cbbe7b60c36..00000000000 --- a/apps/user_webdavauth/l10n/th_TH.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "ยืนยันตัวตน WebDAV", - "Address:" : "ที่อยู่:", - "Save" : "บันทึก", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "สิทธิของผู้ใช้จะถูกส่งไปยังที่อยู่นี้ ปลั๊กอินนี้จะตรวจสอบการตอบสนองและจะแปลรหัสสถานะ HTTP 401 และ 403 ข้อมูลประจำตัวที่ไม่ถูกต้องและการตอบสนองอื่นๆ ทั้งหมดให้เป็นข้อมูลประจำตัวที่ถูกต้อง" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/tr.js b/apps/user_webdavauth/l10n/tr.js deleted file mode 100644 index dd0a66a45ef..00000000000 --- a/apps/user_webdavauth/l10n/tr.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV Kimlik Doğrulaması", - "Address:" : "Adres:", - "Save" : "Kaydet", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kullanıcı kimlik bilgileri bu adrese gönderilecek. Bu eklenti yanıtı kontrol edecek ve 401 ile 403 HTTP durum kodlarını geçersiz kimlik bilgileri olarak, diğer yanıtları ise doğru kimlik bilgileri olarak algılayacaktır." -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_webdavauth/l10n/tr.json b/apps/user_webdavauth/l10n/tr.json deleted file mode 100644 index 3c8845256c3..00000000000 --- a/apps/user_webdavauth/l10n/tr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV Kimlik Doğrulaması", - "Address:" : "Adres:", - "Save" : "Kaydet", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kullanıcı kimlik bilgileri bu adrese gönderilecek. Bu eklenti yanıtı kontrol edecek ve 401 ile 403 HTTP durum kodlarını geçersiz kimlik bilgileri olarak, diğer yanıtları ise doğru kimlik bilgileri olarak algılayacaktır." -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ug.js b/apps/user_webdavauth/l10n/ug.js deleted file mode 100644 index 2fe5c26fe23..00000000000 --- a/apps/user_webdavauth/l10n/ug.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV سالاھىيەت دەلىللەش", - "Save" : "ساقلا" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/ug.json b/apps/user_webdavauth/l10n/ug.json deleted file mode 100644 index a897a27d54a..00000000000 --- a/apps/user_webdavauth/l10n/ug.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV سالاھىيەت دەلىللەش", - "Save" : "ساقلا" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/uk.js b/apps/user_webdavauth/l10n/uk.js deleted file mode 100644 index f0febc1d21c..00000000000 --- a/apps/user_webdavauth/l10n/uk.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Аутентифікація WebDAV", - "Address:" : "Адреси:", - "Save" : "Зберегти", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Облікові дані користувача буде надіслано на цю адресу. Цей плагін перевіряє відповідь і буде інтерпретувати коди статусу HTTP 401 і 403, як неправильні облікові дані, а всі інші відповіді, вважатимуться правильними." -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/uk.json b/apps/user_webdavauth/l10n/uk.json deleted file mode 100644 index 1bec19cbbdd..00000000000 --- a/apps/user_webdavauth/l10n/uk.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Аутентифікація WebDAV", - "Address:" : "Адреси:", - "Save" : "Зберегти", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Облікові дані користувача буде надіслано на цю адресу. Цей плагін перевіряє відповідь і буде інтерпретувати коди статусу HTTP 401 і 403, як неправильні облікові дані, а всі інші відповіді, вважатимуться правильними." -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/ur_PK.js b/apps/user_webdavauth/l10n/ur_PK.js deleted file mode 100644 index 45493bf7bf3..00000000000 --- a/apps/user_webdavauth/l10n/ur_PK.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "حفظ" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/ur_PK.json b/apps/user_webdavauth/l10n/ur_PK.json deleted file mode 100644 index 2c8f5af7ae5..00000000000 --- a/apps/user_webdavauth/l10n/ur_PK.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "حفظ" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/vi.js b/apps/user_webdavauth/l10n/vi.js deleted file mode 100644 index 7b8d7949ba5..00000000000 --- a/apps/user_webdavauth/l10n/vi.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "Xác thực WebDAV", - "Address:" : "Địa chỉ:", - "Save" : "Lưu", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Các thông tin người dùng sẽ được gửi đến địa chỉ này. Plugin này sẽ kiểm tra các phản hồi và các statuscodes HTTP 401 và 403 không hợp lệ, và tất cả những phản h khác như thông tin hợp lệ." -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/vi.json b/apps/user_webdavauth/l10n/vi.json deleted file mode 100644 index ebe1725a929..00000000000 --- a/apps/user_webdavauth/l10n/vi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "Xác thực WebDAV", - "Address:" : "Địa chỉ:", - "Save" : "Lưu", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Các thông tin người dùng sẽ được gửi đến địa chỉ này. Plugin này sẽ kiểm tra các phản hồi và các statuscodes HTTP 401 và 403 không hợp lệ, và tất cả những phản h khác như thông tin hợp lệ." -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/zh_CN.js b/apps/user_webdavauth/l10n/zh_CN.js deleted file mode 100644 index 9cca337fd6d..00000000000 --- a/apps/user_webdavauth/l10n/zh_CN.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV 认证", - "Address:" : "地址:", - "Save" : "保存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "用户的身份将会被发送到此 URL。这个插件检查返回值并且将 HTTP 状态编码 401 和 403 解释为非法身份,其他所有返回值为合法身份。" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/zh_CN.json b/apps/user_webdavauth/l10n/zh_CN.json deleted file mode 100644 index 5bd8489403d..00000000000 --- a/apps/user_webdavauth/l10n/zh_CN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV 认证", - "Address:" : "地址:", - "Save" : "保存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "用户的身份将会被发送到此 URL。这个插件检查返回值并且将 HTTP 状态编码 401 和 403 解释为非法身份,其他所有返回值为合法身份。" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/zh_HK.js b/apps/user_webdavauth/l10n/zh_HK.js deleted file mode 100644 index 87e29b7432f..00000000000 --- a/apps/user_webdavauth/l10n/zh_HK.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV 認證", - "Address:" : "地址:", - "Save" : "儲存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/zh_HK.json b/apps/user_webdavauth/l10n/zh_HK.json deleted file mode 100644 index a2108b738be..00000000000 --- a/apps/user_webdavauth/l10n/zh_HK.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV 認證", - "Address:" : "地址:", - "Save" : "儲存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/zh_TW.js b/apps/user_webdavauth/l10n/zh_TW.js deleted file mode 100644 index a4de3acc406..00000000000 --- a/apps/user_webdavauth/l10n/zh_TW.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV 認證", - "Save" : "儲存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/zh_TW.json b/apps/user_webdavauth/l10n/zh_TW.json deleted file mode 100644 index aca5151be08..00000000000 --- a/apps/user_webdavauth/l10n/zh_TW.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV 認證", - "Save" : "儲存", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_webdavauth/templates/settings.php b/apps/user_webdavauth/templates/settings.php deleted file mode 100644 index a87c0ad159a..00000000000 --- a/apps/user_webdavauth/templates/settings.php +++ /dev/null @@ -1,7 +0,0 @@ -<form id="webdavauth" class="section" action="#" method="post"> - <h2><?php p($l->t('WebDAV Authentication'));?></h2> - <p><label for="webdav_url"><?php p($l->t('Address:').' ');?><input type="url" placeholder="https://example.com/webdav" id="webdav_url" name="webdav_url" value="<?php p($_['webdav_url']); ?>"></label> - <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" id="requesttoken"> - <input type="submit" value="<?php p($l->t('Save')); ?>" /> - <br /><?php p($l->t('The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials.')); ?> -</form> diff --git a/apps/user_webdavauth/user_webdavauth.php b/apps/user_webdavauth/user_webdavauth.php deleted file mode 100644 index acd7ec8507c..00000000000 --- a/apps/user_webdavauth/user_webdavauth.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * @author Bart Visscher <bartv@thisnet.nl> - * @author Felix Moeller <mail@felixmoeller.de> - * @author Frank Karlitschek <frank@owncloud.org> - * @author Georg Ehrke <georg@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author opensaucesystems <ashley@opensaucesystems.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -class OC_USER_WEBDAVAUTH extends OC_User_Backend implements \OCP\IUserBackend { - protected $webdavauth_url; - - public function __construct() { - $this->webdavauth_url = OC_Config::getValue( "user_webdavauth_url" ); - } - - public function deleteUser($uid) { - // Can't delete user - OCP\Util::writeLog('OC_USER_WEBDAVAUTH', 'Not possible to delete users from web frontend using WebDAV user backend', 3); - return false; - } - - public function setPassword ( $uid, $password ) { - // We can't change user password - OCP\Util::writeLog('OC_USER_WEBDAVAUTH', 'Not possible to change password for users from web frontend using WebDAV user backend', 3); - return false; - } - - public function checkPassword( $uid, $password ) { - $arr = explode('://', $this->webdavauth_url, 2); - if( ! isset($arr) OR count($arr) !== 2) { - OCP\Util::writeLog('OC_USER_WEBDAVAUTH', 'Invalid Url: "'.$this->webdavauth_url.'" ', 3); - return false; - } - list($webdavauth_protocol, $webdavauth_url_path) = $arr; - $url= $webdavauth_protocol.'://'.urlencode($uid).':'.urlencode($password).'@'.$webdavauth_url_path; - $headers = get_headers($url); - if($headers==false) { - OCP\Util::writeLog('OC_USER_WEBDAVAUTH', 'Not possible to connect to WebDAV Url: "'.$webdavauth_protocol.'://'.$webdavauth_url_path.'" ', 3); - return false; - - } - $returncode= substr($headers[0], 9, 3); - - if(substr($returncode, 0, 1) === '2') { - return $uid; - } else { - return false; - } - - } - - /* - * we don´t know if a user exists without the password. so we have to return true all the time - */ - public function userExists( $uid ){ - return true; - } - - /** - * @return bool - */ - public function hasUserListings() { - return false; - } - - /* - * we don´t know the users so all we can do it return an empty array here - */ - public function getUsers($search = '', $limit = 10, $offset = 0) { - $returnArray = array(); - - return $returnArray; - } - - /** - * Backend name to be shown in user management - * @return string the name of the backend to be shown - */ - public function getBackendName(){ - return 'WebDAV'; - } -} diff --git a/autotest-external.sh b/autotest-external.sh index cb5a3dad503..b738669b48c 100755 --- a/autotest-external.sh +++ b/autotest-external.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/autotest-js.sh b/autotest-js.sh index 99cc09f9085..2d8552811cf 100755 --- a/autotest-js.sh +++ b/autotest-js.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/autotest.sh b/autotest.sh index 8d0e20cf2a8..460fa9e38b1 100755 --- a/autotest.sh +++ b/autotest.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # @@ -9,6 +9,7 @@ # @author Andreas Fischer # @author Joas Schilling # @author Lukas Reschke +# @author Jörn Friedrich Dreyer # @copyright 2012-2015 Thomas Müller thomas.mueller@tmit.eu # @@ -21,6 +22,7 @@ DATABASEHOST=localhost ADMINLOGIN=admin$EXECUTOR_NUMBER BASEDIR=$PWD +PRIMARY_STORAGE_CONFIGS="local swift" DBCONFIGS="sqlite mysql mariadb pgsql oci" # $PHP_EXE is run through 'which' and as such e.g. 'php' or 'hhvm' is usually @@ -91,6 +93,22 @@ if [ "$1" ]; then exit 2 fi fi +if [ "$PRIMARY_STORAGE_CONFIG" ]; then + FOUND=0 + for PSC in $PRIMARY_STORAGE_CONFIGS; do + if [ "$PRIMARY_STORAGE_CONFIG" = "$PSC" ]; then + FOUND=1 + break + fi + done + if [ $FOUND = 0 ]; then + echo -e "Unknown primary storage config name \"$PRIMARY_STORAGE_CONFIG\"\n" >&2 + print_syntax + exit 2 + fi +else + PRIMARY_STORAGE_CONFIG="local" +fi # check for the presence of @since in all OCP methods $PHP build/OCPSinceChecker.php @@ -101,12 +119,17 @@ if [ -f config/config.php ] && [ ! -f config/config-autotest-backup.php ]; then fi function cleanup_config { + if [ ! -z "$DOCKER_CONTAINER_ID" ]; then echo "Kill the docker $DOCKER_CONTAINER_ID" docker rm -f "$DOCKER_CONTAINER_ID" fi cd "$BASEDIR" + if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then + echo "Kill the swift docker" + tests/objectstore/stop-swift-ceph.sh + fi # Restore existing config if [ -f config/config-autotest-backup.php ]; then mv config/config-autotest-backup.php config/config.php @@ -115,6 +138,10 @@ function cleanup_config { if [ -f config/autoconfig.php ]; then rm config/autoconfig.php fi + # Remove autotest swift storage config + if [ -f config/autotest-storage-swift.config.php ]; then + rm config/autotest-storage-swift.config.php + fi } # restore config on exit @@ -131,7 +158,7 @@ echo "Using database $DATABASENAME" function execute_tests { DB=$1 - echo "Setup environment for $DB testing ..." + echo "Setup environment for $DB testing on $PRIMARY_STORAGE_CONFIG storage ..." # back to root folder cd "$BASEDIR" @@ -142,6 +169,10 @@ function execute_tests { rm -rf "$DATADIR" mkdir "$DATADIR" + if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then + tests/objectstore/start-swift-ceph.sh + cp tests/objectstore/swift.config.php config/autotest-storage-swift.config.php + fi cp tests/preseed-config.php config/config.php _DB=$DB @@ -171,7 +202,7 @@ function execute_tests { else if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ] ; then echo "Your mysql binary is not provided by MariaDB" - echo "To use the docker container set the USEDOCKER enviroment variable" + echo "To use the docker container set the USEDOCKER environment variable" exit -1 fi mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true @@ -203,8 +234,14 @@ function execute_tests { echo "Waiting for Oracle initialization ... " - # grep exits on the first match and then the script continues - times out after 2 minutes - timeout 240 docker logs -f "$DOCKER_CONTAINER_ID" 2>&1 | grep -q "Grant succeeded." + # Try to connect to the OCI host via sqlplus to ensure that the connection is already running + for i in {1..48} + do + if sqlplus "system/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=$DATABASEHOST)(Port=1521))(CONNECT_DATA=(SID=XE)))" < /dev/null | grep 'Connected to'; then + break; + fi + sleep 5 + done DATABASEUSER=autotest DATABASENAME='XE' @@ -232,6 +269,12 @@ function execute_tests { RESULT=$? fi + if [ "$PRIMARY_STORAGE_CONFIG" == "swift" ] ; then + cd .. + echo "Kill the swift docker" + tests/objectstore/stop-swift-ceph.sh + fi + if [ ! -z "$DOCKER_CONTAINER_ID" ] ; then echo "Kill the docker $DOCKER_CONTAINER_ID" docker rm -f $DOCKER_CONTAINER_ID diff --git a/build/integration/.gitignore b/build/integration/.gitignore new file mode 100644 index 00000000000..18b981bf7ed --- /dev/null +++ b/build/integration/.gitignore @@ -0,0 +1,3 @@ +vendor +output +composer.lock diff --git a/build/integration/composer.json b/build/integration/composer.json new file mode 100644 index 00000000000..98b2f294c7a --- /dev/null +++ b/build/integration/composer.json @@ -0,0 +1,7 @@ +{ + "require-dev": { + "phpunit/phpunit": "~4.6", + "guzzlehttp/guzzle": "~5.0", + "behat/behat": "2.4.*@stable" + } +} diff --git a/build/integration/config/behat.yml b/build/integration/config/behat.yml new file mode 100644 index 00000000000..01ca0d18790 --- /dev/null +++ b/build/integration/config/behat.yml @@ -0,0 +1,17 @@ +default: + paths: + features: ../features + bootstrap: %behat.paths.features%/bootstrap + + context: + parameters: + baseUrl: http://localhost:8080/ocs/ + admin: + - admin + - admin + +ci: + formatter: + name: pretty,junit + parameters: + output_path: null,./output diff --git a/build/integration/features/bootstrap/FeatureContext.php b/build/integration/features/bootstrap/FeatureContext.php new file mode 100644 index 00000000000..caff517a16d --- /dev/null +++ b/build/integration/features/bootstrap/FeatureContext.php @@ -0,0 +1,248 @@ +<?php + +use Behat\Behat\Context\BehatContext; +use GuzzleHttp\Client; +use GuzzleHttp\Message\ResponseInterface; + +require __DIR__ . '/../../vendor/autoload.php'; + +/** + * Features context. + */ +class FeatureContext extends BehatContext { + + /** @var string */ + private $baseUrl = ''; + + /** @var ResponseInterface */ + private $response = null; + + /** @var string */ + private $currentUser = ''; + + /** @var int */ + private $apiVersion = 1; + + /** + * Initializes context. + * Every scenario gets it's own context object. + * + * @param array $parameters context parameters (set them up through behat.yml) + */ + public function __construct(array $parameters) { + + // Initialize your context here + $this->baseUrl = $parameters['baseUrl']; + $this->adminUser = $parameters['admin']; + + // in case of ci deployment we take the server url from the environment + $testServerUrl = getenv('TEST_SERVER_URL'); + if ($testServerUrl !== false) { + $this->baseUrl = $testServerUrl; + } + } + + /** + * @When /^sending "([^"]*)" to "([^"]*)"$/ + */ + public function sendingTo($verb, $url) { + $this->sendingToWith($verb, $url, null); + } + + /** + * Parses the xml answer to get ocs response which doesn't match with + * http one in v1 of the api. + */ + public function getOCSResponse($response) { + return $response->xml()->meta[0]->statuscode; + } + + /** + * Parses the xml answer to get the array of users returned. + */ + public function getArrayOfUsersResponded($resp) { + $listCheckedElements = $resp->xml()->data[0]->users[0]->element; + $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1); + return $extractedElementsArray; + } + + /** + * Parses the xml answer to get the array of groups returned. + */ + public function getArrayOfGroupsResponded($resp) { + $listCheckedElements = $resp->xml()->data[0]->groups[0]->element; + $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1); + return $extractedElementsArray; + } + + /** + * @Then /^users returned are$/ + * @param \Behat\Gherkin\Node\TableNode|null $formData + */ + public function theUsersShouldBe($usersList) { + if ($usersList instanceof \Behat\Gherkin\Node\TableNode) { + $users = $usersList->getRows()[0]; + $respondedArray = $this->getArrayOfUsersResponded($this->response); + PHPUnit_Framework_Assert::assertEquals(asort($users), asort($respondedArray)); + } + + } + + /** + * @Then /^groups returned are$/ + * @param \Behat\Gherkin\Node\TableNode|null $formData + */ + public function theGroupsShouldBe($groupsList) { + if ($groupsList instanceof \Behat\Gherkin\Node\TableNode) { + $groups = $groupsList->getRows()[0]; + $respondedArray = $this->getArrayOfGroupsResponded($this->response); + PHPUnit_Framework_Assert::assertEquals(asort($groups), asort($respondedArray)); + } + + } + + /** + * @Then /^the OCS status code should be "([^"]*)"$/ + */ + public function theOCSStatusCodeShouldBe($statusCode) { + PHPUnit_Framework_Assert::assertEquals($statusCode, $this->getOCSResponse($this->response)); + } + + /** + * @Then /^the HTTP status code should be "([^"]*)"$/ + */ + public function theHTTPStatusCodeShouldBe($statusCode) { + PHPUnit_Framework_Assert::assertEquals($statusCode, $this->response->getStatusCode()); + } + + /** + * @Given /^As an "([^"]*)"$/ + */ + public function asAn($user) { + $this->currentUser = $user; + } + + /** + * @Given /^using api version "([^"]*)"$/ + */ + public function usingApiVersion($version) { + $this->apiVersion = $version; + } + + /** + * @Given /^user "([^"]*)" exists$/ + */ + public function userExists($user) { + $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $this->response = $client->get($fullUrl, $options); + PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); + } + + /** + * @Given /^user "([^"]*)" does not exist$/ + */ + public function userDoesNotExist($user) { + try { + $this->userExists($user); + PHPUnit_Framework_Assert::fail('The user "' . $user . '" exists'); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode()); + } + } + + /** + * @When /^creating the user "([^"]*)r"$/ + */ + public function creatingTheUser($user) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $this->response = $client->post($fullUrl, [ + 'form_params' => [ + 'userid' => $user, + 'password' => '123456' + ] + ]); + + } + + /** + * @When /^creating the group "([^"]*)r"$/ + */ + public function creatingTheGroup($group) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/addgroup"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $this->response = $client->post($fullUrl, [ + 'form_params' => [ + 'groupid' => $user + ] + ]); + } + + /** + * @Given /^group "([^"]*)" exists$/ + */ + public function groupExists($group) { + $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group"; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + + $this->response = $client->get($fullUrl, $options); + PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode()); + } + + /** + * @Given /^group "([^"]*)" does not exist$/ + */ + public function groupDoesNotExist($group) { + try { + $this->groupExists($group); + PHPUnit_Framework_Assert::fail('The group "' . $group . '" exists'); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode()); + } + } + + /** + * @When /^sending "([^"]*)" to "([^"]*)" with$/ + * @param \Behat\Gherkin\Node\TableNode|null $formData + */ + public function sendingToWith($verb, $url, $body) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url; + $client = new Client(); + $options = []; + if ($this->currentUser === 'admin') { + $options['auth'] = $this->adminUser; + } + if ($body instanceof \Behat\Gherkin\Node\TableNode) { + $fd = $body->getRowsHash(); + $options['body'] = $fd; + } + + try { + $this->response = $client->send($client->createRequest($verb, $fullUrl, $options)); + } catch (\GuzzleHttp\Exception\ClientException $ex) { + $this->response = $ex->getResponse(); + } + } +} diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature new file mode 100644 index 00000000000..d865ee687ed --- /dev/null +++ b/build/integration/features/provisioning-v1.feature @@ -0,0 +1,106 @@ +Feature: provisioning + Background: + Given using api version "1" + + Scenario: Getting an not existing user + Given As an "admin" + When sending "GET" to "/cloud/users/test" + Then the OCS status code should be "998" + And the HTTP status code should be "200" + + Scenario: Listing all users + Given As an "admin" + When sending "GET" to "/cloud/users" + Then the OCS status code should be "100" + And the HTTP status code should be "200" + + Scenario: Create a user + Given As an "admin" + And user "brand-new-user" does not exist + When sending "POST" to "/cloud/users" with + | userid | brand-new-user | + | password | 123456 | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And user "brand-new-user" exists + + Scenario: Create an existing user + Given As an "admin" + And user "brand-new-user" exists + When sending "POST" to "/cloud/users" with + | userid | brand-new-user | + | password | 123456 | + Then the OCS status code should be "102" + And the HTTP status code should be "200" + + Scenario: Get an existing user + Given As an "admin" + When sending "GET" to "/cloud/users/brand-new-user" + Then the OCS status code should be "100" + And the HTTP status code should be "200" + + + Scenario: Getting all users + Given As an "admin" + And user "brand-new-user" exists + And user "admin" exists + When sending "GET" to "/cloud/users" + And users returned are + | brand-new-user | + | admin | + + + Scenario: Edit a user + Given As an "admin" + And user "brand-new-user" exists + When sending "PUT" to "/cloud/users/brand-new-user" with + | key | quota | + | value | 12MB | + | key | email | + | value | brand-new-user@gmail.com | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And user "brand-new-user" exists + + + Scenario: Delete a user + Given As an "admin" + And user "brand-new-user" exists + When sending "DELETE" to "/cloud/users/brand-new-user" + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And user "brand-new-user" does not exist + + + Scenario: Create a group + Given As an "admin" + And group "new-group" does not exist + When sending "POST" to "/cloud/groups" with + | groupid | new-group | + | password | 123456 | + + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And group "new-group" exists + + + Scenario: Getting all groups + Given As an "admin" + And group "new-group" exists + And group "admin" exists + When sending "GET" to "/cloud/groups" + And groups returned are + | admin | + | new-group | + + + Scenario: Delete a group + Given As an "admin" + And group "new-group" exists + When sending "DELETE" to "/cloud/groups/new-group" + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And group "new-group" does not exist + + + diff --git a/build/integration/features/provisioning-v2.feature b/build/integration/features/provisioning-v2.feature new file mode 100644 index 00000000000..6140128684d --- /dev/null +++ b/build/integration/features/provisioning-v2.feature @@ -0,0 +1,9 @@ +Feature: provisioning + Background: + Given using api version "2" + + Scenario: Getting an not existing user + Given As an "admin" + When sending "GET" to "/cloud/users/test" + Then the HTTP status code should be "404" + diff --git a/build/integration/run.sh b/build/integration/run.sh new file mode 100755 index 00000000000..08f10b86c5f --- /dev/null +++ b/build/integration/run.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +composer install + +# TODO: avoid port collision on jenkins - use $EXECUTOR_NUMBER +if [ -z "$EXECUTOR_NUMBER" ]; then + EXECUTOR_NUMBER=0 +fi +PORT=$((8080 + $EXECUTOR_NUMBER)) +#PORT=8080 +echo $PORT +php -S localhost:$PORT -t ../.. & +PHPPID=$! +echo $PHPPID + +export TEST_SERVER_URL="http://localhost:$PORT/ocs/" +vendor/bin/behat --profile ci + +kill $PHPPID diff --git a/build/license.php b/build/license.php index 214ea3c2269..26b02bc71c3 100644 --- a/build/license.php +++ b/build/license.php @@ -144,7 +144,9 @@ EOD; } private function getAuthors($file) { - $out = shell_exec("git blame --line-porcelain $file | sed -n 's/^author //p;s/^author-mail //p' | sed 'N;s/\\n/ /' | sort -f | uniq"); + // only add authors that changed code and not the license header + $licenseHeaderEndsAtLine = trim(shell_exec("grep -n '*/' $file | head -n 1 | cut -d ':' -f 1")); + $out = shell_exec("git blame --line-porcelain -L $licenseHeaderEndsAtLine, $file | sed -n 's/^author //p;s/^author-mail //p' | sed 'N;s/\\n/ /' | sort -f | uniq"); $authors = explode(PHP_EOL, $out); $authors = array_filter($authors, function($author) { @@ -173,7 +175,6 @@ if (isset($argv[1])) { '../apps/files_versions', '../apps/provisioning_api', '../apps/user_ldap', - '../apps/user_webdavauth', '../core', '../lib', '../ocs', diff --git a/buildjsdocs.sh b/buildjsdocs.sh index ef18dc8c9a9..90562558f66 100755 --- a/buildjsdocs.sh +++ b/buildjsdocs.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # ownCloud # diff --git a/config/config.sample.php b/config/config.sample.php index d561ad27e84..743d76aae35 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -55,12 +55,6 @@ $CONFIG = array( 'passwordsalt' => '', /** - * The hashing cost used by hashes generated by ownCloud - * Using a higher value requires more time and CPU power to calculate the hashes - */ -'hashingCost' => 10, - -/** * Your list of trusted domains that users can log into. Specifying trusted * domains prevents host header poisoning. Do not remove this, as it performs * necessary security checks. @@ -80,16 +74,6 @@ $CONFIG = array( 'datadirectory' => '/var/www/owncloud/data', /** - * Override where ownCloud stores temporary files. Useful in situations where - * the system temporary directory is on a limited space ramdisk or is otherwise - * restricted, or if external storages which do not support streaming are in - * use. - * - * The web server user must have write access to this directory. - */ -'tempdirectory' => '/tmp/owncloudtemp', - -/** * The current version number of your ownCloud installation. This is set up * during installation and update, so you shouldn't need to change it. */ @@ -140,20 +124,6 @@ $CONFIG = array( 'dbtableprefix' => '', /** - * Additional driver options for the database connection, eg. to enable SSL - * encryption in MySQL. - */ -'dbdriveroptions' => array( - PDO::MYSQL_ATTR_SSL_CA => '/file/path/to/ca_cert.pem', -), - -/** - * sqlite3 journal mode can be specified using this config parameter - can be - * 'WAL' or 'DELETE' see for more details https://www.sqlite.org/wal.html - */ -'sqlite.journal_mode' => 'DELETE', - -/** * Indicates whether the ownCloud instance was installed successfully; ``true`` * indicates a successful installation, and ``false`` indicates an unsuccessful * installation. @@ -417,19 +387,21 @@ $CONFIG = array( * * Available values: * - * * ``auto`` default setting. keeps files and folders in the trash bin - * for 30 days and automatically deletes anytime after that - * if space is needed (note: files may not be deleted if space - * is not needed). - * * ``D, auto`` keeps files and folders in the trash bin for D+ days, - * delete anytime if space needed (note: files may not be deleted - * if space is not needed) - * * ``auto, D`` delete all files in the trash bin that are older than D days - * automatically, delete other files anytime if space needed - * * ``D1, D2`` keep files and folders the in trash bin for at least D1 days - * and delete when exceeds D2 days - * * ``disabled`` trash bin auto clean disabled, files and folders will be - * kept forever + * * ``auto`` + * default setting. keeps files and folders in the trash bin for 30 days + * and automatically deletes anytime after that if space is needed (note: + * files may not be deleted if space is not needed). + * * ``D, auto`` + * keeps files and folders in the trash bin for D+ days, delete anytime if + * space needed (note: files may not be deleted if space is not needed) + * * ``auto, D`` + * delete all files in the trash bin that are older than D days + * automatically, delete other files anytime if space needed + * * ``D1, D2`` + * keep files and folders the in trash bin for at least D1 days and + * delete when exceeds D2 days + * * ``disabled`` + * trash bin auto clean disabled, files and folders will be kept forever */ 'trashbin_retention_obligation' => 'auto', @@ -448,19 +420,24 @@ $CONFIG = array( * ownCloud 8.1 and before. * * Available values: - * ``auto`` default setting. Automatically expire versions according to - * expire rules. Please refer to Files_versions online documentation - * for more info. - * ``D, auto`` keep versions at least for D days, apply expire rules to all - * versions that older than D days - * * ``auto, D`` delete all versions that are older than D days automatically, - * delete other versions according to expire rules - * * ``D1, D2`` keep versions for at least D1 days and delete when exceeds D2 days - * ``disabled`` versions auto clean disabled, versions will be kept forever + * + * * ``auto`` + * default setting. Automatically expire versions according to expire + * rules. Please refer to Files_versions online documentation for more + * info. + * * ``D, auto`` + * keep versions at least for D days, apply expire rules to all versions + * that are older than D days + * * ``auto, D`` + * delete all versions that are older than D days automatically, delete + * other versions according to expire rules + * * ``D1, D2`` + * keep versions for at least D1 days and delete when exceeds D2 days + * * ``disabled`` + * versions auto clean disabled, versions will be kept forever */ 'versions_retention_obligation' => 'auto', - /** * ownCloud Verifications * @@ -609,7 +586,9 @@ $CONFIG = array( /** * ownCloud uses some 3rd party PHP components to provide certain functionality. * These components are shipped as part of the software package and reside in - * ``owncloud/3rdparty``. Use this option to configure a different location. + * ``owncloud/3rdparty``. Use this option to configure a different location. + * For example, if your location is /var/www/owncloud/foo/3rdparty, then the + * correct configuration is '3rdpartyroot' => '/var/www/owncloud/foo/', */ '3rdpartyroot' => '', @@ -804,6 +783,21 @@ $CONFIG = array( */ 'ldapUserCleanupInterval' => 51, +/** + * Enforce the existence of the home folder naming rule for all users + * + * Following scenario: + * * a home folder naming rule is set in LDAP advanced settings + * * a user doesn't have the home folder naming rule attribute set + * + * If this is set to **true** (default) it will NOT fallback to the core's + * default naming rule of using the internal user ID as home folder name. + * + * If this is set to **false** it will fallback for the users without the + * attribute set to naming the home folder like the internal user ID. + * + */ +'enforce_home_folder_naming_rule' => true, /** * Maintenance @@ -951,6 +945,24 @@ $CONFIG = array( ), /** + * All other config options + */ + +/** + * Additional driver options for the database connection, eg. to enable SSL + * encryption in MySQL. + */ +'dbdriveroptions' => array( + PDO::MYSQL_ATTR_SSL_CA => '/file/path/to/ca_cert.pem', +), + +/** + * sqlite3 journal mode can be specified using this config parameter - can be + * 'WAL' or 'DELETE' see for more details https://www.sqlite.org/wal.html + */ +'sqlite.journal_mode' => 'DELETE', + +/** * Database types that are supported for installation. * * Available: @@ -967,8 +979,20 @@ $CONFIG = array( ), /** - * All other config options + * Override where ownCloud stores temporary files. Useful in situations where + * the system temporary directory is on a limited space ramdisk or is otherwise + * restricted, or if external storages which do not support streaming are in + * use. + * + * The web server user must have write access to this directory. + */ +'tempdirectory' => '/tmp/owncloudtemp', + +/** + * The hashing cost used by hashes generated by ownCloud + * Using a higher value requires more time and CPU power to calculate the hashes */ +'hashingCost' => 10, /** * Blacklist a specific file or files and disallow the upload of files @@ -1046,8 +1070,9 @@ $CONFIG = array( /** * Where ``mount.json`` file should be stored, defaults to ``data/mount.json`` + * in the ownCloud directory. */ -'mount_file' => 'data/mount.json', +'mount_file' => '/var/www/owncloud/data/mount.json', /** * When ``true``, prevent ownCloud from changing the cache due to changes in the @@ -1063,6 +1088,9 @@ $CONFIG = array( /** * List of trusted proxy servers + * + * If you configure these also consider setting `forwarded_for_headers` which + * otherwise defaults to `HTTP_X_FORWARDED_FOR` (the `X-Forwarded-For` header). */ 'trusted_proxies' => array('203.0.113.45', '198.51.100.128'), @@ -1117,6 +1145,15 @@ $CONFIG = array( 'debug' => false, /** + * Skips the migration test during upgrades + * + * If this is set to true the migration test are deactivated during upgrade. + * This is only recommended in installations where upgrade tests are run in + * advance with the same data on a test system. + */ +'update.skip-migration-test' => false, + +/** * This entry is just here to show a warning in case somebody copied the sample * configuration. DO NOT ADD THIS SWITCH TO YOUR CONFIGURATION! * diff --git a/console.php b/console.php index a5808f4a06a..8bfbabf2a03 100644 --- a/console.php +++ b/console.php @@ -5,6 +5,7 @@ * @author Jost Baron <Jost.Baron@gmx.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Philippe Le Brouster <plb@nebkha.net> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/core/ajax/preview.php b/core/ajax/preview.php index baa0ed4ec61..05eb4b62b79 100644 --- a/core/ajax/preview.php +++ b/core/ajax/preview.php @@ -3,6 +3,7 @@ * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @@ -26,8 +27,8 @@ \OC::$server->getSession()->close(); $file = array_key_exists('file', $_GET) ? (string)$_GET['file'] : ''; -$maxX = array_key_exists('x', $_GET) ? (int)$_GET['x'] : '36'; -$maxY = array_key_exists('y', $_GET) ? (int)$_GET['y'] : '36'; +$maxX = array_key_exists('x', $_GET) ? (int)$_GET['x'] : '32'; +$maxY = array_key_exists('y', $_GET) ? (int)$_GET['y'] : '32'; $scalingUp = array_key_exists('scalingup', $_GET) ? (bool)$_GET['scalingup'] : true; $keepAspect = array_key_exists('a', $_GET) ? true : false; $always = array_key_exists('forceIcon', $_GET) ? (bool)$_GET['forceIcon'] : true; @@ -53,7 +54,7 @@ if (!$info instanceof OCP\Files\FileInfo || !$always && !\OC::$server->getPrevie \OC_Response::setStatus(404); } else { $preview = new \OC\Preview(\OC_User::getUser(), 'files'); - $preview->setFile($file); + $preview->setFile($file, $info); $preview->setMaxX($maxX); $preview->setMaxY($maxY); $preview->setScalingUp($scalingUp); diff --git a/core/ajax/share.php b/core/ajax/share.php index 69b84564ab1..4738d0e0827 100644 --- a/core/ajax/share.php +++ b/core/ajax/share.php @@ -5,6 +5,7 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Craig Morrissey <craig@owncloud.com> * @author dampfklon <me@dampfklon.de> + * @author Felix Böhm <felixboehm@gmx.de> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> @@ -183,6 +184,37 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo $result = $mailNotification->sendLinkShareMail($to_address, $file, $link, $expiration); if(empty($result)) { + // Get the token from the link + $linkParts = explode('/', $link); + $token = array_pop($linkParts); + + // Get the share for the token + $share = \OCP\Share::getShareByToken($token, false); + if ($share !== false) { + $currentUser = \OC::$server->getUserSession()->getUser()->getUID(); + $file = '/' . ltrim($file, '/'); + + // Check whether share belongs to the user and whether the file is the same + if ($share['file_target'] === $file && $share['uid_owner'] === $currentUser) { + + // Get the path for the user + $view = new \OC\Files\View('/' . $currentUser . '/files'); + $fileId = (int) $share['item_source']; + $path = $view->getPath((int) $share['item_source']); + + if ($path !== null) { + $event = \OC::$server->getActivityManager()->generateEvent(); + $event->setApp(\OCA\Files_Sharing\Activity::FILES_SHARING_APP) + ->setType(\OCA\Files_Sharing\Activity::TYPE_SHARED) + ->setAuthor($currentUser) + ->setAffectedUser($currentUser) + ->setObject('files', $fileId, $path) + ->setSubject(\OCA\Files_Sharing\Activity::SUBJECT_SHARED_EMAIL, [$path, $to_address]); + \OC::$server->getActivityManager()->publish($event); + } + } + } + \OCP\JSON::success(); } else { $l = \OC::$server->getL10N('core'); @@ -379,6 +411,16 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo } } + $sharingAutocompletion = \OC::$server->getConfig() + ->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes'); + + if ($sharingAutocompletion !== 'yes') { + $searchTerm = strtolower($_GET['search']); + $shareWith = array_filter($shareWith, function($user) use ($searchTerm) { + return strtolower($user['label']) === $searchTerm + || strtolower($user['value']['shareWith']) === $searchTerm; + }); + } $sorter = new \OC\Share\SearchResultSorter((string)$_GET['search'], 'label', diff --git a/core/ajax/update.php b/core/ajax/update.php index a693deeb9cf..11d159f15d1 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -41,12 +41,21 @@ if (OC::checkUpgrade(false)) { // avoid side effects \OC_User::setIncognitoMode(true); + + $logger = \OC::$server->getLogger(); + $config = \OC::$server->getConfig(); $updater = new \OC\Updater( \OC::$server->getHTTPHelper(), - \OC::$server->getConfig(), + $config, $logger ); + + if ($config->getSystemValue('update.skip-migration-test', false)) { + $eventSource->send('success', (string)$l->t('Migration tests are skipped - "update.skip-migration-test" is activated in config.php')); + $updater->setSimulateStepEnabled(false); + } + $incompatibleApps = []; $disabledThirdPartyApps = []; @@ -88,6 +97,12 @@ if (OC::checkUpgrade(false)) { $eventSource->close(); OC_Config::setValue('maintenance', false); }); + $updater->listen('\OC\Updater', 'setDebugLogLevel', function ($logLevel, $logLevelName) use($eventSource, $l) { + $eventSource->send('success', (string)$l->t('Set log level to debug - current level: "%s"', [ $logLevelName ])); + }); + $updater->listen('\OC\Updater', 'resetLogLevel', function ($logLevel, $logLevelName) use($eventSource, $l) { + $eventSource->send('success', (string)$l->t('Reset log level to "%s"', [ $logLevelName ])); + }); try { $updater->upgrade(); diff --git a/core/application.php b/core/application.php index 12ec6b63fd4..eab2c686dc1 100644 --- a/core/application.php +++ b/core/application.php @@ -85,7 +85,8 @@ class Application extends App { $c->query('L10N'), $c->query('UserManager'), $c->query('UserSession'), - $c->query('UserFolder') + $c->query('UserFolder'), + $c->query('Logger') ); }); @@ -128,6 +129,9 @@ class Application extends App { $container->registerService('Mailer', function(SimpleContainer $c) { return $c->query('ServerContainer')->getMailer(); }); + $container->registerService('Logger', function(SimpleContainer $c) { + return $c->query('ServerContainer')->getLogger(); + }); $container->registerService('TimeFactory', function(SimpleContainer $c) { return new TimeFactory(); }); diff --git a/core/avatar/avatarcontroller.php b/core/avatar/avatarcontroller.php index 945e022600a..e15b47e9a84 100644 --- a/core/avatar/avatarcontroller.php +++ b/core/avatar/avatarcontroller.php @@ -5,6 +5,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Roeland Jago Douma <roeland@famdouma.nl> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -29,7 +30,7 @@ use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\DataDisplayResponse; use OCP\IAvatarManager; -use OCP\ICache; +use OCP\ILogger; use OCP\IL10N; use OCP\IRequest; use OCP\IUserManager; @@ -61,6 +62,9 @@ class AvatarController extends Controller { /** @var Folder */ protected $userFolder; + /** @var ILogger */ + protected $logger; + /** * @param string $appName * @param IRequest $request @@ -70,6 +74,7 @@ class AvatarController extends Controller { * @param IUserManager $userManager * @param IUserSession $userSession * @param Folder $userFolder + * @param ILogger $logger */ public function __construct($appName, IRequest $request, @@ -78,7 +83,8 @@ class AvatarController extends Controller { IL10N $l10n, IUserManager $userManager, IUserSession $userSession, - Folder $userFolder) { + Folder $userFolder, + ILogger $logger) { parent::__construct($appName, $request); $this->avatarManager = $avatarManager; @@ -87,6 +93,7 @@ class AvatarController extends Controller { $this->userManager = $userManager; $this->userSession = $userSession; $this->userFolder = $userFolder; + $this->logger = $logger; } /** @@ -139,12 +146,21 @@ class AvatarController extends Controller { $userId = $this->userSession->getUser()->getUID(); $files = $this->request->getUploadedFile('files'); + $headers = []; + if ($this->request->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE_8])) { + // due to upload iframe workaround, need to set content-type to text/plain + $headers['Content-Type'] = 'text/plain'; + } + if (isset($path)) { $path = stripslashes($path); $node = $this->userFolder->get($path); if ($node->getSize() > 20*1024*1024) { - return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('File is too big')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } $content = $node->getContent(); } elseif (!is_null($files)) { @@ -154,20 +170,29 @@ class AvatarController extends Controller { !\OC\Files\Filesystem::isFileBlacklisted($files['tmp_name'][0]) ) { if ($files['size'][0] > 20*1024*1024) { - return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('File is too big')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } $this->cache->set('avatar_upload', file_get_contents($files['tmp_name'][0]), 7200); $content = $this->cache->get('avatar_upload'); unlink($files['tmp_name'][0]); } else { - return new DataResponse(['data' => ['message' => $this->l->t('Invalid file provided')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('Invalid file provided')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } } else { //Add imgfile - return new DataResponse(['data' => ['message' => $this->l->t('No image or file provided')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('No image or file provided')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } try { @@ -178,16 +203,29 @@ class AvatarController extends Controller { if ($image->valid()) { $mimeType = $image->mimeType(); if ($mimeType !== 'image/jpeg' && $mimeType !== 'image/png') { - return new DataResponse(['data' => ['message' => $this->l->t('Unknown filetype')]]); + return new DataResponse( + ['data' => ['message' => $this->l->t('Unknown filetype')]], + Http::STATUS_OK, + $headers + ); } $this->cache->set('tmpAvatar', $image->data(), 7200); - return new DataResponse(['data' => 'notsquare']); + return new DataResponse( + ['data' => 'notsquare'], + Http::STATUS_OK, + $headers + ); } else { - return new DataResponse(['data' => ['message' => $this->l->t('Invalid image')]]); + return new DataResponse( + ['data' => ['message' => $this->l->t('Invalid image')]], + Http::STATUS_OK, + $headers + ); } } catch (\Exception $e) { - return new DataResponse(['data' => ['message' => $e->getMessage()]]); + $this->logger->logException($e, ['app' => 'core']); + return new DataResponse(['data' => ['message' => $this->l->t('An error occurred. Please contact your admin.')]], Http::STATUS_OK, $headers); } } @@ -204,7 +242,8 @@ class AvatarController extends Controller { $avatar->remove(); return new DataResponse(); } catch (\Exception $e) { - return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_BAD_REQUEST); + $this->logger->logException($e, ['app' => 'core']); + return new DataResponse(['data' => ['message' => $this->l->t('An error occurred. Please contact your admin.')]], Http::STATUS_BAD_REQUEST); } } @@ -272,10 +311,9 @@ class AvatarController extends Controller { } catch (\OC\NotSquareException $e) { return new DataResponse(['data' => ['message' => $this->l->t('Crop is not square')]], Http::STATUS_BAD_REQUEST); - - }catch (\Exception $e) { - return new DataResponse(['data' => ['message' => $e->getMessage()]], - Http::STATUS_BAD_REQUEST); + } catch (\Exception $e) { + $this->logger->logException($e, ['app' => 'core']); + return new DataResponse(['data' => ['message' => $this->l->t('An error occurred. Please contact your admin.')]], Http::STATUS_BAD_REQUEST); } } } diff --git a/core/command/app/checkcode.php b/core/command/app/checkcode.php index a4e7322460f..a04f4bb5e03 100644 --- a/core/command/app/checkcode.php +++ b/core/command/app/checkcode.php @@ -2,8 +2,8 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -26,6 +26,8 @@ namespace OC\Core\Command\App; use OC\App\CodeChecker\CodeChecker; use OC\App\CodeChecker\EmptyCheck; +use OC\App\CodeChecker\InfoChecker; +use OC\App\InfoParser; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -33,12 +35,21 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class CheckCode extends Command { + + /** @var InfoParser */ + private $infoParser; + protected $checkers = [ 'private' => '\OC\App\CodeChecker\PrivateCheck', 'deprecation' => '\OC\App\CodeChecker\DeprecationCheck', 'strong-comparison' => '\OC\App\CodeChecker\StrongComparisonCheck', ]; + public function __construct(InfoParser $infoParser) { + parent::__construct(); + $this->infoParser = $infoParser; + } + protected function configure() { $this ->setName('app:check-code') @@ -54,6 +65,12 @@ class CheckCode extends Command { InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'enable the specified checker(s)', [ 'private', 'deprecation', 'strong-comparison' ] + ) + ->addOption( + '--skip-validate-info', + null, + InputOption::VALUE_NONE, + 'skips the info.xml/version check' ); } @@ -84,7 +101,7 @@ class CheckCode extends Command { $output->writeln("<info>Analysing {$filename}</info>"); } - // show error count if there are errros present or the verbosity is high + // show error count if there are errors present or the verbosity is high if($count > 0 || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $output->writeln(" {$count} errors"); } @@ -98,6 +115,53 @@ class CheckCode extends Command { } }); $errors = $codeChecker->analyse($appId); + + if(!$input->getOption('skip-validate-info')) { + $infoChecker = new InfoChecker($this->infoParser); + + $infoChecker->listen('InfoChecker', 'mandatoryFieldMissing', function($key) use ($output) { + $output->writeln("<error>Mandatory field missing: $key</error>"); + }); + + $infoChecker->listen('InfoChecker', 'deprecatedFieldFound', function($key, $value) use ($output) { + if($value === [] || is_null($value) || $value === '') { + $output->writeln("<info>Deprecated field available: $key</info>"); + } else { + $output->writeln("<info>Deprecated field available: $key => $value</info>"); + } + }); + + $infoChecker->listen('InfoChecker', 'differentVersions', function($versionFile, $infoXML) use ($output) { + $output->writeln("<error>Different versions provided (appinfo/version: $versionFile - appinfo/info.xml: $infoXML)</error>"); + }); + + $infoChecker->listen('InfoChecker', 'sameVersions', function($path) use ($output) { + $output->writeln("<info>Version file isn't needed anymore and can be safely removed ($path)</info>"); + }); + + $infoChecker->listen('InfoChecker', 'migrateVersion', function($version) use ($output) { + $output->writeln("<info>Migrate the app version to appinfo/info.xml (add <version>$version</version> to appinfo/info.xml and remove appinfo/version)</info>"); + }); + + if(OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $infoChecker->listen('InfoChecker', 'mandatoryFieldFound', function($key, $value) use ($output) { + $output->writeln("<info>Mandatory field available: $key => $value</info>"); + }); + + $infoChecker->listen('InfoChecker', 'optionalFieldFound', function($key, $value) use ($output) { + $output->writeln("<info>Optional field available: $key => $value</info>"); + }); + + $infoChecker->listen('InfoChecker', 'unusedFieldFound', function($key, $value) use ($output) { + $output->writeln("<info>Unused field available: $key => $value</info>"); + }); + } + + $infoErrors = $infoChecker->analyse($appId); + + $errors = array_merge($errors, $infoErrors); + } + if (empty($errors)) { $output->writeln('<info>App is compliant - awesome job!</info>'); return 0; diff --git a/core/command/app/disable.php b/core/command/app/disable.php index f2096448279..6c04860789f 100644 --- a/core/command/app/disable.php +++ b/core/command/app/disable.php @@ -2,6 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/command/app/enable.php b/core/command/app/enable.php index 907006961dc..f82c23e7e60 100644 --- a/core/command/app/enable.php +++ b/core/command/app/enable.php @@ -2,6 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/command/config/listconfigs.php b/core/command/config/listconfigs.php index 5796362f2fc..37aeb53c6f5 100644 --- a/core/command/config/listconfigs.php +++ b/core/command/config/listconfigs.php @@ -32,20 +32,6 @@ use Symfony\Component\Console\Output\OutputInterface; class ListConfigs extends Base { protected $defaultOutputFormat = self::OUTPUT_FORMAT_JSON_PRETTY; - /** @var array */ - protected $sensitiveValues = [ - 'dbpassword' => true, - 'dbuser' => true, - 'mail_smtpname' => true, - 'mail_smtppassword' => true, - 'passwordsalt' => true, - 'secret' => true, - 'ldap_agent_password' => true, - 'objectstore' => ['arguments' => ['password' => true]], - ]; - - const SENSITIVE_VALUE = '***REMOVED SENSITIVE VALUE***'; - /** * @var SystemConfig */ protected $systemConfig; @@ -127,10 +113,10 @@ class ListConfigs extends Base { $configs = []; foreach ($keys as $key) { - $value = $this->systemConfig->getValue($key, serialize(null)); - - if ($noSensitiveValues && isset($this->sensitiveValues[$key])) { - $value = $this->removeSensitiveValue($this->sensitiveValues[$key], $value); + if ($noSensitiveValues) { + $value = $this->systemConfig->getFilteredValue($key, serialize(null)); + } else { + $value = $this->systemConfig->getValue($key, serialize(null)); } if ($value !== 'N;') { @@ -140,25 +126,4 @@ class ListConfigs extends Base { return $configs; } - - /** - * @param bool|array $keysToRemove - * @param mixed $value - * @return mixed - */ - protected function removeSensitiveValue($keysToRemove, $value) { - if ($keysToRemove === true) { - return self::SENSITIVE_VALUE; - } - - if (is_array($value)) { - foreach ($keysToRemove as $keyToRemove => $valueToRemove) { - if (isset($value[$keyToRemove])) { - $value[$keyToRemove] = $this->removeSensitiveValue($valueToRemove, $value[$keyToRemove]); - } - } - } - - return $value; - } } diff --git a/core/command/encryption/decryptall.php b/core/command/encryption/decryptall.php index c71ba5f04c7..4755a9dc7ba 100644 --- a/core/command/encryption/decryptall.php +++ b/core/command/encryption/decryptall.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -101,7 +102,8 @@ class DecryptAll extends Command { parent::configure(); $this->setName('encryption:decrypt-all'); - $this->setDescription( + $this->setDescription('Disable server-side encryption and decrypt all files'); + $this->setHelp( 'This will disable server-side encryption and decrypt all files for ' . 'all users if it is supported by your encryption module. ' . 'Please make sure that no user access his files during this process!' diff --git a/core/command/encryption/encryptall.php b/core/command/encryption/encryptall.php index 4ae6ae47836..572991039ef 100644 --- a/core/command/encryption/encryptall.php +++ b/core/command/encryption/encryptall.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -93,7 +94,8 @@ class EncryptAll extends Command { parent::configure(); $this->setName('encryption:encrypt-all'); - $this->setDescription( + $this->setDescription('Encrypt all files for all users'); + $this->setHelp( 'This will encrypt all files for all users. ' . 'Please make sure that no user access his files during this process!' ); diff --git a/core/command/log/manage.php b/core/command/log/manage.php index f3d18cffca0..1a5cd142413 100644 --- a/core/command/log/manage.php +++ b/core/command/log/manage.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/command/log/owncloud.php b/core/command/log/owncloud.php index a2d9e4bc7c8..6200a8b6a53 100644 --- a/core/command/log/owncloud.php +++ b/core/command/log/owncloud.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/command/maintenance/install.php b/core/command/maintenance/install.php index 7f5d9cae647..b0235c518ec 100644 --- a/core/command/maintenance/install.php +++ b/core/command/maintenance/install.php @@ -2,7 +2,6 @@ /** * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Christian Kampka <christian@kampka.net> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/core/command/maintenance/mimetype/updatedb.php b/core/command/maintenance/mimetype/updatedb.php index 37c401c0338..42d6af49baf 100644 --- a/core/command/maintenance/mimetype/updatedb.php +++ b/core/command/maintenance/mimetype/updatedb.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -16,6 +16,7 @@ * * You should have received a copy of the GNU Affero General Public License, version 3, * along with this program. If not, see <http://www.gnu.org/licenses/> + * */ namespace OC\Core\Command\Maintenance\Mimetype; diff --git a/core/command/maintenance/mimetype/updatejs.php b/core/command/maintenance/mimetype/updatejs.php index 5de75d53a3f..5329475c0a6 100644 --- a/core/command/maintenance/mimetype/updatejs.php +++ b/core/command/maintenance/mimetype/updatejs.php @@ -1,5 +1,7 @@ <?php /** + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/command/upgrade.php b/core/command/upgrade.php index 44e0b66c17c..5d4819f6baf 100644 --- a/core/command/upgrade.php +++ b/core/command/upgrade.php @@ -1,6 +1,7 @@ <?php /** * @author Andreas Fischer <bantu@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Owen Winkler <a_github@midnightcircus.com> * @author Steffen Lindner <mail@steffen-lindner.de> @@ -29,6 +30,7 @@ namespace OC\Core\Command; use OC\Console\TimestampFormatter; use OC\Updater; use OCP\IConfig; +use OCP\ILogger; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -43,17 +45,19 @@ class Upgrade extends Command { const ERROR_INVALID_ARGUMENTS = 4; const ERROR_FAILURE = 5; - /** - * @var IConfig - */ + /** @var IConfig */ private $config; + /** @var ILogger */ + private $logger; + /** * @param IConfig $config */ - public function __construct(IConfig $config) { + public function __construct(IConfig $config, ILogger $logger) { parent::__construct(); $this->config = $config; + $this->logger = $logger; } protected function configure() { @@ -92,6 +96,12 @@ class Upgrade extends Command { $updateStepEnabled = true; $skip3rdPartyAppsDisable = false; + if ($this->config->getSystemValue('update.skip-migration-test', false)) { + $output->writeln( + '<info>"skip-migration-test" is activated via config.php</info>' + ); + $simulateStepEnabled = false; + } if ($input->getOption('skip-migration-test')) { $simulateStepEnabled = false; } @@ -119,7 +129,8 @@ class Upgrade extends Command { $self = $this; $updater = new Updater(\OC::$server->getHTTPHelper(), - \OC::$server->getConfig()); + $this->config, + $this->logger); $updater->setSimulateStepEnabled($simulateStepEnabled); $updater->setUpdateStepEnabled($updateStepEnabled); @@ -177,6 +188,12 @@ class Upgrade extends Command { $updater->listen('\OC\Updater', 'failure', function ($message) use($output, $self) { $output->writeln("<error>$message</error>"); }); + $updater->listen('\OC\Updater', 'setDebugLogLevel', function ($logLevel, $logLevelName) use($output) { + $output->writeln("<info>Set log level to debug - current level: '$logLevelName'</info>"); + }); + $updater->listen('\OC\Updater', 'resetLogLevel', function ($logLevel, $logLevelName) use($output) { + $output->writeln("<info>Reset log level to '$logLevelName'</info>"); + }); if(OutputInterface::VERBOSITY_NORMAL < $output->getVerbosity()) { $updater->listen('\OC\Updater', 'repairInfo', function ($message) use($output) { diff --git a/core/command/user/add.php b/core/command/user/add.php index 07060bb172f..426b8489ccf 100644 --- a/core/command/user/add.php +++ b/core/command/user/add.php @@ -2,7 +2,6 @@ /** * @author Joas Schilling <nickvergessen@owncloud.com> * @author Laurens Post <lkpost@scept.re> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/css/apps.css b/core/css/apps.css index 6dd7e63bb69..ee68c45b1f2 100644 --- a/core/css/apps.css +++ b/core/css/apps.css @@ -35,7 +35,6 @@ height: 100%; width: inherit; overflow: auto; - padding-bottom: 44px; -moz-box-sizing: border-box; box-sizing: border-box; } #app-navigation li { @@ -308,6 +307,18 @@ -o-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); } +.ie .bubble, +.ie #app-navigation .app-navigation-entry-menu, +.ie .bubble:after, +.ie #app-navigation .app-navigation-entry-menu:after { + border: 1px solid #eee; +} +.ie8 .bubble { + margin-top: 18px; +} +.ie8 .bubble:after { + display: none; +} /* miraculous border arrow stuff */ .bubble:after, #app-navigation .app-navigation-entry-menu:after { @@ -417,7 +428,6 @@ position: relative; height: 100%; overflow-y: auto; - -webkit-overflow-scrolling: touch; } #app-content-wrapper { @@ -685,6 +695,7 @@ em { .popovermenu .menuitem .no-icon { display: inline-block; width: 16px; + height: 16px; margin-right: 10px; } diff --git a/core/css/fixes.css b/core/css/fixes.css index 7ef44ba6909..71cb09cae76 100644 --- a/core/css/fixes.css +++ b/core/css/fixes.css @@ -24,6 +24,10 @@ select { background-image: url('../img/actions/checkmark.png'); } +.ie8 .icon-close { + background-image: url('../img/actions/close.png'); +} + .lte9 .icon-triangle-e { background-image: url('../img/actions/triangle-e.png'); } @@ -38,6 +42,16 @@ select { background-image: url('../img/actions/settings.png'); } +.lte9 input[type="submit"], .lte9 input[type="button"], +.lte9 button, .lte9 .button, +.lte9 #quota, .lte9 select, .lte9 .pager li a { + background-color: #f1f1f1; +} + +/* IE8 needs PNG image for header logo */ +.ie8 #header .logo { + background-image: url(../img/logo-icon-175px.png); +} /* IE8 needs background to be set to same color to make transparency look good. */ .lte9 #body-login form input[type="text"] { @@ -51,6 +65,15 @@ select { border-bottom: 1px solid lightgrey; background-color: white; /* don't change background on hover */ } +.ie8 #body-login input[type="submit"] { + padding: 10px 5px; + margin-top: 3px; +} +/* for whatever unexplained reason */ +.ie8 #password { + width: 271px !important; + min-width: auto !important; +} /* disable opacity of info text on gradient since we cannot set a good backround color to use the filter&background hack as with the input labels */ diff --git a/core/css/icons.css b/core/css/icons.css index 2461ee46c9f..14b2101b331 100644 --- a/core/css/icons.css +++ b/core/css/icons.css @@ -78,6 +78,10 @@ background-image: url('../img/actions/download.svg'); } +.icon-edit { + background-image: url('../img/actions/edit.svg'); +} + .icon-external { background-image: url('../img/actions/external.svg'); } diff --git a/core/css/mobile.css b/core/css/mobile.css index 29507a0faa9..26f7b8520b9 100644 --- a/core/css/mobile.css +++ b/core/css/mobile.css @@ -45,6 +45,10 @@ width: 80% !important; } +/* fix name autocomplete not showing on mobile */ +.ui-autocomplete { + z-index: 1000 !important; +} /* fix error display on smaller screens */ .error-wide { @@ -79,7 +83,7 @@ } #app-sidebar{ - width: 100%; + width: 100% !important; } /* allow horizontal scrollbar in settings diff --git a/core/css/multiselect.css b/core/css/multiselect.css index a9451964f59..a4b03319156 100644 --- a/core/css/multiselect.css +++ b/core/css/multiselect.css @@ -33,9 +33,8 @@ ul.multiselectoptions>li { white-space: nowrap; } -ul.multiselectoptions > li > input[type="checkbox"] { - margin: 10px 7px; - vertical-align: middle; +ul.multiselectoptions > li > input[type="checkbox"]+label:before { + margin-left: 7px; } ul.multiselectoptions > li input[type='checkbox']+label { font-weight: normal; diff --git a/core/css/styles.css b/core/css/styles.css index 2ec5129a1c5..abefd2748b2 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -158,7 +158,12 @@ textarea:hover, textarea:focus, textarea:active { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; opacity: 1; } -input[type="checkbox"] { + +.ie8 input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; } +.ie8 input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; } + +/* ie8 doesn't support :checked */ +html:not(.ie8) input[type="checkbox"].checkbox { margin:0; padding:0; height:auto; @@ -166,7 +171,7 @@ input[type="checkbox"] { display: none; } -input[type="checkbox"] + label:before { +html:not(.ie8) input[type="checkbox"].checkbox + label:before { content: ""; display: inline-block; @@ -174,23 +179,28 @@ input[type="checkbox"] + label:before { width: 20px; vertical-align: middle; - background: url('../img/actions/checkbox.svg') left center no-repeat; + background: url('../img/actions/checkbox.svg') left top no-repeat; opacity: 0.7; } -input[type="checkbox"].white + label:before { +html:not(.ie8) input[type="checkbox"].checkbox:disabled +label:before { opacity: .6; } + +html:not(.ie8) input[type="checkbox"].checkbox.u-left +label:before { float: left; } +html:not(.ie8) input[type="checkbox"].checkbox.u-hidden + label:before { display: none; } + +html:not(.ie8) input[type="checkbox"].checkbox--white + label:before { background-image: url('../img/actions/checkbox-white.svg'); } -input[type="checkbox"]:checked + label:before { +html:not(.ie8) input[type="checkbox"].checkbox:checked + label:before { background-image: url('../img/actions/checkbox-checked.svg'); } -input[type="checkbox"].white:checked + label:before { +html:not(.ie8) input[type="checkbox"].checkbox--white:checked + label:before { background-image: url('../img/actions/checkbox-checked-white.svg'); } -input[type="checkbox"]:hover+label:before, input[type="checkbox"]:focus+label:before { +html:not(.ie8) input[type="checkbox"].checkbox:hover+label:before, input[type="checkbox"]:focus+label:before { color:#111 !important; } @@ -394,8 +404,7 @@ input[type="submit"].enabled { width: 100%; } #content .hascontrols { - position: relative; - top: 45px; + margin-top: 45px; } #content-wrapper { position: absolute; @@ -415,9 +424,9 @@ input[type="submit"].enabled { .emptycontent { font-size: 16px; color: #888; - position: absolute; text-align: center; - top: 30%; + margin-top: 100px; /* ie8 */ + margin-top: 30vh; width: 100%; } #emptycontent h2, @@ -506,7 +515,7 @@ input[type="submit"].enabled { #body-login #submit.login { position: absolute; right: 0; - top: 49px; + top: 0; border: none; background-color: transparent; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; @@ -525,8 +534,8 @@ input[type="submit"].enabled { #body-login form { position: relative; - width: 22em; - margin: 2em auto 2em; + width: 280px; + margin: 32px auto; padding: 0; } #body-login form fieldset { @@ -650,6 +659,14 @@ label.infield { padding-left: 28px; vertical-align: middle; } +html.ie8 #body-login form input[type="checkbox"]+label { + margin-left: -28px; + margin-top: -3px; + vertical-align: auto; +} +html.ie8 #body-login form input[type="checkbox"] { + margin-top: 5px; +} #body-login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; } #body-login .success { background:#d7fed7; border:1px solid #0f0; width: 35%; margin: 30px auto; padding:1em; text-align: center;} @@ -845,7 +862,6 @@ label.infield { } #remember_login { margin: 18px 5px 0 16px !important; - vertical-align: text-bottom; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; opacity: .7; } @@ -1009,7 +1025,7 @@ a.bookmarklet { background-color:#ddd; border:1px solid #ccc; padding:5px;paddin #oc-dialog-filepicker-content .dirtree span:not(:last-child)::after { content: '>'; padding: 3px;} #oc-dialog-filepicker-content .filelist { overflow-y:auto; - max-height: 300px; + height: 300px; background-color:white; width:100%; } @@ -1147,7 +1163,7 @@ div.crumb:active { /* public footer */ #body-public footer { - margin-top: 65px; + position: relative; text-align: center; } diff --git a/core/img/actions/close.png b/core/img/actions/close.png Binary files differindex ece33258e56..66e3c26cc65 100644 --- a/core/img/actions/close.png +++ b/core/img/actions/close.png diff --git a/core/img/actions/close.svg b/core/img/actions/close.svg index 4471dbc6301..e060da3f8bb 100644 --- a/core/img/actions/close.svg +++ b/core/img/actions/close.svg @@ -1,3 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <path d="M12.95,11.536,11.536,12.95,8,9.4142,4.4645,12.95,3.0503,11.536,6.5858,8,3.0503,4.4644,4.4645,3.0502,8,6.5858,11.516,3.0311,12.95,4.4644,9.4143,8z" fill="#000"/> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.5994" width="1.6006" y="-.29971" x="-.30029"> + <feGaussianBlur stdDeviation="1.2386625"/> + </filter> + </defs> + <path d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z" filter="url(#a)" stroke="#fff" stroke-width="2" fill="#fff"/> + <path d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z"/> </svg> diff --git a/core/img/actions/edit.png b/core/img/actions/edit.png Binary files differnew file mode 100644 index 00000000000..7ca20eba363 --- /dev/null +++ b/core/img/actions/edit.png diff --git a/core/img/actions/edit.svg b/core/img/actions/edit.svg new file mode 100644 index 00000000000..a8ab95e615b --- /dev/null +++ b/core/img/actions/edit.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> + <path style="color:#000000;block-progression:tb;text-transform:none;text-indent:0" d="m2.3496 1.002c-0.1975 0.0382-0.3531 0.2333-0.3496 0.4375v13.122c0 0.23 0.2061 0.438 0.4316 0.438h11.138c0.226 0 0.432-0.208 0.432-0.438v-10.142c-0.004-0.0669-0.023-0.133-0.055-0.1915l-3.312-3.1992c-0.043-0.0164-0.089-0.0255-0.135-0.0273h-8.0684c-0.0268-0.00265-0.0552-0.00265-0.082 0zm1.6504 1.998h6v1h-6v-1zm0 3h5v1h-5v-1zm0 3h8v1h-8v-1zm0 3h4v1h-4v-1z"/> +</svg> diff --git a/core/img/actions/upload.png b/core/img/actions/upload.png Binary files differindex a6969c23fa6..8955ed96412 100644 --- a/core/img/actions/upload.png +++ b/core/img/actions/upload.png diff --git a/core/img/actions/upload.svg b/core/img/actions/upload.svg index 80231797c96..bf1c08cd488 100644 --- a/core/img/actions/upload.svg +++ b/core/img/actions/upload.svg @@ -1,4 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <path d="M10,12,6,12,6,6,2,6,8,0,14,6,10,6z"/> - <path fill="#000" d="m0,11,0,5,16,0,0-5-2,0,0,3-12,0,0-3z"/> + <path d="m8 1-6 6h4v4h4v-4h4zm-6 12v2h12v-2z"/> </svg> diff --git a/core/img/actions/view-close.png b/core/img/actions/view-close.png Binary files differindex c21f6ee30e7..0874381a576 100644 --- a/core/img/actions/view-close.png +++ b/core/img/actions/view-close.png diff --git a/core/img/actions/view-close.svg b/core/img/actions/view-close.svg index 89d1fab88dd..2b91e382eb1 100644 --- a/core/img/actions/view-close.svg +++ b/core/img/actions/view-close.svg @@ -1,3 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <path fill="#FFF" d="m23.071,6.1013,2.8278,2.8278-7.0713,7.0717,7.071,7.0704-2.8279,2.8283-7.0714-7.0704l-7.0713,7.071-2.8282-2.828,7.0705-7.071-7.1084-7.0316,2.8665-2.8679,7.0709,7.0705z"/> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.5997" width="1.6003" y="-.29984" x="-.30016"> + <feGaussianBlur stdDeviation="2.2386623"/> + </filter> + </defs> + <path d="m24.955 23.538-1.414 1.414-7.536-7.5358-7.5355 7.5358-1.4142-1.414 7.5355-7.536-7.5355-7.5356 1.4142-1.4142 7.5355 7.5356 7.516-7.5547 1.434 1.4333-7.5357 7.5356z" filter="url(#a)" stroke="#000" stroke-width="2"/> + <path d="m24.955 23.538-1.414 1.414-7.536-7.5358-7.5355 7.5358-1.4142-1.414 7.5355-7.536-7.5355-7.5356 1.4142-1.4142 7.5355 7.5356 7.516-7.5547 1.434 1.4333-7.5357 7.5356z" fill="#fff"/> </svg> diff --git a/core/img/actions/view-next.png b/core/img/actions/view-next.png Binary files differindex 8a23452e083..d8c749bec9b 100644 --- a/core/img/actions/view-next.png +++ b/core/img/actions/view-next.png diff --git a/core/img/actions/view-next.svg b/core/img/actions/view-next.svg index 07c95b73ff0..4b719842efd 100644 --- a/core/img/actions/view-next.svg +++ b/core/img/actions/view-next.svg @@ -1,6 +1,10 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <g transform="translate(0 -1020.4)"> - <path d="m9 1024.4 2-2 14 14-14 14-2-2 10-12z" fill="#fff"/> - </g> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.4477" width="1.8073" y="-.22386" x="-.40365"> + <feGaussianBlur stdDeviation="2.4158278"/> + </filter> + </defs> + <path d="m10.414 28.952-1.414-1.414 11.535-11.536-11.535-11.536 1.414-1.4138 12.95 12.95z" filter="url(#a)" stroke="#000" stroke-width="2"/> + <path d="m10.414 28.952-1.414-1.414 11.535-11.536-11.535-11.536 1.414-1.4138 12.95 12.95z" fill="#fff"/> </svg> diff --git a/core/img/actions/view-pause.png b/core/img/actions/view-pause.png Binary files differindex 1de1fb4654b..87a18128ade 100644 --- a/core/img/actions/view-pause.png +++ b/core/img/actions/view-pause.png diff --git a/core/img/actions/view-pause.svg b/core/img/actions/view-pause.svg index f5fdc030479..e9ff43be0bf 100644 --- a/core/img/actions/view-pause.svg +++ b/core/img/actions/view-pause.svg @@ -1,6 +1,14 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <g transform="translate(0 -1020.4)"> - <path d="m6 1026.4v20h8v-20h-8zm12 0v20h8v-20h-8z" fill="#fff"/> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.6" width="1.6" y="-.3" x="-.3"> + <feGaussianBlur stdDeviation="2.5"/> + </filter> + </defs> + <g transform="matrix(.9 0 0 .9 1.6 -916.76)" filter="url(#a)" stroke="#000" stroke-width="2.2222"> + <path d="m6 1026.4v20h8v-20h-8zm12 0v20h8v-20h-8z" stroke="#000" stroke-width="2.2222"/> + </g> + <g transform="matrix(.9 0 0 .9 1.6 -916.76)"> + <path fill="#fff" d="m6 1026.4v20h8v-20h-8zm12 0v20h8v-20h-8z"/> </g> </svg> diff --git a/core/img/actions/view-play.png b/core/img/actions/view-play.png Binary files differindex c506815c0cf..b07c6de3cfd 100644 --- a/core/img/actions/view-play.png +++ b/core/img/actions/view-play.png diff --git a/core/img/actions/view-play.svg b/core/img/actions/view-play.svg index d9fa355371c..e617e29cb01 100644 --- a/core/img/actions/view-play.svg +++ b/core/img/actions/view-play.svg @@ -1,6 +1,14 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <g transform="translate(0 -1020.4)"> - <path d="m4 1024.4 24 12-24 12z" fill="#fff"/> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.6" width="1.6" y="-.3" x="-.3"> + <feGaussianBlur stdDeviation="3"/> + </filter> + </defs> + <g transform="matrix(.83333 0 0 .83333 2.6667 -847.67)" filter="url(#a)" stroke="#000" stroke-width="2.4"> + <path d="m4 1024.4 24 12-24 12z" stroke="#000" stroke-width="2.4"/> + </g> + <g transform="matrix(.83333 0 0 .83333 2.6667 -847.67)"> + <path fill="#fff" d="m4 1024.4 24 12-24 12z"/> </g> </svg> diff --git a/core/img/actions/view-previous.png b/core/img/actions/view-previous.png Binary files differindex 79dcb2301df..f601ec2ba44 100644 --- a/core/img/actions/view-previous.png +++ b/core/img/actions/view-previous.png diff --git a/core/img/actions/view-previous.svg b/core/img/actions/view-previous.svg index 68a31c04433..8a5013aad40 100644 --- a/core/img/actions/view-previous.svg +++ b/core/img/actions/view-previous.svg @@ -1,6 +1,10 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <g transform="translate(0 -1020.4)"> - <path d="m23 1024.4-2-2-14 14 14 14 2-2-10-12z" fill="#fff"/> - </g> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.4477" width="1.8073" y="-.22386" x="-.40365"> + <feGaussianBlur stdDeviation="2.4158278"/> + </filter> + </defs> + <path d="m10.414 28.952-1.414-1.414 11.535-11.536-11.535-11.536 1.414-1.4138 12.95 12.95z" transform="matrix(-1 0 0 1 32.364 0)" filter="url(#a)" stroke="#000" stroke-width="2"/> + <path d="m21.95 28.952 1.414-1.414-11.536-11.536 11.536-11.536-1.414-1.4138-12.95 12.95z" fill="#fff"/> </svg> diff --git a/core/img/filetypes/application-pdf.png b/core/img/filetypes/application-pdf.png Binary files differindex 4029f8aead1..c215094eaa7 100644 --- a/core/img/filetypes/application-pdf.png +++ b/core/img/filetypes/application-pdf.png diff --git a/core/img/filetypes/application.png b/core/img/filetypes/application.png Binary files differindex 9be7361d1b6..d9db3b9114c 100644 --- a/core/img/filetypes/application.png +++ b/core/img/filetypes/application.png diff --git a/core/img/filetypes/audio.png b/core/img/filetypes/audio.png Binary files differindex 4eb8ab78e3f..3d52756341a 100644 --- a/core/img/filetypes/audio.png +++ b/core/img/filetypes/audio.png diff --git a/core/img/filetypes/file.png b/core/img/filetypes/file.png Binary files differindex 3bd7463cfc9..74add13f276 100644 --- a/core/img/filetypes/file.png +++ b/core/img/filetypes/file.png diff --git a/core/img/filetypes/folder-drag-accept.png b/core/img/filetypes/folder-drag-accept.png Binary files differindex 80ab53b72b9..1124a02982f 100644 --- a/core/img/filetypes/folder-drag-accept.png +++ b/core/img/filetypes/folder-drag-accept.png diff --git a/core/img/filetypes/folder-external.png b/core/img/filetypes/folder-external.png Binary files differindex 5262d72e627..dd8343d245a 100644 --- a/core/img/filetypes/folder-external.png +++ b/core/img/filetypes/folder-external.png diff --git a/core/img/filetypes/folder-public.png b/core/img/filetypes/folder-public.png Binary files differindex 17c3ee2a8d9..3da67f85f79 100644 --- a/core/img/filetypes/folder-public.png +++ b/core/img/filetypes/folder-public.png diff --git a/core/img/filetypes/folder-shared.png b/core/img/filetypes/folder-shared.png Binary files differindex be5e59cbf28..d24e1d7af4e 100644 --- a/core/img/filetypes/folder-shared.png +++ b/core/img/filetypes/folder-shared.png diff --git a/core/img/filetypes/folder-starred.png b/core/img/filetypes/folder-starred.png Binary files differindex b083a9d2d11..4b847bf69ea 100644 --- a/core/img/filetypes/folder-starred.png +++ b/core/img/filetypes/folder-starred.png diff --git a/core/img/filetypes/folder.png b/core/img/filetypes/folder.png Binary files differindex 1dbb1154100..e811e9cdfdc 100644 --- a/core/img/filetypes/folder.png +++ b/core/img/filetypes/folder.png diff --git a/core/img/filetypes/image.png b/core/img/filetypes/image.png Binary files differindex 0feaecf2830..8ff5e6c119f 100644 --- a/core/img/filetypes/image.png +++ b/core/img/filetypes/image.png diff --git a/core/img/filetypes/package-x-generic.png b/core/img/filetypes/package-x-generic.png Binary files differindex 287a1f18869..68117e0d070 100644 --- a/core/img/filetypes/package-x-generic.png +++ b/core/img/filetypes/package-x-generic.png diff --git a/core/img/filetypes/text-calendar.png b/core/img/filetypes/text-calendar.png Binary files differindex ff3ced62531..f21c3a9951d 100644 --- a/core/img/filetypes/text-calendar.png +++ b/core/img/filetypes/text-calendar.png diff --git a/core/img/filetypes/text-code.png b/core/img/filetypes/text-code.png Binary files differindex 5505102f60e..69744e499e6 100644 --- a/core/img/filetypes/text-code.png +++ b/core/img/filetypes/text-code.png diff --git a/core/img/filetypes/text-vcard.png b/core/img/filetypes/text-vcard.png Binary files differindex 77ac138fe1c..087eadaabd1 100644 --- a/core/img/filetypes/text-vcard.png +++ b/core/img/filetypes/text-vcard.png diff --git a/core/img/filetypes/text.png b/core/img/filetypes/text.png Binary files differindex 5fca7cb69d7..d6bec70cf43 100644 --- a/core/img/filetypes/text.png +++ b/core/img/filetypes/text.png diff --git a/core/img/filetypes/video.png b/core/img/filetypes/video.png Binary files differindex 308e81cca83..7cc1ecdc46a 100644 --- a/core/img/filetypes/video.png +++ b/core/img/filetypes/video.png diff --git a/core/img/filetypes/x-office-document.png b/core/img/filetypes/x-office-document.png Binary files differindex d9c5b890583..3bc2f08d1f9 100644 --- a/core/img/filetypes/x-office-document.png +++ b/core/img/filetypes/x-office-document.png diff --git a/core/img/filetypes/x-office-presentation.png b/core/img/filetypes/x-office-presentation.png Binary files differindex 5b3733b7121..644fb852009 100644 --- a/core/img/filetypes/x-office-presentation.png +++ b/core/img/filetypes/x-office-presentation.png diff --git a/core/img/filetypes/x-office-spreadsheet.png b/core/img/filetypes/x-office-spreadsheet.png Binary files differindex 5a20026ebdd..8f79c32fe01 100644 --- a/core/img/filetypes/x-office-spreadsheet.png +++ b/core/img/filetypes/x-office-spreadsheet.png diff --git a/core/img/image-optimization.sh b/core/img/image-optimization.sh index e6374c419b2..3fad080dc79 100755 --- a/core/img/image-optimization.sh +++ b/core/img/image-optimization.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash function recursive_optimize_images() { cd $1; diff --git a/core/img/logo-icon-175px.png b/core/img/logo-icon-175px.png Binary files differnew file mode 100644 index 00000000000..67e76498670 --- /dev/null +++ b/core/img/logo-icon-175px.png diff --git a/core/js/config.php b/core/js/config.php index 5da610698df..e2d7ae3784c 100644 --- a/core/js/config.php +++ b/core/js/config.php @@ -3,6 +3,7 @@ * @author Bart Visscher <bartv@thisnet.nl> * @author Björn Schießle <schiessle@owncloud.com> * @author Guillaume AMAT <guillaume.amat@informatique-libre.com> + * @author Hasso Tepper <hasso@zone.ee> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> diff --git a/core/js/js.js b/core/js/js.js index de773dc1221..00a775b8027 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -85,6 +85,7 @@ var OC={ appConfig: window.oc_appconfig || {}, theme: window.oc_defaults || {}, coreApps:['', 'admin','log','core/search','settings','core','3rdparty'], + requestToken: oc_requesttoken, menuSpeed: 50, /** @@ -1533,6 +1534,10 @@ OC.Util = { * @returns {string} human readable difference from now */ relativeModifiedDate: function (timestamp) { + var diff = moment().diff(moment(timestamp)); + if (diff >= 0 && diff < 45000 ) { + return t('core', 'seconds ago'); + } return moment(timestamp).fromNow(); }, /** @@ -1597,6 +1602,85 @@ OC.Util = { }, /** + * Fix image scaling for IE8, since background-size is not supported. + * + * This scales the image to the element's actual size, the URL is + * taken from the "background-image" CSS attribute. + * + * @param {Object} $el image element + */ + scaleFixForIE8: function($el) { + if (!this.isIE8()) { + return; + } + var self = this; + $($el).each(function() { + var url = $(this).css('background-image'); + var r = url.match(/url\(['"]?([^'")]*)['"]?\)/); + if (!r) { + return; + } + url = r[1]; + url = self.replaceSVGIcon(url); + // TODO: escape + url = url.replace(/'/g, '%27'); + $(this).css({ + 'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + url + '\', sizingMethod=\'scale\')', + 'background-image': '' + }); + }); + return $el; + }, + + /** + * Returns whether this is IE8 + * + * @return {bool} true if this is IE8, false otherwise + */ + isIE8: function() { + return $('html').hasClass('ie8'); + }, + + /** + * Returns the width of a generic browser scrollbar + * + * @return {int} width of scrollbar + */ + getScrollBarWidth: function() { + if (this._scrollBarWidth) { + return this._scrollBarWidth; + } + + var inner = document.createElement('p'); + inner.style.width = "100%"; + inner.style.height = "200px"; + + var outer = document.createElement('div'); + outer.style.position = "absolute"; + outer.style.top = "0px"; + outer.style.left = "0px"; + outer.style.visibility = "hidden"; + outer.style.width = "200px"; + outer.style.height = "150px"; + outer.style.overflow = "hidden"; + outer.appendChild (inner); + + document.body.appendChild (outer); + var w1 = inner.offsetWidth; + outer.style.overflow = 'scroll'; + var w2 = inner.offsetWidth; + if(w1 === w2) { + w2 = outer.clientWidth; + } + + document.body.removeChild (outer); + + this._scrollBarWidth = (w1 - w2); + + return this._scrollBarWidth; + }, + + /** * Remove the time component from a given date * * @param {Date} date date @@ -1773,9 +1857,7 @@ OC.Util.History = { params = OC.parseQueryString(this._decodeQuery(query)); } // else read from query attributes - if (!params) { - params = OC.parseQueryString(this._decodeQuery(location.search)); - } + params = _.extend(params || {}, OC.parseQueryString(this._decodeQuery(location.search))); return params || {}; }, @@ -1888,32 +1970,11 @@ jQuery.fn.exists = function(){ return this.length > 0; }; +/** + * @deprecated use OC.Util.getScrollBarWidth() instead + */ function getScrollBarWidth() { - var inner = document.createElement('p'); - inner.style.width = "100%"; - inner.style.height = "200px"; - - var outer = document.createElement('div'); - outer.style.position = "absolute"; - outer.style.top = "0px"; - outer.style.left = "0px"; - outer.style.visibility = "hidden"; - outer.style.width = "200px"; - outer.style.height = "150px"; - outer.style.overflow = "hidden"; - outer.appendChild (inner); - - document.body.appendChild (outer); - var w1 = inner.offsetWidth; - outer.style.overflow = 'scroll'; - var w2 = inner.offsetWidth; - if(w1 === w2) { - w2 = outer.clientWidth; - } - - document.body.removeChild (outer); - - return (w1 - w2); + return OC.Util.getScrollBarWidth(); } /** @@ -1972,4 +2033,5 @@ jQuery.fn.tipsy = function(argument) { this.tooltip(argument); jQuery.fn.tooltip.call(this, argument); } + return this; } diff --git a/core/js/mimetype.js b/core/js/mimetype.js index d22b0a2378a..b0de8eb8411 100644 --- a/core/js/mimetype.js +++ b/core/js/mimetype.js @@ -70,7 +70,7 @@ OC.MimeType = { return undefined; } - if (mimeType in OC.MimeTypeList.aliases) { + while (mimeType in OC.MimeTypeList.aliases) { mimeType = OC.MimeTypeList.aliases[mimeType]; } if (mimeType in OC.MimeType._mimeTypeIcons) { diff --git a/core/js/mimetypelist.js b/core/js/mimetypelist.js index e49ace6df73..43f01273f55 100644 --- a/core/js/mimetypelist.js +++ b/core/js/mimetypelist.js @@ -13,7 +13,7 @@ OC.MimeTypeList={ "application/font-sfnt": "image", "application/font-woff": "image", "application/illustrator": "image", - "application/javascript": "text/code", + "application/javascript": "text/code", "application/json": "text/code", "application/msaccess": "file", "application/msexcel": "x-office/spreadsheet", @@ -21,7 +21,7 @@ OC.MimeTypeList={ "application/msword": "x-office/document", "application/octet-stream": "file", "application/postscript": "image", - "application/rss+xml": "text/code", + "application/rss+xml": "application/xml", "application/vnd.android.package-archive": "package/x-generic", "application/vnd.ms-excel": "x-office/spreadsheet", "application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet", @@ -63,7 +63,6 @@ OC.MimeTypeList={ "application/x-photoshop": "image", "application/x-php": "text/code", "application/x-rar-compressed": "package/x-generic", - "application/x-shockwave-flash": "application", "application/x-tar": "package/x-generic", "application/x-tex": "text", "application/xml": "text/html", @@ -71,22 +70,24 @@ OC.MimeTypeList={ "application/zip": "package/x-generic", "database": "file", "httpd/unix-directory": "dir", - "image/svg+xml": "image", - "image/vector": "image", "text/css": "text/code", "text/csv": "x-office/spreadsheet", - "text/html": "text/code", - "text/x-c": "text/code", - "text/x-h": "text/code", - "text/x-python": "text/code", - "text/x-shellscript": "text/code", - "web": "text/code" + "text/html": "text/code", + "text/x-c": "text/code", + "text/x-c++src": "text/code", + "text/x-h": "text/code", + "text/x-java-source": "text/code", + "text/x-python": "text/code", + "text/x-shellscript": "text/code", + "web": "text/code" }, files: [ "video", "folder-drag-accept", + "folder-starred", "folder-public", "package-x-generic", + "text", "folder-external", "text-vcard", "application", @@ -98,7 +99,6 @@ OC.MimeTypeList={ "text-calendar", "x-office-presentation", "file", - "text", "folder-shared", "image", "audio" diff --git a/core/js/multiselect.js b/core/js/multiselect.js index 41dc68ac051..6d5c54ac0f5 100644 --- a/core/js/multiselect.js +++ b/core/js/multiselect.js @@ -109,6 +109,9 @@ var id='ms'+multiSelectId+'-option-'+item; var input=$('<input type="' + inputType + '"/>'); input.attr('id',id); + if(inputType === 'checkbox') { + input.addClass('checkbox'); + } if(settings.singleSelect) { input.attr('name', 'ms'+multiSelectId+'-option'); } diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 52ed34f61ec..4448b813021 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -171,7 +171,6 @@ var OCdialogs = { $('body').append(self.$filePicker); - self.$filePicker.ready(function() { self.$filelist = self.$filePicker.find('.filelist'); self.$dirTree = self.$filePicker.find('.dirtree'); @@ -312,9 +311,11 @@ var OCdialogs = { * @param {object} original file with name, size and mtime * @param {object} replacement file with name, size and mtime * @param {object} controller with onCancel, onSkip, onReplace and onRename methods + * @return {Promise} jquery promise that resolves after the dialog template was loaded */ fileexists:function(data, original, replacement, controller) { var self = this; + var dialogDeferred = new $.Deferred(); var getCroppedPreview = function(file) { var deferred = new $.Deferred(); @@ -342,11 +343,12 @@ var OCdialogs = { var crop = function(img) { var canvas = document.createElement('canvas'), - width = img.width, - height = img.height, - x, y, size; + targetSize = 96, + width = img.width, + height = img.height, + x, y, size; - // calculate the width and height, constraining the proportions + // Calculate the width and height, constraining the proportions if (width > height) { y = 0; x = (width - height) / 2; @@ -356,14 +358,90 @@ var OCdialogs = { } size = Math.min(width, height); - // resize the canvas and draw the image data into it - canvas.width = 64; - canvas.height = 64; + // Set canvas size to the cropped area + canvas.width = size; + canvas.height = size; var ctx = canvas.getContext("2d"); - ctx.drawImage(img, x, y, size, size, 0, 0, 64, 64); + ctx.drawImage(img, x, y, size, size, 0, 0, size, size); + + // Resize the canvas to match the destination (right size uses 96px) + resampleHermite(canvas, size, size, targetSize, targetSize); + return canvas.toDataURL("image/png", 0.7); }; + /** + * Fast image resize/resample using Hermite filter with JavaScript. + * + * @author: ViliusL + * + * @param {*} canvas + * @param {number} W + * @param {number} H + * @param {number} W2 + * @param {number} H2 + */ + var resampleHermite = function (canvas, W, H, W2, H2) { + W2 = Math.round(W2); + H2 = Math.round(H2); + var img = canvas.getContext("2d").getImageData(0, 0, W, H); + var img2 = canvas.getContext("2d").getImageData(0, 0, W2, H2); + var data = img.data; + var data2 = img2.data; + var ratio_w = W / W2; + var ratio_h = H / H2; + var ratio_w_half = Math.ceil(ratio_w / 2); + var ratio_h_half = Math.ceil(ratio_h / 2); + + for (var j = 0; j < H2; j++) { + for (var i = 0; i < W2; i++) { + var x2 = (i + j * W2) * 4; + var weight = 0; + var weights = 0; + var weights_alpha = 0; + var gx_r = 0; + var gx_g = 0; + var gx_b = 0; + var gx_a = 0; + var center_y = (j + 0.5) * ratio_h; + for (var yy = Math.floor(j * ratio_h); yy < (j + 1) * ratio_h; yy++) { + var dy = Math.abs(center_y - (yy + 0.5)) / ratio_h_half; + var center_x = (i + 0.5) * ratio_w; + var w0 = dy * dy; //pre-calc part of w + for (var xx = Math.floor(i * ratio_w); xx < (i + 1) * ratio_w; xx++) { + var dx = Math.abs(center_x - (xx + 0.5)) / ratio_w_half; + var w = Math.sqrt(w0 + dx * dx); + if (w >= -1 && w <= 1) { + //hermite filter + weight = 2 * w * w * w - 3 * w * w + 1; + if (weight > 0) { + dx = 4 * (xx + yy * W); + //alpha + gx_a += weight * data[dx + 3]; + weights_alpha += weight; + //colors + if (data[dx + 3] < 255) + weight = weight * data[dx + 3] / 250; + gx_r += weight * data[dx]; + gx_g += weight * data[dx + 1]; + gx_b += weight * data[dx + 2]; + weights += weight; + } + } + } + } + data2[x2] = gx_r / weights; + data2[x2 + 1] = gx_g / weights; + data2[x2 + 2] = gx_b / weights; + data2[x2 + 3] = gx_a / weights_alpha; + } + } + canvas.getContext("2d").clearRect(0, 0, Math.max(W, W2), Math.max(H, H2)); + canvas.width = W2; + canvas.height = H2; + canvas.getContext("2d").putImageData(img2, 0, 0); + }; + var addConflict = function($conflicts, original, replacement) { var $conflict = $conflicts.find('.template').clone().removeClass('template').addClass('conflict'); @@ -388,9 +466,9 @@ var OCdialogs = { c: original.etag, forceIcon: 0 }; - var previewpath = OC.generateUrl('/core/preview.png?') + $.param(urlSpec); + var previewpath = Files.generatePreviewUrl(urlSpec); // Escaping single quotes - previewpath = previewpath.replace(/'/g, "%27") + previewpath = previewpath.replace(/'/g, "%27"); $originalDiv.find('.icon').css({"background-image": "url('" + previewpath + "')"}); getCroppedPreview(replacement).then( function(path){ @@ -400,6 +478,11 @@ var OCdialogs = { $replacementDiv.find('.icon').css('background-image','url(' + path + ')'); } ); + // connect checkboxes with labels + var checkboxId = $conflicts.find('.conflict').length; + $originalDiv.find('input:checkbox').attr('id', 'checkbox_original_'+checkboxId); + $replacementDiv.find('input:checkbox').attr('id', 'checkbox_replacement_'+checkboxId); + $conflicts.append($conflict); //set more recent mtime bold @@ -458,7 +541,7 @@ var OCdialogs = { //recalculate dimensions $(window).trigger('resize'); - + dialogDeferred.resolve(); } else { //create dialog this._fileexistsshown = true; @@ -477,8 +560,10 @@ var OCdialogs = { }); $('body').append($dlg); - var $conflicts = $dlg.find('.conflicts'); - addConflict($conflicts, original, replacement); + if (original && replacement) { + var $conflicts = $dlg.find('.conflicts'); + addConflict($conflicts, original, replacement); + } var buttonlist = [{ text: t('core', 'Cancel'), @@ -515,6 +600,14 @@ var OCdialogs = { $(dialogId).css('height','auto'); + var $primaryButton = $dlg.closest('.oc-dialog').find('button.continue'); + $primaryButton.prop('disabled', true); + + function updatePrimaryButton() { + var checkedCount = $dlg.find('.conflicts .checkbox:checked').length; + $primaryButton.prop('disabled', checkedCount === 0); + } + //add checkbox toggling actions $(dialogId).find('.allnewfiles').on('click', function() { var $checkboxes = $(dialogId).find('.conflict .replacement input[type="checkbox"]'); @@ -530,7 +623,7 @@ var OCdialogs = { }); $(dialogId).find('.conflicts').on('click', '.replacement input[type="checkbox"],.original:not(.readonly) input[type="checkbox"]', function() { var $checkbox = $(this); - $checkbox.prop('checked', !checkbox.prop('checked')); + $checkbox.prop('checked', !$checkbox.prop('checked')); }); //update counters @@ -546,6 +639,7 @@ var OCdialogs = { $(dialogId).find('.allnewfiles').prop('checked', false); $(dialogId).find('.allnewfiles + .count').text(''); } + updatePrimaryButton(); }); $(dialogId).on('click', '.original,.allexistingfiles', function(){ var count = $(dialogId).find('.conflict .original input[type="checkbox"]:checked').length; @@ -560,13 +654,18 @@ var OCdialogs = { $(dialogId).find('.allexistingfiles').prop('checked', false); $(dialogId).find('.allexistingfiles + .count').text(''); } + updatePrimaryButton(); }); + + dialogDeferred.resolve(); }) .fail(function() { + dialogDeferred.reject(); alert(t('core', 'Error loading file exists template')); }); } //} + return dialogDeferred.promise(); }, _getFilePickerTemplate: function() { var defer = $.Deferred(); @@ -638,9 +737,10 @@ var OCdialogs = { var dirs = []; var others = []; var self = this; - this.$filelist.empty().addClass('loading'); + this.$filelist.empty().addClass('icon-loading'); this.$filePicker.data('path', dir); $.when(this._getFileList(dir, this.$filePicker.data('mimetype'))).then(function(response) { + $.each(response.data.files, function(index, file) { if (file.type === 'dir') { dirs.push(file); @@ -672,7 +772,7 @@ var OCdialogs = { self.$filelist.append($li); }); - self.$filelist.removeClass('loading'); + self.$filelist.removeClass('icon-loading'); if (!OC.Util.hasSVGSupport()) { OC.Util.replaceSVG(self.$filePicker.find('.dirtree')); } diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index 2e21c6ad725..6e2058d54fc 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -98,6 +98,12 @@ type: OC.SetupChecks.MESSAGE_TYPE_WARNING }); } + if(!data.isCorrectMemcachedPHPModuleInstalled) { + messages.push({ + msg: t('core', 'Memcached is configured as distributed cache, but the wrong PHP module "memcache" is installed. \\OC\\Memcache\\Memcached only supports "memcached" and not "memcache". See the <a href="{wikiLink}">memcached wiki about both modules</a>.', {wikiLink: 'https://code.google.com/p/memcached/wiki/PHPClientComparison'}), + type: OC.SetupChecks.MESSAGE_TYPE_WARNING + }); + } } else { messages.push({ msg: t('core', 'Error occurred while checking server setup'), diff --git a/core/js/sharedialogexpirationview.js b/core/js/sharedialogexpirationview.js index 3fba4b135d9..eef440c9af5 100644 --- a/core/js/sharedialogexpirationview.js +++ b/core/js/sharedialogexpirationview.js @@ -8,6 +8,8 @@ * */ +/* global moment */ + (function() { if (!OC.Share) { OC.Share = {}; @@ -19,9 +21,9 @@ // in the LinkShareView to ease reusing it in future. Then, // modifications (getting rid of IDs) are still necessary. '{{#if isLinkShare}}' + - '<input type="checkbox" name="expirationCheckbox" class="expirationCheckbox" id="expirationCheckbox" value="1" ' + + '<input type="checkbox" name="expirationCheckbox" class="expirationCheckbox checkbox" id="expirationCheckbox-{{cid}}" value="1" ' + '{{#if isExpirationSet}}checked="checked"{{/if}} {{#if disableCheckbox}}disabled="disabled"{{/if}} />' + - '<label for="expirationCheckbox">{{setExpirationLabel}}</label>' + + '<label for="expirationCheckbox-{{cid}}">{{setExpirationLabel}}</label>' + '<div class="expirationDateContainer {{#unless isExpirationSet}}hidden{{/unless}}">' + ' <label for="expirationDate" class="hidden-visually" value="{{expirationDate}}">{{expirationLabel}}</label>' + ' <input id="expirationDate" class="datepicker" type="text" placeholder="{{expirationDatePlaceholder}}" value="{{expirationValue}}" />' + @@ -132,8 +134,13 @@ var isExpirationSet = !!this.model.get('linkShare').expiration || isExpirationEnforced; - var expirationTemplate = this.template(); - this.$el.html(expirationTemplate({ + var expiration; + if (isExpirationSet) { + expiration = moment(this.model.get('linkShare').expiration, 'YYYY-MM-DD').format('DD-MM-YYYY'); + } + + this.$el.html(this.template({ + cid: this.cid, setExpirationLabel: t('core', 'Set expiration date'), expirationLabel: t('core', 'Expiration'), expirationDatePlaceholder: t('core', 'Expiration date'), @@ -142,7 +149,7 @@ isExpirationSet: isExpirationSet, isExpirationEnforced: isExpirationEnforced, disableCheckbox: isExpirationEnforced && isExpirationSet, - expirationValue: this.model.get('linkShare').expiration + expirationValue: expiration })); // what if there is another date picker on that page? @@ -181,11 +188,11 @@ * @returns {Function} from Handlebars * @private */ - template: function () { + template: function (data) { if (!this._template) { this._template = Handlebars.compile(TEMPLATE); } - return this._template; + return this._template(data); } }); diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js index ab591b9c6e8..beb8b01c8a8 100644 --- a/core/js/sharedialoglinkshareview.js +++ b/core/js/sharedialoglinkshareview.js @@ -16,33 +16,36 @@ var TEMPLATE = '{{#if shareAllowed}}' + '<span class="icon-loading-small hidden"></span>' + - '<input type="checkbox" name="linkCheckbox" id="linkCheckbox" value="1" {{#if isLinkShare}}checked="checked"{{/if}} /><label for="linkCheckbox">{{linkShareLabel}}</label>' + + '<input type="checkbox" name="linkCheckbox" id="linkCheckbox-{{cid}}" class="checkbox linkCheckbox" value="1" {{#if isLinkShare}}checked="checked"{{/if}} />' + + '<label for="linkCheckbox-{{cid}}">{{linkShareLabel}}</label>' + '<br />' + - '<label for="linkText" class="hidden-visually">{{urlLabel}}</label>' + - '<input id="linkText" {{#unless isLinkShare}}class="hidden"{{/unless}} type="text" readonly="readonly" value="{{shareLinkURL}}" />' + + '<label for="linkText-{{cid}}" class="hidden-visually">{{urlLabel}}</label>' + + '<input id="linkText-{{cid}}" class="linkText {{#unless isLinkShare}}hidden{{/unless}}" type="text" readonly="readonly" value="{{shareLinkURL}}" />' + ' {{#if showPasswordCheckBox}}' + - '<input type="checkbox" name="showPassword" id="showPassword" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" /><label for="showPassword">{{enablePasswordLabel}}</label>' + + '<input type="checkbox" name="showPassword" id="showPassword-{{cid}}" class="checkbox showPasswordCheckbox" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" />' + + '<label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>' + ' {{/if}}' + - '<div id="linkPass" {{#unless isPasswordSet}}class="hidden"{{/unless}}>' + - ' <label for="linkPassText" class="hidden-visually">{{passwordLabel}}</label>' + - ' <input id="linkPassText" type="password" placeholder="{{passwordPlaceholder}}" />' + + '<div id="linkPass" class="linkPass {{#unless isPasswordSet}}hidden{{/unless}}">' + + ' <label for="linkPassText-{{cid}}" class="hidden-visually">{{passwordLabel}}</label>' + + ' <input id="linkPassText-{{cid}}" class="linkPassText" type="password" placeholder="{{passwordPlaceholder}}" />' + ' <span class="icon-loading-small hidden"></span>' + '</div>' + ' {{#if publicUpload}}' + '<div id="allowPublicUploadWrapper">' + ' <span class="icon-loading-small hidden"></span>' + - ' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload" {{{publicUploadChecked}}} />' + - '<label for="sharingDialogAllowPublicUpload">{{publicUploadLabel}}</label>' + + ' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload-{{cid}}" class="checkbox publicUploadCheckbox" {{{publicUploadChecked}}} />' + + '<label for="sharingDialogAllowPublicUpload-{{cid}}">{{publicUploadLabel}}</label>' + '</div>' + ' {{/if}}' + ' {{#if mailPublicNotificationEnabled}}' + '<form id="emailPrivateLink" class="emailPrivateLinkForm">' + - ' <input id="email" value="" placeholder="{{mailPrivatePlaceholder}}" type="text" />' + - ' <input id="emailButton" type="submit" value="{{mailButtonText}}" />' + + ' <input id="email" class="emailField" value="" placeholder="{{mailPrivatePlaceholder}}" type="text" />' + + ' <input id="emailButton" class="emailButton" type="submit" value="{{mailButtonText}}" />' + '</form>' + ' {{/if}}' + '{{else}}' + - '<input id="shareWith" type="text" placeholder="{{noSharingPlaceholder}}" disabled="disabled"/>' + + // FIXME: this doesn't belong in this view + '<input id="shareWith-{{cid}}" class="shareWithField" type="text" placeholder="{{noSharingPlaceholder}}" disabled="disabled"/>' + '{{/if}}' ; @@ -70,7 +73,13 @@ showLink: true, events: { - 'submit .emailPrivateLinkForm': '_onEmailPrivateLink' + 'submit .emailPrivateLinkForm': '_onEmailPrivateLink', + 'focusout input.linkPassText': 'onPasswordEntered', + 'keyup input.linkPassText': 'onPasswordKeyUp', + 'click .linkCheckbox': 'onLinkCheckBoxChange', + 'click .linkText': 'onLinkTextClick', + 'change .publicUploadCheckbox': 'onAllowPublicUploadChange', + 'click .showPasswordCheckbox': 'onShowPasswordClick' }, initialize: function(options) { @@ -98,12 +107,20 @@ throw 'missing OC.Share.ShareConfigModel'; } - _.bindAll(this, 'onLinkCheckBoxChange', 'onPasswordEntered', - 'onShowPasswordClick', 'onAllowPublicUploadChange'); + _.bindAll( + this, + '_onEmailPrivateLink', + 'onLinkCheckBoxChange', + 'onPasswordEntered', + 'onPasswordKeyUp', + 'onLinkTextClick', + 'onShowPasswordClick', + 'onAllowPublicUploadChange' + ); }, onLinkCheckBoxChange: function() { - var $checkBox = this.$el.find('#linkCheckbox'); + var $checkBox = this.$el.find('.linkCheckbox'); var $loading = $checkBox.siblings('.icon-loading-small'); if(!$loading.hasClass('hidden')) { return false; @@ -115,16 +132,21 @@ // this will create it this.model.saveLinkShare(); } else { - this.$el.find('#linkPass').slideToggle(OC.menuSpeed); + this.$el.find('.linkPass').slideToggle(OC.menuSpeed); // TODO drop with IE8 drop if($('html').hasClass('ie8')) { - this.$el.find('#linkPassText').attr('placeholder', null); - this.$el.find('#linkPassText').val(''); + this.$el.find('.linkPassText').attr('placeholder', null); + this.$el.find('.linkPassText').val(''); } - this.$el.find('#linkPassText').focus(); + this.$el.find('.linkPassText').focus(); } } else { - this.model.removeLinkShare(); + $loading.removeClass('hidden'); + if (this.model.get('linkShare').isLinkShare) { + this.model.removeLinkShare(); + } else { + this.$el.find('.linkPass').slideToggle(OC.menuSpeed); + } } }, @@ -134,53 +156,81 @@ }, onShowPasswordClick: function() { - this.$el.find('#linkPass').slideToggle(OC.menuSpeed); - if(!this.$el.find('#showPassword').is(':checked')) { + this.$el.find('.linkPass').slideToggle(OC.menuSpeed); + if(!this.$el.find('.showPasswordCheckbox').is(':checked')) { this.model.setPassword(''); this.model.saveLinkShare(); } else { - this.$el.find('#linkPassText').focus(); + this.$el.find('.linkPassText').focus(); + } + }, + + onPasswordKeyUp: function(event) { + if(event.keyCode == 13) { + this.onPasswordEntered(); } }, onPasswordEntered: function() { - var password = this.$el.find('#linkPassText').val(); + var self = this; + var $loading = this.$el.find('.linkPass .icon-loading-small'); + if (!$loading.hasClass('hidden')) { + // still in process + return; + } + var $input = this.$el.find('.linkPassText'); + $input.removeClass('error'); + var password = $input.val(); if(password === '') { return; } - this.$el.find('#linkPass .icon-loading-small') + $loading .removeClass('hidden') .addClass('inlineblock'); this.model.setPassword(password); - this.model.saveLinkShare(); + this.model.saveLinkShare({}, { + error: function(model, msg) { + $loading.removeClass('inlineblock').addClass('hidden'); + $input.addClass('error'); + $input.attr('title', msg); + $input.tooltip({placement: 'bottom', trigger: 'manual'}); + $input.tooltip('show'); + } + }); }, onAllowPublicUploadChange: function() { - this.$el.find('#sharingDialogAllowPublicUpload') - .siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock'); - this.model.setPublicUpload(this.$el.find('#sharingDialogAllowPublicUpload').is(':checked')); + var $checkbox = this.$('.publicUploadCheckbox'); + $checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock'); + this.model.setPublicUpload($checkbox.is(':checked')); this.model.saveLinkShare(); }, _onEmailPrivateLink: function(event) { event.preventDefault(); - var $emailField = this.$el.find('#email'); - var $emailButton = this.$el.find('#emailButton'); - var email = this.$el.find('#email').val(); + var $emailField = this.$el.find('.emailField'); + var $emailButton = this.$el.find('.emailButton'); + var email = $emailField.val(); if (email !== '') { $emailField.prop('disabled', true); $emailButton.prop('disabled', true); $emailField.val(t('core', 'Sending ...')); - this.model.sendEmailPrivateLink(email).then(function() { + this.model.sendEmailPrivateLink(email).done(function() { $emailField.css('font-weight', 'bold').val(t('core','Email sent')); setTimeout(function() { - $emailField.css('font-weight', 'normal').val(''); + $emailField.val(''); + $emailField.css('font-weight', 'normal'); $emailField.prop('disabled', false); $emailButton.prop('disabled', false); }, 2000); + }).fail(function() { + $emailField.val(email); + $emailField.css('font-weight', 'normal'); + $emailField.prop('disabled', false); + $emailButton.prop('disabled', false); }); } return false; @@ -217,6 +267,7 @@ || !this.model.get('linkShare').password); this.$el.html(linkShareTemplate({ + cid: this.cid, shareAllowed: true, isLinkShare: isLinkShare, shareLinkURL: this.model.get('linkShare').link, @@ -235,20 +286,7 @@ mailButtonText: t('core', 'Send') })); - // TODO: move this to delegate events instead - this.$el.find('#linkCheckbox').click(this.onLinkCheckBoxChange); - this.$el.find('#sharingDialogAllowPublicUpload').change(this.onAllowPublicUploadChange); - this.$el.find('#linkText').click(this.onLinkTextClick); - this.$el.find('#showPassword').click(this.onShowPasswordClick); - this.$el.find('#linkPassText').focusout(this.onPasswordEntered); - var view = this; - this.$el.find('#linkPassText').keyup(function(event) { - if(event.keyCode == 13) { - view.onPasswordEntered(); - } - }); - - var $emailField = this.$el.find('#email'); + var $emailField = this.$el.find('.emailField'); if (isLinkShare && $emailField.length !== 0) { $emailField.autocomplete({ minLength: 1, diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js index d2c45bb08b1..dfe5789e774 100644 --- a/core/js/sharedialogshareelistview.js +++ b/core/js/sharedialogshareelistview.js @@ -14,44 +14,44 @@ } var TEMPLATE = - '<ul id="shareWithList">' + + '<ul id="shareWithList" class="shareWithList">' + '{{#each sharees}}' + ' {{#if isCollection}}' + ' <li data-collection="{{collectionID}}">{{text}}</li>' + ' {{/if}}' + ' {{#unless isCollection}}' + ' <li data-share-type="{{shareType}}" data-share-with="{{shareWith}}" title="{{shareWith}}">' + - ' <a href="#" class="unshare"><img class="svg" alt="{{unshareLabel}}" title="{{unshareLabel}}" src="{{unshareImage}}" /></a>' + + ' <a href="#" class="unshare"><span class="icon-loading-small hidden"></span><img class="svg" alt="{{unshareLabel}}" title="{{unshareLabel}}" src="{{unshareImage}}" /></a>' + ' {{#if avatarEnabled}}' + ' <div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' + ' {{/if}}' + ' <span class="username">{{shareWithDisplayName}}</span>' + ' {{#if mailPublicNotificationEnabled}} {{#unless isRemoteShare}}' + - ' <input id="mail-{{shareWith}}" type="checkbox" name="mailNotification" class="mailNotification" {{#if wasMailSent}}checked="checked"{{/if}} />' + - ' <label for="mail-{{shareWith}}">{{notifyByMailLabel}}</label>' + + ' <input id="mail-{{cid}}-{{shareWith}}" type="checkbox" name="mailNotification" class="mailNotification checkbox" {{#if wasMailSent}}checked="checked"{{/if}} />' + + ' <label for="mail-{{cid}}-{{shareWith}}">{{notifyByMailLabel}}</label>' + ' {{/unless}} {{/if}}' + ' {{#if isResharingAllowed}} {{#if sharePermissionPossible}} {{#unless isRemoteShare}}' + - ' <input id="canShare-{{shareWith}}" type="checkbox" name="share" class="permissions" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' + - ' <label for="canShare-{{shareWith}}">{{canShareLabel}}</label>' + + ' <input id="canShare-{{cid}}-{{shareWith}}" type="checkbox" name="share" class="permissions checkbox" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' + + ' <label for="canShare-{{cid}}-{{shareWith}}">{{canShareLabel}}</label>' + ' {{/unless}} {{/if}} {{/if}}' + ' {{#if editPermissionPossible}}' + - ' <input id="canEdit-{{shareWith}}" type="checkbox" name="edit" class="permissions" {{#if hasEditPermission}}checked="checked"{{/if}} />' + - ' <label for="canEdit-{{shareWith}}">{{canEditLabel}}</label>' + + ' <input id="canEdit-{{cid}}-{{shareWith}}" type="checkbox" name="edit" class="permissions checkbox" {{#if hasEditPermission}}checked="checked"{{/if}} />' + + ' <label for="canEdit-{{cid}}-{{shareWith}}">{{canEditLabel}}</label>' + ' {{/if}}' + ' {{#unless isRemoteShare}}' + ' <a href="#" class="showCruds"><img class="svg" alt="{{crudsLabel}}" src="{{triangleSImage}}"/></a>' + ' <div class="cruds hidden">' + ' {{#if createPermissionPossible}}' + - ' <input id="canCreate-{{shareWith}}" type="checkbox" name="create" class="permissions" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>' + - ' <label for="canCreate-{{shareWith}}">{{createPermissionLabel}}</label>' + + ' <input id="canCreate-{{cid}}-{{shareWith}}" type="checkbox" name="create" class="permissions checkbox" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>' + + ' <label for="canCreate-{{cid}}-{{shareWith}}">{{createPermissionLabel}}</label>' + ' {{/if}}' + ' {{#if updatePermissionPossible}}' + - ' <input id="canUpdate-{{shareWith}}" type="checkbox" name="update" class="permissions" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>' + - ' <label for="canUpdate-{{shareWith}}">{{updatePermissionLabel}}</label>' + + ' <input id="canUpdate-{{cid}}-{{shareWith}}" type="checkbox" name="update" class="permissions checkbox" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>' + + ' <label for="canUpdate-{{cid}}-{{shareWith}}">{{updatePermissionLabel}}</label>' + ' {{/if}}' + ' {{#if deletePermissionPossible}} {{#unless isRemoteShare}}' + - ' <input id="canDelete-{{shareWith}}" type="checkbox" name="delete" class="permissions" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' + - ' <label for="canDelete-{{shareWith}}">{{deletePermissionLabel}}</label>' + + ' <input id="canDelete-{{cid}}-{{shareWith}}" type="checkbox" name="delete" class="permissions checkbox" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' + + ' <label for="canDelete-{{cid}}-{{shareWith}}">{{deletePermissionLabel}}</label>' + ' {{/unless}} {{/if}}' + ' </div>' + ' {{/unless}}' + @@ -146,6 +146,7 @@ } return _.extend(hasPermissionOverride, { + cid: this.cid, hasSharePermission: this.model.hasSharePermission(shareIndex), hasEditPermission: this.model.hasEditPermission(shareIndex), hasCreatePermission: this.model.hasCreatePermission(shareIndex), @@ -209,8 +210,8 @@ }, render: function() { - var shareeListTemplate = this.template(); - this.$el.html(shareeListTemplate({ + this.$el.html(this.template({ + cid: this.cid, sharees: this.getShareeList() })); @@ -235,21 +236,23 @@ * @returns {Function} from Handlebars * @private */ - template: function () { + template: function (data) { if (!this._template) { this._template = Handlebars.compile(TEMPLATE); } - return this._template; + return this._template(data); }, onUnshare: function(event) { var $element = $(event.target); + console.log($element); - if($element.hasClass('icon-loading-small')) { + var $loading = $element.siblings('.icon-loading-small').eq(0); + if(!$loading.hasClass('hidden')) { // in process return; } - $element.empty().addClass('icon-loading-small'); + $loading.removeClass('hidden'); var $li = $element.closest('li'); var shareType = $li.data('share-type'); diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js index 2b61dab3ceb..dd07adceac4 100644 --- a/core/js/sharedialogview.js +++ b/core/js/sharedialogview.js @@ -14,19 +14,19 @@ } var TEMPLATE_BASE = - '<div class="resharerInfoView"></div>' + + '<div class="resharerInfoView subView"></div>' + '{{#if isSharingAllowed}}' + - '<label for="shareWith" class="hidden-visually">{{shareLabel}}</label>' + + '<label for="shareWith-{{cid}}" class="hidden-visually">{{shareLabel}}</label>' + '<div class="oneline">' + - ' <input id="shareWith" type="text" placeholder="{{sharePlaceholder}}" />' + + ' <input id="shareWith-{{cid}}" class="shareWithField" type="text" placeholder="{{sharePlaceholder}}" />' + ' <span class="shareWithLoading icon-loading-small hidden"></span>'+ '{{{remoteShareInfo}}}' + '</div>' + '{{/if}}' + - '<div class="shareeListView"></div>' + - '<div class="linkShareView"></div>' + - '<div class="expirationView"></div>' - ; + '<div class="shareeListView subView"></div>' + + '<div class="linkShareView subView"></div>' + + '<div class="expirationView subView"></div>' + + '<div class="loading hidden" style="height: 50px"></div>'; var TEMPLATE_REMOTE_SHARE_INFO = '<a target="_blank" class="icon-info svg shareWithRemoteInfo hasTooltip" href="{{docLink}}" ' + @@ -87,6 +87,9 @@ view.render(); }); + this.model.on('request', this._onRequest, this); + this.model.on('sync', this._onEndRequest, this); + var subViewOptions = { model: this.model, configModel: this.configModel @@ -124,7 +127,7 @@ $loading.addClass('hidden'); $loading.removeClass('inlineblock'); if (result.status == 'success' && result.data.length > 0) { - $("#shareWith").autocomplete("option", "autoFocus", true); + $('.shareWithField').autocomplete("option", "autoFocus", true); response(result.data); } else { response(); @@ -161,21 +164,50 @@ this.model.addShare(s.item.value); }, + _toggleLoading: function(state) { + this._loading = state; + this.$el.find('.subView').toggleClass('hidden', state); + this.$el.find('.loading').toggleClass('hidden', !state); + }, + + _onRequest: function() { + // only show the loading spinner for the first request (for now) + if (!this._loadingOnce) { + this._toggleLoading(true); + } + }, + + _onEndRequest: function() { + var self = this; + this._toggleLoading(false); + if (!this._loadingOnce) { + this._loadingOnce = true; + // the first time, focus on the share field after the spinner disappeared + _.defer(function() { + self.$('.shareWithField').focus(); + }); + } + }, + render: function() { var baseTemplate = this._getTemplate('base', TEMPLATE_BASE); this.$el.html(baseTemplate({ + cid: this.cid, shareLabel: t('core', 'Share'), sharePlaceholder: this._renderSharePlaceholderPart(), remoteShareInfo: this._renderRemoteShareInfoPart(), isSharingAllowed: this.model.sharePermissionPossible() })); - var $shareField = this.$el.find('#shareWith'); + var $shareField = this.$el.find('.shareWithField'); if ($shareField.length) { $shareField.autocomplete({ minLength: 2, delay: 750, + focus: function(event) { + event.preventDefault(); + }, source: this.autocompleteHandler, select: this._onSelectRecipient }).data('ui-autocomplete')._renderItem = this.autocompleteRenderItem; diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js index ff0d3a6d800..1cf116f08f9 100644 --- a/core/js/shareitemmodel.js +++ b/core/js/shareitemmodel.js @@ -50,7 +50,7 @@ * @property {string} token * @property {string} share_with * @property {string} share_with_displayname - * @property {string} share_mail_send + * @property {string} mail_send * @property {OC.Share.Types.Collection|undefined} collection * @property {Date} expiration optional? * @property {number} stime optional? @@ -64,6 +64,15 @@ */ /** + * These properties are sometimes returned by the server as strings instead + * of integers, so we need to convert them accordingly... + */ + var SHARE_RESPONSE_INT_PROPS = [ + 'id', 'file_parent', 'mail_send', 'file_source', 'item_source', 'permissions', + 'storage', 'share_type', 'parent', 'stime' + ]; + + /** * @class OCA.Share.ShareItemModel * @classdesc * @@ -288,8 +297,7 @@ * @returns {boolean} */ hasUserShares: function() { - var shares = this.get('shares'); - return _.isArray(shares) && shares.length > 0; + return this.getSharesWithCurrentItem().length > 0; }, /** @@ -399,6 +407,20 @@ }, /** + * Returns all share entries that only apply to the current item + * (file/folder) + * + * @return {Array.<OC.Share.Types.ShareInfo>} + */ + getSharesWithCurrentItem: function() { + var shares = this.get('shares') || []; + var fileId = this.fileInfoModel.get('id'); + return _.filter(shares, function(share) { + return share.item_source === fileId; + }); + }, + + /** * @param shareIndex * @returns {string} */ @@ -462,7 +484,7 @@ if(!_.isObject(share)) { throw "Unknown Share"; } - return share.share_mail_send === '1'; + return share.mail_send === 1; }, /** @@ -500,11 +522,12 @@ * @param {string} recipientEmail recipient email address */ sendEmailPrivateLink: function(recipientEmail) { + var deferred = $.Deferred(); var itemType = this.get('itemType'); var itemSource = this.get('itemSource'); var linkShare = this.get('linkShare'); - return $.post( + $.post( OC.generateUrl('core/ajax/share.php'), { action: 'email', toaddress: recipientEmail, @@ -518,8 +541,13 @@ if (!result || result.status !== 'success') { // FIXME: a model should not show dialogs OC.dialogs.alert(result.data.message, t('core', 'Error while sending notification')); + deferred.reject(); + } else { + deferred.resolve(); } }); + + return deferred.promise(); }, /** @@ -602,7 +630,9 @@ fetch: function() { var model = this; + this.trigger('request', this); OC.Share.loadItem(this.get('itemType'), this.get('itemSource'), function(data) { + model.trigger('sync', 'GET', this); model.set(model.parse(data)); }); }, @@ -618,6 +648,8 @@ var fileId = this.fileInfoModel.get('id'); if (!shares || !shares.length) { delete OC.Share.statuses[fileId]; + OC.Share.currentShares = {}; + OC.Share.itemShares = []; return; } @@ -671,7 +703,19 @@ } /** @type {OC.Share.Types.ShareInfo[]} **/ - var shares = _.toArray(data.shares); + var shares = _.map(data.shares, function(share) { + // properly parse some values because sometimes the server + // returns integers as string... + var i; + for (i = 0; i < SHARE_RESPONSE_INT_PROPS.length; i++) { + var prop = SHARE_RESPONSE_INT_PROPS[i]; + if (!_.isUndefined(share[prop])) { + share[prop] = parseInt(share[prop], 10); + } + } + return share; + }); + this._legacyFillCurrentShares(shares); var linkShare = { isLinkShare: false }; diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js index c70ea0ff9fa..8dd2214621a 100644 --- a/core/js/tests/specs/setupchecksSpec.js +++ b/core/js/tests/specs/setupchecksSpec.js @@ -73,7 +73,8 @@ describe('OC.SetupChecks tests', function() { isUrandomAvailable: true, serverHasInternetConnection: false, memcacheDocs: 'https://doc.owncloud.org/server/go.php?to=admin-performance', - forwardedForHeadersWorking: true + forwardedForHeadersWorking: true, + isCorrectMemcachedPHPModuleInstalled: true, }) ); @@ -106,7 +107,8 @@ describe('OC.SetupChecks tests', function() { serverHasInternetConnection: false, dataDirectoryProtected: false, memcacheDocs: 'https://doc.owncloud.org/server/go.php?to=admin-performance', - forwardedForHeadersWorking: true + forwardedForHeadersWorking: true, + isCorrectMemcachedPHPModuleInstalled: true, }) ); @@ -141,7 +143,8 @@ describe('OC.SetupChecks tests', function() { serverHasInternetConnection: false, dataDirectoryProtected: false, isMemcacheConfigured: true, - forwardedForHeadersWorking: true + forwardedForHeadersWorking: true, + isCorrectMemcachedPHPModuleInstalled: true, }) ); @@ -173,7 +176,8 @@ describe('OC.SetupChecks tests', function() { serverHasInternetConnection: true, dataDirectoryProtected: true, isMemcacheConfigured: true, - forwardedForHeadersWorking: true + forwardedForHeadersWorking: true, + isCorrectMemcachedPHPModuleInstalled: true, }) ); @@ -186,6 +190,34 @@ describe('OC.SetupChecks tests', function() { }); }); + it('should return an error if the wrong memcache PHP module is installed', function(done) { + var async = OC.SetupChecks.checkSetup(); + + suite.server.requests[0].respond( + 200, + { + 'Content-Type': 'application/json', + }, + JSON.stringify({ + isUrandomAvailable: true, + securityDocs: 'https://docs.owncloud.org/myDocs.html', + serverHasInternetConnection: true, + dataDirectoryProtected: true, + isMemcacheConfigured: true, + forwardedForHeadersWorking: true, + isCorrectMemcachedPHPModuleInstalled: false, + }) + ); + + async.done(function( data, s, x ){ + expect(data).toEqual([{ + msg: 'Memcached is configured as distributed cache, but the wrong PHP module "memcache" is installed. \\OC\\Memcache\\Memcached only supports "memcached" and not "memcache". See the <a href="https://code.google.com/p/memcached/wiki/PHPClientComparison">memcached wiki about both modules</a>.', + type: OC.SetupChecks.MESSAGE_TYPE_WARNING + }]); + done(); + }); + }); + it('should return an error if the forwarded for headers are not working', function(done) { var async = OC.SetupChecks.checkSetup(); @@ -200,7 +232,8 @@ describe('OC.SetupChecks tests', function() { dataDirectoryProtected: true, isMemcacheConfigured: true, forwardedForHeadersWorking: false, - reverseProxyDocs: 'https://docs.owncloud.org/foo/bar.html' + reverseProxyDocs: 'https://docs.owncloud.org/foo/bar.html', + isCorrectMemcachedPHPModuleInstalled: true, }) ); @@ -248,7 +281,8 @@ describe('OC.SetupChecks tests', function() { dataDirectoryProtected: true, isMemcacheConfigured: true, forwardedForHeadersWorking: true, - phpSupported: {eol: true, version: '5.4.0'} + phpSupported: {eol: true, version: '5.4.0'}, + isCorrectMemcachedPHPModuleInstalled: true, }) ); diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js index de6f9944094..55aa0541bd0 100644 --- a/core/js/tests/specs/sharedialogviewSpec.js +++ b/core/js/tests/specs/sharedialogviewSpec.js @@ -80,6 +80,9 @@ describe('OC.Share.ShareDialogView', function() { model: shareModel }); + // required for proper event propagation when simulating clicks in some cases (jquery bugs) + $('#testArea').append(dialog.$el); + // triggers rendering shareModel.set({ shares: [], @@ -111,6 +114,7 @@ describe('OC.Share.ShareDialogView', function() { /* jshint camelcase:false */ oc_appconfig.core = oldAppConfig; + dialog.remove(); fetchStub.restore(); autocompleteStub.restore(); @@ -127,7 +131,7 @@ describe('OC.Share.ShareDialogView', function() { dialog.render(); // Toggle linkshare - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); fakeServer.requests[0].respond( 200, { 'Content-Type': 'application/json' }, @@ -136,9 +140,9 @@ describe('OC.Share.ShareDialogView', function() { // Enable password, enter password and focusout dialog.$el.find('[name=showPassword]').click(); - dialog.$el.find('#linkPassText').focus(); - dialog.$el.find('#linkPassText').val('foo'); - dialog.$el.find('#linkPassText').focusout(); + dialog.$el.find('.linkPassText').focus(); + dialog.$el.find('.linkPassText').val('foo'); + dialog.$el.find('.linkPassText').focusout(); expect(fakeServer.requests[1].method).toEqual('POST'); var body = OC.parseQueryString(fakeServer.requests[1].requestBody); @@ -157,8 +161,8 @@ describe('OC.Share.ShareDialogView', function() { // fetching the model will rerender the view dialog.render(); - expect(dialog.$el.find('#linkPassText').val()).toEqual(''); - expect(dialog.$el.find('#linkPassText').attr('placeholder')).toEqual('**********'); + expect(dialog.$el.find('.linkPassText').val()).toEqual(''); + expect(dialog.$el.find('.linkPassText').attr('placeholder')).toEqual('**********'); }); it('update password on enter', function() { $('#allowShareWithLink').val('yes'); @@ -166,7 +170,7 @@ describe('OC.Share.ShareDialogView', function() { dialog.render(); // Toggle linkshare - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); fakeServer.requests[0].respond( 200, { 'Content-Type': 'application/json' }, @@ -175,9 +179,9 @@ describe('OC.Share.ShareDialogView', function() { // Enable password and enter password dialog.$el.find('[name=showPassword]').click(); - dialog.$el.find('#linkPassText').focus(); - dialog.$el.find('#linkPassText').val('foo'); - dialog.$el.find('#linkPassText').trigger(new $.Event('keyup', {keyCode: 13})); + dialog.$el.find('.linkPassText').focus(); + dialog.$el.find('.linkPassText').val('foo'); + dialog.$el.find('.linkPassText').trigger(new $.Event('keyup', {keyCode: 13})); expect(fakeServer.requests[1].method).toEqual('POST'); var body = OC.parseQueryString(fakeServer.requests[1].requestBody); @@ -196,22 +200,22 @@ describe('OC.Share.ShareDialogView', function() { // fetching the model will rerender the view dialog.render(); - expect(dialog.$el.find('#linkPassText').val()).toEqual(''); - expect(dialog.$el.find('#linkPassText').attr('placeholder')).toEqual('**********'); + expect(dialog.$el.find('.linkPassText').val()).toEqual(''); + expect(dialog.$el.find('.linkPassText').attr('placeholder')).toEqual('**********'); }); it('shows share with link checkbox when allowed', function() { $('#allowShareWithLink').val('yes'); dialog.render(); - expect(dialog.$el.find('#linkCheckbox').length).toEqual(1); + expect(dialog.$el.find('.linkCheckbox').length).toEqual(1); }); it('does not show share with link checkbox when not allowed', function() { $('#allowShareWithLink').val('no'); dialog.render(); - expect(dialog.$el.find('#linkCheckbox').length).toEqual(0); + expect(dialog.$el.find('.linkCheckbox').length).toEqual(0); }); it('shows populated link share when a link share exists', function() { // this is how the OC.Share class does it... @@ -228,8 +232,45 @@ describe('OC.Share.ShareDialogView', function() { dialog.render(); - expect(dialog.$el.find('#linkCheckbox').prop('checked')).toEqual(true); - expect(dialog.$el.find('#linkText').val()).toEqual(link); + expect(dialog.$el.find('.linkCheckbox').prop('checked')).toEqual(true); + expect(dialog.$el.find('.linkText').val()).toEqual(link); + }); + describe('password', function() { + var slideToggleStub; + + beforeEach(function() { + $('#allowShareWithLink').val('yes'); + configModel.set({ + enforcePasswordForPublicLink: false + }); + + slideToggleStub = sinon.stub($.fn, 'slideToggle'); + }); + afterEach(function() { + slideToggleStub.restore(); + }); + + it('enforced but toggled does not fire request', function() { + configModel.set('enforcePasswordForPublicLink', true); + dialog.render(); + + dialog.$el.find('.linkCheckbox').click(); + + // The password linkPass field is shown (slideToggle is called). + // No request is made yet + expect(slideToggleStub.callCount).toEqual(1); + expect(slideToggleStub.getCall(0).thisValue.eq(0).attr('id')).toEqual('linkPass'); + expect(fakeServer.requests.length).toEqual(0); + + // Now untoggle share by link + dialog.$el.find('.linkCheckbox').click(); + dialog.render(); + + // Password field disappears and no ajax requests have been made + expect(fakeServer.requests.length).toEqual(0); + expect(slideToggleStub.callCount).toEqual(2); + expect(slideToggleStub.getCall(1).thisValue.eq(0).attr('id')).toEqual('linkPass'); + }); }); describe('expiration date', function() { var shareData; @@ -265,32 +306,31 @@ describe('OC.Share.ShareDialogView', function() { dialog.render(); expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(false); - expect(dialog.$el.find('#expirationDate').val()).toEqual(''); + expect(dialog.$el.find('.datepicker').val()).toEqual(''); }); it('does not check expiration date checkbox for new share', function() { dialog.render(); expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(false); - expect(dialog.$el.find('#expirationDate').val()).toEqual(''); + expect(dialog.$el.find('.datepicker').val()).toEqual(''); }); it('checks expiration date checkbox and populates field when expiration date was set', function() { - shareModel.get('linkShare').expiration = 1234; + shareModel.get('linkShare').expiration = '2014-02-01 00:00:00'; dialog.render(); expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true); - expect(dialog.$el.find('#expirationDate').val()).toEqual('1234'); + expect(dialog.$el.find('.datepicker').val()).toEqual('01-02-2014'); }); it('sets default date when default date setting is enabled', function() { configModel.set('isDefaultExpireDateEnabled', true); dialog.render(); - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); // here fetch would be called and the server returns the expiration date shareModel.get('linkShare').expiration = '2014-1-27 00:00:00'; dialog.render(); // enabled by default expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true); - // TODO: those zeros must go... - expect(dialog.$el.find('#expirationDate').val()).toEqual('2014-1-27 00:00:00'); + expect(dialog.$el.find('.datepicker').val()).toEqual('27-01-2014'); // disabling is allowed dialog.$el.find('[name=expirationCheckbox]').click(); @@ -302,14 +342,13 @@ describe('OC.Share.ShareDialogView', function() { isDefaultExpireDateEnforced: true }); dialog.render(); - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); // here fetch would be called and the server returns the expiration date shareModel.get('linkShare').expiration = '2014-1-27 00:00:00'; dialog.render(); expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true); - // TODO: those zeros must go... - expect(dialog.$el.find('#expirationDate').val()).toEqual('2014-1-27 00:00:00'); + expect(dialog.$el.find('.datepicker').val()).toEqual('27-01-2014'); // disabling is not allowed expect(dialog.$el.find('[name=expirationCheckbox]').prop('disabled')).toEqual(true); @@ -323,14 +362,14 @@ describe('OC.Share.ShareDialogView', function() { isDefaultExpireDateEnforced: true }); dialog.render(); - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); // here fetch would be called and the server returns the expiration date shareModel.get('linkShare').expiration = '2014-1-27 00:00:00'; dialog.render(); //Enter password - dialog.$el.find('#linkPassText').val('foo'); - dialog.$el.find('#linkPassText').trigger(new $.Event('keyup', {keyCode: 13})); + dialog.$el.find('.linkPassText').val('foo'); + dialog.$el.find('.linkPassText').trigger(new $.Event('keyup', {keyCode: 13})); fakeServer.requests[0].respond( 200, { 'Content-Type': 'application/json' }, @@ -338,27 +377,16 @@ describe('OC.Share.ShareDialogView', function() { ); expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true); - // TODO: those zeros must go... - expect(dialog.$el.find('#expirationDate').val()).toEqual('2014-1-27 00:00:00'); + expect(dialog.$el.find('.datepicker').val()).toEqual('27-01-2014'); // disabling is not allowed expect(dialog.$el.find('[name=expirationCheckbox]').prop('disabled')).toEqual(true); dialog.$el.find('[name=expirationCheckbox]').click(); expect(dialog.$el.find('[name=expirationCheckbox]').prop('checked')).toEqual(true); }); - it('displayes email form when sending emails is enabled', function() { - $('input[name=mailPublicNotificationEnabled]').val('yes'); - dialog.render(); - expect(dialog.$('#emailPrivateLink').length).toEqual(1); - }); - it('not renders email form when sending emails is disabled', function() { - $('input[name=mailPublicNotificationEnabled]').val('no'); - dialog.render(); - expect(dialog.$('#emailPrivateLink').length).toEqual(0); - }); it('sets picker minDate to today and no maxDate by default', function() { dialog.render(); - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); dialog.$el.find('[name=expirationCheckbox]').click(); expect($.datepicker._defaults.minDate).toEqual(expectedMinDate); expect($.datepicker._defaults.maxDate).toEqual(null); @@ -369,7 +397,7 @@ describe('OC.Share.ShareDialogView', function() { isDefaultExpireDateEnforced: true }); dialog.render(); - dialog.$el.find('[name=linkCheckbox]').click(); + dialog.$el.find('.linkCheckbox').click(); expect($.datepicker._defaults.minDate).toEqual(expectedMinDate); expect($.datepicker._defaults.maxDate).toEqual(new Date(2014, 0, 27, 0, 0, 0, 0)); }); @@ -388,6 +416,76 @@ describe('OC.Share.ShareDialogView', function() { expect($.datepicker._defaults.maxDate).toEqual(new Date(2014, 0, 27, 0, 0, 0, 0)); }); }); + describe('send link by email', function() { + var sendEmailPrivateLinkStub; + var clock; + + beforeEach(function() { + configModel.set({ + isMailPublicNotificationEnabled: true + }); + + shareModel.set('linkShare', { + isLinkShare: true, + token: 'tehtoken', + permissions: OC.PERMISSION_READ, + expiration: null + }); + + sendEmailPrivateLinkStub = sinon.stub(dialog.model, "sendEmailPrivateLink"); + clock = sinon.useFakeTimers(); + }); + afterEach(function() { + sendEmailPrivateLinkStub.restore(); + clock.restore(); + }); + + it('displayes form when sending emails is enabled', function() { + $('input[name=mailPublicNotificationEnabled]').val('yes'); + dialog.render(); + expect(dialog.$('.emailPrivateLinkForm').length).toEqual(1); + }); + it('form not rendered when sending emails is disabled', function() { + $('input[name=mailPublicNotificationEnabled]').val('no'); + dialog.render(); + expect(dialog.$('.emailPrivateLinkForm').length).toEqual(0); + }); + it('input cleared on success', function() { + var defer = $.Deferred(); + sendEmailPrivateLinkStub.returns(defer.promise()); + + $('input[name=mailPublicNotificationEnabled]').val('yes'); + dialog.render(); + + dialog.$el.find('.emailPrivateLinkForm .emailField').val('a@b.c'); + dialog.$el.find('.emailPrivateLinkForm').trigger('submit'); + + expect(sendEmailPrivateLinkStub.callCount).toEqual(1); + expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual('Sending ...'); + + defer.resolve(); + expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual('Email sent'); + + clock.tick(2000); + expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual(''); + }); + it('input not cleared on failure', function() { + var defer = $.Deferred(); + sendEmailPrivateLinkStub.returns(defer.promise()); + + $('input[name=mailPublicNotificationEnabled]').val('yes'); + dialog.render(); + + dialog.$el.find('.emailPrivateLinkForm .emailField').val('a@b.c'); + dialog.$el.find('.emailPrivateLinkForm').trigger('submit'); + + expect(sendEmailPrivateLinkStub.callCount).toEqual(1); + expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual('Sending ...'); + + defer.reject(); + expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual('a@b.c'); + }); + }); }); describe('check for avatar', function() { beforeEach(function() { @@ -438,7 +536,7 @@ describe('OC.Share.ShareDialogView', function() { it('test correct function calls', function() { expect(avatarStub.calledTwice).toEqual(true); expect(placeholderStub.calledTwice).toEqual(true); - expect(dialog.$('#shareWithList').children().length).toEqual(3); + expect(dialog.$('.shareWithList').children().length).toEqual(3); expect(dialog.$('.avatar').length).toEqual(4); }); @@ -552,7 +650,7 @@ describe('OC.Share.ShareDialogView', function() { permissions: OC.PERMISSION_READ }); dialog.render(); - expect(dialog.$el.find('#shareWith').prop('disabled')).toEqual(true); + expect(dialog.$el.find('.shareWithField').prop('disabled')).toEqual(true); }); it('shows reshare owner', function() { shareModel.set({ diff --git a/core/js/tests/specs/shareitemmodelSpec.js b/core/js/tests/specs/shareitemmodelSpec.js index c1d820052e2..28daf860393 100644 --- a/core/js/tests/specs/shareitemmodelSpec.js +++ b/core/js/tests/specs/shareitemmodelSpec.js @@ -169,7 +169,7 @@ describe('OC.Share.ShareItemModel', function() { /* jshint camelcase: false */ shares: [{ displayname_owner: 'root', - expiration: 1111, + expiration: '2015-10-12 00:00:00', file_source: 123, file_target: '/folder', id: 20, @@ -187,7 +187,7 @@ describe('OC.Share.ShareItemModel', function() { uid_owner: 'root' }, { displayname_owner: 'root', - expiration: 2222, + expiration: '2015-10-15 00:00:00', file_source: 456, file_target: '/file_in_folder.txt', id: 21, @@ -249,10 +249,7 @@ describe('OC.Share.ShareItemModel', function() { it('allows owner to share their own share when they are also the recipient', function() { OC.currentUser = 'user1'; loadItemStub.yields({ - reshare: { - permissions: OC.PERMISSION_READ, - uid_owner: 'user1' - }, + reshare: {}, shares: [] }); @@ -261,6 +258,108 @@ describe('OC.Share.ShareItemModel', function() { // sharing still allowed expect(model.get('permissions') & OC.PERMISSION_SHARE).toEqual(OC.PERMISSION_SHARE); }); + it('properly parses integer values when the server is in the mood of returning ints as string', function() { + loadItemStub.yields({ + reshare: {}, + shares: [{ + displayname_owner: 'root', + expiration: '2015-10-12 00:00:00', + file_source: '123', + file_target: '/folder', + id: '20', + item_source: '123', + item_type: 'file', + mail_send: '0', + parent: '999', + path: '/folder', + permissions: '' + OC.PERMISSION_READ, + share_type: '' + OC.Share.SHARE_TYPE_USER, + share_with: 'user1', + stime: '1403884258', + storage: '1', + token: 'tehtoken', + uid_owner: 'root' + }] + }); + + model.fetch(); + + var shares = model.get('shares'); + expect(shares.length).toEqual(1); + + var share = shares[0]; + expect(share.id).toEqual(20); + expect(share.file_source).toEqual(123); + expect(share.file_target).toEqual('/folder'); + expect(share.item_source).toEqual(123); + expect(share.item_type).toEqual('file'); + expect(share.displayname_owner).toEqual('root'); + expect(share.mail_send).toEqual(0); + expect(share.parent).toEqual(999); + expect(share.path).toEqual('/folder'); + expect(share.permissions).toEqual(OC.PERMISSION_READ); + expect(share.share_type).toEqual(OC.Share.SHARE_TYPE_USER); + expect(share.share_with).toEqual('user1'); + expect(share.stime).toEqual(1403884258); + expect(share.expiration).toEqual('2015-10-12 00:00:00'); + }); + }); + describe('hasUserShares', function() { + it('returns false when no user shares exist', function() { + loadItemStub.yields({ + reshare: {}, + shares: [] + }); + + model.fetch(); + + expect(model.hasUserShares()).toEqual(false); + }); + it('returns true when user shares exist on the current item', function() { + loadItemStub.yields({ + reshare: {}, + shares: [{ + id: 1, + share_type: OC.Share.SHARE_TYPE_USER, + share_with: 'user1', + item_source: '123' + }] + }); + + model.fetch(); + + expect(model.hasUserShares()).toEqual(true); + }); + it('returns true when group shares exist on the current item', function() { + loadItemStub.yields({ + reshare: {}, + shares: [{ + id: 1, + share_type: OC.Share.SHARE_TYPE_GROUP, + share_with: 'group1', + item_source: '123' + }] + }); + + model.fetch(); + + expect(model.hasUserShares()).toEqual(true); + }); + it('returns false when share exist on parent item', function() { + loadItemStub.yields({ + reshare: {}, + shares: [{ + id: 1, + share_type: OC.Share.SHARE_TYPE_GROUP, + share_with: 'group1', + item_source: '111' + }] + }); + + model.fetch(); + + expect(model.hasUserShares()).toEqual(false); + }); }); describe('Util', function() { @@ -279,5 +378,105 @@ describe('OC.Share.ShareItemModel', function() { }); }); + + describe('sendEmailPrivateLink', function() { + it('succeeds', function() { + loadItemStub.yields({ + shares: [{ + displayname_owner: 'root', + expiration: null, + file_source: 123, + file_target: '/folder', + id: 20, + item_source: '123', + item_type: 'folder', + mail_send: '0', + parent: null, + path: '/folder', + permissions: OC.PERMISSION_READ, + share_type: OC.Share.SHARE_TYPE_LINK, + share_with: null, + stime: 1403884258, + storage: 1, + token: 'tehtoken', + uid_owner: 'root' + }] + }); + model.fetch(); + + var res = model.sendEmailPrivateLink('foo@bar.com'); + + expect(res.state()).toEqual('pending'); + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].url).toEqual(OC.generateUrl('core/ajax/share.php')); + expect(OC.parseQueryString(fakeServer.requests[0].requestBody)).toEqual( + { + action: 'email', + toaddress: 'foo@bar.com', + link: model.get('linkShare').link, + itemType: 'file', + itemSource: '123', + file: 'shared_file_name.txt', + expiration: '' + } + ) + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({status: 'success'}) + ); + expect(res.state()).toEqual('resolved'); + }); + + it('fails', function() { + loadItemStub.yields({ + shares: [{ + displayname_owner: 'root', + expiration: null, + file_source: 123, + file_target: '/folder', + id: 20, + item_source: '123', + item_type: 'folder', + mail_send: '0', + parent: null, + path: '/folder', + permissions: OC.PERMISSION_READ, + share_type: OC.Share.SHARE_TYPE_LINK, + share_with: null, + stime: 1403884258, + storage: 1, + token: 'tehtoken', + uid_owner: 'root' + }] + }); + model.fetch(); + + var res = model.sendEmailPrivateLink('foo@bar.com'); + + expect(res.state()).toEqual('pending'); + expect(fakeServer.requests.length).toEqual(1); + expect(fakeServer.requests[0].url).toEqual(OC.generateUrl('core/ajax/share.php')); + expect(OC.parseQueryString(fakeServer.requests[0].requestBody)).toEqual( + { + action: 'email', + toaddress: 'foo@bar.com', + link: model.get('linkShare').link, + itemType: 'file', + itemSource: '123', + file: 'shared_file_name.txt', + expiration: '' + } + ) + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({data: {message: 'fail'}, status: 'error'}) + ); + expect(res.state()).toEqual('rejected'); + }); + }); }); diff --git a/core/js/update.js b/core/js/update.js index fd3c7a56bd6..090f8fa5d23 100644 --- a/core/js/update.js +++ b/core/js/update.js @@ -27,6 +27,11 @@ this.$el = $el; this._started = true; + + $(window).on('beforeunload.inprogress', function () { + return t('core', 'The upgrade is in progress, leaving this page might interrupt the process in some environments.'); + }); + this.addMessage(t( 'core', 'Updating {productName} to version {version}, this may take a while.', { @@ -45,12 +50,15 @@ hasWarnings = true; }); updateEventSource.listen('error', function(message) { + message = message || t('core', 'An error occurred.'); + $(window).off('beforeunload.inprogress'); $('<span>').addClass('error').append(message).append('<br />').appendTo($el); message = t('core', 'Please reload the page.'); - $('<span>').addClass('error').append(message).append('<br />').appendTo($el); + $('<span>').addClass('error').append('<a href=".">'+message+'</a><br />').appendTo($el); updateEventSource.close(); }); updateEventSource.listen('failure', function(message) { + $(window).off('beforeunload.inprogress'); $('<span>').addClass('error').append(message).append('<br />').appendTo($el); $('<span>') .addClass('bold') @@ -60,6 +68,8 @@ .appendTo($el); }); updateEventSource.listen('done', function() { + $(window).off('beforeunload.inprogress'); + if (hasWarnings) { $('<span>').addClass('bold') .append('<br />') diff --git a/core/l10n/af_ZA.js b/core/l10n/af_ZA.js index 6bc1ed26add..fa31f60fc50 100644 --- a/core/l10n/af_ZA.js +++ b/core/l10n/af_ZA.js @@ -36,6 +36,7 @@ OC.L10N.register( "December" : "Desember", "Settings" : "Instellings", "Saving..." : "Stoor...", + "seconds ago" : "sekondes gelede", "Couldn't send reset email. Please contact your administrator." : "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Die \"link\" vir die herstel van jou wagwoord is na jou epos gestuur. As jy dit nie binne 'n redelike tyd ontvang nie, soek deur jou \"spam/junk\" omslagte.<br>As dit nie daar is nie vra jou administrateur vir hulp.", "I know what I'm doing" : "Ek weet wat ek doen", diff --git a/core/l10n/af_ZA.json b/core/l10n/af_ZA.json index b8e7eb39b43..098649bdccd 100644 --- a/core/l10n/af_ZA.json +++ b/core/l10n/af_ZA.json @@ -34,6 +34,7 @@ "December" : "Desember", "Settings" : "Instellings", "Saving..." : "Stoor...", + "seconds ago" : "sekondes gelede", "Couldn't send reset email. Please contact your administrator." : "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Die \"link\" vir die herstel van jou wagwoord is na jou epos gestuur. As jy dit nie binne 'n redelike tyd ontvang nie, soek deur jou \"spam/junk\" omslagte.<br>As dit nie daar is nie vra jou administrateur vir hulp.", "I know what I'm doing" : "Ek weet wat ek doen", diff --git a/core/l10n/ar.js b/core/l10n/ar.js index a0ef7db8521..e180f2e61df 100644 --- a/core/l10n/ar.js +++ b/core/l10n/ar.js @@ -45,6 +45,7 @@ OC.L10N.register( "Dec." : "كانون الأول", "Settings" : "إعدادات", "Saving..." : "جاري الحفظ...", + "seconds ago" : "منذ ثواني", "I know what I'm doing" : "أعرف ماذا أفعل", "Password can not be changed. Please contact your administrator." : "كلمة المرور لا يمكن تغييرها. فضلاً تحدث مع المسؤول", "No" : "لا", diff --git a/core/l10n/ar.json b/core/l10n/ar.json index 5ac8003fb4c..1240d8aadb0 100644 --- a/core/l10n/ar.json +++ b/core/l10n/ar.json @@ -43,6 +43,7 @@ "Dec." : "كانون الأول", "Settings" : "إعدادات", "Saving..." : "جاري الحفظ...", + "seconds ago" : "منذ ثواني", "I know what I'm doing" : "أعرف ماذا أفعل", "Password can not be changed. Please contact your administrator." : "كلمة المرور لا يمكن تغييرها. فضلاً تحدث مع المسؤول", "No" : "لا", diff --git a/core/l10n/ast.js b/core/l10n/ast.js index 1e02a7ca37c..f4392491b1e 100644 --- a/core/l10n/ast.js +++ b/core/l10n/ast.js @@ -53,6 +53,7 @@ OC.L10N.register( "Dec." : "Avi.", "Settings" : "Axustes", "Saving..." : "Guardando...", + "seconds ago" : "hai segundos", "Couldn't send reset email. Please contact your administrator." : "Nun pudo unviase'l corréu de reaniciu. Por favor, contauta col alministrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Unviósete al corréu l'enllaz pa reaniciar la to contraseña. Si nun lu recibes nuna cantidá razonable de tiempu, comprueba les tos carpetes de corréu puxarra. <br>Si nun ta ehí, entruga al to alministrador llocal", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Los tos ficheros tán crifraos. Si nun habilitesti la clave de recuperación, nun habrá forma de recuperar los tos datos dempués de que se reanicie la to contraseña.<br />Si nun tas seguru de qué facer, por favor contauta col to alministrador enantes que sigas. <br />¿De xuru quies siguir?", diff --git a/core/l10n/ast.json b/core/l10n/ast.json index 636960d6496..68adb758817 100644 --- a/core/l10n/ast.json +++ b/core/l10n/ast.json @@ -51,6 +51,7 @@ "Dec." : "Avi.", "Settings" : "Axustes", "Saving..." : "Guardando...", + "seconds ago" : "hai segundos", "Couldn't send reset email. Please contact your administrator." : "Nun pudo unviase'l corréu de reaniciu. Por favor, contauta col alministrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Unviósete al corréu l'enllaz pa reaniciar la to contraseña. Si nun lu recibes nuna cantidá razonable de tiempu, comprueba les tos carpetes de corréu puxarra. <br>Si nun ta ehí, entruga al to alministrador llocal", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Los tos ficheros tán crifraos. Si nun habilitesti la clave de recuperación, nun habrá forma de recuperar los tos datos dempués de que se reanicie la to contraseña.<br />Si nun tas seguru de qué facer, por favor contauta col to alministrador enantes que sigas. <br />¿De xuru quies siguir?", diff --git a/core/l10n/az.js b/core/l10n/az.js index 647c1f3c273..10532ce6607 100644 --- a/core/l10n/az.js +++ b/core/l10n/az.js @@ -49,6 +49,7 @@ OC.L10N.register( "Dec." : "Dek.", "Settings" : "Quraşdırmalar", "Saving..." : "Saxlama...", + "seconds ago" : "saniyələr öncə", "No" : "Xeyir", "Yes" : "Bəli", "Choose" : "Seç", diff --git a/core/l10n/az.json b/core/l10n/az.json index a49a9528230..ebfeca74bf7 100644 --- a/core/l10n/az.json +++ b/core/l10n/az.json @@ -47,6 +47,7 @@ "Dec." : "Dek.", "Settings" : "Quraşdırmalar", "Saving..." : "Saxlama...", + "seconds ago" : "saniyələr öncə", "No" : "Xeyir", "Yes" : "Bəli", "Choose" : "Seç", diff --git a/core/l10n/be.js b/core/l10n/be.js index defe9f70337..5b4674ee6d2 100644 --- a/core/l10n/be.js +++ b/core/l10n/be.js @@ -21,6 +21,7 @@ OC.L10N.register( "November" : "Лістапад", "December" : "Снежань", "Settings" : "Налады", + "seconds ago" : "Секунд таму", "No" : "Не", "Yes" : "Так", "Choose" : "Выбар", diff --git a/core/l10n/be.json b/core/l10n/be.json index 50e1a29dcaf..ef4093ebc67 100644 --- a/core/l10n/be.json +++ b/core/l10n/be.json @@ -19,6 +19,7 @@ "November" : "Лістапад", "December" : "Снежань", "Settings" : "Налады", + "seconds ago" : "Секунд таму", "No" : "Не", "Yes" : "Так", "Choose" : "Выбар", diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js index dd8610428f2..f8d2e44204a 100644 --- a/core/l10n/bg_BG.js +++ b/core/l10n/bg_BG.js @@ -57,6 +57,7 @@ OC.L10N.register( "Dec." : "Дек.", "Settings" : "Настройки", "Saving..." : "Запазване...", + "seconds ago" : "преди секунди", "Couldn't send reset email. Please contact your administrator." : "Изпращането на електронна поща е неуспешно. Моля, свържете се с вашия администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Връзката за възстановяване на паролата беше изпратена до вашата електронна поща. Ако не я получите в разумен период от време, проверете папките си за спам и junk.<br>Ако не я откривате и там, се свържете с местния администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Файловете Ви са криптирани. Ако не сте настроили ключ за възстановяване, няма да е възможно да се възстановят данните Ви след смяна на паролата.<br />Ако не сте сигурни какво да направите, моля, свържете се с Вашия администратор преди да продължите. <br/>Наистина ли искате да продължите?", @@ -152,7 +153,6 @@ OC.L10N.register( "New Password" : "Нова Парола", "Reset password" : "Възстановяване на паролата", "Searching other places" : "Търсене в други места", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат от търсене в други места","{count} резултати от търсене в други места"], "Personal" : "Лични", "Users" : "Потребители", "Apps" : "Приложения", diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json index 91a9704f7ef..4709830c087 100644 --- a/core/l10n/bg_BG.json +++ b/core/l10n/bg_BG.json @@ -55,6 +55,7 @@ "Dec." : "Дек.", "Settings" : "Настройки", "Saving..." : "Запазване...", + "seconds ago" : "преди секунди", "Couldn't send reset email. Please contact your administrator." : "Изпращането на електронна поща е неуспешно. Моля, свържете се с вашия администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Връзката за възстановяване на паролата беше изпратена до вашата електронна поща. Ако не я получите в разумен период от време, проверете папките си за спам и junk.<br>Ако не я откривате и там, се свържете с местния администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Файловете Ви са криптирани. Ако не сте настроили ключ за възстановяване, няма да е възможно да се възстановят данните Ви след смяна на паролата.<br />Ако не сте сигурни какво да направите, моля, свържете се с Вашия администратор преди да продължите. <br/>Наистина ли искате да продължите?", @@ -150,7 +151,6 @@ "New Password" : "Нова Парола", "Reset password" : "Възстановяване на паролата", "Searching other places" : "Търсене в други места", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат от търсене в други места","{count} резултати от търсене в други места"], "Personal" : "Лични", "Users" : "Потребители", "Apps" : "Приложения", diff --git a/core/l10n/bn_BD.js b/core/l10n/bn_BD.js index 98eb0da6414..1dc84a030ab 100644 --- a/core/l10n/bn_BD.js +++ b/core/l10n/bn_BD.js @@ -48,6 +48,7 @@ OC.L10N.register( "Dec." : "ডিসে.", "Settings" : "নিয়ামকসমূহ", "Saving..." : "সংরক্ষণ করা হচ্ছে..", + "seconds ago" : "সেকেন্ড পূর্বে", "No" : "না", "Yes" : "হ্যাঁ", "Choose" : "বেছে নিন", diff --git a/core/l10n/bn_BD.json b/core/l10n/bn_BD.json index f1f2cf05ca3..46675b0a904 100644 --- a/core/l10n/bn_BD.json +++ b/core/l10n/bn_BD.json @@ -46,6 +46,7 @@ "Dec." : "ডিসে.", "Settings" : "নিয়ামকসমূহ", "Saving..." : "সংরক্ষণ করা হচ্ছে..", + "seconds ago" : "সেকেন্ড পূর্বে", "No" : "না", "Yes" : "হ্যাঁ", "Choose" : "বেছে নিন", diff --git a/core/l10n/ca.js b/core/l10n/ca.js index 4fdce762dc5..9d397d03408 100644 --- a/core/l10n/ca.js +++ b/core/l10n/ca.js @@ -71,6 +71,7 @@ OC.L10N.register( "Dec." : "Des.", "Settings" : "Configuració", "Saving..." : "Desant...", + "seconds ago" : "segons enrere", "Couldn't send reset email. Please contact your administrator." : "No s'ha pogut restablir el correu. Contacteu amb l'administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "L'enllaç per reiniciar la vostra contrasenya s'ha enviat al vostre correu. Si no el rebeu en un temps raonable comproveu les carpetes de spam. <br>Si no és allà, pregunteu a l'administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Els vostres fitxers estan encriptats. Si no heu habilitat la clau de recuperació no hi haurà manera de recuperar les dades després que reestabliu la contrasenya. <br />Si sabeu què fer, contacteu amb l'administrador abans de continuar.<br />Voleu continuar?", @@ -177,8 +178,6 @@ OC.L10N.register( "New Password" : "Contrasenya nova", "Reset password" : "Reinicialitza la contrasenya", "Searching other places" : "Buscant altres ubicacions", - "No search results in other places" : "No hi ha resultats de cerques a altres llocs", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat de cerca en altres ubicacions","{count} resultats de cerca en altres ubicacions"], "Personal" : "Personal", "Users" : "Usuaris", "Apps" : "Aplicacions", diff --git a/core/l10n/ca.json b/core/l10n/ca.json index 4d147db52f4..52de7a322b4 100644 --- a/core/l10n/ca.json +++ b/core/l10n/ca.json @@ -69,6 +69,7 @@ "Dec." : "Des.", "Settings" : "Configuració", "Saving..." : "Desant...", + "seconds ago" : "segons enrere", "Couldn't send reset email. Please contact your administrator." : "No s'ha pogut restablir el correu. Contacteu amb l'administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "L'enllaç per reiniciar la vostra contrasenya s'ha enviat al vostre correu. Si no el rebeu en un temps raonable comproveu les carpetes de spam. <br>Si no és allà, pregunteu a l'administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Els vostres fitxers estan encriptats. Si no heu habilitat la clau de recuperació no hi haurà manera de recuperar les dades després que reestabliu la contrasenya. <br />Si sabeu què fer, contacteu amb l'administrador abans de continuar.<br />Voleu continuar?", @@ -175,8 +176,6 @@ "New Password" : "Contrasenya nova", "Reset password" : "Reinicialitza la contrasenya", "Searching other places" : "Buscant altres ubicacions", - "No search results in other places" : "No hi ha resultats de cerques a altres llocs", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat de cerca en altres ubicacions","{count} resultats de cerca en altres ubicacions"], "Personal" : "Personal", "Users" : "Usuaris", "Apps" : "Aplicacions", diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js index ac1d9631c53..f48b1f54d2b 100644 --- a/core/l10n/cs_CZ.js +++ b/core/l10n/cs_CZ.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Nebylo možné odeslat email následujícím uživatelům: %s", "Preparing update" : "Příprava na aktualizaci", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Test přesunu bude přeskočen - \"update.skip-migration-test\" je aktivován v souboru ", "Turned on maintenance mode" : "Zapnut režim údržby", "Turned off maintenance mode" : "Vypnut režim údržby", "Maintenance mode is kept active" : "Mód údržby je aktivní", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Aktualizováno z \"%s\" na %s", "Repair warning: " : "Upozornění opravy:", "Repair error: " : "Chyba opravy:", + "Set log level to debug - current level: \"%s\"" : "Nastavit úroveň logování na debug - aktuální úroveň: \"%s\"", + "Reset log level to \"%s\"" : "Vrátit úroveň logování na \"%s\"", "Following incompatible apps have been disabled: %s" : "Následující nekompatibilní aplikace byly zakázány: %s", "Following apps have been disabled: %s" : "Následující aplikace byly vypnuty: %s", "Already up to date" : "Je již aktuální", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Soubor nebo obrázek nebyl zadán", "Unknown filetype" : "Neznámý typ souboru", "Invalid image" : "Chybný obrázek", + "An error occurred. Please contact your admin." : "Došlo k chybě. Kontaktujte prosím svého administrátora.", "No temporary profile picture available, try again" : "Dočasný profilový obrázek není k dispozici, zkuste to znovu", "No crop data provided" : "Nebyla poskytnuta data pro oříznutí obrázku", "No valid crop data provided" : "Nebyla poskytnuta platná data pro oříznutí obrázku", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "prosinec", "Settings" : "Nastavení", "Saving..." : "Ukládám...", + "seconds ago" : "před pár sekundami", "Couldn't send reset email. Please contact your administrator." : "Nepodařilo se odeslat email pro změnu hesla. Kontaktujte svého správce systému.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovení hesla byl odeslán na vaši emailovou adresu. Pokud jej v krátké době neobdržíte, zkontrolujte složku nevyžádané pošty a koš.<br>Pokud jej nenaleznete, kontaktujte svého správce systému.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?", @@ -144,12 +149,14 @@ OC.L10N.register( "change" : "změnit", "delete" : "smazat", "access control" : "řízení přístupu", + "Share details could not be loaded for this item." : "Detaily sdílení pro tuto položku nelze načíst.", "An error occured. Please try again" : "Nastala chyba. Prosím zkuste to znovu", "Share" : "Sdílet", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sdílejte s lidmi na ownClouds použitím syntaxe username@example.com/owncloud", "Share with users or groups …" : "Sdílet s uživateli nebo skupinami", "Share with users, groups or remote users …" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli", "Warning" : "Varování", + "Error while sending notification" : "Chyba při odesílání upozornění", "The object type is not specified." : "Není určen typ objektu.", "Enter new" : "Zadat nový", "Delete" : "Smazat", @@ -165,6 +172,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["stáhnout %n soubor","stáhnout %n soubory","stáhnout %n souborů"], "{version} is available. Get more information on how to update." : "Je dostupná {version}. Přečtěte si více informací jak aktualizovat.", "Updating {productName} to version {version}, this may take a while." : "Aktualizuji {productName} na verzi {version}, může to chvíli trvat.", + "An error occurred." : "Došlo k chybě.", "Please reload the page." : "Načtěte stránku znovu, prosím.", "The update was unsuccessful. " : "Aktualizace nebyla úspěšná.", "The update was successful. There were warnings." : "Aktualizace byla úspěšná. Zachycen výskyt varování.", @@ -179,8 +187,8 @@ OC.L10N.register( "New Password" : "Nové heslo", "Reset password" : "Obnovit heslo", "Searching other places" : "Prohledávání ostatních umístění", - "No search results in other places" : "Žádné nálezy v ostatních umístěních", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} nález v ostatních umístěních","{count} nálezy v ostatních umístěních","{count} nálezů v ostatních umístěních"], + "No search results in other folders" : "V ostatních adresářích nebylo nic nalezeno", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} nález v dalším adresáři","{count} nálezy v dalších adresářích","{count} nálezů v dalších adresářích"], "Personal" : "Osobní", "Users" : "Uživatelé", "Apps" : "Aplikace", diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json index 78c0e61d0b8..e83942a8922 100644 --- a/core/l10n/cs_CZ.json +++ b/core/l10n/cs_CZ.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Nebylo možné odeslat email následujícím uživatelům: %s", "Preparing update" : "Příprava na aktualizaci", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Test přesunu bude přeskočen - \"update.skip-migration-test\" je aktivován v souboru ", "Turned on maintenance mode" : "Zapnut režim údržby", "Turned off maintenance mode" : "Vypnut režim údržby", "Maintenance mode is kept active" : "Mód údržby je aktivní", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Aktualizováno z \"%s\" na %s", "Repair warning: " : "Upozornění opravy:", "Repair error: " : "Chyba opravy:", + "Set log level to debug - current level: \"%s\"" : "Nastavit úroveň logování na debug - aktuální úroveň: \"%s\"", + "Reset log level to \"%s\"" : "Vrátit úroveň logování na \"%s\"", "Following incompatible apps have been disabled: %s" : "Následující nekompatibilní aplikace byly zakázány: %s", "Following apps have been disabled: %s" : "Následující aplikace byly vypnuty: %s", "Already up to date" : "Je již aktuální", @@ -18,6 +21,7 @@ "No image or file provided" : "Soubor nebo obrázek nebyl zadán", "Unknown filetype" : "Neznámý typ souboru", "Invalid image" : "Chybný obrázek", + "An error occurred. Please contact your admin." : "Došlo k chybě. Kontaktujte prosím svého administrátora.", "No temporary profile picture available, try again" : "Dočasný profilový obrázek není k dispozici, zkuste to znovu", "No crop data provided" : "Nebyla poskytnuta data pro oříznutí obrázku", "No valid crop data provided" : "Nebyla poskytnuta platná data pro oříznutí obrázku", @@ -69,6 +73,7 @@ "Dec." : "prosinec", "Settings" : "Nastavení", "Saving..." : "Ukládám...", + "seconds ago" : "před pár sekundami", "Couldn't send reset email. Please contact your administrator." : "Nepodařilo se odeslat email pro změnu hesla. Kontaktujte svého správce systému.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovení hesla byl odeslán na vaši emailovou adresu. Pokud jej v krátké době neobdržíte, zkontrolujte složku nevyžádané pošty a koš.<br>Pokud jej nenaleznete, kontaktujte svého správce systému.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?", @@ -142,12 +147,14 @@ "change" : "změnit", "delete" : "smazat", "access control" : "řízení přístupu", + "Share details could not be loaded for this item." : "Detaily sdílení pro tuto položku nelze načíst.", "An error occured. Please try again" : "Nastala chyba. Prosím zkuste to znovu", "Share" : "Sdílet", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sdílejte s lidmi na ownClouds použitím syntaxe username@example.com/owncloud", "Share with users or groups …" : "Sdílet s uživateli nebo skupinami", "Share with users, groups or remote users …" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli", "Warning" : "Varování", + "Error while sending notification" : "Chyba při odesílání upozornění", "The object type is not specified." : "Není určen typ objektu.", "Enter new" : "Zadat nový", "Delete" : "Smazat", @@ -163,6 +170,7 @@ "_download %n file_::_download %n files_" : ["stáhnout %n soubor","stáhnout %n soubory","stáhnout %n souborů"], "{version} is available. Get more information on how to update." : "Je dostupná {version}. Přečtěte si více informací jak aktualizovat.", "Updating {productName} to version {version}, this may take a while." : "Aktualizuji {productName} na verzi {version}, může to chvíli trvat.", + "An error occurred." : "Došlo k chybě.", "Please reload the page." : "Načtěte stránku znovu, prosím.", "The update was unsuccessful. " : "Aktualizace nebyla úspěšná.", "The update was successful. There were warnings." : "Aktualizace byla úspěšná. Zachycen výskyt varování.", @@ -177,8 +185,8 @@ "New Password" : "Nové heslo", "Reset password" : "Obnovit heslo", "Searching other places" : "Prohledávání ostatních umístění", - "No search results in other places" : "Žádné nálezy v ostatních umístěních", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} nález v ostatních umístěních","{count} nálezy v ostatních umístěních","{count} nálezů v ostatních umístěních"], + "No search results in other folders" : "V ostatních adresářích nebylo nic nalezeno", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} nález v dalším adresáři","{count} nálezy v dalších adresářích","{count} nálezů v dalších adresářích"], "Personal" : "Osobní", "Users" : "Uživatelé", "Apps" : "Aplikace", diff --git a/core/l10n/cy_GB.js b/core/l10n/cy_GB.js index ffea08840c1..5f99455146c 100644 --- a/core/l10n/cy_GB.js +++ b/core/l10n/cy_GB.js @@ -41,6 +41,7 @@ OC.L10N.register( "Dec." : "Rhag.", "Settings" : "Gosodiadau", "Saving..." : "Yn cadw...", + "seconds ago" : "eiliad yn ôl", "No" : "Na", "Yes" : "Ie", "Choose" : "Dewisiwch", diff --git a/core/l10n/cy_GB.json b/core/l10n/cy_GB.json index e5f4dae203d..2c3c2533e0e 100644 --- a/core/l10n/cy_GB.json +++ b/core/l10n/cy_GB.json @@ -39,6 +39,7 @@ "Dec." : "Rhag.", "Settings" : "Gosodiadau", "Saving..." : "Yn cadw...", + "seconds ago" : "eiliad yn ôl", "No" : "Na", "Yes" : "Ie", "Choose" : "Dewisiwch", diff --git a/core/l10n/da.js b/core/l10n/da.js index 5461275fb8e..3d90b55836c 100644 --- a/core/l10n/da.js +++ b/core/l10n/da.js @@ -12,6 +12,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Opdaterede \"%s\" til %s", "Repair warning: " : "Reparationsadvarsel:", "Repair error: " : "Reparationsfejl:", + "Set log level to debug - current level: \"%s\"" : "Sæt log niveau til fejlfinding - nuværende niveau: \"%s\"", + "Reset log level to \"%s\"" : "Nulstil log niveau til \"%s\"", "Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s", "Following apps have been disabled: %s" : "Følgende apps er blevet deaktiveret: %s", "Already up to date" : "Allerede opdateret", @@ -71,6 +73,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Indstillinger", "Saving..." : "Gemmer...", + "seconds ago" : "sekunder siden", "Couldn't send reset email. Please contact your administrator." : "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?", @@ -182,8 +185,8 @@ OC.L10N.register( "New Password" : "Ny adgangskode", "Reset password" : "Nulstil kodeord", "Searching other places" : "Søger på andre steder", - "No search results in other places" : "Ingen søgeresultater fra andre steder", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søgeresultat fra andre steder","{count} søgeresultater fra andre steder"], + "No search results in other folders" : "Søgning gav ingen resultater in andre mapper", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søgeresultat fundet i andre mapper","{count} søgeresultater fundet i andre mapper"], "Personal" : "Personligt", "Users" : "Brugere", "Apps" : "Apps", diff --git a/core/l10n/da.json b/core/l10n/da.json index adf9fb314d5..53182aeab70 100644 --- a/core/l10n/da.json +++ b/core/l10n/da.json @@ -10,6 +10,8 @@ "Updated \"%s\" to %s" : "Opdaterede \"%s\" til %s", "Repair warning: " : "Reparationsadvarsel:", "Repair error: " : "Reparationsfejl:", + "Set log level to debug - current level: \"%s\"" : "Sæt log niveau til fejlfinding - nuværende niveau: \"%s\"", + "Reset log level to \"%s\"" : "Nulstil log niveau til \"%s\"", "Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s", "Following apps have been disabled: %s" : "Følgende apps er blevet deaktiveret: %s", "Already up to date" : "Allerede opdateret", @@ -69,6 +71,7 @@ "Dec." : "Dec.", "Settings" : "Indstillinger", "Saving..." : "Gemmer...", + "seconds ago" : "sekunder siden", "Couldn't send reset email. Please contact your administrator." : "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?", @@ -180,8 +183,8 @@ "New Password" : "Ny adgangskode", "Reset password" : "Nulstil kodeord", "Searching other places" : "Søger på andre steder", - "No search results in other places" : "Ingen søgeresultater fra andre steder", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søgeresultat fra andre steder","{count} søgeresultater fra andre steder"], + "No search results in other folders" : "Søgning gav ingen resultater in andre mapper", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søgeresultat fundet i andre mapper","{count} søgeresultater fundet i andre mapper"], "Personal" : "Personligt", "Users" : "Brugere", "Apps" : "Apps", diff --git a/core/l10n/de.js b/core/l10n/de.js index 3b307547244..ff0176b6d94 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -2,6 +2,8 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Die E-Mail konnte nicht an folgende Benutzer gesendet werden: %s", + "Preparing update" : "Update vorbereiten", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrationstests wurden übersprungen - \"update.skip-migration-test\" ist in der config.php aktiviert", "Turned on maintenance mode" : "Wartungsmodus eingeschaltet", "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", "Maintenance mode is kept active" : "Wartungsmodus wird aktiv gehalten", @@ -11,13 +13,17 @@ OC.L10N.register( "Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert", "Repair warning: " : "Reperaturwarnung:", "Repair error: " : "Reperaturfehler:", + "Set log level to debug - current level: \"%s\"" : "Log-Level auf Debug gesetzt - aktuelles Level: \"%s\"", + "Reset log level to \"%s\"" : "Log-Level auf \"%s\" zurückgesetzt", "Following incompatible apps have been disabled: %s" : "Die folgenden inkompatiblen Apps sind deaktiviert worden: %s", "Following apps have been disabled: %s" : "Die folgenden Apps sind deaktiviert worden: %s", + "Already up to date" : "Bereits aktuell", "File is too big" : "Datei ist zu groß", "Invalid file provided" : "Ungültige Datei zur Verfügung gestellt", "No image or file provided" : "Es wurde weder ein Bild noch eine Datei zur Verfügung gestellt", "Unknown filetype" : "Unbekannter Dateityp", "Invalid image" : "Ungültiges Bild", + "An error occurred. Please contact your admin." : "Ein Fehler ist aufgetreten. Bitte kontaktiere den Administrator.", "No temporary profile picture available, try again" : "Kein temporäres Profilbild verfügbar, bitte versuche es noch einmal", "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", @@ -36,6 +42,13 @@ OC.L10N.register( "Thu." : "Do", "Fri." : "Fr", "Sat." : "Sa", + "Su" : "So", + "Mo" : "Mo", + "Tu" : "Di", + "We" : "Mi", + "Th" : "Do", + "Fr" : "Fr", + "Sa" : "Sa", "January" : "Januar", "February" : "Februar", "March" : "März", @@ -62,6 +75,7 @@ OC.L10N.register( "Dec." : "Dez.", "Settings" : "Einstellungen", "Saving..." : "Speichern…", + "seconds ago" : "Gerade eben", "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Deines Passworts ist an Deine E-Mail-Adresse versandt worden. Solltest Du ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfe bitte Deine Spam-Ordner.<br>Wenn er sich nicht darin befindet, frage bitte bei Deinem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Solltest Du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, Deine Daten zurückzuerhalten, nachdem Dein Passwort zurückgesetzt ist.<br />Falls Du Dir nicht sicher bist, was zu tun ist, kontaktiere bitte Deinen Administrator, bevor Du fortfährst.<br />Willst Du wirklich fortfahren?", @@ -95,7 +109,7 @@ OC.L10N.register( "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Deinen Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Du es aus dem Document-Root-Verzeichnis des Webservers herausverschiebst.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a href=\"{docLink}\">Dokumentation</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ist für PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu findest Du in unserer <a href=\"{docLink}\">Dokumentation</a>.", - "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Deine PHP Version ({version}) ist nicht länger <a href=\"{phpLink}\">supported</a>. Wir empfehlen ein Upgrade deiner PHP Version, um die volle Performance und Sicherheit zu gewährleisten.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Deine PHP Version ({version}) wird nicht länger <a href=\"{phpLink}\">unterstützt</a>. Wir empfehlen ein Upgrade deiner PHP Version, um die volle Performance und Sicherheit zu gewährleisten.", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.", @@ -141,6 +155,7 @@ OC.L10N.register( "Share with users or groups …" : "Mit Benutzern oder Gruppen teilen…", "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", + "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Delete" : "Löschen", @@ -156,11 +171,13 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["Lade %n Datei herunter","Lade %n Dateien herunter"], "{version} is available. Get more information on how to update." : "{version} ist verfügbar. Hole weitere Informationen zu Aktualisierungen ein.", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}. Dies könnte eine Weile dauern.", + "An error occurred." : "Es ist ein Fehler aufgetreten.", "Please reload the page." : "Bitte lade die Seite neu.", "The update was unsuccessful. " : "Die Aktualisierung war nicht erfolgreich.", "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Du wirst nun zu ownCloud weitergeleitet.", "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktiere Deinen Administrator.", "%s password reset" : "%s-Passwort zurücksetzen", @@ -169,8 +186,8 @@ OC.L10N.register( "New Password" : "Neues Passwort", "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", - "No search results in other places" : "Keine Suchergebnisse an anderen Orten", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"], + "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis im anderen Ordner","{count} Suchergebnisse in anderen Ordnern"], "Personal" : "Persönlich", "Users" : "Benutzer", "Apps" : "Apps", @@ -247,6 +264,10 @@ OC.L10N.register( "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Bitte kontaktiere Deinen Administrator. Wenn Du Administrator dieser Instanz bist, konfiguriere bitte die „trusted_domain“-Einstellung in config/config.php. Eine Beispielkonfiguration wird unter config/config.sample.php bereitgestellt.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Wenn es Deine Konfiguration zulässt, kannst Du als Administrator gegebenenfalls den Button unten benutzen, um diese Domain als vertrauenswürdig einzustufen.", "Add \"%s\" as trusted domain" : "„%s“ als vertrauenswürdige Domain hinzufügen", + "App update required" : "Appupdate notwendig", + "%s will be updated to version %s" : "%s wird auf Version %s aktuallisiert", + "These apps will be updated:" : "Diese Apps werden aktuallisiert:", + "These incompatible apps will be disabled:" : "Diese inkompatiblen Apps werden deaktiviert:", "The theme %s has been disabled." : "Das Theme %s wurde deaktiviert.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Bitte stelle vor dem Fortsetzen sicher, dass die Datenbank, der Konfigurationsordner und der Datenordner gesichert wurden.", "Start update" : "Aktualisierung starten", diff --git a/core/l10n/de.json b/core/l10n/de.json index 4784f7f1979..94df2d559fc 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -1,5 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Die E-Mail konnte nicht an folgende Benutzer gesendet werden: %s", + "Preparing update" : "Update vorbereiten", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrationstests wurden übersprungen - \"update.skip-migration-test\" ist in der config.php aktiviert", "Turned on maintenance mode" : "Wartungsmodus eingeschaltet", "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", "Maintenance mode is kept active" : "Wartungsmodus wird aktiv gehalten", @@ -9,13 +11,17 @@ "Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert", "Repair warning: " : "Reperaturwarnung:", "Repair error: " : "Reperaturfehler:", + "Set log level to debug - current level: \"%s\"" : "Log-Level auf Debug gesetzt - aktuelles Level: \"%s\"", + "Reset log level to \"%s\"" : "Log-Level auf \"%s\" zurückgesetzt", "Following incompatible apps have been disabled: %s" : "Die folgenden inkompatiblen Apps sind deaktiviert worden: %s", "Following apps have been disabled: %s" : "Die folgenden Apps sind deaktiviert worden: %s", + "Already up to date" : "Bereits aktuell", "File is too big" : "Datei ist zu groß", "Invalid file provided" : "Ungültige Datei zur Verfügung gestellt", "No image or file provided" : "Es wurde weder ein Bild noch eine Datei zur Verfügung gestellt", "Unknown filetype" : "Unbekannter Dateityp", "Invalid image" : "Ungültiges Bild", + "An error occurred. Please contact your admin." : "Ein Fehler ist aufgetreten. Bitte kontaktiere den Administrator.", "No temporary profile picture available, try again" : "Kein temporäres Profilbild verfügbar, bitte versuche es noch einmal", "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", @@ -34,6 +40,13 @@ "Thu." : "Do", "Fri." : "Fr", "Sat." : "Sa", + "Su" : "So", + "Mo" : "Mo", + "Tu" : "Di", + "We" : "Mi", + "Th" : "Do", + "Fr" : "Fr", + "Sa" : "Sa", "January" : "Januar", "February" : "Februar", "March" : "März", @@ -60,6 +73,7 @@ "Dec." : "Dez.", "Settings" : "Einstellungen", "Saving..." : "Speichern…", + "seconds ago" : "Gerade eben", "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Deines Passworts ist an Deine E-Mail-Adresse versandt worden. Solltest Du ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfe bitte Deine Spam-Ordner.<br>Wenn er sich nicht darin befindet, frage bitte bei Deinem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Solltest Du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, Deine Daten zurückzuerhalten, nachdem Dein Passwort zurückgesetzt ist.<br />Falls Du Dir nicht sicher bist, was zu tun ist, kontaktiere bitte Deinen Administrator, bevor Du fortfährst.<br />Willst Du wirklich fortfahren?", @@ -93,7 +107,7 @@ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Deinen Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Du es aus dem Document-Root-Verzeichnis des Webservers herausverschiebst.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a href=\"{docLink}\">Dokumentation</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ist für PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu findest Du in unserer <a href=\"{docLink}\">Dokumentation</a>.", - "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Deine PHP Version ({version}) ist nicht länger <a href=\"{phpLink}\">supported</a>. Wir empfehlen ein Upgrade deiner PHP Version, um die volle Performance und Sicherheit zu gewährleisten.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Deine PHP Version ({version}) wird nicht länger <a href=\"{phpLink}\">unterstützt</a>. Wir empfehlen ein Upgrade deiner PHP Version, um die volle Performance und Sicherheit zu gewährleisten.", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.", @@ -139,6 +153,7 @@ "Share with users or groups …" : "Mit Benutzern oder Gruppen teilen…", "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", + "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Delete" : "Löschen", @@ -154,11 +169,13 @@ "_download %n file_::_download %n files_" : ["Lade %n Datei herunter","Lade %n Dateien herunter"], "{version} is available. Get more information on how to update." : "{version} ist verfügbar. Hole weitere Informationen zu Aktualisierungen ein.", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}. Dies könnte eine Weile dauern.", + "An error occurred." : "Es ist ein Fehler aufgetreten.", "Please reload the page." : "Bitte lade die Seite neu.", "The update was unsuccessful. " : "Die Aktualisierung war nicht erfolgreich.", "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Du wirst nun zu ownCloud weitergeleitet.", "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktiere Deinen Administrator.", "%s password reset" : "%s-Passwort zurücksetzen", @@ -167,8 +184,8 @@ "New Password" : "Neues Passwort", "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", - "No search results in other places" : "Keine Suchergebnisse an anderen Orten", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"], + "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis im anderen Ordner","{count} Suchergebnisse in anderen Ordnern"], "Personal" : "Persönlich", "Users" : "Benutzer", "Apps" : "Apps", @@ -245,6 +262,10 @@ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Bitte kontaktiere Deinen Administrator. Wenn Du Administrator dieser Instanz bist, konfiguriere bitte die „trusted_domain“-Einstellung in config/config.php. Eine Beispielkonfiguration wird unter config/config.sample.php bereitgestellt.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Wenn es Deine Konfiguration zulässt, kannst Du als Administrator gegebenenfalls den Button unten benutzen, um diese Domain als vertrauenswürdig einzustufen.", "Add \"%s\" as trusted domain" : "„%s“ als vertrauenswürdige Domain hinzufügen", + "App update required" : "Appupdate notwendig", + "%s will be updated to version %s" : "%s wird auf Version %s aktuallisiert", + "These apps will be updated:" : "Diese Apps werden aktuallisiert:", + "These incompatible apps will be disabled:" : "Diese inkompatiblen Apps werden deaktiviert:", "The theme %s has been disabled." : "Das Theme %s wurde deaktiviert.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Bitte stelle vor dem Fortsetzen sicher, dass die Datenbank, der Konfigurationsordner und der Datenordner gesichert wurden.", "Start update" : "Aktualisierung starten", diff --git a/core/l10n/de_AT.js b/core/l10n/de_AT.js index b41c1547953..d0a5e054fca 100644 --- a/core/l10n/de_AT.js +++ b/core/l10n/de_AT.js @@ -40,6 +40,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dez.", "Settings" : "Einstellungen", + "seconds ago" : "Sekunden zuvor", "No" : "Nein", "Yes" : "Ja", "Cancel" : "Abbrechen", diff --git a/core/l10n/de_AT.json b/core/l10n/de_AT.json index 4e3b9669c16..6ab59d45c2d 100644 --- a/core/l10n/de_AT.json +++ b/core/l10n/de_AT.json @@ -38,6 +38,7 @@ "Nov." : "Nov.", "Dec." : "Dez.", "Settings" : "Einstellungen", + "seconds ago" : "Sekunden zuvor", "No" : "Nein", "Yes" : "Ja", "Cancel" : "Abbrechen", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 369936d0c92..b593fc452ae 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "An folgende Benutzer konnte keine E-Mail gesendet werden: %s", "Preparing update" : "Update vorbereiten", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrationstests wurden übersprungen - \"update.skip-migration-test\" ist in der config.php aktiviert", "Turned on maintenance mode" : "Wartungsmodus eingeschaltet ", "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", "Maintenance mode is kept active" : "Wartungsmodus wird aktiv gehalten", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert", "Repair warning: " : "Reperaturwarnung:", "Repair error: " : "Reperaturfehler:", + "Set log level to debug - current level: \"%s\"" : "Log-Level auf Debug gesetzt - aktuelles Level: \"%s\"", + "Reset log level to \"%s\"" : "Log-Level auf \"%s\" zurückgesetzt", "Following incompatible apps have been disabled: %s" : "Die folgenden inkompatiblen Apps sind deaktiviert worden: %s", "Following apps have been disabled: %s" : "Die folgenden Apps sind deaktiviert worden: %s", "Already up to date" : "Bereits aktuell", @@ -71,6 +74,7 @@ OC.L10N.register( "Dec." : "Dez.", "Settings" : "Einstellungen", "Saving..." : "Speichervorgang…", + "seconds ago" : "Gerade eben", "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktieren Sie Ihren Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn er sich nicht darin befindet, fragen Sie bitte bei Ihrem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?", @@ -104,6 +108,7 @@ OC.L10N.register( "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Ihren Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Sie es aus dem Document-Root-Verzeichnis des Webservers herausverschieben.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a href=\"{docLink}\">Dokumentation</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ist von PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu finden Sie in unserer <a href=\"{docLink}\">Dokumentation</a>.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ihre PHP Version ({version}) wird nicht länger <a href=\"{phpLink}\">unterstützt</a>. Wir empfehlen ein Upgrade ihrer PHP Version, um die volle Performance und Sicherheit zu gewährleisten.", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.", @@ -149,6 +154,7 @@ OC.L10N.register( "Share with users or groups …" : "Mit Benutzern oder Gruppen teilen…", "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", + "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Delete" : "Löschen", @@ -169,6 +175,7 @@ OC.L10N.register( "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Sie werden nun zu ownCloud weitergeleitet.", "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktieren Sie Ihren Administrator.", "%s password reset" : "%s-Passwort zurücksetzen", @@ -177,8 +184,8 @@ OC.L10N.register( "New Password" : "Neues Passwort", "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", - "No search results in other places" : "Keine Suchergebnisse an anderen Orten", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"], + "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis in anderen Ordnern","{count} Suchergebnisse in anderen Ordnern"], "Personal" : "Persönlich", "Users" : "Benutzer", "Apps" : "Apps", @@ -204,13 +211,13 @@ OC.L10N.register( "More details can be found in the server log." : "Weitere Details können im Serverprotokoll gefunden werden.", "Technical details" : "Technische Details", "Remote Address: %s" : "Entfernte Adresse: %s", - "Request ID: %s" : "Anforderungskennung: %s", + "Request ID: %s" : "Anfragekennung: %s", "Type: %s" : "Typ: %s", "Code: %s" : "Code: %s", "Message: %s" : "Nachricht: %s", "File: %s" : "Datei: %s", "Line: %s" : "Zeile: %s", - "Trace" : "Spur", + "Trace" : "Ablauf", "Security warning" : "Sicherheitshinweis", "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar, weil die .htaccess-Datei nicht funktioniert.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Informationen zum richtigen Konfigurieren Ihres Servers können Sie der <a href=\"%s\" target=\"_blank\">Dokumentation</a> entnehmen.", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index 8f0d3fa8465..c7fa1e368a9 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "An folgende Benutzer konnte keine E-Mail gesendet werden: %s", "Preparing update" : "Update vorbereiten", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrationstests wurden übersprungen - \"update.skip-migration-test\" ist in der config.php aktiviert", "Turned on maintenance mode" : "Wartungsmodus eingeschaltet ", "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", "Maintenance mode is kept active" : "Wartungsmodus wird aktiv gehalten", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert", "Repair warning: " : "Reperaturwarnung:", "Repair error: " : "Reperaturfehler:", + "Set log level to debug - current level: \"%s\"" : "Log-Level auf Debug gesetzt - aktuelles Level: \"%s\"", + "Reset log level to \"%s\"" : "Log-Level auf \"%s\" zurückgesetzt", "Following incompatible apps have been disabled: %s" : "Die folgenden inkompatiblen Apps sind deaktiviert worden: %s", "Following apps have been disabled: %s" : "Die folgenden Apps sind deaktiviert worden: %s", "Already up to date" : "Bereits aktuell", @@ -69,6 +72,7 @@ "Dec." : "Dez.", "Settings" : "Einstellungen", "Saving..." : "Speichervorgang…", + "seconds ago" : "Gerade eben", "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktieren Sie Ihren Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn er sich nicht darin befindet, fragen Sie bitte bei Ihrem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?", @@ -102,6 +106,7 @@ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Ihren Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Sie es aus dem Document-Root-Verzeichnis des Webservers herausverschieben.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a href=\"{docLink}\">Dokumentation</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ist von PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu finden Sie in unserer <a href=\"{docLink}\">Dokumentation</a>.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ihre PHP Version ({version}) wird nicht länger <a href=\"{phpLink}\">unterstützt</a>. Wir empfehlen ein Upgrade ihrer PHP Version, um die volle Performance und Sicherheit zu gewährleisten.", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.", @@ -147,6 +152,7 @@ "Share with users or groups …" : "Mit Benutzern oder Gruppen teilen…", "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", + "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Delete" : "Löschen", @@ -167,6 +173,7 @@ "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Sie werden nun zu ownCloud weitergeleitet.", "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktieren Sie Ihren Administrator.", "%s password reset" : "%s-Passwort zurücksetzen", @@ -175,8 +182,8 @@ "New Password" : "Neues Passwort", "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", - "No search results in other places" : "Keine Suchergebnisse an anderen Orten", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"], + "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis in anderen Ordnern","{count} Suchergebnisse in anderen Ordnern"], "Personal" : "Persönlich", "Users" : "Benutzer", "Apps" : "Apps", @@ -202,13 +209,13 @@ "More details can be found in the server log." : "Weitere Details können im Serverprotokoll gefunden werden.", "Technical details" : "Technische Details", "Remote Address: %s" : "Entfernte Adresse: %s", - "Request ID: %s" : "Anforderungskennung: %s", + "Request ID: %s" : "Anfragekennung: %s", "Type: %s" : "Typ: %s", "Code: %s" : "Code: %s", "Message: %s" : "Nachricht: %s", "File: %s" : "Datei: %s", "Line: %s" : "Zeile: %s", - "Trace" : "Spur", + "Trace" : "Ablauf", "Security warning" : "Sicherheitshinweis", "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar, weil die .htaccess-Datei nicht funktioniert.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Informationen zum richtigen Konfigurieren Ihres Servers können Sie der <a href=\"%s\" target=\"_blank\">Dokumentation</a> entnehmen.", diff --git a/core/l10n/el.js b/core/l10n/el.js index 3b739d06b52..975f3895b46 100644 --- a/core/l10n/el.js +++ b/core/l10n/el.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Αδυναμία αποστολής μηνύματος στους ακόλουθους χρήστες: %s", "Preparing update" : "Προετοιμασία ενημέρωσης", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Οι δοκιμές μεταφοράς έχουν παρακαμφθεί - το \"update.skip-migration-test\" ελιναι ενεργοποιημένο στο ", "Turned on maintenance mode" : "Η κατάσταση συντήρησης ενεργοποιήθηκε", "Turned off maintenance mode" : "Η κατάσταση συντήρησης απενεργοποιήθηκε", "Maintenance mode is kept active" : "Η λειτουργία συντήρησης διατηρήθηκε ενεργή", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Αναβαθμίστηκε \"%s\" σε %s", "Repair warning: " : "Προειδοποίηση διόρθωσης:", "Repair error: " : "Σφάλμα διόρθωσης:", + "Set log level to debug - current level: \"%s\"" : "Καθορισμός του επιπέδου καταγραφής σε αποσφαλμάτωση - τρέχον επίπεδο: \"%s\"", + "Reset log level to \"%s\"" : "Επαναφορά επιπέδου καταγραφής σε \"%s\"", "Following incompatible apps have been disabled: %s" : "Οι παρακάτω εφαρμογές έχουν απενεργοποιηθεί: %s", "Following apps have been disabled: %s" : "Οι ακόλουθες εφαρμογές έχουν απενεργοποιηθεί: %s", "Already up to date" : "Ήδη ενημερωμένο", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Δεν δόθηκε εικόνα ή αρχείο", "Unknown filetype" : "Άγνωστος τύπος αρχείου", "Invalid image" : "Μη έγκυρη εικόνα", + "An error occurred. Please contact your admin." : "Προέκυψε σφάλμα. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.", "No temporary profile picture available, try again" : "Δεν υπάρχει προσωρινή φωτογραφία προφίλ διαθέσιμη, δοκιμάστε ξανά", "No crop data provided" : "Δεν δόθηκαν δεδομένα περικοπής", "No valid crop data provided" : "Έχουν δοθεί μη έγκυρα δεδομένα περικοπής", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "Δεκ.", "Settings" : "Ρυθμίσεις", "Saving..." : "Γίνεται αποθήκευση...", + "seconds ago" : "δευτερόλεπτα πριν", "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ο σύνδεσμος για την επαναφορά του κωδικού πρόσβασής σας απεστάλη στο ηλ. ταχυδρομείο σας. Εάν δεν το παραλάβετε μέσα σε ένα εύλογο χρονικό διάστημα, ελέγξτε το φάκελο ανεπιθύμητων μηνυμάτων σας. <br>Εάν δεν βρίσκεται εκεί ρωτήστε τον τοπικό διαχειριστή σας.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Τα αρχεία σας είναι κρυπτογραφημένα. Εάν δεν έχετε ενεργοποιήσει το κλειδί επαναφοράς, δεν θα υπάρχει τρόπος να ανακτήσετε τα δεδομένα σας μετά την επαναφορά του κωδικού πρόσβασής σας.<br />Εάν δεν είστε σίγουροι για το τι θα θέλατε να κάνετε, παρακαλώ επικοινωνήστε με το διαχειριστή σας πριν συνεχίσετε. <br />Θέλετε στ' αλήθεια να συνεχίσετε;", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Το /dev/urandom δεν είναι αναγνώσιμο από την PHP, το οποίο δεν συνίσταται για λόγους ασφαλείας. Περισσότερες πληροφορίες υπάρχουν στην <a href=\"{docLink}\">τεκμηρίωσή</a> μας.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Η έκδοσή σας της PHP ({version}) <a href=\"{phpLink}\">δεν υποστηρίζεται πια από την PHP</a>. Σας παροτρύνουμε να αναβαθμίσετε την PHP για να επωφεληθείτε από την απόδοση και την ασφάλεια που παρέχει η PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Η διαμόρφωση των reverse proxy headers δεν είναι σωστή ή συνδέεστε στο ownCloud από ένα έμπιστο διαμεσολαβητή. Αν δεν συνδέεστε στο ownCloud από έμπιστο διαμεσολαβητή, αυτό είναι ένα θέμα ασφαλείας και μπορεί να επιτρέψει σε έναν επιτιθέμενο να μασκαρέψει τη διεύθυνση IP του ως ορατή στο ownCloud. Περισσότερες πληροφορίες υπάρχουν στην <a href=\"{docLink}\">τεκμηρίωση</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Το Memcached είναι ρυθμισμένο ως κατανεμημένη cache, αλλά είναι εγκατεστημένη η λάθος μονάδα \"memcache\" της PHP. Το \\OC\\Memcache\\Memcached υποστηρίζει μόνο τη \"memcached\" και όχι τη \"memcache\". Δείτε τη <a href=\"{wikiLink}\">memcached wiki και για τις δύο μονάδες</a>.", "Error occurred while checking server setup" : "Παρουσιάστηκε σφάλμα κατά τον έλεγχο της εγκατάστασης με το διακομιστή", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "H \"{header}\" κεφαλίδα HTTP δεν έχει ρυθμιστεί ώστε να ισούται με \"{expected}\". Αυτό αποτελεί ενδεχόμενο κίνδυνο ασφάλειας ή ιδιωτικότητας και συστήνουμε τη διόρθωση αυτής της ρύθμισης.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Η «Strict-Transport-Security\" κεφαλίδα HTTP δεν έχει ρυθμιστεί για τουλάχιστον \"{seconds}\" δευτερόλεπτα. Για αυξημένη ασφάλεια συστήνουμε την ενεργοποίηση του HSTS όπως περιγράφεται στις <a href=\"{docUrl}\">προτάσεις ασφαλείας</a> μας.", @@ -145,12 +151,14 @@ OC.L10N.register( "change" : "αλλαγή", "delete" : "διαγραφή", "access control" : "έλεγχος πρόσβασης", + "Share details could not be loaded for this item." : "Αδυναμία φόρτωσης λεπτομερειών διαμοιρασμού για αυτό το αντικείμενο.", "An error occured. Please try again" : "Ένα σφάλμα προέκυψε. Παρακαλώ προσπαθήστε ξανά", "Share" : "Διαμοιρασμός", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud", "Share with users or groups …" : "Διαμοιρασμός με χρήστες ή ομάδες ...", "Share with users, groups or remote users …" : "Διαμοιρασμός με χρήστες, ομάδες ή απομακρυσμένους χρήστες ...", "Warning" : "Προειδοποίηση", + "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", "The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.", "Enter new" : "Εισαγωγή νέου", "Delete" : "Διαγραφή", @@ -180,8 +188,8 @@ OC.L10N.register( "New Password" : "Νέος Κωδικός", "Reset password" : "Επαναφορά συνθηματικού", "Searching other places" : "Έρευνα σε άλλα σημεία.", - "No search results in other places" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλες τοποθεσίες", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} αποτελέσματα έρευνας σε άλλα σημεία","{count} αποτελέσματα έρευνας σε άλλα σημεία"], + "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} αποτέλεσμα αναζήτησης σε άλλο φάκελο","{count} αποτελέσματα αναζήτησης σε άλλους φακέλους"], "Personal" : "Προσωπικά", "Users" : "Χρήστες", "Apps" : "Εφαρμογές", diff --git a/core/l10n/el.json b/core/l10n/el.json index 9900d8f568c..21901440ecc 100644 --- a/core/l10n/el.json +++ b/core/l10n/el.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Αδυναμία αποστολής μηνύματος στους ακόλουθους χρήστες: %s", "Preparing update" : "Προετοιμασία ενημέρωσης", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Οι δοκιμές μεταφοράς έχουν παρακαμφθεί - το \"update.skip-migration-test\" ελιναι ενεργοποιημένο στο ", "Turned on maintenance mode" : "Η κατάσταση συντήρησης ενεργοποιήθηκε", "Turned off maintenance mode" : "Η κατάσταση συντήρησης απενεργοποιήθηκε", "Maintenance mode is kept active" : "Η λειτουργία συντήρησης διατηρήθηκε ενεργή", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Αναβαθμίστηκε \"%s\" σε %s", "Repair warning: " : "Προειδοποίηση διόρθωσης:", "Repair error: " : "Σφάλμα διόρθωσης:", + "Set log level to debug - current level: \"%s\"" : "Καθορισμός του επιπέδου καταγραφής σε αποσφαλμάτωση - τρέχον επίπεδο: \"%s\"", + "Reset log level to \"%s\"" : "Επαναφορά επιπέδου καταγραφής σε \"%s\"", "Following incompatible apps have been disabled: %s" : "Οι παρακάτω εφαρμογές έχουν απενεργοποιηθεί: %s", "Following apps have been disabled: %s" : "Οι ακόλουθες εφαρμογές έχουν απενεργοποιηθεί: %s", "Already up to date" : "Ήδη ενημερωμένο", @@ -18,6 +21,7 @@ "No image or file provided" : "Δεν δόθηκε εικόνα ή αρχείο", "Unknown filetype" : "Άγνωστος τύπος αρχείου", "Invalid image" : "Μη έγκυρη εικόνα", + "An error occurred. Please contact your admin." : "Προέκυψε σφάλμα. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.", "No temporary profile picture available, try again" : "Δεν υπάρχει προσωρινή φωτογραφία προφίλ διαθέσιμη, δοκιμάστε ξανά", "No crop data provided" : "Δεν δόθηκαν δεδομένα περικοπής", "No valid crop data provided" : "Έχουν δοθεί μη έγκυρα δεδομένα περικοπής", @@ -69,6 +73,7 @@ "Dec." : "Δεκ.", "Settings" : "Ρυθμίσεις", "Saving..." : "Γίνεται αποθήκευση...", + "seconds ago" : "δευτερόλεπτα πριν", "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ο σύνδεσμος για την επαναφορά του κωδικού πρόσβασής σας απεστάλη στο ηλ. ταχυδρομείο σας. Εάν δεν το παραλάβετε μέσα σε ένα εύλογο χρονικό διάστημα, ελέγξτε το φάκελο ανεπιθύμητων μηνυμάτων σας. <br>Εάν δεν βρίσκεται εκεί ρωτήστε τον τοπικό διαχειριστή σας.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Τα αρχεία σας είναι κρυπτογραφημένα. Εάν δεν έχετε ενεργοποιήσει το κλειδί επαναφοράς, δεν θα υπάρχει τρόπος να ανακτήσετε τα δεδομένα σας μετά την επαναφορά του κωδικού πρόσβασής σας.<br />Εάν δεν είστε σίγουροι για το τι θα θέλατε να κάνετε, παρακαλώ επικοινωνήστε με το διαχειριστή σας πριν συνεχίσετε. <br />Θέλετε στ' αλήθεια να συνεχίσετε;", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Το /dev/urandom δεν είναι αναγνώσιμο από την PHP, το οποίο δεν συνίσταται για λόγους ασφαλείας. Περισσότερες πληροφορίες υπάρχουν στην <a href=\"{docLink}\">τεκμηρίωσή</a> μας.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Η έκδοσή σας της PHP ({version}) <a href=\"{phpLink}\">δεν υποστηρίζεται πια από την PHP</a>. Σας παροτρύνουμε να αναβαθμίσετε την PHP για να επωφεληθείτε από την απόδοση και την ασφάλεια που παρέχει η PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Η διαμόρφωση των reverse proxy headers δεν είναι σωστή ή συνδέεστε στο ownCloud από ένα έμπιστο διαμεσολαβητή. Αν δεν συνδέεστε στο ownCloud από έμπιστο διαμεσολαβητή, αυτό είναι ένα θέμα ασφαλείας και μπορεί να επιτρέψει σε έναν επιτιθέμενο να μασκαρέψει τη διεύθυνση IP του ως ορατή στο ownCloud. Περισσότερες πληροφορίες υπάρχουν στην <a href=\"{docLink}\">τεκμηρίωση</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Το Memcached είναι ρυθμισμένο ως κατανεμημένη cache, αλλά είναι εγκατεστημένη η λάθος μονάδα \"memcache\" της PHP. Το \\OC\\Memcache\\Memcached υποστηρίζει μόνο τη \"memcached\" και όχι τη \"memcache\". Δείτε τη <a href=\"{wikiLink}\">memcached wiki και για τις δύο μονάδες</a>.", "Error occurred while checking server setup" : "Παρουσιάστηκε σφάλμα κατά τον έλεγχο της εγκατάστασης με το διακομιστή", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "H \"{header}\" κεφαλίδα HTTP δεν έχει ρυθμιστεί ώστε να ισούται με \"{expected}\". Αυτό αποτελεί ενδεχόμενο κίνδυνο ασφάλειας ή ιδιωτικότητας και συστήνουμε τη διόρθωση αυτής της ρύθμισης.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Η «Strict-Transport-Security\" κεφαλίδα HTTP δεν έχει ρυθμιστεί για τουλάχιστον \"{seconds}\" δευτερόλεπτα. Για αυξημένη ασφάλεια συστήνουμε την ενεργοποίηση του HSTS όπως περιγράφεται στις <a href=\"{docUrl}\">προτάσεις ασφαλείας</a> μας.", @@ -143,12 +149,14 @@ "change" : "αλλαγή", "delete" : "διαγραφή", "access control" : "έλεγχος πρόσβασης", + "Share details could not be loaded for this item." : "Αδυναμία φόρτωσης λεπτομερειών διαμοιρασμού για αυτό το αντικείμενο.", "An error occured. Please try again" : "Ένα σφάλμα προέκυψε. Παρακαλώ προσπαθήστε ξανά", "Share" : "Διαμοιρασμός", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud", "Share with users or groups …" : "Διαμοιρασμός με χρήστες ή ομάδες ...", "Share with users, groups or remote users …" : "Διαμοιρασμός με χρήστες, ομάδες ή απομακρυσμένους χρήστες ...", "Warning" : "Προειδοποίηση", + "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", "The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.", "Enter new" : "Εισαγωγή νέου", "Delete" : "Διαγραφή", @@ -178,8 +186,8 @@ "New Password" : "Νέος Κωδικός", "Reset password" : "Επαναφορά συνθηματικού", "Searching other places" : "Έρευνα σε άλλα σημεία.", - "No search results in other places" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλες τοποθεσίες", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} αποτελέσματα έρευνας σε άλλα σημεία","{count} αποτελέσματα έρευνας σε άλλα σημεία"], + "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} αποτέλεσμα αναζήτησης σε άλλο φάκελο","{count} αποτελέσματα αναζήτησης σε άλλους φακέλους"], "Personal" : "Προσωπικά", "Users" : "Χρήστες", "Apps" : "Εφαρμογές", diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js index ced4272c1d8..d2f3ce77c73 100644 --- a/core/l10n/en_GB.js +++ b/core/l10n/en_GB.js @@ -59,6 +59,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Settings", "Saving..." : "Saving...", + "seconds ago" : "seconds ago", "Couldn't send reset email. Please contact your administrator." : "Couldn't send reset email. Please contact your administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?", @@ -162,8 +163,6 @@ OC.L10N.register( "New Password" : "New Password", "Reset password" : "Reset password", "Searching other places" : "Searching other places", - "No search results in other places" : "No search results in other places", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} search result in other places","{count} search results in other places"], "Personal" : "Personal", "Users" : "Users", "Apps" : "Apps", diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json index 7bea74e4359..75e8e30d594 100644 --- a/core/l10n/en_GB.json +++ b/core/l10n/en_GB.json @@ -57,6 +57,7 @@ "Dec." : "Dec.", "Settings" : "Settings", "Saving..." : "Saving...", + "seconds ago" : "seconds ago", "Couldn't send reset email. Please contact your administrator." : "Couldn't send reset email. Please contact your administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?", @@ -160,8 +161,6 @@ "New Password" : "New Password", "Reset password" : "Reset password", "Searching other places" : "Searching other places", - "No search results in other places" : "No search results in other places", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} search result in other places","{count} search results in other places"], "Personal" : "Personal", "Users" : "Users", "Apps" : "Apps", diff --git a/core/l10n/eo.js b/core/l10n/eo.js index 8ecd740bc7e..c4fafe2f96c 100644 --- a/core/l10n/eo.js +++ b/core/l10n/eo.js @@ -44,6 +44,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Agordo", "Saving..." : "Konservante...", + "seconds ago" : "sekundoj antaŭe", "No" : "Ne", "Yes" : "Jes", "Choose" : "Elekti", diff --git a/core/l10n/eo.json b/core/l10n/eo.json index ddce56a528d..5d29d8534ec 100644 --- a/core/l10n/eo.json +++ b/core/l10n/eo.json @@ -42,6 +42,7 @@ "Dec." : "Dec.", "Settings" : "Agordo", "Saving..." : "Konservante...", + "seconds ago" : "sekundoj antaŭe", "No" : "Ne", "Yes" : "Jes", "Choose" : "Elekti", diff --git a/core/l10n/es.js b/core/l10n/es.js index ea606905e7d..4ee9dac0760 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "No se pudo enviar el mensaje a los siguientes usuarios: %s", "Preparing update" : "Preparando la actualización", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Se han saltado las pruebas de migración - \"update.skip-migration-test\" está activado en config.php", "Turned on maintenance mode" : "Modo mantenimiento activado", "Turned off maintenance mode" : "Modo mantenimiento desactivado", "Maintenance mode is kept active" : "El modo mantenimiento aún está activo.", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Se ha actualizado \"%s\" a %s", "Repair warning: " : "Advertencia de reparación:", "Repair error: " : "Error que reparar:", + "Set log level to debug - current level: \"%s\"" : "Establecer nivel de registro para depurar - nivel actual: \"%s\"", + "Reset log level to \"%s\"" : "Restablecer nivel de registro a \"%s\"", "Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles se han deshabilitado: %s", "Following apps have been disabled: %s" : "Siguiendo aplicaciones ha sido deshabilitado: %s", "Already up to date" : "Ya actualizado", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "No se especificó ningún archivo o imagen", "Unknown filetype" : "Tipo de archivo desconocido", "Invalid image" : "Imagen inválida", + "An error occurred. Please contact your admin." : "Un error ocurrió. Póngase en contacto con su administrador.", "No temporary profile picture available, try again" : "No hay disponible una imagen temporal de perfil, pruebe de nuevo", "No crop data provided" : "No se proporcionó datos del recorte", "No valid crop data provided" : "Recorte inválido", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "Dic.", "Settings" : "Ajustes", "Saving..." : "Guardando...", + "seconds ago" : "hace segundos", "Couldn't send reset email. Please contact your administrator." : "No pudo enviarse el correo para restablecer la contraseña. Por favor, contacte con su administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Se ha enviado un enlace para restablecer su contraseña a su correo electrónico. Si usted no lo recibe en un tiempo razonable, revise su carpeta de spam/chatarra/basura.<br>Si no lo encuentra, consulte a su administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom no es legible por PHP el mismo es altamente desalentado por razones de seguridad. Más información puede ser encontrada en nuestra <a href=\"{docLink}\">documentación</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Su versión PHP ({version}) ya no es <a href=\"{phpLink}\">respaldada por PHP</a>. Recomendamos actualizar su versión de PHP para aprovechar las actualizaciones de rendimiento y seguridad proporcionadas por PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a href=\"{docLink}\">documentación</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "memcached es un sistema de cache distribuido. pero ha sido instalado por error el modulo PHP memcache.\nConsulte <a href=\"{wikiLink}\">memcached wiki acerca de ambos modulos</a>", "Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad, por lo que se recomienda ajustar esta opción.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como es descripta en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.", @@ -145,12 +151,14 @@ OC.L10N.register( "change" : "cambio", "delete" : "eliminar", "access control" : "control de acceso", + "Share details could not be loaded for this item." : "No se han podido cargar los detalles de compartición para este elemento.", "An error occured. Please try again" : "Un error ocurrió. Por favor reinténtelo nuevamente.", "Share" : "Compartir", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "Share with users or groups …" : "Compartir con usuarios o grupos ...", "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...", "Warning" : "Precaución", + "Error while sending notification" : "Error mientras se enviaba la notificación", "The object type is not specified." : "El tipo de objeto no está especificado.", "Enter new" : "Ingresar nueva", "Delete" : "Eliminar", @@ -163,9 +171,10 @@ OC.L10N.register( "sunny" : "soleado", "Hello {name}, the weather is {weather}" : "Hola {name}, el día es {weather}", "Hello {name}" : "Hola {name}", - "_download %n file_::_download %n files_" : ["descargar %n ficheros","descargar %n ficheros"], - "{version} is available. Get more information on how to update." : "Una nueva {version} está disponible. Consiga mas información de como actualizar.", + "_download %n file_::_download %n files_" : ["descargar %n ficheros","descargar %n archivos"], + "{version} is available. Get more information on how to update." : "Una nueva {version} está disponible. Obtenga más información sobre cómo actualizar.", "Updating {productName} to version {version}, this may take a while." : "Actualizando {productName} a la versión {version}. Esto puede tardar un poco.", + "An error occurred." : "Ocurrió un error.", "Please reload the page." : "Recargue/Actualice la página", "The update was unsuccessful. " : "La actualización ha fallado.", "The update was successful. There were warnings." : "La actualización fue exitosa. Había advertencias.", @@ -180,8 +189,8 @@ OC.L10N.register( "New Password" : "Contraseña nueva", "Reset password" : "Restablecer contraseña", "Searching other places" : "Buscando en otros lugares", - "No search results in other places" : "Sin resultados de búsqueda en otros sitios", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de búsqueda en otros lugares","{count} resultados de búsqueda en otros lugares"], + "No search results in other folders" : "Ningún resultado de búsqueda en otras carpetas", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de búsqueda en otra carpeta","{count} resultados de búsqueda en otras carpetas"], "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Aplicaciones", diff --git a/core/l10n/es.json b/core/l10n/es.json index ec5b80a3e82..8a598d505e5 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "No se pudo enviar el mensaje a los siguientes usuarios: %s", "Preparing update" : "Preparando la actualización", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Se han saltado las pruebas de migración - \"update.skip-migration-test\" está activado en config.php", "Turned on maintenance mode" : "Modo mantenimiento activado", "Turned off maintenance mode" : "Modo mantenimiento desactivado", "Maintenance mode is kept active" : "El modo mantenimiento aún está activo.", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Se ha actualizado \"%s\" a %s", "Repair warning: " : "Advertencia de reparación:", "Repair error: " : "Error que reparar:", + "Set log level to debug - current level: \"%s\"" : "Establecer nivel de registro para depurar - nivel actual: \"%s\"", + "Reset log level to \"%s\"" : "Restablecer nivel de registro a \"%s\"", "Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles se han deshabilitado: %s", "Following apps have been disabled: %s" : "Siguiendo aplicaciones ha sido deshabilitado: %s", "Already up to date" : "Ya actualizado", @@ -18,6 +21,7 @@ "No image or file provided" : "No se especificó ningún archivo o imagen", "Unknown filetype" : "Tipo de archivo desconocido", "Invalid image" : "Imagen inválida", + "An error occurred. Please contact your admin." : "Un error ocurrió. Póngase en contacto con su administrador.", "No temporary profile picture available, try again" : "No hay disponible una imagen temporal de perfil, pruebe de nuevo", "No crop data provided" : "No se proporcionó datos del recorte", "No valid crop data provided" : "Recorte inválido", @@ -69,6 +73,7 @@ "Dec." : "Dic.", "Settings" : "Ajustes", "Saving..." : "Guardando...", + "seconds ago" : "hace segundos", "Couldn't send reset email. Please contact your administrator." : "No pudo enviarse el correo para restablecer la contraseña. Por favor, contacte con su administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Se ha enviado un enlace para restablecer su contraseña a su correo electrónico. Si usted no lo recibe en un tiempo razonable, revise su carpeta de spam/chatarra/basura.<br>Si no lo encuentra, consulte a su administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom no es legible por PHP el mismo es altamente desalentado por razones de seguridad. Más información puede ser encontrada en nuestra <a href=\"{docLink}\">documentación</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Su versión PHP ({version}) ya no es <a href=\"{phpLink}\">respaldada por PHP</a>. Recomendamos actualizar su versión de PHP para aprovechar las actualizaciones de rendimiento y seguridad proporcionadas por PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a href=\"{docLink}\">documentación</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "memcached es un sistema de cache distribuido. pero ha sido instalado por error el modulo PHP memcache.\nConsulte <a href=\"{wikiLink}\">memcached wiki acerca de ambos modulos</a>", "Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad, por lo que se recomienda ajustar esta opción.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como es descripta en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.", @@ -143,12 +149,14 @@ "change" : "cambio", "delete" : "eliminar", "access control" : "control de acceso", + "Share details could not be loaded for this item." : "No se han podido cargar los detalles de compartición para este elemento.", "An error occured. Please try again" : "Un error ocurrió. Por favor reinténtelo nuevamente.", "Share" : "Compartir", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "Share with users or groups …" : "Compartir con usuarios o grupos ...", "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...", "Warning" : "Precaución", + "Error while sending notification" : "Error mientras se enviaba la notificación", "The object type is not specified." : "El tipo de objeto no está especificado.", "Enter new" : "Ingresar nueva", "Delete" : "Eliminar", @@ -161,9 +169,10 @@ "sunny" : "soleado", "Hello {name}, the weather is {weather}" : "Hola {name}, el día es {weather}", "Hello {name}" : "Hola {name}", - "_download %n file_::_download %n files_" : ["descargar %n ficheros","descargar %n ficheros"], - "{version} is available. Get more information on how to update." : "Una nueva {version} está disponible. Consiga mas información de como actualizar.", + "_download %n file_::_download %n files_" : ["descargar %n ficheros","descargar %n archivos"], + "{version} is available. Get more information on how to update." : "Una nueva {version} está disponible. Obtenga más información sobre cómo actualizar.", "Updating {productName} to version {version}, this may take a while." : "Actualizando {productName} a la versión {version}. Esto puede tardar un poco.", + "An error occurred." : "Ocurrió un error.", "Please reload the page." : "Recargue/Actualice la página", "The update was unsuccessful. " : "La actualización ha fallado.", "The update was successful. There were warnings." : "La actualización fue exitosa. Había advertencias.", @@ -178,8 +187,8 @@ "New Password" : "Contraseña nueva", "Reset password" : "Restablecer contraseña", "Searching other places" : "Buscando en otros lugares", - "No search results in other places" : "Sin resultados de búsqueda en otros sitios", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de búsqueda en otros lugares","{count} resultados de búsqueda en otros lugares"], + "No search results in other folders" : "Ningún resultado de búsqueda en otras carpetas", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de búsqueda en otra carpeta","{count} resultados de búsqueda en otras carpetas"], "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Aplicaciones", diff --git a/core/l10n/es_AR.js b/core/l10n/es_AR.js index 0a82908e2ee..789c3377e39 100644 --- a/core/l10n/es_AR.js +++ b/core/l10n/es_AR.js @@ -50,6 +50,7 @@ OC.L10N.register( "Dec." : "dic.", "Settings" : "Configuración", "Saving..." : "Guardando...", + "seconds ago" : "segundos atrás", "No" : "No", "Yes" : "Sí", "Choose" : "Elegir", diff --git a/core/l10n/es_AR.json b/core/l10n/es_AR.json index 804167f4af4..a1ceedab0cb 100644 --- a/core/l10n/es_AR.json +++ b/core/l10n/es_AR.json @@ -48,6 +48,7 @@ "Dec." : "dic.", "Settings" : "Configuración", "Saving..." : "Guardando...", + "seconds ago" : "segundos atrás", "No" : "No", "Yes" : "Sí", "Choose" : "Elegir", diff --git a/core/l10n/es_CL.js b/core/l10n/es_CL.js index 23e151199a7..33de74ee9ee 100644 --- a/core/l10n/es_CL.js +++ b/core/l10n/es_CL.js @@ -23,6 +23,7 @@ OC.L10N.register( "November" : "Noviembre", "December" : "Diciembre", "Settings" : "Configuración", + "seconds ago" : "segundos antes", "No" : "No", "Yes" : "Si", "Choose" : "Choose", diff --git a/core/l10n/es_CL.json b/core/l10n/es_CL.json index dd7bb617e64..58346c15741 100644 --- a/core/l10n/es_CL.json +++ b/core/l10n/es_CL.json @@ -21,6 +21,7 @@ "November" : "Noviembre", "December" : "Diciembre", "Settings" : "Configuración", + "seconds ago" : "segundos antes", "No" : "No", "Yes" : "Si", "Choose" : "Choose", diff --git a/core/l10n/es_MX.js b/core/l10n/es_MX.js index 81113221e66..1d8cc914706 100644 --- a/core/l10n/es_MX.js +++ b/core/l10n/es_MX.js @@ -50,6 +50,7 @@ OC.L10N.register( "Dec." : "Dic.", "Settings" : "Ajustes", "Saving..." : "Guardando...", + "seconds ago" : "hace segundos", "No" : "No", "Yes" : "Sí", "Choose" : "Seleccionar", diff --git a/core/l10n/es_MX.json b/core/l10n/es_MX.json index 978274222fe..783a374fa2a 100644 --- a/core/l10n/es_MX.json +++ b/core/l10n/es_MX.json @@ -48,6 +48,7 @@ "Dec." : "Dic.", "Settings" : "Ajustes", "Saving..." : "Guardando...", + "seconds ago" : "hace segundos", "No" : "No", "Yes" : "Sí", "Choose" : "Seleccionar", diff --git a/core/l10n/et_EE.js b/core/l10n/et_EE.js index 1c49deff6ca..a55e1c04ccd 100644 --- a/core/l10n/et_EE.js +++ b/core/l10n/et_EE.js @@ -69,6 +69,7 @@ OC.L10N.register( "Dec." : "Dets.", "Settings" : "Seaded", "Saving..." : "Salvestamine...", + "seconds ago" : "sekundit tagasi", "Couldn't send reset email. Please contact your administrator." : "Ei suutnud lähtestada e-maili. Palun kontakteeru süsteemihalduriga.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link parooli vahetuseks on saadetud Sinu e-posti aadressil.<br>Kui kiri pole saabunud mõistliku aja jooksul, siis kontrolli oma spam-/rämpskirjade katalooge<br>.Kui kirja pole ka seal, siis küsi abi süsteemihaldurilt.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sinu failid on krüpteeritud. Kui sa pole taastamise võtit veel määranud, siis pole präast parooli taastamist mingit võimalust sinu andmeid tagasi saada. <br />Kui sa pole kindel, mida teha, siis palun väta enne jätkamist ühendust oma administaatoriga. <br />Oled sa kindel, et sa soovid jätkata?", @@ -165,8 +166,6 @@ OC.L10N.register( "New Password" : "Uus parool", "Reset password" : "Nulli parool", "Searching other places" : "Otsi teistest kohtadest", - "No search results in other places" : "Teistest kohtadest otsimine ei andnud tulemusi", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} otsingutulemus teistest kohtadest","{count} otsingutulemust teistest kohtadest"], "Personal" : "Isiklik", "Users" : "Kasutajad", "Apps" : "Rakendused", diff --git a/core/l10n/et_EE.json b/core/l10n/et_EE.json index 9e11b84d86e..ee32aba5690 100644 --- a/core/l10n/et_EE.json +++ b/core/l10n/et_EE.json @@ -67,6 +67,7 @@ "Dec." : "Dets.", "Settings" : "Seaded", "Saving..." : "Salvestamine...", + "seconds ago" : "sekundit tagasi", "Couldn't send reset email. Please contact your administrator." : "Ei suutnud lähtestada e-maili. Palun kontakteeru süsteemihalduriga.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link parooli vahetuseks on saadetud Sinu e-posti aadressil.<br>Kui kiri pole saabunud mõistliku aja jooksul, siis kontrolli oma spam-/rämpskirjade katalooge<br>.Kui kirja pole ka seal, siis küsi abi süsteemihaldurilt.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sinu failid on krüpteeritud. Kui sa pole taastamise võtit veel määranud, siis pole präast parooli taastamist mingit võimalust sinu andmeid tagasi saada. <br />Kui sa pole kindel, mida teha, siis palun väta enne jätkamist ühendust oma administaatoriga. <br />Oled sa kindel, et sa soovid jätkata?", @@ -163,8 +164,6 @@ "New Password" : "Uus parool", "Reset password" : "Nulli parool", "Searching other places" : "Otsi teistest kohtadest", - "No search results in other places" : "Teistest kohtadest otsimine ei andnud tulemusi", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} otsingutulemus teistest kohtadest","{count} otsingutulemust teistest kohtadest"], "Personal" : "Isiklik", "Users" : "Kasutajad", "Apps" : "Rakendused", diff --git a/core/l10n/eu.js b/core/l10n/eu.js index a0d4650a4ae..5227f1332cb 100644 --- a/core/l10n/eu.js +++ b/core/l10n/eu.js @@ -53,6 +53,7 @@ OC.L10N.register( "Dec." : "abe.", "Settings" : "Ezarpenak", "Saving..." : "Gordetzen...", + "seconds ago" : "segundu", "Couldn't send reset email. Please contact your administrator." : "Ezin da berrezartzeko eposta bidali. Mesedez jarri harremetan zure administradorearekin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Zure pasahitza berrezartzeko lotura zure postara bidalia izan da.<br>Ez baduzu arrazoizko denbora epe batean jasotzen begiratu zure zabor-posta karpetan.<br>Hor ere ez badago kudeatzailearekin harremanetan jarri.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Zure fitxategiak enkriptaturik daude. Ez baduzu berreskuratze gakoa gaitzen pasahitza berrabiaraztean ez da zure fitxategiak berreskuratzeko modurik egongo. <br />Zer egin ziur ez bazaude kudeatzailearekin harremanetan ipini jarraitu aurretik.<br /> Ziur zaude aurrera jarraitu nahi duzula?", @@ -145,7 +146,6 @@ OC.L10N.register( "New Password" : "Pasahitz Berria", "Reset password" : "Berrezarri pasahitza", "Searching other places" : "Beste lekuak bilatzen", - "_{count} search result in other places_::_{count} search results in other places_" : ["Bilaketa emaitza {count} beste lekuetan","{count} emaitza lortu dira beste lekuetan"], "Personal" : "Pertsonala", "Users" : "Erabiltzaileak", "Apps" : "Aplikazioak", diff --git a/core/l10n/eu.json b/core/l10n/eu.json index e4ccdd8584c..37120181cbb 100644 --- a/core/l10n/eu.json +++ b/core/l10n/eu.json @@ -51,6 +51,7 @@ "Dec." : "abe.", "Settings" : "Ezarpenak", "Saving..." : "Gordetzen...", + "seconds ago" : "segundu", "Couldn't send reset email. Please contact your administrator." : "Ezin da berrezartzeko eposta bidali. Mesedez jarri harremetan zure administradorearekin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Zure pasahitza berrezartzeko lotura zure postara bidalia izan da.<br>Ez baduzu arrazoizko denbora epe batean jasotzen begiratu zure zabor-posta karpetan.<br>Hor ere ez badago kudeatzailearekin harremanetan jarri.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Zure fitxategiak enkriptaturik daude. Ez baduzu berreskuratze gakoa gaitzen pasahitza berrabiaraztean ez da zure fitxategiak berreskuratzeko modurik egongo. <br />Zer egin ziur ez bazaude kudeatzailearekin harremanetan ipini jarraitu aurretik.<br /> Ziur zaude aurrera jarraitu nahi duzula?", @@ -143,7 +144,6 @@ "New Password" : "Pasahitz Berria", "Reset password" : "Berrezarri pasahitza", "Searching other places" : "Beste lekuak bilatzen", - "_{count} search result in other places_::_{count} search results in other places_" : ["Bilaketa emaitza {count} beste lekuetan","{count} emaitza lortu dira beste lekuetan"], "Personal" : "Pertsonala", "Users" : "Erabiltzaileak", "Apps" : "Aplikazioak", diff --git a/core/l10n/fa.js b/core/l10n/fa.js index b7312046777..46c1602bef1 100644 --- a/core/l10n/fa.js +++ b/core/l10n/fa.js @@ -2,13 +2,23 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "ارسال ایمیل برای کاربران روبرو با شکست مواجه شد : %s", + "Preparing update" : "آمادهسازی به روز رسانی", "Turned on maintenance mode" : "حالت \" در دست تعمیر \" فعال شد .", "Turned off maintenance mode" : "حالت \" در دست تعمیر \" غیرفعال شد .", + "Maintenance mode is kept active" : "حالت تعمیرات فعال نگهداشته شده است", "Updated database" : "بروز رسانی پایگاه داده انجام شد .", + "Updated \"%s\" to %s" : "\"%s\" به %s بروزرسانی شد", + "Repair warning: " : "اخطار تعمیر:", + "Repair error: " : "خطای تعمیر:", + "Already up to date" : "در حال حاضر بروز است", + "File is too big" : "فایل خیلی بزرگ است", + "Invalid file provided" : "فایل دادهشده نا معتبر است", "No image or file provided" : "هیچ فایل یا تصویری وارد نشده است", "Unknown filetype" : "نوع فایل ناشناخته", "Invalid image" : "عکس نامعتبر", + "An error occurred. Please contact your admin." : "یک خطا رخ داده است. لطفا با مدیر سیستم تماس بگیرید.", "No temporary profile picture available, try again" : "تصویر پروفایل موقت در حال حاضر در دسترس نیست ، دوباره تلاش کنید ", + "Crop is not square" : "بخش بریده شده مربع نیست", "Sunday" : "یکشنبه", "Monday" : "دوشنبه", "Tuesday" : "سه شنبه", @@ -23,6 +33,13 @@ OC.L10N.register( "Thu." : "پنج شنبه", "Fri." : "جمعه", "Sat." : "شنبه", + "Su" : "یکشنبه", + "Mo" : "دوشنبه", + "Tu" : "سهشنبه", + "We" : "چهارشنبه", + "Th" : "پنجشنبه", + "Fr" : "جمعه", + "Sa" : "شنبه", "January" : "ژانویه", "February" : "فبریه", "March" : "مارس", @@ -49,6 +66,7 @@ OC.L10N.register( "Dec." : "دسامبر", "Settings" : "تنظیمات", "Saving..." : "در حال ذخیره سازی...", + "seconds ago" : "ثانیهها پیش", "Couldn't send reset email. Please contact your administrator." : "ارسال ایمیل مجدد با مشکل مواجه شد . لطفا با مدیر سیستم تماس بگیرید .", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "لینک تنظیم مجدد رمز عبور به ایمیل شما ارسال شده است.<br>اگر آن رادر یک زمان مشخصی دریافت نکرده اید، لطفا هرزنامه/ پوشه های ناخواسته را بررسی کنید.<br>در صورت نبودن از مدیر خود بپرسید.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "فایل های شما رمزگذاری شده اند. اگر شما کلید بازیابی را فعال نکرده اید، پس از راه اندازی مجدد رمزعبور هیچ راهی برای بازگشت اطلاعاتتان وجود نخواهد داشت.در صورت عدم اطمینان به انجام کار، لطفا ابتدا با مدیر خود تماس بگیرید. آیا واقعا میخواهید ادامه دهید ؟", @@ -60,6 +78,7 @@ OC.L10N.register( "Error loading file picker template: {error}" : "خطا در بارگذاری قالب انتخاب فایل : {error}", "Ok" : "قبول", "Error loading message template: {error}" : "خطا در بارگذاری قالب پیام : {error}", + "read-only" : "فقط-خواندنی", "One file conflict" : "یک فایل متضاد", "New Files" : "فایل های جدید", "Already existing files" : "فایل های موجود در حال حاضر ", @@ -68,11 +87,13 @@ OC.L10N.register( "Continue" : "ادامه", "(all selected)" : "(همه انتخاب شده اند)", "({count} selected)" : "({count} انتخاب شده)", + "Error loading file exists template" : "خطا در بارگزاری فایل قالب", "Very weak password" : "رمز عبور بسیار ضعیف", "Weak password" : "رمز عبور ضعیف", "So-so password" : "رمز عبور متوسط", "Good password" : "رمز عبور خوب", "Strong password" : "رمز عبور قوی", + "Error occurred while checking server setup" : "خطا در هنگام چک کردن راهاندازی سرور رخ داده است", "Shared" : "اشتراک گذاشته شده", "Shared with {recipients}" : "به اشتراک گذاشته شده با {recipients}", "Error" : "خطا", @@ -80,6 +101,7 @@ OC.L10N.register( "Error while unsharing" : "خطا درحال لغو اشتراک", "Error while changing permissions" : "خطا در حال تغییر مجوز", "Error setting expiration date" : "خطا در تنظیم تاریخ انقضا", + "The public link will expire no later than {days} days after it is created" : "لینک عمومی پس از {days} روز پس از ایجاد منقضی خواهد شد", "Set expiration date" : "تنظیم تاریخ انقضا", "Expiration" : "تاریخ انقضا", "Expiration date" : "تاریخ انقضا", @@ -87,32 +109,57 @@ OC.L10N.register( "Email sent" : "ایمیل ارسال شد", "Resharing is not allowed" : "اشتراک گذاری مجدد مجاز نمی باشد", "Share link" : "اشتراک گذاشتن لینک", + "Link" : "لینک", "Password protect" : "نگهداری کردن رمز عبور", "Password" : "گذرواژه", + "Choose a password for the public link" : "انتخاب رمز برای لینک عمومی", + "Allow editing" : "اجازهی ویرایش", "Email link to person" : "پیوند ایمیل برای شخص.", "Send" : "ارسال", "Shared with you and the group {group} by {owner}" : "به اشتراک گذاشته شده با شما و گروه {گروه} توسط {دارنده}", "Shared with you by {owner}" : "به اشتراک گذاشته شده با شما توسط { دارنده}", "Shared in {item} with {user}" : "به اشتراک گذاشته شده در {بخش} با {کاربر}", "group" : "گروه", + "remote" : "از راه دور", "notify by email" : "دریافت هشدار از طریق ایمیل", "Unshare" : "لغو اشتراک", "can share" : "قابل به اشتراک گذاری", "can edit" : "می توان ویرایش کرد", "create" : "ایجاد", + "change" : "تغییر", "delete" : "پاک کردن", "access control" : "کنترل دسترسی", + "An error occured. Please try again" : "یک خطا رخ داده است، لطفا مجددا تلاش کنید", "Share" : "اشتراکگذاری", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "اشتراکگذاری با دیگر افراد بر روی ownClouds بصورت username@example.com/owncloud", + "Share with users or groups …" : "اشتراک گذاری با کاربران یا گروه ها ...", + "Share with users, groups or remote users …" : "اشتراک گذاری با کاربران، گروهها یا کاربران راه دور...", "Warning" : "اخطار", + "Error while sending notification" : "خطا در حین ارسال نوتیفیکیشن", "The object type is not specified." : "نوع شی تعیین نشده است.", "Enter new" : "مورد جدید را وارد کنید", "Delete" : "حذف", "Add" : "افزودن", "Edit tags" : "ویرایش تگ ها", + "No tags selected for deletion." : "هیچ تگی برای حذف انتخاب نشده است.", + "unknown text" : "متن نامعلوم", + "Hello world!" : "سلام دنیا!", + "sunny" : "آفتابی", + "Hello {name}, the weather is {weather}" : "سلام {name}, هوا {weather} است", + "Hello {name}" : "سلام {name}", + "_download %n file_::_download %n files_" : ["دانلود %n فایل"], + "{version} is available. Get more information on how to update." : "{version} آماده است. برای چگونگی بروزرسانی اطلاعات بیشتر را دریافت نمایید.", + "Updating {productName} to version {version}, this may take a while." : "بروزرسانی {productName} به نسخهی {version}، این عملیات ممکن است زمانبر باشد.", + "An error occurred." : "یک خطا رخداده است.", + "The update was unsuccessful. " : "بروزرسانی ناموفق بود.", + "The update was successful. There were warnings." : "بروزرسانی با موفقیت انجام شد، اخطارهایی وجود دارد.", "The update was successful. Redirecting you to ownCloud now." : "به روزرسانی موفقیت آمیز بود. در حال انتقال شما به OwnCloud.", + "%s password reset" : "%s رمزعبور تغییر کرد", "Use the following link to reset your password: {link}" : "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", "New password" : "گذرواژه جدید", + "New Password" : "رمزعبور جدید", "Reset password" : "تنظیم مجدد رمز عبور", + "Searching other places" : "جستجو در مکانهای دیگر", "Personal" : "شخصی", "Users" : "کاربران", "Apps" : " برنامه ها", @@ -126,7 +173,22 @@ OC.L10N.register( "Error favoriting" : "خطا هنگام افزودن به موارد محبوب", "Error unfavoriting" : "خطا هنگام حذف از موارد محبوب", "Access forbidden" : "اجازه دسترسی به مناطق ممنوعه را ندارید", + "File not found" : "فایل یافت نشد", + "The specified document has not been found on the server." : "مستند مورد نظر در سرور یافت نشد.", + "You can click here to return to %s." : "شما میتوانید برای بازگشت به %s اینجا کلیک کنید.", + "The share will expire on %s." : "اشتراکگذاری در %s منقضی خواهد شد.", "Cheers!" : "سلامتی!", + "Internal Server Error" : "خطای داخلی سرور", + "More details can be found in the server log." : "جزئیات بیشتر در لاگ سرور قابل مشاهده خواهد بود.", + "Technical details" : "جزئیات فنی", + "Remote Address: %s" : "آدرس راهدور: %s", + "Request ID: %s" : "ID درخواست: %s", + "Type: %s" : "نوع: %s", + "Code: %s" : "کد: %s", + "Message: %s" : "پیام: %s", + "File: %s" : "فایل : %s", + "Line: %s" : "خط: %s", + "Security warning" : "اخطار امنیتی", "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "فایلها و فهرست های داده های شما قابل از اینترنت قابل دسترسی هستند، چونکه فایل htacces. کار نمی کند.", "Create an <strong>admin account</strong>" : "لطفا یک <strong> شناسه برای مدیر</strong> بسازید", "Username" : "نام کاربری", @@ -134,19 +196,33 @@ OC.L10N.register( "Data folder" : "پوشه اطلاعاتی", "Configure the database" : "پایگاه داده برنامه ریزی شدند", "Only %s is available." : "تنها %s موجود است.", + "Install and activate additional PHP modules to choose other database types." : "جهت انتخاب انواع دیگر پایگاهداده،ماژولهای اضافی PHP را نصب و فعالسازی کنید.", + "For more details check out the documentation." : "برای جزئیات بیشتر به مستندات مراجعه کنید.", "Database user" : "شناسه پایگاه داده", "Database password" : "پسورد پایگاه داده", "Database name" : "نام پایگاه داده", "Database tablespace" : "جدول پایگاه داده", "Database host" : "هاست پایگاه داده", + "Performance warning" : "اخطار کارایی", + "SQLite will be used as database." : "SQLite به عنوان پایگاهداده استفاده خواهد شد.", "Finish setup" : "اتمام نصب", "Finishing …" : "در حال اتمام ...", + "Need help?" : "کمک لازم دارید ؟", + "See the documentation" : "مشاهدهی مستندات", "Log out" : "خروج", "Search" : "جستوجو", + "Please contact your administrator." : "لطفا با مدیر وبسایت تماس بگیرید.", + "An internal error occured." : "یک خطای داخلی رخ دادهاست.", + "Please try again or contact your administrator." : "لطفا مجددا تلاش کنید یا با مدیر سیستم تماس بگیرید.", "Log in" : "ورود", "remember" : "بیاد آوری", "Alternative Logins" : "ورود متناوب", "Thank you for your patience." : "از صبر شما متشکریم", + "Add \"%s\" as trusted domain" : "افزودن \"%s\" به عنوان دامنه مورد اعتماد", + "App update required" : "نیاز به بروزرسانی برنامه وجود دارد", + "%s will be updated to version %s" : "%s به نسخهی %s بروزرسانی خواهد شد", + "These apps will be updated:" : "این برنامهها بروزرسانی شدهاند:", + "The theme %s has been disabled." : "قالب %s غیر فعال شد.", "Start update" : "اغاز به روز رسانی" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/fa.json b/core/l10n/fa.json index 5ec3ad5ee0e..2de8952ce34 100644 --- a/core/l10n/fa.json +++ b/core/l10n/fa.json @@ -1,12 +1,22 @@ { "translations": { "Couldn't send mail to following users: %s " : "ارسال ایمیل برای کاربران روبرو با شکست مواجه شد : %s", + "Preparing update" : "آمادهسازی به روز رسانی", "Turned on maintenance mode" : "حالت \" در دست تعمیر \" فعال شد .", "Turned off maintenance mode" : "حالت \" در دست تعمیر \" غیرفعال شد .", + "Maintenance mode is kept active" : "حالت تعمیرات فعال نگهداشته شده است", "Updated database" : "بروز رسانی پایگاه داده انجام شد .", + "Updated \"%s\" to %s" : "\"%s\" به %s بروزرسانی شد", + "Repair warning: " : "اخطار تعمیر:", + "Repair error: " : "خطای تعمیر:", + "Already up to date" : "در حال حاضر بروز است", + "File is too big" : "فایل خیلی بزرگ است", + "Invalid file provided" : "فایل دادهشده نا معتبر است", "No image or file provided" : "هیچ فایل یا تصویری وارد نشده است", "Unknown filetype" : "نوع فایل ناشناخته", "Invalid image" : "عکس نامعتبر", + "An error occurred. Please contact your admin." : "یک خطا رخ داده است. لطفا با مدیر سیستم تماس بگیرید.", "No temporary profile picture available, try again" : "تصویر پروفایل موقت در حال حاضر در دسترس نیست ، دوباره تلاش کنید ", + "Crop is not square" : "بخش بریده شده مربع نیست", "Sunday" : "یکشنبه", "Monday" : "دوشنبه", "Tuesday" : "سه شنبه", @@ -21,6 +31,13 @@ "Thu." : "پنج شنبه", "Fri." : "جمعه", "Sat." : "شنبه", + "Su" : "یکشنبه", + "Mo" : "دوشنبه", + "Tu" : "سهشنبه", + "We" : "چهارشنبه", + "Th" : "پنجشنبه", + "Fr" : "جمعه", + "Sa" : "شنبه", "January" : "ژانویه", "February" : "فبریه", "March" : "مارس", @@ -47,6 +64,7 @@ "Dec." : "دسامبر", "Settings" : "تنظیمات", "Saving..." : "در حال ذخیره سازی...", + "seconds ago" : "ثانیهها پیش", "Couldn't send reset email. Please contact your administrator." : "ارسال ایمیل مجدد با مشکل مواجه شد . لطفا با مدیر سیستم تماس بگیرید .", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "لینک تنظیم مجدد رمز عبور به ایمیل شما ارسال شده است.<br>اگر آن رادر یک زمان مشخصی دریافت نکرده اید، لطفا هرزنامه/ پوشه های ناخواسته را بررسی کنید.<br>در صورت نبودن از مدیر خود بپرسید.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "فایل های شما رمزگذاری شده اند. اگر شما کلید بازیابی را فعال نکرده اید، پس از راه اندازی مجدد رمزعبور هیچ راهی برای بازگشت اطلاعاتتان وجود نخواهد داشت.در صورت عدم اطمینان به انجام کار، لطفا ابتدا با مدیر خود تماس بگیرید. آیا واقعا میخواهید ادامه دهید ؟", @@ -58,6 +76,7 @@ "Error loading file picker template: {error}" : "خطا در بارگذاری قالب انتخاب فایل : {error}", "Ok" : "قبول", "Error loading message template: {error}" : "خطا در بارگذاری قالب پیام : {error}", + "read-only" : "فقط-خواندنی", "One file conflict" : "یک فایل متضاد", "New Files" : "فایل های جدید", "Already existing files" : "فایل های موجود در حال حاضر ", @@ -66,11 +85,13 @@ "Continue" : "ادامه", "(all selected)" : "(همه انتخاب شده اند)", "({count} selected)" : "({count} انتخاب شده)", + "Error loading file exists template" : "خطا در بارگزاری فایل قالب", "Very weak password" : "رمز عبور بسیار ضعیف", "Weak password" : "رمز عبور ضعیف", "So-so password" : "رمز عبور متوسط", "Good password" : "رمز عبور خوب", "Strong password" : "رمز عبور قوی", + "Error occurred while checking server setup" : "خطا در هنگام چک کردن راهاندازی سرور رخ داده است", "Shared" : "اشتراک گذاشته شده", "Shared with {recipients}" : "به اشتراک گذاشته شده با {recipients}", "Error" : "خطا", @@ -78,6 +99,7 @@ "Error while unsharing" : "خطا درحال لغو اشتراک", "Error while changing permissions" : "خطا در حال تغییر مجوز", "Error setting expiration date" : "خطا در تنظیم تاریخ انقضا", + "The public link will expire no later than {days} days after it is created" : "لینک عمومی پس از {days} روز پس از ایجاد منقضی خواهد شد", "Set expiration date" : "تنظیم تاریخ انقضا", "Expiration" : "تاریخ انقضا", "Expiration date" : "تاریخ انقضا", @@ -85,32 +107,57 @@ "Email sent" : "ایمیل ارسال شد", "Resharing is not allowed" : "اشتراک گذاری مجدد مجاز نمی باشد", "Share link" : "اشتراک گذاشتن لینک", + "Link" : "لینک", "Password protect" : "نگهداری کردن رمز عبور", "Password" : "گذرواژه", + "Choose a password for the public link" : "انتخاب رمز برای لینک عمومی", + "Allow editing" : "اجازهی ویرایش", "Email link to person" : "پیوند ایمیل برای شخص.", "Send" : "ارسال", "Shared with you and the group {group} by {owner}" : "به اشتراک گذاشته شده با شما و گروه {گروه} توسط {دارنده}", "Shared with you by {owner}" : "به اشتراک گذاشته شده با شما توسط { دارنده}", "Shared in {item} with {user}" : "به اشتراک گذاشته شده در {بخش} با {کاربر}", "group" : "گروه", + "remote" : "از راه دور", "notify by email" : "دریافت هشدار از طریق ایمیل", "Unshare" : "لغو اشتراک", "can share" : "قابل به اشتراک گذاری", "can edit" : "می توان ویرایش کرد", "create" : "ایجاد", + "change" : "تغییر", "delete" : "پاک کردن", "access control" : "کنترل دسترسی", + "An error occured. Please try again" : "یک خطا رخ داده است، لطفا مجددا تلاش کنید", "Share" : "اشتراکگذاری", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "اشتراکگذاری با دیگر افراد بر روی ownClouds بصورت username@example.com/owncloud", + "Share with users or groups …" : "اشتراک گذاری با کاربران یا گروه ها ...", + "Share with users, groups or remote users …" : "اشتراک گذاری با کاربران، گروهها یا کاربران راه دور...", "Warning" : "اخطار", + "Error while sending notification" : "خطا در حین ارسال نوتیفیکیشن", "The object type is not specified." : "نوع شی تعیین نشده است.", "Enter new" : "مورد جدید را وارد کنید", "Delete" : "حذف", "Add" : "افزودن", "Edit tags" : "ویرایش تگ ها", + "No tags selected for deletion." : "هیچ تگی برای حذف انتخاب نشده است.", + "unknown text" : "متن نامعلوم", + "Hello world!" : "سلام دنیا!", + "sunny" : "آفتابی", + "Hello {name}, the weather is {weather}" : "سلام {name}, هوا {weather} است", + "Hello {name}" : "سلام {name}", + "_download %n file_::_download %n files_" : ["دانلود %n فایل"], + "{version} is available. Get more information on how to update." : "{version} آماده است. برای چگونگی بروزرسانی اطلاعات بیشتر را دریافت نمایید.", + "Updating {productName} to version {version}, this may take a while." : "بروزرسانی {productName} به نسخهی {version}، این عملیات ممکن است زمانبر باشد.", + "An error occurred." : "یک خطا رخداده است.", + "The update was unsuccessful. " : "بروزرسانی ناموفق بود.", + "The update was successful. There were warnings." : "بروزرسانی با موفقیت انجام شد، اخطارهایی وجود دارد.", "The update was successful. Redirecting you to ownCloud now." : "به روزرسانی موفقیت آمیز بود. در حال انتقال شما به OwnCloud.", + "%s password reset" : "%s رمزعبور تغییر کرد", "Use the following link to reset your password: {link}" : "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", "New password" : "گذرواژه جدید", + "New Password" : "رمزعبور جدید", "Reset password" : "تنظیم مجدد رمز عبور", + "Searching other places" : "جستجو در مکانهای دیگر", "Personal" : "شخصی", "Users" : "کاربران", "Apps" : " برنامه ها", @@ -124,7 +171,22 @@ "Error favoriting" : "خطا هنگام افزودن به موارد محبوب", "Error unfavoriting" : "خطا هنگام حذف از موارد محبوب", "Access forbidden" : "اجازه دسترسی به مناطق ممنوعه را ندارید", + "File not found" : "فایل یافت نشد", + "The specified document has not been found on the server." : "مستند مورد نظر در سرور یافت نشد.", + "You can click here to return to %s." : "شما میتوانید برای بازگشت به %s اینجا کلیک کنید.", + "The share will expire on %s." : "اشتراکگذاری در %s منقضی خواهد شد.", "Cheers!" : "سلامتی!", + "Internal Server Error" : "خطای داخلی سرور", + "More details can be found in the server log." : "جزئیات بیشتر در لاگ سرور قابل مشاهده خواهد بود.", + "Technical details" : "جزئیات فنی", + "Remote Address: %s" : "آدرس راهدور: %s", + "Request ID: %s" : "ID درخواست: %s", + "Type: %s" : "نوع: %s", + "Code: %s" : "کد: %s", + "Message: %s" : "پیام: %s", + "File: %s" : "فایل : %s", + "Line: %s" : "خط: %s", + "Security warning" : "اخطار امنیتی", "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "فایلها و فهرست های داده های شما قابل از اینترنت قابل دسترسی هستند، چونکه فایل htacces. کار نمی کند.", "Create an <strong>admin account</strong>" : "لطفا یک <strong> شناسه برای مدیر</strong> بسازید", "Username" : "نام کاربری", @@ -132,19 +194,33 @@ "Data folder" : "پوشه اطلاعاتی", "Configure the database" : "پایگاه داده برنامه ریزی شدند", "Only %s is available." : "تنها %s موجود است.", + "Install and activate additional PHP modules to choose other database types." : "جهت انتخاب انواع دیگر پایگاهداده،ماژولهای اضافی PHP را نصب و فعالسازی کنید.", + "For more details check out the documentation." : "برای جزئیات بیشتر به مستندات مراجعه کنید.", "Database user" : "شناسه پایگاه داده", "Database password" : "پسورد پایگاه داده", "Database name" : "نام پایگاه داده", "Database tablespace" : "جدول پایگاه داده", "Database host" : "هاست پایگاه داده", + "Performance warning" : "اخطار کارایی", + "SQLite will be used as database." : "SQLite به عنوان پایگاهداده استفاده خواهد شد.", "Finish setup" : "اتمام نصب", "Finishing …" : "در حال اتمام ...", + "Need help?" : "کمک لازم دارید ؟", + "See the documentation" : "مشاهدهی مستندات", "Log out" : "خروج", "Search" : "جستوجو", + "Please contact your administrator." : "لطفا با مدیر وبسایت تماس بگیرید.", + "An internal error occured." : "یک خطای داخلی رخ دادهاست.", + "Please try again or contact your administrator." : "لطفا مجددا تلاش کنید یا با مدیر سیستم تماس بگیرید.", "Log in" : "ورود", "remember" : "بیاد آوری", "Alternative Logins" : "ورود متناوب", "Thank you for your patience." : "از صبر شما متشکریم", + "Add \"%s\" as trusted domain" : "افزودن \"%s\" به عنوان دامنه مورد اعتماد", + "App update required" : "نیاز به بروزرسانی برنامه وجود دارد", + "%s will be updated to version %s" : "%s به نسخهی %s بروزرسانی خواهد شد", + "These apps will be updated:" : "این برنامهها بروزرسانی شدهاند:", + "The theme %s has been disabled." : "قالب %s غیر فعال شد.", "Start update" : "اغاز به روز رسانی" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index 826305c9b5a..c0f89d5899d 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Sähköpostin lähetys seuraaville käyttäjille epäonnistui: %s", "Preparing update" : "Valmistellaan päivitystä", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migraatiotestit ohitetaan - \"update.skip-migration-test\" on aktiivisena config.php-tiedostossa", "Turned on maintenance mode" : "Siirrytty huoltotilaan", "Turned off maintenance mode" : "Huoltotila asetettu pois päältä", "Maintenance mode is kept active" : "Huoltotila pidetään aktiivisena", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Päivitetty \"%s\" versioon %s", "Repair warning: " : "Korjausvaroitus:", "Repair error: " : "Korjausvirhe:", + "Set log level to debug - current level: \"%s\"" : "Aseta lokitasoksi vianjäljitys - nykyinen taso: \"%s\"", + "Reset log level to \"%s\"" : "Palauta lokitasoksi \"%s\"", "Following incompatible apps have been disabled: %s" : "Seuraavat yhteensopimattomat sovellukset on poistettu käytöstä: %s", "Following apps have been disabled: %s" : "Seuraavat sovellukset on poistettu käytöstä: %s", "Already up to date" : "Kaikki on jo ajan tasalla", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Kuvaa tai tiedostoa ei määritelty", "Unknown filetype" : "Tuntematon tiedostotyyppi", "Invalid image" : "Virhellinen kuva", + "An error occurred. Please contact your admin." : "Tapahtui virhe. Ota yhteys ylläpitoon.", "No temporary profile picture available, try again" : "Väliaikaista profiilikuvaa ei ole käytettävissä, yritä uudelleen", "No crop data provided" : "Puutteellinen tieto", "No valid crop data provided" : "Kelvollisia leikkaustietoja ei määritetty", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "Joulu", "Settings" : "Asetukset", "Saving..." : "Tallennetaan...", + "seconds ago" : "sekuntia sitten", "Couldn't send reset email. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut. Ota yhteys ylläpitäjään.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linkki salasanan palauttamista varten on lähetetty sähköpostitse. Jos et saa sähköpostiviestiä kohtuullisessa ajassa, tarkista roskapostikansiot.<br>Jos et saa sähköpostiviestiä, ota yhteys paikalliseen ylläpitäjään.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ei ole luettavissa PHP:n toimesta. Turvallisuussyistä tämä ei ole suositeltava asetus. Lisätietoja on tarjolla <a href=\"{docLink}\">dokumentaatiossa</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Käytössäsi oleva PHP-versio ({version}) ei ole enää <a href=\"{phpLink}\">PHP:n tukema</a>. Päivitä PHP:n versio, jotta hyödyt suorituskykyyn ja tietoturvaan vaikuttavista päivityksistä.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Käänteisen välityspalvelimen otsakkaiden asetukset ovat väärin, tai vaihtoehtoisesti käytät ownCloudia luotetun välityspalvelimen kautta. Jos et käytä ownCloudia luotetun välityspalvelimen kautta, kyseessä on tietoturvaongelma, joka mahdollistaa hyökkääjän väärentää ownCloudille näkyvän IP-osoitteen. Lisätietoja on saatavilla <a href=\"{docLink}\">dokumentaatiosta</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached on määritelty hajautetuksi välimuistiksi, mutta väärä PHP-moduuli \"memcache\" on asennettuna. \\OC\\Memcache\\Memcached tukee vain \"memcached\":ia, ei \"memcache\":a. Lisätietoja <a href=\"{wikiLink}\">memcachedin wikissä molemmista moduuleista</a>.", "Error occurred while checking server setup" : "Virhe palvelimen määrityksiä tarkistaessa", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-otsaketta \"{header}\" ei ole määritetty vastaamaan arvoa \"{expected}\". Kyseessä on mahdollinen tietoturvaan tai -suojaan liittyvä riski, joten suosittelemme muuttamaan asetuksen arvoa.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP-otsaketta \"Strict-Transport-Security\" ei ole määritetty vähintään \"{seconds}\" sekuntiin. Suosittelemme HSTS:n käyttöä paremman tietoturvan vuoksi, kuten <a href=\"{docUrl}\">tietoturvavinkeissä</a> neuvotaan.", @@ -168,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["lataa %n tiedosto","lataa %n tiedostoa"], "{version} is available. Get more information on how to update." : "{version} on saatavilla. Tarjolla on lisätietoja päivittämisestä.", "Updating {productName} to version {version}, this may take a while." : "Päivitetään {productName} versioon {version}, tämä saattaa kestää hetken.", + "An error occurred." : "Tapahtui virhe.", "Please reload the page." : "Päivitä sivu.", "The update was unsuccessful. " : "Päivitys epäonnistui.", "The update was successful. There were warnings." : "Päivitys onnistui, tosin ilmeni varoituksia.", @@ -182,8 +189,8 @@ OC.L10N.register( "New Password" : "Uusi salasana", "Reset password" : "Palauta salasana", "Searching other places" : "Etsitään muista paikoista", - "No search results in other places" : "Ei hakutuloksia muista paikoista", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hakutulos muualla","{count} hakutulosta muualla"], + "No search results in other folders" : "Ei hakutuloksia muissa kansioissa", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hakutulos muussa kansiossa","{count} hakutulosta muissa kansioissa"], "Personal" : "Henkilökohtainen", "Users" : "Käyttäjät", "Apps" : "Sovellukset", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index c8a37ae2ef1..52c1c5553b3 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Sähköpostin lähetys seuraaville käyttäjille epäonnistui: %s", "Preparing update" : "Valmistellaan päivitystä", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migraatiotestit ohitetaan - \"update.skip-migration-test\" on aktiivisena config.php-tiedostossa", "Turned on maintenance mode" : "Siirrytty huoltotilaan", "Turned off maintenance mode" : "Huoltotila asetettu pois päältä", "Maintenance mode is kept active" : "Huoltotila pidetään aktiivisena", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Päivitetty \"%s\" versioon %s", "Repair warning: " : "Korjausvaroitus:", "Repair error: " : "Korjausvirhe:", + "Set log level to debug - current level: \"%s\"" : "Aseta lokitasoksi vianjäljitys - nykyinen taso: \"%s\"", + "Reset log level to \"%s\"" : "Palauta lokitasoksi \"%s\"", "Following incompatible apps have been disabled: %s" : "Seuraavat yhteensopimattomat sovellukset on poistettu käytöstä: %s", "Following apps have been disabled: %s" : "Seuraavat sovellukset on poistettu käytöstä: %s", "Already up to date" : "Kaikki on jo ajan tasalla", @@ -18,6 +21,7 @@ "No image or file provided" : "Kuvaa tai tiedostoa ei määritelty", "Unknown filetype" : "Tuntematon tiedostotyyppi", "Invalid image" : "Virhellinen kuva", + "An error occurred. Please contact your admin." : "Tapahtui virhe. Ota yhteys ylläpitoon.", "No temporary profile picture available, try again" : "Väliaikaista profiilikuvaa ei ole käytettävissä, yritä uudelleen", "No crop data provided" : "Puutteellinen tieto", "No valid crop data provided" : "Kelvollisia leikkaustietoja ei määritetty", @@ -69,6 +73,7 @@ "Dec." : "Joulu", "Settings" : "Asetukset", "Saving..." : "Tallennetaan...", + "seconds ago" : "sekuntia sitten", "Couldn't send reset email. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut. Ota yhteys ylläpitäjään.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linkki salasanan palauttamista varten on lähetetty sähköpostitse. Jos et saa sähköpostiviestiä kohtuullisessa ajassa, tarkista roskapostikansiot.<br>Jos et saa sähköpostiviestiä, ota yhteys paikalliseen ylläpitäjään.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ei ole luettavissa PHP:n toimesta. Turvallisuussyistä tämä ei ole suositeltava asetus. Lisätietoja on tarjolla <a href=\"{docLink}\">dokumentaatiossa</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Käytössäsi oleva PHP-versio ({version}) ei ole enää <a href=\"{phpLink}\">PHP:n tukema</a>. Päivitä PHP:n versio, jotta hyödyt suorituskykyyn ja tietoturvaan vaikuttavista päivityksistä.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Käänteisen välityspalvelimen otsakkaiden asetukset ovat väärin, tai vaihtoehtoisesti käytät ownCloudia luotetun välityspalvelimen kautta. Jos et käytä ownCloudia luotetun välityspalvelimen kautta, kyseessä on tietoturvaongelma, joka mahdollistaa hyökkääjän väärentää ownCloudille näkyvän IP-osoitteen. Lisätietoja on saatavilla <a href=\"{docLink}\">dokumentaatiosta</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached on määritelty hajautetuksi välimuistiksi, mutta väärä PHP-moduuli \"memcache\" on asennettuna. \\OC\\Memcache\\Memcached tukee vain \"memcached\":ia, ei \"memcache\":a. Lisätietoja <a href=\"{wikiLink}\">memcachedin wikissä molemmista moduuleista</a>.", "Error occurred while checking server setup" : "Virhe palvelimen määrityksiä tarkistaessa", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-otsaketta \"{header}\" ei ole määritetty vastaamaan arvoa \"{expected}\". Kyseessä on mahdollinen tietoturvaan tai -suojaan liittyvä riski, joten suosittelemme muuttamaan asetuksen arvoa.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP-otsaketta \"Strict-Transport-Security\" ei ole määritetty vähintään \"{seconds}\" sekuntiin. Suosittelemme HSTS:n käyttöä paremman tietoturvan vuoksi, kuten <a href=\"{docUrl}\">tietoturvavinkeissä</a> neuvotaan.", @@ -166,6 +172,7 @@ "_download %n file_::_download %n files_" : ["lataa %n tiedosto","lataa %n tiedostoa"], "{version} is available. Get more information on how to update." : "{version} on saatavilla. Tarjolla on lisätietoja päivittämisestä.", "Updating {productName} to version {version}, this may take a while." : "Päivitetään {productName} versioon {version}, tämä saattaa kestää hetken.", + "An error occurred." : "Tapahtui virhe.", "Please reload the page." : "Päivitä sivu.", "The update was unsuccessful. " : "Päivitys epäonnistui.", "The update was successful. There were warnings." : "Päivitys onnistui, tosin ilmeni varoituksia.", @@ -180,8 +187,8 @@ "New Password" : "Uusi salasana", "Reset password" : "Palauta salasana", "Searching other places" : "Etsitään muista paikoista", - "No search results in other places" : "Ei hakutuloksia muista paikoista", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hakutulos muualla","{count} hakutulosta muualla"], + "No search results in other folders" : "Ei hakutuloksia muissa kansioissa", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hakutulos muussa kansiossa","{count} hakutulosta muissa kansioissa"], "Personal" : "Henkilökohtainen", "Users" : "Käyttäjät", "Apps" : "Sovellukset", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 3335924e5e1..905e9943c3f 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Impossible d'envoyer un courriel aux utilisateurs suivants : %s", "Preparing update" : "Préparation de la mise à jour", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Les tests de migration sont ignorés - \"update.skip-migration-test\" est activé dans config.php", "Turned on maintenance mode" : "Mode de maintenance activé", "Turned off maintenance mode" : "Mode de maintenance désactivé", "Maintenance mode is kept active" : "Le mode de maintenance est laissé actif", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Mise à jour de « %s » vers %s", "Repair warning: " : "Avertissement de réparation :", "Repair error: " : "Erreur de réparation :", + "Set log level to debug - current level: \"%s\"" : "Réglage du niveau de log à \"debug\" - niveau actuel: \"%s\"", + "Reset log level to \"%s\"" : "Réglage du niveau de log à \"%s\"", "Following incompatible apps have been disabled: %s" : "Les applications incompatibles suivantes ont été désactivées : %s", "Following apps have been disabled: %s" : "Les applications suivantes ont été désactivées : %s", "Already up to date" : "Déjà à jour", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Aucun fichier fourni", "Unknown filetype" : "Type de fichier inconnu", "Invalid image" : "Image non valable", + "An error occurred. Please contact your admin." : "Une erreur est survenue. Veuillez contacter votre administrateur.", "No temporary profile picture available, try again" : "Aucune image temporaire disponible pour le profil. Essayez à nouveau.", "No crop data provided" : "Aucune donnée de recadrage fournie", "No valid crop data provided" : "Données de recadrage non valides", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "Déc.", "Settings" : "Paramètres", "Saving..." : "Enregistrement…", + "seconds ago" : "à l'instant", "Couldn't send reset email. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez contacter votre administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clef de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?", @@ -105,7 +110,8 @@ OC.L10N.register( "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Aucun cache de la mémoire n'est configuré. Si possible, configurez un \"memcache\" pour augmenter les performances. Pour plus d'information consultez la <a href=\"{docLink}\">documentation</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom n'est pas lisible par PHP, ce qui est fortement déconseillé pour des raisons de sécurité. Plus d'informations peuvent être trouvées dans notre <a href=\"{docLink}\">documentation</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "La version de PHP utilisée ({version}) <a href=\"{phpLink}\">n'est plus prise en charge par les créateurs de PHP</a>. Nous vous recommandons de mettre à niveau votre installation de PHP pour bénéficier de meilleures performances et des mises à jour de sécurité fournies par PHP.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "L'entête du fichier de configuration du reverse proxy est incorrect, ou vous accédez ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accédé ownCloud depuis un proxy de confiance, ceci est un problème de sécurité and peut permettre à un attaquant de parodier son adresse IP visible par ownCloud. Plus d'information est accessible dans notre <a href=\"{docLink}\">documentation</a>.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "La configuration des headers du reverse proxy est incorrecte, ou vous accédez ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. <a href=\"{docLink}\">Plus d'info dans la documentation.</a>", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "\"memcached\" est configuré comme cache distribué, mais le module installé est \"memcache\". \\OC\\Memcache\\Memcached ne prend en charge que \"memcached\" et non \"memcache\". <a href=\"{wikiLink}\">Consulter le wiki memcached parlant de ces deux modules.</a>", "Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\" créant potentiellement un risque relié à la sécurité et à la vie privée. Il est donc recommandé d'ajuster ce paramètre.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configurée à \"{seconds}\" secondes. Pour renforcer la sécurité nous recommandons d'activer HSTS comme décrit dans notre <a href=\"{docUrl}\">Guide pour le renforcement et la sécurité</a>.", @@ -141,16 +147,18 @@ OC.L10N.register( "Unshare" : "Ne plus partager", "can share" : "peut partager", "can edit" : "peut modifier", - "create" : "créer", + "create" : "création", "change" : "modification", - "delete" : "supprimer", + "delete" : "suppression", "access control" : "contrôle d'accès", + "Share details could not be loaded for this item." : "Les informations de partage n'ont pu être chargées pour cet élément.", "An error occured. Please try again" : "Une erreur est survenue. Merci de réessayer", "Share" : "Partager", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud", "Share with users or groups …" : "Partager avec des utilisateurs ou groupes...", "Share with users, groups or remote users …" : "Partager avec des utilisateurs, groupes, ou utilisateurs distants", "Warning" : "Attention", + "Error while sending notification" : "Erreur lors de l'envoi de la notification", "The object type is not specified." : "Le type d'objet n'est pas spécifié.", "Enter new" : "Saisir un nouveau", "Delete" : "Supprimer", @@ -166,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["Télécharger %n fichier","Télécharger %n fichiers"], "{version} is available. Get more information on how to update." : "La version {version} est disponible. Cliquez ici pour plus d'informations à propos de cette mise à jour.", "Updating {productName} to version {version}, this may take a while." : "La mise à jour de {productName} vers la version {version} est en cours. Cela peut prendre un certain temps.", + "An error occurred." : "Une erreur est survenue.", "Please reload the page." : "Veuillez recharger la page.", "The update was unsuccessful. " : "La mise à jour a échoué.", "The update was successful. There were warnings." : "La mise à jour a réussi, mais il y a eu des avertissements", @@ -180,8 +189,8 @@ OC.L10N.register( "New Password" : "Nouveau mot de passe", "Reset password" : "Réinitialiser le mot de passe", "Searching other places" : "Recherche en cours dans d'autres emplacements", - "No search results in other places" : "Aucun résultat dans d'autres emplacements", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} résultat dans d'autres emplacements","{count} résultats dans d'autres emplacements"], + "No search results in other folders" : "Aucun résultat dans d'autres dossiers", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} résultat dans un autre dossier","{count} résultats dans d'autres dossiers"], "Personal" : "Personnel", "Users" : "Utilisateurs", "Apps" : "Applications", @@ -222,7 +231,7 @@ OC.L10N.register( "Storage & database" : "Stockage & base de données", "Data folder" : "Répertoire des données", "Configure the database" : "Configurer la base de données", - "Only %s is available." : "%s seulement est disponible.", + "Only %s is available." : "Seul(e) %s est disponible.", "Install and activate additional PHP modules to choose other database types." : "Installez et activez les modules PHP additionnels adéquats pour choisir d'autres types de base de données.", "For more details check out the documentation." : "Consultez la documentation pour plus de détails.", "Database user" : "Utilisateur de la base de données", @@ -230,7 +239,7 @@ OC.L10N.register( "Database name" : "Nom de la base de données", "Database tablespace" : "Tablespace de la base de données", "Database host" : "Hôte de la base de données", - "Performance warning" : "Avertissement de performance", + "Performance warning" : "Avertissement à propos des performances", "SQLite will be used as database." : "SQLite sera utilisé comme gestionnaire de base de données.", "For larger installations we recommend to choose a different database backend." : "Pour des installations plus volumineuses, nous vous conseillons d'utiliser un autre gestionnaire de base de données.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "En particulier si vous utilisez le client de bureau pour synchroniser vos données : l'utilisation de SQLite est alors déconseillée.", @@ -261,7 +270,7 @@ OC.L10N.register( "App update required" : "Mise à jour de l'application nécessaire", "%s will be updated to version %s" : "%s sera mis à jour vers la version %s.", "These apps will be updated:" : "Les applications suivantes seront mises à jour:", - "These incompatible apps will be disabled:" : "Ces applications incompatibles ont été désactivés:", + "These incompatible apps will be disabled:" : "Ces applications incompatibles ont été désactivées:", "The theme %s has been disabled." : "Le thème %s a été désactivé.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Veuillez vous assurer qu'une copie de sauvegarde de la base de données, du dossier de configuration (config) et du dossier de données (data) a été réalisée avant de commencer.", "Start update" : "Démarrer la mise à jour", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 225146cfb73..9cfa4af12c1 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Impossible d'envoyer un courriel aux utilisateurs suivants : %s", "Preparing update" : "Préparation de la mise à jour", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Les tests de migration sont ignorés - \"update.skip-migration-test\" est activé dans config.php", "Turned on maintenance mode" : "Mode de maintenance activé", "Turned off maintenance mode" : "Mode de maintenance désactivé", "Maintenance mode is kept active" : "Le mode de maintenance est laissé actif", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Mise à jour de « %s » vers %s", "Repair warning: " : "Avertissement de réparation :", "Repair error: " : "Erreur de réparation :", + "Set log level to debug - current level: \"%s\"" : "Réglage du niveau de log à \"debug\" - niveau actuel: \"%s\"", + "Reset log level to \"%s\"" : "Réglage du niveau de log à \"%s\"", "Following incompatible apps have been disabled: %s" : "Les applications incompatibles suivantes ont été désactivées : %s", "Following apps have been disabled: %s" : "Les applications suivantes ont été désactivées : %s", "Already up to date" : "Déjà à jour", @@ -18,6 +21,7 @@ "No image or file provided" : "Aucun fichier fourni", "Unknown filetype" : "Type de fichier inconnu", "Invalid image" : "Image non valable", + "An error occurred. Please contact your admin." : "Une erreur est survenue. Veuillez contacter votre administrateur.", "No temporary profile picture available, try again" : "Aucune image temporaire disponible pour le profil. Essayez à nouveau.", "No crop data provided" : "Aucune donnée de recadrage fournie", "No valid crop data provided" : "Données de recadrage non valides", @@ -69,6 +73,7 @@ "Dec." : "Déc.", "Settings" : "Paramètres", "Saving..." : "Enregistrement…", + "seconds ago" : "à l'instant", "Couldn't send reset email. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez contacter votre administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clef de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?", @@ -103,7 +108,8 @@ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Aucun cache de la mémoire n'est configuré. Si possible, configurez un \"memcache\" pour augmenter les performances. Pour plus d'information consultez la <a href=\"{docLink}\">documentation</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom n'est pas lisible par PHP, ce qui est fortement déconseillé pour des raisons de sécurité. Plus d'informations peuvent être trouvées dans notre <a href=\"{docLink}\">documentation</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "La version de PHP utilisée ({version}) <a href=\"{phpLink}\">n'est plus prise en charge par les créateurs de PHP</a>. Nous vous recommandons de mettre à niveau votre installation de PHP pour bénéficier de meilleures performances et des mises à jour de sécurité fournies par PHP.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "L'entête du fichier de configuration du reverse proxy est incorrect, ou vous accédez ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accédé ownCloud depuis un proxy de confiance, ceci est un problème de sécurité and peut permettre à un attaquant de parodier son adresse IP visible par ownCloud. Plus d'information est accessible dans notre <a href=\"{docLink}\">documentation</a>.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "La configuration des headers du reverse proxy est incorrecte, ou vous accédez ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. <a href=\"{docLink}\">Plus d'info dans la documentation.</a>", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "\"memcached\" est configuré comme cache distribué, mais le module installé est \"memcache\". \\OC\\Memcache\\Memcached ne prend en charge que \"memcached\" et non \"memcache\". <a href=\"{wikiLink}\">Consulter le wiki memcached parlant de ces deux modules.</a>", "Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\" créant potentiellement un risque relié à la sécurité et à la vie privée. Il est donc recommandé d'ajuster ce paramètre.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configurée à \"{seconds}\" secondes. Pour renforcer la sécurité nous recommandons d'activer HSTS comme décrit dans notre <a href=\"{docUrl}\">Guide pour le renforcement et la sécurité</a>.", @@ -139,16 +145,18 @@ "Unshare" : "Ne plus partager", "can share" : "peut partager", "can edit" : "peut modifier", - "create" : "créer", + "create" : "création", "change" : "modification", - "delete" : "supprimer", + "delete" : "suppression", "access control" : "contrôle d'accès", + "Share details could not be loaded for this item." : "Les informations de partage n'ont pu être chargées pour cet élément.", "An error occured. Please try again" : "Une erreur est survenue. Merci de réessayer", "Share" : "Partager", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud", "Share with users or groups …" : "Partager avec des utilisateurs ou groupes...", "Share with users, groups or remote users …" : "Partager avec des utilisateurs, groupes, ou utilisateurs distants", "Warning" : "Attention", + "Error while sending notification" : "Erreur lors de l'envoi de la notification", "The object type is not specified." : "Le type d'objet n'est pas spécifié.", "Enter new" : "Saisir un nouveau", "Delete" : "Supprimer", @@ -164,6 +172,7 @@ "_download %n file_::_download %n files_" : ["Télécharger %n fichier","Télécharger %n fichiers"], "{version} is available. Get more information on how to update." : "La version {version} est disponible. Cliquez ici pour plus d'informations à propos de cette mise à jour.", "Updating {productName} to version {version}, this may take a while." : "La mise à jour de {productName} vers la version {version} est en cours. Cela peut prendre un certain temps.", + "An error occurred." : "Une erreur est survenue.", "Please reload the page." : "Veuillez recharger la page.", "The update was unsuccessful. " : "La mise à jour a échoué.", "The update was successful. There were warnings." : "La mise à jour a réussi, mais il y a eu des avertissements", @@ -178,8 +187,8 @@ "New Password" : "Nouveau mot de passe", "Reset password" : "Réinitialiser le mot de passe", "Searching other places" : "Recherche en cours dans d'autres emplacements", - "No search results in other places" : "Aucun résultat dans d'autres emplacements", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} résultat dans d'autres emplacements","{count} résultats dans d'autres emplacements"], + "No search results in other folders" : "Aucun résultat dans d'autres dossiers", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} résultat dans un autre dossier","{count} résultats dans d'autres dossiers"], "Personal" : "Personnel", "Users" : "Utilisateurs", "Apps" : "Applications", @@ -220,7 +229,7 @@ "Storage & database" : "Stockage & base de données", "Data folder" : "Répertoire des données", "Configure the database" : "Configurer la base de données", - "Only %s is available." : "%s seulement est disponible.", + "Only %s is available." : "Seul(e) %s est disponible.", "Install and activate additional PHP modules to choose other database types." : "Installez et activez les modules PHP additionnels adéquats pour choisir d'autres types de base de données.", "For more details check out the documentation." : "Consultez la documentation pour plus de détails.", "Database user" : "Utilisateur de la base de données", @@ -228,7 +237,7 @@ "Database name" : "Nom de la base de données", "Database tablespace" : "Tablespace de la base de données", "Database host" : "Hôte de la base de données", - "Performance warning" : "Avertissement de performance", + "Performance warning" : "Avertissement à propos des performances", "SQLite will be used as database." : "SQLite sera utilisé comme gestionnaire de base de données.", "For larger installations we recommend to choose a different database backend." : "Pour des installations plus volumineuses, nous vous conseillons d'utiliser un autre gestionnaire de base de données.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "En particulier si vous utilisez le client de bureau pour synchroniser vos données : l'utilisation de SQLite est alors déconseillée.", @@ -259,7 +268,7 @@ "App update required" : "Mise à jour de l'application nécessaire", "%s will be updated to version %s" : "%s sera mis à jour vers la version %s.", "These apps will be updated:" : "Les applications suivantes seront mises à jour:", - "These incompatible apps will be disabled:" : "Ces applications incompatibles ont été désactivés:", + "These incompatible apps will be disabled:" : "Ces applications incompatibles ont été désactivées:", "The theme %s has been disabled." : "Le thème %s a été désactivé.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Veuillez vous assurer qu'une copie de sauvegarde de la base de données, du dossier de configuration (config) et du dossier de données (data) a été réalisée avant de commencer.", "Start update" : "Démarrer la mise à jour", diff --git a/core/l10n/gl.js b/core/l10n/gl.js index 8cff0f073d6..5ac505ab535 100644 --- a/core/l10n/gl.js +++ b/core/l10n/gl.js @@ -69,6 +69,7 @@ OC.L10N.register( "Dec." : "dec.", "Settings" : "Axustes", "Saving..." : "Gardando...", + "seconds ago" : "segundos atrás", "Couldn't send reset email. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Póñase en contacto co administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A ligazón para restabelecer o seu contrasinal foi enviada ao seu correo. Se non a recibe nun prazo razoábel de tempo, vexa o seu cartafol de correo lixo. <br> Se non está ali pregúntelle ao administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros están cifrados. Se non activou a chave de recuperación, non haberá maneira de recuperar os datos após o restabelecemento do contrasinal. <br />Se non está seguro de que facer, póñase en contacto co administrador antes de continuar. <br /> Confirma que quere continuar?", @@ -175,8 +176,6 @@ OC.L10N.register( "New Password" : "Novo contrasinal", "Reset password" : "Restabelecer o contrasinal", "Searching other places" : "Buscando noutros lugares", - "No search results in other places" : "Sen resultados na busca noutros lugares", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado na busca noutros lugares","{count} resultados na busca noutros lugares"], "Personal" : "Persoal", "Users" : "Usuarios", "Apps" : "Aplicacións", diff --git a/core/l10n/gl.json b/core/l10n/gl.json index 9ce7bf5c34b..d9b28a5a86f 100644 --- a/core/l10n/gl.json +++ b/core/l10n/gl.json @@ -67,6 +67,7 @@ "Dec." : "dec.", "Settings" : "Axustes", "Saving..." : "Gardando...", + "seconds ago" : "segundos atrás", "Couldn't send reset email. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Póñase en contacto co administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A ligazón para restabelecer o seu contrasinal foi enviada ao seu correo. Se non a recibe nun prazo razoábel de tempo, vexa o seu cartafol de correo lixo. <br> Se non está ali pregúntelle ao administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros están cifrados. Se non activou a chave de recuperación, non haberá maneira de recuperar os datos após o restabelecemento do contrasinal. <br />Se non está seguro de que facer, póñase en contacto co administrador antes de continuar. <br /> Confirma que quere continuar?", @@ -173,8 +174,6 @@ "New Password" : "Novo contrasinal", "Reset password" : "Restabelecer o contrasinal", "Searching other places" : "Buscando noutros lugares", - "No search results in other places" : "Sen resultados na busca noutros lugares", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado na busca noutros lugares","{count} resultados na busca noutros lugares"], "Personal" : "Persoal", "Users" : "Usuarios", "Apps" : "Aplicacións", diff --git a/core/l10n/he.js b/core/l10n/he.js index c590e0c530e..baaa87b24e0 100644 --- a/core/l10n/he.js +++ b/core/l10n/he.js @@ -41,6 +41,7 @@ OC.L10N.register( "Dec." : "דצמ׳", "Settings" : "הגדרות", "Saving..." : "שמירה…", + "seconds ago" : "שניות", "No" : "לא", "Yes" : "כן", "Choose" : "בחירה", diff --git a/core/l10n/he.json b/core/l10n/he.json index 38cf01d285d..8455e46a61c 100644 --- a/core/l10n/he.json +++ b/core/l10n/he.json @@ -39,6 +39,7 @@ "Dec." : "דצמ׳", "Settings" : "הגדרות", "Saving..." : "שמירה…", + "seconds ago" : "שניות", "No" : "לא", "Yes" : "כן", "Choose" : "בחירה", diff --git a/core/l10n/hr.js b/core/l10n/hr.js index f891532b283..db7655f947f 100644 --- a/core/l10n/hr.js +++ b/core/l10n/hr.js @@ -53,6 +53,7 @@ OC.L10N.register( "Dec." : "pros.", "Settings" : "Postavke", "Saving..." : "Spremanje...", + "seconds ago" : "prije par sekundi", "Couldn't send reset email. Please contact your administrator." : "Nije mogće poslati resetiranu poštu. MOlimo kontaktirajte svog administratora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Veza za resetiranje vaše lozinke poslana je na vašu adresu e-pošte. Ako je ne primite unekom razumnom vremenskom roku, provjerite svoje spam/junk mape. <br> Ako nije tamo, kontaktirajtesvoga lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše datoteke su šifrirane. Ako niste aktivirali ključ oporavka,svoje podatke nećete moći dohvatitinakon što vaša lozinka bude resetirana.<br />Ako ne znate što učiniti, prije nego linastavite, molimo kontaktirajte svog administratora. <br />Želite li doista nastaviti?", @@ -117,7 +118,11 @@ OC.L10N.register( "change" : "promijeni", "delete" : "Izbrišite", "access control" : "Kontrola pristupa", + "An error occured. Please try again" : "Dogodila se pogreška. Molimo Vas, pokušajte ponovno. ", "Share" : "Podijelite", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Podijelite sa korisnicima drugoga ownClouda koristeći format korisnickoime@primjer.com/owncloud", + "Share with users or groups …" : "Podijeli sa korisnicima ili grupama ...", + "Share with users, groups or remote users …" : "Podijeli sa korisnicima, grupama ili udaljenim korisnicima ...", "Warning" : "Upozorenje", "The object type is not specified." : "Vrsta objekta nije specificirana.", "Enter new" : "Unesite novi", @@ -145,7 +150,6 @@ OC.L10N.register( "New Password" : "Nova lozinka", "Reset password" : "Resetirajte lozinku", "Searching other places" : "Pretraživanje drugih lokacija", - "_{count} search result in other places_::_{count} search results in other places_" : ["Pronađen {count} rezultat na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama"], "Personal" : "Osobno", "Users" : "Korisnici", "Apps" : "Aplikacije", diff --git a/core/l10n/hr.json b/core/l10n/hr.json index 3b4404dacb5..9bde2af14e8 100644 --- a/core/l10n/hr.json +++ b/core/l10n/hr.json @@ -51,6 +51,7 @@ "Dec." : "pros.", "Settings" : "Postavke", "Saving..." : "Spremanje...", + "seconds ago" : "prije par sekundi", "Couldn't send reset email. Please contact your administrator." : "Nije mogće poslati resetiranu poštu. MOlimo kontaktirajte svog administratora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Veza za resetiranje vaše lozinke poslana je na vašu adresu e-pošte. Ako je ne primite unekom razumnom vremenskom roku, provjerite svoje spam/junk mape. <br> Ako nije tamo, kontaktirajtesvoga lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše datoteke su šifrirane. Ako niste aktivirali ključ oporavka,svoje podatke nećete moći dohvatitinakon što vaša lozinka bude resetirana.<br />Ako ne znate što učiniti, prije nego linastavite, molimo kontaktirajte svog administratora. <br />Želite li doista nastaviti?", @@ -115,7 +116,11 @@ "change" : "promijeni", "delete" : "Izbrišite", "access control" : "Kontrola pristupa", + "An error occured. Please try again" : "Dogodila se pogreška. Molimo Vas, pokušajte ponovno. ", "Share" : "Podijelite", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Podijelite sa korisnicima drugoga ownClouda koristeći format korisnickoime@primjer.com/owncloud", + "Share with users or groups …" : "Podijeli sa korisnicima ili grupama ...", + "Share with users, groups or remote users …" : "Podijeli sa korisnicima, grupama ili udaljenim korisnicima ...", "Warning" : "Upozorenje", "The object type is not specified." : "Vrsta objekta nije specificirana.", "Enter new" : "Unesite novi", @@ -143,7 +148,6 @@ "New Password" : "Nova lozinka", "Reset password" : "Resetirajte lozinku", "Searching other places" : "Pretraživanje drugih lokacija", - "_{count} search result in other places_::_{count} search results in other places_" : ["Pronađen {count} rezultat na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama"], "Personal" : "Osobno", "Users" : "Korisnici", "Apps" : "Aplikacije", diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js index 3f2a73d0c99..05b34ef23e3 100644 --- a/core/l10n/hu_HU.js +++ b/core/l10n/hu_HU.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Nem sikerült e-mailt küldeni a következő felhasználóknak: %s", "Preparing update" : "Felkészülés a frissítésre", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrációs tesztek kihagyva - „update.skip-migration-test” aktiválva van a config.php fájlban", "Turned on maintenance mode" : "A karbantartási mód bekapcsolva", "Turned off maintenance mode" : "A karbantartási mód kikapcsolva", "Maintenance mode is kept active" : "Karbantartási mód aktiválva marad", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Frissítettük \"%s\"-t erre: %s", "Repair warning: " : "Javítás figyelmeztetés:", "Repair error: " : "Javítás hiba:", + "Set log level to debug - current level: \"%s\"" : "Hibakeresési naplózási szint beállítása - jelenlegi szint: \"%s\"", + "Reset log level to \"%s\"" : "Naplózási szint visszaállítása \"%s\"-re", "Following incompatible apps have been disabled: %s" : "A következő nem kompatibilis applikációk lettek tiltva: %s", "Following apps have been disabled: %s" : "A következő applikációk lettek tiltva: %s", "Already up to date" : "Már a legfrissebb változat", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Nincs kép vagy fájl megadva", "Unknown filetype" : "Ismeretlen fájltípus", "Invalid image" : "Hibás kép", + "An error occurred. Please contact your admin." : "Hiba történt. Kérem lépjen kapcsolatba a rendszergazdával.", "No temporary profile picture available, try again" : "Az átmeneti profilkép nem elérhető, próbálja újra", "No crop data provided" : "Vágáshoz nincs adat megadva", "No valid crop data provided" : "Nem lett valós levágási adat megadva", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "dec.", "Settings" : "Beállítások", "Saving..." : "Mentés...", + "seconds ago" : "pár másodperce", "Couldn't send reset email. Please contact your administrator." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A jelszó felülírásához a linket e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Az Ön állományai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne. Biztos, hogy folytatni kívánja?", @@ -105,6 +110,8 @@ OC.L10N.register( "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Nem lett gyorsítótár memória beállítva. A teljesítmény növeléséhez kérem állítson be gyorsítótárat, ha lehetséges. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "a /dev/urandom eszköz nem elérhető PHP-ből, ami nagyon nagy biztonsági problémát jelent. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A PHP verziód ({version}) már nem <a href=\"{phpLink}\">támogatott a PHP által</a>. Javasoljuk, hogy frissítsd a PHP verziót, hogy kihasználd a teljesítménybeli és biztonsági javításokat.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. További információ található a <a href=\"{docLink}\">dokumentációban</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézd meg a <a href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</a>.", "Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.", @@ -144,12 +151,14 @@ OC.L10N.register( "change" : "változtatás", "delete" : "töröl", "access control" : "jogosultság", + "Share details could not be loaded for this item." : "A megosztás részletei nem lehet betölteni ehhez az elemhez.", "An error occured. Please try again" : "Hiba történt. Kérjük, próbáld újra!", "Share" : "Megosztás", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasznalo@példa.com/owncloud", "Share with users or groups …" : "Megosztás felhasználókkal vagy csoportokkal ...", "Share with users, groups or remote users …" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal ...", "Warning" : "Figyelmeztetés", + "Error while sending notification" : "Hiba történt az értesítő küldése közben", "The object type is not specified." : "Az objektum típusa nincs megadva.", "Enter new" : "Új beírása", "Delete" : "Törlés", @@ -165,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["%n fájl letöltése","%n fájl letöltése"], "{version} is available. Get more information on how to update." : "{version} rendelkezésre áll. További információ a frissítéshez.", "Updating {productName} to version {version}, this may take a while." : " {productName} frissítése zajlik erre a verzióra: {version}. Ez eltarthat egy darabig.", + "An error occurred." : "Hiba történt.", "Please reload the page." : "Kérjük frissítse az oldalt!", "The update was unsuccessful. " : "A frissítés nem sikerült.", "The update was successful. There were warnings." : "A frissítés sikerült. Figyelmeztetések találhatók.", @@ -179,8 +189,8 @@ OC.L10N.register( "New Password" : "Új jelszó", "Reset password" : "Jelszó-visszaállítás", "Searching other places" : "Keresés más helyeken", - "No search results in other places" : "Nem talált semmit más helyeken.", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} keresési eredmény más helyeken","{count} keresési eredmény más helyeken"], + "No search results in other folders" : "Nincs keresési eredmény a másik könyvtárakban", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} keresési eredmény egy másik könyvtárban","{count} keresési eredmény más könyvtárakban"], "Personal" : "Személyes", "Users" : "Felhasználók", "Apps" : "Alkalmazások", diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json index 0f5376c947a..c32ed57c5a2 100644 --- a/core/l10n/hu_HU.json +++ b/core/l10n/hu_HU.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Nem sikerült e-mailt küldeni a következő felhasználóknak: %s", "Preparing update" : "Felkészülés a frissítésre", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrációs tesztek kihagyva - „update.skip-migration-test” aktiválva van a config.php fájlban", "Turned on maintenance mode" : "A karbantartási mód bekapcsolva", "Turned off maintenance mode" : "A karbantartási mód kikapcsolva", "Maintenance mode is kept active" : "Karbantartási mód aktiválva marad", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Frissítettük \"%s\"-t erre: %s", "Repair warning: " : "Javítás figyelmeztetés:", "Repair error: " : "Javítás hiba:", + "Set log level to debug - current level: \"%s\"" : "Hibakeresési naplózási szint beállítása - jelenlegi szint: \"%s\"", + "Reset log level to \"%s\"" : "Naplózási szint visszaállítása \"%s\"-re", "Following incompatible apps have been disabled: %s" : "A következő nem kompatibilis applikációk lettek tiltva: %s", "Following apps have been disabled: %s" : "A következő applikációk lettek tiltva: %s", "Already up to date" : "Már a legfrissebb változat", @@ -18,6 +21,7 @@ "No image or file provided" : "Nincs kép vagy fájl megadva", "Unknown filetype" : "Ismeretlen fájltípus", "Invalid image" : "Hibás kép", + "An error occurred. Please contact your admin." : "Hiba történt. Kérem lépjen kapcsolatba a rendszergazdával.", "No temporary profile picture available, try again" : "Az átmeneti profilkép nem elérhető, próbálja újra", "No crop data provided" : "Vágáshoz nincs adat megadva", "No valid crop data provided" : "Nem lett valós levágási adat megadva", @@ -69,6 +73,7 @@ "Dec." : "dec.", "Settings" : "Beállítások", "Saving..." : "Mentés...", + "seconds ago" : "pár másodperce", "Couldn't send reset email. Please contact your administrator." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A jelszó felülírásához a linket e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Az Ön állományai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne. Biztos, hogy folytatni kívánja?", @@ -103,6 +108,8 @@ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Nem lett gyorsítótár memória beállítva. A teljesítmény növeléséhez kérem állítson be gyorsítótárat, ha lehetséges. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "a /dev/urandom eszköz nem elérhető PHP-ből, ami nagyon nagy biztonsági problémát jelent. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A PHP verziód ({version}) már nem <a href=\"{phpLink}\">támogatott a PHP által</a>. Javasoljuk, hogy frissítsd a PHP verziót, hogy kihasználd a teljesítménybeli és biztonsági javításokat.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. További információ található a <a href=\"{docLink}\">dokumentációban</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézd meg a <a href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</a>.", "Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.", @@ -142,12 +149,14 @@ "change" : "változtatás", "delete" : "töröl", "access control" : "jogosultság", + "Share details could not be loaded for this item." : "A megosztás részletei nem lehet betölteni ehhez az elemhez.", "An error occured. Please try again" : "Hiba történt. Kérjük, próbáld újra!", "Share" : "Megosztás", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasznalo@példa.com/owncloud", "Share with users or groups …" : "Megosztás felhasználókkal vagy csoportokkal ...", "Share with users, groups or remote users …" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal ...", "Warning" : "Figyelmeztetés", + "Error while sending notification" : "Hiba történt az értesítő küldése közben", "The object type is not specified." : "Az objektum típusa nincs megadva.", "Enter new" : "Új beírása", "Delete" : "Törlés", @@ -163,6 +172,7 @@ "_download %n file_::_download %n files_" : ["%n fájl letöltése","%n fájl letöltése"], "{version} is available. Get more information on how to update." : "{version} rendelkezésre áll. További információ a frissítéshez.", "Updating {productName} to version {version}, this may take a while." : " {productName} frissítése zajlik erre a verzióra: {version}. Ez eltarthat egy darabig.", + "An error occurred." : "Hiba történt.", "Please reload the page." : "Kérjük frissítse az oldalt!", "The update was unsuccessful. " : "A frissítés nem sikerült.", "The update was successful. There were warnings." : "A frissítés sikerült. Figyelmeztetések találhatók.", @@ -177,8 +187,8 @@ "New Password" : "Új jelszó", "Reset password" : "Jelszó-visszaállítás", "Searching other places" : "Keresés más helyeken", - "No search results in other places" : "Nem talált semmit más helyeken.", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} keresési eredmény más helyeken","{count} keresési eredmény más helyeken"], + "No search results in other folders" : "Nincs keresési eredmény a másik könyvtárakban", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} keresési eredmény egy másik könyvtárban","{count} keresési eredmény más könyvtárakban"], "Personal" : "Személyes", "Users" : "Felhasználók", "Apps" : "Alkalmazások", diff --git a/core/l10n/hy.js b/core/l10n/hy.js index e0a9e3060fc..4225d7efc7c 100644 --- a/core/l10n/hy.js +++ b/core/l10n/hy.js @@ -27,9 +27,20 @@ OC.L10N.register( "October" : "Հոկտեմբեր", "November" : "Նոյեմբեր", "December" : "Դեկտեմբեր", + "Cancel" : "Չեղարկել", + "Very weak password" : "Շատ թույլ գաղտնաբառ", + "Weak password" : "Թույլ գաղտնաբառ", + "Good password" : "Լավ գաղտնաբառ", + "Share link" : "Կիսվել հղմամբ", + "Link" : "Հղում", + "Password" : "Գաղտնաբառ", + "Send" : "Ուղարկել", "group" : "խումբ", + "delete" : "ջնջել", + "Share" : "Կիսվել", "Delete" : "Ջնջել", "Add" : "Ավելացնել", + "New password" : "Նոր գաղտնաբառ", "Personal" : "Անձնական" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/hy.json b/core/l10n/hy.json index 89a76b1626b..a051b79bafd 100644 --- a/core/l10n/hy.json +++ b/core/l10n/hy.json @@ -25,9 +25,20 @@ "October" : "Հոկտեմբեր", "November" : "Նոյեմբեր", "December" : "Դեկտեմբեր", + "Cancel" : "Չեղարկել", + "Very weak password" : "Շատ թույլ գաղտնաբառ", + "Weak password" : "Թույլ գաղտնաբառ", + "Good password" : "Լավ գաղտնաբառ", + "Share link" : "Կիսվել հղմամբ", + "Link" : "Հղում", + "Password" : "Գաղտնաբառ", + "Send" : "Ուղարկել", "group" : "խումբ", + "delete" : "ջնջել", + "Share" : "Կիսվել", "Delete" : "Ջնջել", "Add" : "Ավելացնել", + "New password" : "Նոր գաղտնաբառ", "Personal" : "Անձնական" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/ia.js b/core/l10n/ia.js index 536affe6060..ef277277d51 100644 --- a/core/l10n/ia.js +++ b/core/l10n/ia.js @@ -52,6 +52,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Configurationes", "Saving..." : "Salveguardante...", + "seconds ago" : "secundas passate", "Couldn't send reset email. Please contact your administrator." : "On non pote inviar message de configurar ex novo. Pro favor continge tu administrator.", "I know what I'm doing" : "Io sape lo que io es facente", "Password can not be changed. Please contact your administrator." : "Contrasigno non pote esser modificate. Pro favor continge tu administrator.", diff --git a/core/l10n/ia.json b/core/l10n/ia.json index 165d62ba61a..2947e3888c5 100644 --- a/core/l10n/ia.json +++ b/core/l10n/ia.json @@ -50,6 +50,7 @@ "Dec." : "Dec.", "Settings" : "Configurationes", "Saving..." : "Salveguardante...", + "seconds ago" : "secundas passate", "Couldn't send reset email. Please contact your administrator." : "On non pote inviar message de configurar ex novo. Pro favor continge tu administrator.", "I know what I'm doing" : "Io sape lo que io es facente", "Password can not be changed. Please contact your administrator." : "Contrasigno non pote esser modificate. Pro favor continge tu administrator.", diff --git a/core/l10n/id.js b/core/l10n/id.js index c722b4a7b7e..7213844072f 100644 --- a/core/l10n/id.js +++ b/core/l10n/id.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Tidak dapat mengirim Email ke pengguna berikut: %s", "Preparing update" : "Mempersiapkan pembaruan", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Percobaan migrasi dilompati - \"update.skip-migration-test\" diaktikan di config.php", "Turned on maintenance mode" : "Hidupkan mode perawatan", "Turned off maintenance mode" : "Matikan mode perawatan", "Maintenance mode is kept active" : "Mode Pemeliharaan masih aktif", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Terbaru \"%s\" sampai %s", "Repair warning: " : "Peringatan perbaikan:", "Repair error: " : "Kesalahan perbaikan:", + "Set log level to debug - current level: \"%s\"" : "Atur level log untuk debug - level saat ini: \"%s\"", + "Reset log level to \"%s\"" : "Atur ulang level log menjadi \"%s\"", "Following incompatible apps have been disabled: %s" : "Aplikasi tidak kompatibel berikut telah dinonaktifkan: %s", "Following apps have been disabled: %s" : "Aplikasi berikut telah dinonaktifkan: %s", "Already up to date" : "Sudah yang terbaru", @@ -71,6 +74,7 @@ OC.L10N.register( "Dec." : "Des.", "Settings" : "Pengaturan", "Saving..." : "Menyimpan...", + "seconds ago" : "beberapa detik yang lalu", "Couldn't send reset email. Please contact your administrator." : "Tidak dapat mengirim email setel ulang. Silakan hubungi administrator Anda.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Sebuah tautan untuk setel ulang sandi Anda telah dikirim ke email Anda. Jika Anda tidak menerima dalam jangka waktu yang wajar, periksa folder spam/sampah Anda.<br>Jika tidak ada, tanyakan pada administrator Anda.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?", @@ -106,6 +110,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom tidak terbaca oleh PHP sangat disarankan untuk alasan keamanan. Informasi lebih lanjut dapat ditemukan di <a href=\"{docLink}\">dokumentasi</a> kami.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Versi PHP Anda ({version}) tidak lagi <a href=\"{phpLink}\">didukung oleh PHP</a>. Kami menyarankan Anda untuk meningkatkan versi PHP Anda agar mendapatkan keuntungan pembaruan kinerja dan keamanan yang disediakan oleh PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Konfigurasi header reverse proxy tidak benar atau Anda mengakses ownCloud dari proxy yang tidak terpercaya. Jika Anda tidak mengakses ownCloud dari proxy yang terpercaya, ini merupakan masalah keamanan dan memungkinkan peretas dapat memalsukan alamat IP mereka yang terlihat pada ownCloud. Informasi lebih lanjut dapat ditemukan pada <a href=\"{docLink}\">dokumentasi</a> kami.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached diatur sebagai cache terdistribusi, namun modul PHP \"memcache\" yang dipasang salah. \\OC\\Memcache\\Memcached hanya mendukung \"memcached\" bukan \"memcache\". Lihat <a href=\"{wikiLink}\">wiki memcached tentang kedua modul</a>.", "Error occurred while checking server setup" : "Kesalahan tidak terduga saat memeriksa setelan server", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Header HTTP \"{header}\" tidak dikonfigurasi sama dengan \"{expected}\". Hal ini berpotensi pada resiko keamanan dan privasi. Kami sarankan untuk menyesuaikan pengaturan ini.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP header \"Strict-Transport-Security\" tidak diatur kurang dari \"{seconds}\" detik. Untuk peningkatan keamanan, kami menyarankan untuk mengaktifkan HSTS seperti yang dijelaskan di <a href=\"{docUrl}\">tips keamanan</a>.", @@ -145,12 +150,14 @@ OC.L10N.register( "change" : "ubah", "delete" : "hapus", "access control" : "kontrol akses", + "Share details could not be loaded for this item." : "Rincian berbagi tidak dapat dimuat untuk item ini.", "An error occured. Please try again" : "Terjadi masalah. Mohon coba kembali", "Share" : "Bagikan", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud", "Share with users or groups …" : "Bagikan dengan pengguna atau grup ...", "Share with users, groups or remote users …" : "Bagikan dengan pengguna, grup atau pengguna remote ...", "Warning" : "Peringatan", + "Error while sending notification" : "Kesalahan ketika mengirim notifikasi", "The object type is not specified." : "Tipe objek tidak ditentukan.", "Enter new" : "Masukkan baru", "Delete" : "Hapus", @@ -180,8 +187,8 @@ OC.L10N.register( "New Password" : "Sandi Baru", "Reset password" : "Setel ulang sandi", "Searching other places" : "Mencari tempat lainnya", - "No search results in other places" : "Tidak ada hasil pencarian di tempat lain", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hasil pencarian di tempat lain"], + "No search results in other folders" : "Tidak ada hasil penelusuran didalam folder yang lain", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hasil pencarian di folder lain"], "Personal" : "Pribadi", "Users" : "Pengguna", "Apps" : "Aplikasi", diff --git a/core/l10n/id.json b/core/l10n/id.json index ecc2c2b0f6e..1c71260efec 100644 --- a/core/l10n/id.json +++ b/core/l10n/id.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Tidak dapat mengirim Email ke pengguna berikut: %s", "Preparing update" : "Mempersiapkan pembaruan", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Percobaan migrasi dilompati - \"update.skip-migration-test\" diaktikan di config.php", "Turned on maintenance mode" : "Hidupkan mode perawatan", "Turned off maintenance mode" : "Matikan mode perawatan", "Maintenance mode is kept active" : "Mode Pemeliharaan masih aktif", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Terbaru \"%s\" sampai %s", "Repair warning: " : "Peringatan perbaikan:", "Repair error: " : "Kesalahan perbaikan:", + "Set log level to debug - current level: \"%s\"" : "Atur level log untuk debug - level saat ini: \"%s\"", + "Reset log level to \"%s\"" : "Atur ulang level log menjadi \"%s\"", "Following incompatible apps have been disabled: %s" : "Aplikasi tidak kompatibel berikut telah dinonaktifkan: %s", "Following apps have been disabled: %s" : "Aplikasi berikut telah dinonaktifkan: %s", "Already up to date" : "Sudah yang terbaru", @@ -69,6 +72,7 @@ "Dec." : "Des.", "Settings" : "Pengaturan", "Saving..." : "Menyimpan...", + "seconds ago" : "beberapa detik yang lalu", "Couldn't send reset email. Please contact your administrator." : "Tidak dapat mengirim email setel ulang. Silakan hubungi administrator Anda.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Sebuah tautan untuk setel ulang sandi Anda telah dikirim ke email Anda. Jika Anda tidak menerima dalam jangka waktu yang wajar, periksa folder spam/sampah Anda.<br>Jika tidak ada, tanyakan pada administrator Anda.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?", @@ -104,6 +108,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom tidak terbaca oleh PHP sangat disarankan untuk alasan keamanan. Informasi lebih lanjut dapat ditemukan di <a href=\"{docLink}\">dokumentasi</a> kami.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Versi PHP Anda ({version}) tidak lagi <a href=\"{phpLink}\">didukung oleh PHP</a>. Kami menyarankan Anda untuk meningkatkan versi PHP Anda agar mendapatkan keuntungan pembaruan kinerja dan keamanan yang disediakan oleh PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Konfigurasi header reverse proxy tidak benar atau Anda mengakses ownCloud dari proxy yang tidak terpercaya. Jika Anda tidak mengakses ownCloud dari proxy yang terpercaya, ini merupakan masalah keamanan dan memungkinkan peretas dapat memalsukan alamat IP mereka yang terlihat pada ownCloud. Informasi lebih lanjut dapat ditemukan pada <a href=\"{docLink}\">dokumentasi</a> kami.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached diatur sebagai cache terdistribusi, namun modul PHP \"memcache\" yang dipasang salah. \\OC\\Memcache\\Memcached hanya mendukung \"memcached\" bukan \"memcache\". Lihat <a href=\"{wikiLink}\">wiki memcached tentang kedua modul</a>.", "Error occurred while checking server setup" : "Kesalahan tidak terduga saat memeriksa setelan server", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Header HTTP \"{header}\" tidak dikonfigurasi sama dengan \"{expected}\". Hal ini berpotensi pada resiko keamanan dan privasi. Kami sarankan untuk menyesuaikan pengaturan ini.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP header \"Strict-Transport-Security\" tidak diatur kurang dari \"{seconds}\" detik. Untuk peningkatan keamanan, kami menyarankan untuk mengaktifkan HSTS seperti yang dijelaskan di <a href=\"{docUrl}\">tips keamanan</a>.", @@ -143,12 +148,14 @@ "change" : "ubah", "delete" : "hapus", "access control" : "kontrol akses", + "Share details could not be loaded for this item." : "Rincian berbagi tidak dapat dimuat untuk item ini.", "An error occured. Please try again" : "Terjadi masalah. Mohon coba kembali", "Share" : "Bagikan", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud", "Share with users or groups …" : "Bagikan dengan pengguna atau grup ...", "Share with users, groups or remote users …" : "Bagikan dengan pengguna, grup atau pengguna remote ...", "Warning" : "Peringatan", + "Error while sending notification" : "Kesalahan ketika mengirim notifikasi", "The object type is not specified." : "Tipe objek tidak ditentukan.", "Enter new" : "Masukkan baru", "Delete" : "Hapus", @@ -178,8 +185,8 @@ "New Password" : "Sandi Baru", "Reset password" : "Setel ulang sandi", "Searching other places" : "Mencari tempat lainnya", - "No search results in other places" : "Tidak ada hasil pencarian di tempat lain", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hasil pencarian di tempat lain"], + "No search results in other folders" : "Tidak ada hasil penelusuran didalam folder yang lain", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hasil pencarian di folder lain"], "Personal" : "Pribadi", "Users" : "Pengguna", "Apps" : "Aplikasi", diff --git a/core/l10n/is.js b/core/l10n/is.js index 5dcb543b1e4..bc3b13aaf4e 100644 --- a/core/l10n/is.js +++ b/core/l10n/is.js @@ -71,6 +71,7 @@ OC.L10N.register( "Dec." : "Des.", "Settings" : "Stillingar", "Saving..." : "Er að vista ...", + "seconds ago" : "sek.", "Couldn't send reset email. Please contact your administrator." : "Gat ekki sent endursetningar tölvupóst. Vinsamlegast hafðu samband við kerfisstjóra.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Hlekkurinn til að endurstilla lykilorðið þitt hefur verið sent á netfangið þitt. Ef þú færð ekki póstinn innan hæfilegs tíma, athugaðu þá í ruslpóst möppu.<br>Ef það er ekki þar spurðu þá kerfisstjórann þinn.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Skrárnar þínar eru dulkóðaðar. Ef þú hefur ekki kveikt á vara lykill, það verður engin leið til að fá þinn gögn til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað á að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?", @@ -145,12 +146,14 @@ OC.L10N.register( "change" : "breyta", "delete" : "eyða", "access control" : "aðgangsstýring", + "Share details could not be loaded for this item." : "Ekki tókst að finna sameiginlegar upplýsingar.", "An error occured. Please try again" : "Villa kom upp. Vinsamlegast reyndu aftur", "Share" : "Deila", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólk í öðrum ownClouds með skipuninni username@example.com/owncloud", "Share with users or groups …" : "Deila með notendum eða hópum ...", "Share with users, groups or remote users …" : "Deila með notendum, hópa eða ytri notendum ...", "Warning" : "Aðvörun", + "Error while sending notification" : "Villa við að senda tilkynningu", "The object type is not specified." : "Tegund ekki tilgreind", "Enter new" : "Sláðu inn nýtt", "Delete" : "Eyða", @@ -180,8 +183,6 @@ OC.L10N.register( "New Password" : "Nýtt Lykilorð", "Reset password" : "Endursetja lykilorð", "Searching other places" : "Leitað á öðrum stöðum", - "No search results in other places" : "Engar leitarniðurstöður á öðrum stöðum", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Leitarniðurstaða á öðrum stöðum","{count} Leitarniðurstöður á öðrum stöðum"], "Personal" : "Um mig", "Users" : "Notendur", "Apps" : "Forrit", diff --git a/core/l10n/is.json b/core/l10n/is.json index f1238959ebf..c46572fd129 100644 --- a/core/l10n/is.json +++ b/core/l10n/is.json @@ -69,6 +69,7 @@ "Dec." : "Des.", "Settings" : "Stillingar", "Saving..." : "Er að vista ...", + "seconds ago" : "sek.", "Couldn't send reset email. Please contact your administrator." : "Gat ekki sent endursetningar tölvupóst. Vinsamlegast hafðu samband við kerfisstjóra.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Hlekkurinn til að endurstilla lykilorðið þitt hefur verið sent á netfangið þitt. Ef þú færð ekki póstinn innan hæfilegs tíma, athugaðu þá í ruslpóst möppu.<br>Ef það er ekki þar spurðu þá kerfisstjórann þinn.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Skrárnar þínar eru dulkóðaðar. Ef þú hefur ekki kveikt á vara lykill, það verður engin leið til að fá þinn gögn til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað á að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?", @@ -143,12 +144,14 @@ "change" : "breyta", "delete" : "eyða", "access control" : "aðgangsstýring", + "Share details could not be loaded for this item." : "Ekki tókst að finna sameiginlegar upplýsingar.", "An error occured. Please try again" : "Villa kom upp. Vinsamlegast reyndu aftur", "Share" : "Deila", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólk í öðrum ownClouds með skipuninni username@example.com/owncloud", "Share with users or groups …" : "Deila með notendum eða hópum ...", "Share with users, groups or remote users …" : "Deila með notendum, hópa eða ytri notendum ...", "Warning" : "Aðvörun", + "Error while sending notification" : "Villa við að senda tilkynningu", "The object type is not specified." : "Tegund ekki tilgreind", "Enter new" : "Sláðu inn nýtt", "Delete" : "Eyða", @@ -178,8 +181,6 @@ "New Password" : "Nýtt Lykilorð", "Reset password" : "Endursetja lykilorð", "Searching other places" : "Leitað á öðrum stöðum", - "No search results in other places" : "Engar leitarniðurstöður á öðrum stöðum", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Leitarniðurstaða á öðrum stöðum","{count} Leitarniðurstöður á öðrum stöðum"], "Personal" : "Um mig", "Users" : "Notendur", "Apps" : "Forrit", diff --git a/core/l10n/it.js b/core/l10n/it.js index 48fdf0e9b0c..d3ac7cfa40d 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Impossibile inviare email ai seguenti utenti: %s", "Preparing update" : "Preparazione aggiornamento", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "I test di migrazione sono saltati - \"update.skip-migration-test\" è attivato in config.php", "Turned on maintenance mode" : "Modalità di manutenzione attivata", "Turned off maintenance mode" : "Modalità di manutenzione disattivata", "Maintenance mode is kept active" : "La modalità di manutenzione è lasciata attiva", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Aggiornato \"%s\" a %s", "Repair warning: " : "Avviso di riparazione", "Repair error: " : "Errore di riparazione:", + "Set log level to debug - current level: \"%s\"" : "Imposta il livello del log a debug - livello attuale: \"%s\"", + "Reset log level to \"%s\"" : "Ripristina il livello del log a \"%s\"", "Following incompatible apps have been disabled: %s" : "Le seguenti applicazioni incompatibili sono state disabilitate: %s", "Following apps have been disabled: %s" : "Le seguenti applicazioni sono state disabilitate: %s", "Already up to date" : "Già aggiornato", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Non è stata fornita alcun immagine o file", "Unknown filetype" : "Tipo di file sconosciuto", "Invalid image" : "Immagine non valida", + "An error occurred. Please contact your admin." : "Si è verificato un errore. Contatta il tuo amministratore.", "No temporary profile picture available, try again" : "Nessuna immagine di profilo provvisoria disponibile, riprova", "No crop data provided" : "Non sono stati forniti dati di ritaglio", "No valid crop data provided" : "Non sono stati forniti dati di ritaglio validi", @@ -71,9 +75,10 @@ OC.L10N.register( "Dec." : "Dic.", "Settings" : "Impostazioni", "Saving..." : "Salvataggio in corso...", + "seconds ago" : "secondi fa", "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Il collegamento per reimpostare la password è stato inviato al tuo indirizzo di posta. Se non lo ricevi in tempi ragionevoli, controlla le cartelle della posta indesiderata.<br>Se non dovesse essere nemmeno lì, contatta il tuo amministratore locale.", - "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di recupero, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, per favore contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?", + "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?", "I know what I'm doing" : "So cosa sto facendo", "Password can not be changed. Please contact your administrator." : "La password non può essere cambiata. Contatta il tuo amministratore.", "No" : "No", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom non è leggibile da PHP e ciò è vivamente sconsigliato per motivi di sicurezza. Ulteriori informazioni sono disponibili nella nostra <a href=\"{docLink}\">documentazione</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "La tua versione ({version}) di PHP non è più <a href=\"{phpLink}\">supportata da PHP</a>. Ti esortiamo ad aggiornare la versione di PHP per trarre vantaggio dagli aggiornamenti in termini di prestazioni e sicurezza forniti da PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a href=\"{docLink}\">documentazione</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</a>.", "Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "L'intestazione HTTP \"{header}\" non è configurata come \"{expected}\". \nQuesto è un potenziale rischio di sicurezza o di riservatezza dei dati e noi consigliamo di modificare questa impostazione.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore almeno di \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.", @@ -168,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["scarica %n file","scarica %s file"], "{version} is available. Get more information on how to update." : "{version} è disponibile. Ottieni ulteriori informazioni su come eseguire l'aggiornamento.", "Updating {productName} to version {version}, this may take a while." : "Aggiornamento di {productName} alla versione {version}, potrebbe richiedere del tempo.", + "An error occurred." : "Si è verificato un errore.", "Please reload the page." : "Ricarica la pagina.", "The update was unsuccessful. " : "L'aggiornamento non è riuscito.", "The update was successful. There were warnings." : "L'aggiornamento è stato effettuato correttamente. Ci sono degli avvisi.", @@ -182,8 +189,8 @@ OC.L10N.register( "New Password" : "Nuova password", "Reset password" : "Ripristina la password", "Searching other places" : "Ricerca in altre posizioni", - "No search results in other places" : "Nessun risultato di ricerca in altre posizioni", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} risultato di ricerca in altre posizioni","{count} risultati di ricerca in altre posizioni"], + "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} risultato di ricerca in altre cartelle","{count} risultati di ricerca in altre cartelle"], "Personal" : "Personale", "Users" : "Utenti", "Apps" : "Applicazioni", diff --git a/core/l10n/it.json b/core/l10n/it.json index bedb6b8aa66..4862e2b5efe 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Impossibile inviare email ai seguenti utenti: %s", "Preparing update" : "Preparazione aggiornamento", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "I test di migrazione sono saltati - \"update.skip-migration-test\" è attivato in config.php", "Turned on maintenance mode" : "Modalità di manutenzione attivata", "Turned off maintenance mode" : "Modalità di manutenzione disattivata", "Maintenance mode is kept active" : "La modalità di manutenzione è lasciata attiva", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Aggiornato \"%s\" a %s", "Repair warning: " : "Avviso di riparazione", "Repair error: " : "Errore di riparazione:", + "Set log level to debug - current level: \"%s\"" : "Imposta il livello del log a debug - livello attuale: \"%s\"", + "Reset log level to \"%s\"" : "Ripristina il livello del log a \"%s\"", "Following incompatible apps have been disabled: %s" : "Le seguenti applicazioni incompatibili sono state disabilitate: %s", "Following apps have been disabled: %s" : "Le seguenti applicazioni sono state disabilitate: %s", "Already up to date" : "Già aggiornato", @@ -18,6 +21,7 @@ "No image or file provided" : "Non è stata fornita alcun immagine o file", "Unknown filetype" : "Tipo di file sconosciuto", "Invalid image" : "Immagine non valida", + "An error occurred. Please contact your admin." : "Si è verificato un errore. Contatta il tuo amministratore.", "No temporary profile picture available, try again" : "Nessuna immagine di profilo provvisoria disponibile, riprova", "No crop data provided" : "Non sono stati forniti dati di ritaglio", "No valid crop data provided" : "Non sono stati forniti dati di ritaglio validi", @@ -69,9 +73,10 @@ "Dec." : "Dic.", "Settings" : "Impostazioni", "Saving..." : "Salvataggio in corso...", + "seconds ago" : "secondi fa", "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Il collegamento per reimpostare la password è stato inviato al tuo indirizzo di posta. Se non lo ricevi in tempi ragionevoli, controlla le cartelle della posta indesiderata.<br>Se non dovesse essere nemmeno lì, contatta il tuo amministratore locale.", - "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di recupero, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, per favore contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?", + "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?", "I know what I'm doing" : "So cosa sto facendo", "Password can not be changed. Please contact your administrator." : "La password non può essere cambiata. Contatta il tuo amministratore.", "No" : "No", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom non è leggibile da PHP e ciò è vivamente sconsigliato per motivi di sicurezza. Ulteriori informazioni sono disponibili nella nostra <a href=\"{docLink}\">documentazione</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "La tua versione ({version}) di PHP non è più <a href=\"{phpLink}\">supportata da PHP</a>. Ti esortiamo ad aggiornare la versione di PHP per trarre vantaggio dagli aggiornamenti in termini di prestazioni e sicurezza forniti da PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a href=\"{docLink}\">documentazione</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</a>.", "Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "L'intestazione HTTP \"{header}\" non è configurata come \"{expected}\". \nQuesto è un potenziale rischio di sicurezza o di riservatezza dei dati e noi consigliamo di modificare questa impostazione.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore almeno di \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.", @@ -166,6 +172,7 @@ "_download %n file_::_download %n files_" : ["scarica %n file","scarica %s file"], "{version} is available. Get more information on how to update." : "{version} è disponibile. Ottieni ulteriori informazioni su come eseguire l'aggiornamento.", "Updating {productName} to version {version}, this may take a while." : "Aggiornamento di {productName} alla versione {version}, potrebbe richiedere del tempo.", + "An error occurred." : "Si è verificato un errore.", "Please reload the page." : "Ricarica la pagina.", "The update was unsuccessful. " : "L'aggiornamento non è riuscito.", "The update was successful. There were warnings." : "L'aggiornamento è stato effettuato correttamente. Ci sono degli avvisi.", @@ -180,8 +187,8 @@ "New Password" : "Nuova password", "Reset password" : "Ripristina la password", "Searching other places" : "Ricerca in altre posizioni", - "No search results in other places" : "Nessun risultato di ricerca in altre posizioni", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} risultato di ricerca in altre posizioni","{count} risultati di ricerca in altre posizioni"], + "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} risultato di ricerca in altre cartelle","{count} risultati di ricerca in altre cartelle"], "Personal" : "Personale", "Users" : "Utenti", "Apps" : "Applicazioni", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 53bfc2ebc65..3f3b3714b03 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "次のユーザーにメールを送信できませんでした: %s", + "Preparing update" : "アップデートの準備中", "Turned on maintenance mode" : "メンテナンスモードがオンになりました", "Turned off maintenance mode" : "メンテナンスモードがオフになりました", "Maintenance mode is kept active" : "メンテナンスモードが継続中です", @@ -69,6 +70,7 @@ OC.L10N.register( "Dec." : "12月", "Settings" : "設定", "Saving..." : "保存中...", + "seconds ago" : "数秒前", "Couldn't send reset email. Please contact your administrator." : "リセットメールを送信できませんでした。管理者に問い合わせてください。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "パスワードをリセットするリンクをクリックしたので、メールを送信しました。しばらくたってもメールが届かなかった場合は、スパム/ジャンクフォルダーを確認してください。<br>それでも見つからなかった場合は、管理者に問合わせてください。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ファイルが暗号化されています。リカバリーキーが有効でない場合は、パスワードをリセットした後にあなたのデータを元に戻す方法はありません。<br />どういうことか分からない場合は、操作を継続する前に管理者に問い合わせてください。<br />続けてよろしいでしょうか?", @@ -164,6 +166,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["%n個のファイルをダウンロード"], "{version} is available. Get more information on how to update." : "{version} が利用可能です。アップデート方法について詳細情報を確認してください。", "Updating {productName} to version {version}, this may take a while." : "{productName} を バージョン {version} に更新しています。しばらくお待ちください。", + "An error occurred." : "エラーが発生しました。", "Please reload the page." : "ページをリロードしてください。", "The update was unsuccessful. " : "アップデートに失敗しました。", "The update was successful. There were warnings." : "アップデートは成功しました。警告がありました。", @@ -177,8 +180,6 @@ OC.L10N.register( "New Password" : "新しいパスワード", "Reset password" : "パスワードをリセット", "Searching other places" : "他の場所の検索", - "No search results in other places" : "その他の場所の検索結果はありません", - "_{count} search result in other places_::_{count} search results in other places_" : ["その他の場所 の検索件数 {count}"], "Personal" : "個人", "Users" : "ユーザー", "Apps" : "アプリ", @@ -198,7 +199,7 @@ OC.L10N.register( "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "こんにちは、\n\n%s があなたと %s を共有したことをお知らせします。\nそれを表示: %s\n", "The share will expire on %s." : "共有は %s で有効期限が切れます。", "Cheers!" : "それでは!", - "Internal Server Error" : "内部サーバエラー", + "Internal Server Error" : "内部サーバーエラー", "The server encountered an internal error and was unable to complete your request." : "サーバー内でエラーが発生したため、リクエストを完了できませんでした。", "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "このエラーが繰り返し表示されるようであれば、以下の技術情報を添付してサーバー管理者に問い合わせてください。", "More details can be found in the server log." : "詳細は、サーバーのログを確認してください。", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index a0591f119f9..6daf6329e5a 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "次のユーザーにメールを送信できませんでした: %s", + "Preparing update" : "アップデートの準備中", "Turned on maintenance mode" : "メンテナンスモードがオンになりました", "Turned off maintenance mode" : "メンテナンスモードがオフになりました", "Maintenance mode is kept active" : "メンテナンスモードが継続中です", @@ -67,6 +68,7 @@ "Dec." : "12月", "Settings" : "設定", "Saving..." : "保存中...", + "seconds ago" : "数秒前", "Couldn't send reset email. Please contact your administrator." : "リセットメールを送信できませんでした。管理者に問い合わせてください。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "パスワードをリセットするリンクをクリックしたので、メールを送信しました。しばらくたってもメールが届かなかった場合は、スパム/ジャンクフォルダーを確認してください。<br>それでも見つからなかった場合は、管理者に問合わせてください。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ファイルが暗号化されています。リカバリーキーが有効でない場合は、パスワードをリセットした後にあなたのデータを元に戻す方法はありません。<br />どういうことか分からない場合は、操作を継続する前に管理者に問い合わせてください。<br />続けてよろしいでしょうか?", @@ -162,6 +164,7 @@ "_download %n file_::_download %n files_" : ["%n個のファイルをダウンロード"], "{version} is available. Get more information on how to update." : "{version} が利用可能です。アップデート方法について詳細情報を確認してください。", "Updating {productName} to version {version}, this may take a while." : "{productName} を バージョン {version} に更新しています。しばらくお待ちください。", + "An error occurred." : "エラーが発生しました。", "Please reload the page." : "ページをリロードしてください。", "The update was unsuccessful. " : "アップデートに失敗しました。", "The update was successful. There were warnings." : "アップデートは成功しました。警告がありました。", @@ -175,8 +178,6 @@ "New Password" : "新しいパスワード", "Reset password" : "パスワードをリセット", "Searching other places" : "他の場所の検索", - "No search results in other places" : "その他の場所の検索結果はありません", - "_{count} search result in other places_::_{count} search results in other places_" : ["その他の場所 の検索件数 {count}"], "Personal" : "個人", "Users" : "ユーザー", "Apps" : "アプリ", @@ -196,7 +197,7 @@ "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "こんにちは、\n\n%s があなたと %s を共有したことをお知らせします。\nそれを表示: %s\n", "The share will expire on %s." : "共有は %s で有効期限が切れます。", "Cheers!" : "それでは!", - "Internal Server Error" : "内部サーバエラー", + "Internal Server Error" : "内部サーバーエラー", "The server encountered an internal error and was unable to complete your request." : "サーバー内でエラーが発生したため、リクエストを完了できませんでした。", "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "このエラーが繰り返し表示されるようであれば、以下の技術情報を添付してサーバー管理者に問い合わせてください。", "More details can be found in the server log." : "詳細は、サーバーのログを確認してください。", diff --git a/core/l10n/ka_GE.js b/core/l10n/ka_GE.js index 6fda99450a0..cfac021e495 100644 --- a/core/l10n/ka_GE.js +++ b/core/l10n/ka_GE.js @@ -41,6 +41,7 @@ OC.L10N.register( "Dec." : "დეკ.", "Settings" : "პარამეტრები", "Saving..." : "შენახვა...", + "seconds ago" : "წამის წინ", "No" : "არა", "Yes" : "კი", "Choose" : "არჩევა", diff --git a/core/l10n/ka_GE.json b/core/l10n/ka_GE.json index f7cb23adc60..3498c8d891c 100644 --- a/core/l10n/ka_GE.json +++ b/core/l10n/ka_GE.json @@ -39,6 +39,7 @@ "Dec." : "დეკ.", "Settings" : "პარამეტრები", "Saving..." : "შენახვა...", + "seconds ago" : "წამის წინ", "No" : "არა", "Yes" : "კი", "Choose" : "არჩევა", diff --git a/core/l10n/km.js b/core/l10n/km.js index b9a676b12ce..07bf2b0db00 100644 --- a/core/l10n/km.js +++ b/core/l10n/km.js @@ -43,6 +43,7 @@ OC.L10N.register( "Dec." : "ធ្នូ", "Settings" : "ការកំណត់", "Saving..." : "កំពុងរក្សាទុក", + "seconds ago" : "វិនាទីមុន", "No" : "ទេ", "Yes" : "ព្រម", "Choose" : "ជ្រើស", diff --git a/core/l10n/km.json b/core/l10n/km.json index 5815f6cd91d..9504a7c5236 100644 --- a/core/l10n/km.json +++ b/core/l10n/km.json @@ -41,6 +41,7 @@ "Dec." : "ធ្នូ", "Settings" : "ការកំណត់", "Saving..." : "កំពុងរក្សាទុក", + "seconds ago" : "វិនាទីមុន", "No" : "ទេ", "Yes" : "ព្រម", "Choose" : "ជ្រើស", diff --git a/core/l10n/ko.js b/core/l10n/ko.js index c6ebf5e502f..4198d5ea74a 100644 --- a/core/l10n/ko.js +++ b/core/l10n/ko.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "%s 님에게 메일을 보낼 수 없습니다.", "Preparing update" : "업데이트 준비 중", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "이전 작업 테스트를 건너뛰었습니다. config.php 파일에 \"update.skip-migration-test\"가 활성화되어 있습니다", "Turned on maintenance mode" : "유지 보수 모드 켜짐", "Turned off maintenance mode" : "유지 보수 모드 꺼짐", "Maintenance mode is kept active" : "유지 보수 모드가 켜져 있음", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "\"%s\"을(를) %s(으)로 업데이트함", "Repair warning: " : "수리 경고:", "Repair error: " : "수리 오류:", + "Set log level to debug - current level: \"%s\"" : "로그 단계를 디버그로 설정함 - 현재 단계: \"%s\"", + "Reset log level to \"%s\"" : "로그 단계를 \"%s\"(으)로 초기화", "Following incompatible apps have been disabled: %s" : "다음 호환되지 않는 앱이 비활성화되었습니다: %s", "Following apps have been disabled: %s" : "다음 앱이 비활성화되었습니다: %s", "Already up to date" : "최신 상태임", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "사진이나 파일이 없음", "Unknown filetype" : "알려지지 않은 파일 형식", "Invalid image" : "잘못된 사진", + "An error occurred. Please contact your admin." : "오류가 발생했습니다. 시스템 관리자에게 연락하십시오.", "No temporary profile picture available, try again" : "사용 가능한 프로필 사진이 없습니다. 다시 시도하십시오.", "No crop data provided" : "선택된 데이터가 없습니다.", "No valid crop data provided" : "올바른 잘라내기 데이터가 지정되지 않음", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "12월", "Settings" : "설정", "Saving..." : "저장 중...", + "seconds ago" : "초 지남", "Couldn't send reset email. Please contact your administrator." : "재설정 메일을 보낼수 없습니다. 관리자에게 문의하십시오.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "암호 재설정 링크를 포함하고 있는 이메일을 보냈습니다. 이메일이 도착하지 않은 경우 스팸함을 확인해 보십시오.<br>스팸함에도 없는 경우 로컬 관리자에게 문의하십시오.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "파일이 암호화되어 있습니다. 복구 키를 활성화하지 않았다면 암호를 초기화한 후 데이터를 복구할 수 없습니다.<br />무엇을 해야 할 지 잘 모르겠으면 계속하기 전에 관리자에게 연락하십시오.<br />그래도 계속 진행하시겠습니까?", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "PHP에서 /dev/urandom을 읽을 수 없으며, 보안상의 이유로 권장되지 않습니다. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "사용하고 있는 PHP 버전({version})은 더 이상 <a href=\"{phpLink}\">PHP에서 지원하지 않습니다.</a> PHP를 업그레이드하여 성능 및 보안 개선을 누리십시오.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "역방향 프록시 헤더 설정이 잘못되었거나, 신뢰할 수 있는 프록시에서 ownCloud에 접근하고 있습니다. 신뢰할 수 있는 프록시에서 ownCloud에 접근하는 것이 아니라면, 이 상황은 보안 문제이며 공격자가 ownCloud에 접근하는 IP 주소를 속일 수 있습니다. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "분산 캐시로 Memcached가 설정되었으나, 잘못된 PHP 모듈 \"memcache\"가 설치되어 있습니다. \\OC\\Memcache\\Memcached는 \"memcached\"를 지원하며, \"memcache\"를 지원하지 않습니다. <a href=\"{wikiLink}\">memcached 위키의 두 모듈에 관한 정보</a>를 참조하십시오.", "Error occurred while checking server setup" : "서버 설정을 확인하는 중 오류 발생", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 헤더가 \"{expected}\"와(과) 같이 설정되지 않았습니다. 잠재적인 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 헤더 \"Strict-Transport-Security\"가 최소한 \"{seconds}\"초 이상으로 설정되어야 합니다. 강화된 보안을 위해서 <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 HSTS를 활성화하는 것을 추천합니다.", @@ -145,12 +151,14 @@ OC.L10N.register( "change" : "변경", "delete" : "삭제", "access control" : "접근 제어", - "An error occured. Please try again" : "오류가 발생하였습니다. 다시 시도하십시오.", + "Share details could not be loaded for this item." : "이 항목의 공유 정보를 불러올 수 없습니다.", + "An error occured. Please try again" : "오류가 발생했습니다. 다시 시도하십시오.", "Share" : "공유", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "username@example.com/owncloud 형식으로 다른 ownCloud 사용자와 공유할 수 있습니다", "Share with users or groups …" : "사용자 및 그룹과 공유...", "Share with users, groups or remote users …" : "사용자, 그룹 및 원격 사용자와 공유...", "Warning" : "경고", + "Error while sending notification" : "알림을 보내는 중 오류 발생", "The object type is not specified." : "객체 유형이 지정되지 않았습니다.", "Enter new" : "새로운 값 입력", "Delete" : "삭제", @@ -166,10 +174,11 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["파일 %n개 다운로드"], "{version} is available. Get more information on how to update." : "{version}을(를) 사용할 수 있습니다. 업데이트하는 방법에 대해서 알아보십시오.", "Updating {productName} to version {version}, this may take a while." : "{productName}을(를) 버전 {version}으로 업데이트하고 있습니다. 시간이 걸릴 수 있습니다.", + "An error occurred." : "오류가 발생했습니다.", "Please reload the page." : "페이지를 새로 고치십시오.", - "The update was unsuccessful. " : "업데이트가 실패하였습니다. ", - "The update was successful. There were warnings." : "업데이트가 성공하였습니다. 일부 경고가 있습니다.", - "The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공하였습니다. ownCloud로 돌아갑니다.", + "The update was unsuccessful. " : "업데이트가 실패했습니다. ", + "The update was successful. There were warnings." : "업데이트가 성공했습니다. 일부 경고가 있습니다.", + "The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공했습니다. ownCloud로 돌아갑니다.", "Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다", "Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", "Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.", @@ -180,8 +189,8 @@ OC.L10N.register( "New Password" : "새 암호", "Reset password" : "암호 재설정", "Searching other places" : "다른 장소 찾는 중", - "No search results in other places" : "다른 장소의 검색 결과 없음", - "_{count} search result in other places_::_{count} search results in other places_" : ["다른 장소 검색 결과 {count}개"], + "No search results in other folders" : "다른 폴더에 검색 결과 없음", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["다른 폴더의 검색 결과 {count}개"], "Personal" : "개인", "Users" : "사용자", "Apps" : "앱", @@ -243,7 +252,7 @@ OC.L10N.register( "Search" : "검색", "Server side authentication failed!" : "서버 인증 실패!", "Please contact your administrator." : "관리자에게 문의하십시오.", - "An internal error occured." : "내부 오류가 발생하였습니다.", + "An internal error occured." : "내부 오류가 발생했습니다.", "Please try again or contact your administrator." : "다시 시도하거나 관리자에게 연락하십시오.", "Log in" : "로그인", "Wrong password. Reset it?" : "암호가 잘못되었습니다. 다시 설정하시겠습니까?", diff --git a/core/l10n/ko.json b/core/l10n/ko.json index 5bbb99e89dd..64341720004 100644 --- a/core/l10n/ko.json +++ b/core/l10n/ko.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "%s 님에게 메일을 보낼 수 없습니다.", "Preparing update" : "업데이트 준비 중", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "이전 작업 테스트를 건너뛰었습니다. config.php 파일에 \"update.skip-migration-test\"가 활성화되어 있습니다", "Turned on maintenance mode" : "유지 보수 모드 켜짐", "Turned off maintenance mode" : "유지 보수 모드 꺼짐", "Maintenance mode is kept active" : "유지 보수 모드가 켜져 있음", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "\"%s\"을(를) %s(으)로 업데이트함", "Repair warning: " : "수리 경고:", "Repair error: " : "수리 오류:", + "Set log level to debug - current level: \"%s\"" : "로그 단계를 디버그로 설정함 - 현재 단계: \"%s\"", + "Reset log level to \"%s\"" : "로그 단계를 \"%s\"(으)로 초기화", "Following incompatible apps have been disabled: %s" : "다음 호환되지 않는 앱이 비활성화되었습니다: %s", "Following apps have been disabled: %s" : "다음 앱이 비활성화되었습니다: %s", "Already up to date" : "최신 상태임", @@ -18,6 +21,7 @@ "No image or file provided" : "사진이나 파일이 없음", "Unknown filetype" : "알려지지 않은 파일 형식", "Invalid image" : "잘못된 사진", + "An error occurred. Please contact your admin." : "오류가 발생했습니다. 시스템 관리자에게 연락하십시오.", "No temporary profile picture available, try again" : "사용 가능한 프로필 사진이 없습니다. 다시 시도하십시오.", "No crop data provided" : "선택된 데이터가 없습니다.", "No valid crop data provided" : "올바른 잘라내기 데이터가 지정되지 않음", @@ -69,6 +73,7 @@ "Dec." : "12월", "Settings" : "설정", "Saving..." : "저장 중...", + "seconds ago" : "초 지남", "Couldn't send reset email. Please contact your administrator." : "재설정 메일을 보낼수 없습니다. 관리자에게 문의하십시오.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "암호 재설정 링크를 포함하고 있는 이메일을 보냈습니다. 이메일이 도착하지 않은 경우 스팸함을 확인해 보십시오.<br>스팸함에도 없는 경우 로컬 관리자에게 문의하십시오.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "파일이 암호화되어 있습니다. 복구 키를 활성화하지 않았다면 암호를 초기화한 후 데이터를 복구할 수 없습니다.<br />무엇을 해야 할 지 잘 모르겠으면 계속하기 전에 관리자에게 연락하십시오.<br />그래도 계속 진행하시겠습니까?", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "PHP에서 /dev/urandom을 읽을 수 없으며, 보안상의 이유로 권장되지 않습니다. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "사용하고 있는 PHP 버전({version})은 더 이상 <a href=\"{phpLink}\">PHP에서 지원하지 않습니다.</a> PHP를 업그레이드하여 성능 및 보안 개선을 누리십시오.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "역방향 프록시 헤더 설정이 잘못되었거나, 신뢰할 수 있는 프록시에서 ownCloud에 접근하고 있습니다. 신뢰할 수 있는 프록시에서 ownCloud에 접근하는 것이 아니라면, 이 상황은 보안 문제이며 공격자가 ownCloud에 접근하는 IP 주소를 속일 수 있습니다. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "분산 캐시로 Memcached가 설정되었으나, 잘못된 PHP 모듈 \"memcache\"가 설치되어 있습니다. \\OC\\Memcache\\Memcached는 \"memcached\"를 지원하며, \"memcache\"를 지원하지 않습니다. <a href=\"{wikiLink}\">memcached 위키의 두 모듈에 관한 정보</a>를 참조하십시오.", "Error occurred while checking server setup" : "서버 설정을 확인하는 중 오류 발생", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 헤더가 \"{expected}\"와(과) 같이 설정되지 않았습니다. 잠재적인 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 헤더 \"Strict-Transport-Security\"가 최소한 \"{seconds}\"초 이상으로 설정되어야 합니다. 강화된 보안을 위해서 <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 HSTS를 활성화하는 것을 추천합니다.", @@ -143,12 +149,14 @@ "change" : "변경", "delete" : "삭제", "access control" : "접근 제어", - "An error occured. Please try again" : "오류가 발생하였습니다. 다시 시도하십시오.", + "Share details could not be loaded for this item." : "이 항목의 공유 정보를 불러올 수 없습니다.", + "An error occured. Please try again" : "오류가 발생했습니다. 다시 시도하십시오.", "Share" : "공유", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "username@example.com/owncloud 형식으로 다른 ownCloud 사용자와 공유할 수 있습니다", "Share with users or groups …" : "사용자 및 그룹과 공유...", "Share with users, groups or remote users …" : "사용자, 그룹 및 원격 사용자와 공유...", "Warning" : "경고", + "Error while sending notification" : "알림을 보내는 중 오류 발생", "The object type is not specified." : "객체 유형이 지정되지 않았습니다.", "Enter new" : "새로운 값 입력", "Delete" : "삭제", @@ -164,10 +172,11 @@ "_download %n file_::_download %n files_" : ["파일 %n개 다운로드"], "{version} is available. Get more information on how to update." : "{version}을(를) 사용할 수 있습니다. 업데이트하는 방법에 대해서 알아보십시오.", "Updating {productName} to version {version}, this may take a while." : "{productName}을(를) 버전 {version}으로 업데이트하고 있습니다. 시간이 걸릴 수 있습니다.", + "An error occurred." : "오류가 발생했습니다.", "Please reload the page." : "페이지를 새로 고치십시오.", - "The update was unsuccessful. " : "업데이트가 실패하였습니다. ", - "The update was successful. There were warnings." : "업데이트가 성공하였습니다. 일부 경고가 있습니다.", - "The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공하였습니다. ownCloud로 돌아갑니다.", + "The update was unsuccessful. " : "업데이트가 실패했습니다. ", + "The update was successful. There were warnings." : "업데이트가 성공했습니다. 일부 경고가 있습니다.", + "The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공했습니다. ownCloud로 돌아갑니다.", "Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다", "Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", "Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.", @@ -178,8 +187,8 @@ "New Password" : "새 암호", "Reset password" : "암호 재설정", "Searching other places" : "다른 장소 찾는 중", - "No search results in other places" : "다른 장소의 검색 결과 없음", - "_{count} search result in other places_::_{count} search results in other places_" : ["다른 장소 검색 결과 {count}개"], + "No search results in other folders" : "다른 폴더에 검색 결과 없음", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["다른 폴더의 검색 결과 {count}개"], "Personal" : "개인", "Users" : "사용자", "Apps" : "앱", @@ -241,7 +250,7 @@ "Search" : "검색", "Server side authentication failed!" : "서버 인증 실패!", "Please contact your administrator." : "관리자에게 문의하십시오.", - "An internal error occured." : "내부 오류가 발생하였습니다.", + "An internal error occured." : "내부 오류가 발생했습니다.", "Please try again or contact your administrator." : "다시 시도하거나 관리자에게 연락하십시오.", "Log in" : "로그인", "Wrong password. Reset it?" : "암호가 잘못되었습니다. 다시 설정하시겠습니까?", diff --git a/core/l10n/lb.js b/core/l10n/lb.js index bcb7299962a..0f37ae317de 100644 --- a/core/l10n/lb.js +++ b/core/l10n/lb.js @@ -47,6 +47,7 @@ OC.L10N.register( "Dec." : "Dez.", "Settings" : "Astellungen", "Saving..." : "Speicheren...", + "seconds ago" : "Sekonnen hier", "No" : "Nee", "Yes" : "Jo", "Choose" : "Auswielen", diff --git a/core/l10n/lb.json b/core/l10n/lb.json index 1a20e751fd8..72f78ae6e7e 100644 --- a/core/l10n/lb.json +++ b/core/l10n/lb.json @@ -45,6 +45,7 @@ "Dec." : "Dez.", "Settings" : "Astellungen", "Saving..." : "Speicheren...", + "seconds ago" : "Sekonnen hier", "No" : "Nee", "Yes" : "Jo", "Choose" : "Auswielen", diff --git a/core/l10n/lt_LT.js b/core/l10n/lt_LT.js index d0a464b1a54..622dbb5ab3d 100644 --- a/core/l10n/lt_LT.js +++ b/core/l10n/lt_LT.js @@ -2,10 +2,23 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Nepavyko nusiųsti el. pašto šiems naudotojams: %s ", + "Preparing update" : "Ruošiamasi atnaujinimui", "Turned on maintenance mode" : "Įjungta priežiūros veiksena", "Turned off maintenance mode" : "Išjungta priežiūros veiksena", "Maintenance mode is kept active" : "Priežiūros veiksena yra aktyvi", "Updated database" : "Atnaujinta duomenų bazė", + "Checked database schema update" : "Tikrinama duomenų bazės struktūra", + "Checked database schema update for apps" : "Tikrinama duomenų bazės struktūra įskiepiams", + "Updated \"%s\" to %s" : "Atnaujinta \"%s\" į %s", + "Repair warning: " : "Taisymo perspėjimas:", + "Repair error: " : "Taisymo klaida:", + "Set log level to debug - current level: \"%s\"" : "Nustatykite žurnalų lygį į derinimas - dabar \"%s\"", + "Reset log level to \"%s\"" : "Atkurkite žurnalų lygį į \"%s\"", + "Following incompatible apps have been disabled: %s" : "Nesudarinami įskiepiai buvo išjungti: %s", + "Following apps have been disabled: %s" : "Išjungti įskiepiai: %s", + "Already up to date" : "Jau naujausia", + "File is too big" : "Per didelis failas", + "Invalid file provided" : "Netinkamas failas", "No image or file provided" : "Nenurodytas paveikslėlis ar failas", "Unknown filetype" : "Nežinomas failo tipas", "Invalid image" : "Netinkamas paveikslėlis", @@ -25,6 +38,13 @@ OC.L10N.register( "Thu." : "Kt.", "Fri." : "Pn.", "Sat." : "Št.", + "Su" : "S", + "Mo" : "P", + "Tu" : "A", + "We" : "T", + "Th" : "K", + "Fr" : "Pn", + "Sa" : "Š", "January" : "Sausis", "February" : "Vasaris", "March" : "Kovas", @@ -51,6 +71,10 @@ OC.L10N.register( "Dec." : "Groud.", "Settings" : "Nustatymai", "Saving..." : "Saugoma...", + "seconds ago" : "prieš sekundę", + "Couldn't send reset email. Please contact your administrator." : "Nepavyko išsiųsti atkūrimo laiško, susisiekite su administratoriumi.", + "I know what I'm doing" : "Aš žinau ką darau", + "Password can not be changed. Please contact your administrator." : "Slaptažodis negali būti pakeistas, susisiekite su administratoriumi.", "No" : "Ne", "Yes" : "Taip", "Choose" : "Pasirinkite", @@ -60,6 +84,8 @@ OC.L10N.register( "read-only" : "tik skaitymui", "_{count} file conflict_::_{count} file conflicts_" : ["{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"], "One file conflict" : "Vienas failo konfliktas", + "New Files" : "Naujas failas", + "Already existing files" : "Egzistuojantys failai", "Which files do you want to keep?" : "Kuriuos failus norite laikyti?", "If you select both versions, the copied file will have a number added to its name." : "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime.", "Cancel" : "Atšaukti", @@ -67,12 +93,18 @@ OC.L10N.register( "(all selected)" : "(visi pažymėti)", "({count} selected)" : "({count} pažymėtų)", "Error loading file exists template" : "Klaida įkeliant esančių failų ruošinį", + "Very weak password" : "Labai silpnas slaptažodis", + "Weak password" : "Silpnas slaptažodis", + "So-so password" : "Neblogas slaptažodis", + "Good password" : "Geras slaptažodis", + "Strong password" : "Stiprus slaptažodis", "Shared" : "Dalinamasi", "Error" : "Klaida", "Error while sharing" : "Klaida, dalijimosi metu", "Error while unsharing" : "Klaida, kai atšaukiamas dalijimasis", "Error while changing permissions" : "Klaida, keičiant privilegijas", "Error setting expiration date" : "Klaida nustatant galiojimo laiką", + "The public link will expire no later than {days} days after it is created" : "Vieša nuoroda galios ne mažiau kaip {days} dienas nuo sukūrimo", "Set expiration date" : "Nustatykite galiojimo laiką", "Expiration" : "Galiojimo laikas", "Expiration date" : "Galiojimo laikas", @@ -83,6 +115,8 @@ OC.L10N.register( "Link" : "Nuoroda", "Password protect" : "Apsaugotas slaptažodžiu", "Password" : "Slaptažodis", + "Choose a password for the public link" : "Viešos nuorodos slaptažodis", + "Allow editing" : "Leisti redaguoti", "Email link to person" : "Nusiųsti nuorodą paštu", "Send" : "Siųsti", "Shared with you and the group {group} by {owner}" : "Pasidalino su Jumis ir {group} grupe {owner}", @@ -98,7 +132,11 @@ OC.L10N.register( "change" : "keisti", "delete" : "ištrinti", "access control" : "priėjimo kontrolė", + "An error occured. Please try again" : "Klaida, prašau bandyti dar kartą.", "Share" : "Dalintis", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Dalintis su vartotoju kitame ownCloud debesyje, sintaksė vartotojas@example.com/owncloud", + "Share with users or groups …" : "Dalintis su vartotoju ar grupe", + "Share with users, groups or remote users …" : "Dalintis su vartotoju, grupe, ar nutolusiu vartotoju...", "Warning" : "Įspėjimas", "The object type is not specified." : "Objekto tipas nenurodytas.", "Enter new" : "Įveskite naują", diff --git a/core/l10n/lt_LT.json b/core/l10n/lt_LT.json index dbedb34be2d..998cd62a5b2 100644 --- a/core/l10n/lt_LT.json +++ b/core/l10n/lt_LT.json @@ -1,9 +1,22 @@ { "translations": { "Couldn't send mail to following users: %s " : "Nepavyko nusiųsti el. pašto šiems naudotojams: %s ", + "Preparing update" : "Ruošiamasi atnaujinimui", "Turned on maintenance mode" : "Įjungta priežiūros veiksena", "Turned off maintenance mode" : "Išjungta priežiūros veiksena", "Maintenance mode is kept active" : "Priežiūros veiksena yra aktyvi", "Updated database" : "Atnaujinta duomenų bazė", + "Checked database schema update" : "Tikrinama duomenų bazės struktūra", + "Checked database schema update for apps" : "Tikrinama duomenų bazės struktūra įskiepiams", + "Updated \"%s\" to %s" : "Atnaujinta \"%s\" į %s", + "Repair warning: " : "Taisymo perspėjimas:", + "Repair error: " : "Taisymo klaida:", + "Set log level to debug - current level: \"%s\"" : "Nustatykite žurnalų lygį į derinimas - dabar \"%s\"", + "Reset log level to \"%s\"" : "Atkurkite žurnalų lygį į \"%s\"", + "Following incompatible apps have been disabled: %s" : "Nesudarinami įskiepiai buvo išjungti: %s", + "Following apps have been disabled: %s" : "Išjungti įskiepiai: %s", + "Already up to date" : "Jau naujausia", + "File is too big" : "Per didelis failas", + "Invalid file provided" : "Netinkamas failas", "No image or file provided" : "Nenurodytas paveikslėlis ar failas", "Unknown filetype" : "Nežinomas failo tipas", "Invalid image" : "Netinkamas paveikslėlis", @@ -23,6 +36,13 @@ "Thu." : "Kt.", "Fri." : "Pn.", "Sat." : "Št.", + "Su" : "S", + "Mo" : "P", + "Tu" : "A", + "We" : "T", + "Th" : "K", + "Fr" : "Pn", + "Sa" : "Š", "January" : "Sausis", "February" : "Vasaris", "March" : "Kovas", @@ -49,6 +69,10 @@ "Dec." : "Groud.", "Settings" : "Nustatymai", "Saving..." : "Saugoma...", + "seconds ago" : "prieš sekundę", + "Couldn't send reset email. Please contact your administrator." : "Nepavyko išsiųsti atkūrimo laiško, susisiekite su administratoriumi.", + "I know what I'm doing" : "Aš žinau ką darau", + "Password can not be changed. Please contact your administrator." : "Slaptažodis negali būti pakeistas, susisiekite su administratoriumi.", "No" : "Ne", "Yes" : "Taip", "Choose" : "Pasirinkite", @@ -58,6 +82,8 @@ "read-only" : "tik skaitymui", "_{count} file conflict_::_{count} file conflicts_" : ["{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"], "One file conflict" : "Vienas failo konfliktas", + "New Files" : "Naujas failas", + "Already existing files" : "Egzistuojantys failai", "Which files do you want to keep?" : "Kuriuos failus norite laikyti?", "If you select both versions, the copied file will have a number added to its name." : "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime.", "Cancel" : "Atšaukti", @@ -65,12 +91,18 @@ "(all selected)" : "(visi pažymėti)", "({count} selected)" : "({count} pažymėtų)", "Error loading file exists template" : "Klaida įkeliant esančių failų ruošinį", + "Very weak password" : "Labai silpnas slaptažodis", + "Weak password" : "Silpnas slaptažodis", + "So-so password" : "Neblogas slaptažodis", + "Good password" : "Geras slaptažodis", + "Strong password" : "Stiprus slaptažodis", "Shared" : "Dalinamasi", "Error" : "Klaida", "Error while sharing" : "Klaida, dalijimosi metu", "Error while unsharing" : "Klaida, kai atšaukiamas dalijimasis", "Error while changing permissions" : "Klaida, keičiant privilegijas", "Error setting expiration date" : "Klaida nustatant galiojimo laiką", + "The public link will expire no later than {days} days after it is created" : "Vieša nuoroda galios ne mažiau kaip {days} dienas nuo sukūrimo", "Set expiration date" : "Nustatykite galiojimo laiką", "Expiration" : "Galiojimo laikas", "Expiration date" : "Galiojimo laikas", @@ -81,6 +113,8 @@ "Link" : "Nuoroda", "Password protect" : "Apsaugotas slaptažodžiu", "Password" : "Slaptažodis", + "Choose a password for the public link" : "Viešos nuorodos slaptažodis", + "Allow editing" : "Leisti redaguoti", "Email link to person" : "Nusiųsti nuorodą paštu", "Send" : "Siųsti", "Shared with you and the group {group} by {owner}" : "Pasidalino su Jumis ir {group} grupe {owner}", @@ -96,7 +130,11 @@ "change" : "keisti", "delete" : "ištrinti", "access control" : "priėjimo kontrolė", + "An error occured. Please try again" : "Klaida, prašau bandyti dar kartą.", "Share" : "Dalintis", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Dalintis su vartotoju kitame ownCloud debesyje, sintaksė vartotojas@example.com/owncloud", + "Share with users or groups …" : "Dalintis su vartotoju ar grupe", + "Share with users, groups or remote users …" : "Dalintis su vartotoju, grupe, ar nutolusiu vartotoju...", "Warning" : "Įspėjimas", "The object type is not specified." : "Objekto tipas nenurodytas.", "Enter new" : "Įveskite naują", diff --git a/core/l10n/lv.js b/core/l10n/lv.js index 54beb6a107b..1bfbef01275 100644 --- a/core/l10n/lv.js +++ b/core/l10n/lv.js @@ -47,6 +47,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Iestatījumi", "Saving..." : "Saglabā...", + "seconds ago" : "sekundes atpakaļ", "I know what I'm doing" : "Es zinu ko es daru", "Password can not be changed. Please contact your administrator." : "Paroli, nevar nomainīt. Lūdzu kontaktēties ar savu administratoru.", "No" : "Nē", diff --git a/core/l10n/lv.json b/core/l10n/lv.json index b874c1f4008..6d3eed2c2a7 100644 --- a/core/l10n/lv.json +++ b/core/l10n/lv.json @@ -45,6 +45,7 @@ "Dec." : "Dec.", "Settings" : "Iestatījumi", "Saving..." : "Saglabā...", + "seconds ago" : "sekundes atpakaļ", "I know what I'm doing" : "Es zinu ko es daru", "Password can not be changed. Please contact your administrator." : "Paroli, nevar nomainīt. Lūdzu kontaktēties ar savu administratoru.", "No" : "Nē", diff --git a/core/l10n/mk.js b/core/l10n/mk.js index 26d0f8f2152..ef283e7d24f 100644 --- a/core/l10n/mk.js +++ b/core/l10n/mk.js @@ -59,6 +59,7 @@ OC.L10N.register( "Dec." : "Дек.", "Settings" : "Подесувања", "Saving..." : "Снимам...", + "seconds ago" : "пред секунди", "Couldn't send reset email. Please contact your administrator." : "Не можам да истпратам порака за ресетирање. Ве молам контактирајте го вашиот администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Врската за ресетирање на вашата лозинка е испратена на вашата е-адреса. Ако не ја добиете во разумно време, проверете ги вашите папки за спам/ѓубре.<br>Ако не е таму прашајте го вашиот локален администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Вашите датотеки се шифрирани. Ако не сте го овозможиле клучот за враќање, нема да можете да ги повратите вашите податоци откога вашата лозинка ќе биде ресетирана.<br>Ако не сте сигурни што да правите, ве молам контактирајте го вашиот локален администратор пред да продолжите.<br/>Дали навистина сакате да продолжите?", diff --git a/core/l10n/mk.json b/core/l10n/mk.json index 60dfe4305c7..258a912388d 100644 --- a/core/l10n/mk.json +++ b/core/l10n/mk.json @@ -57,6 +57,7 @@ "Dec." : "Дек.", "Settings" : "Подесувања", "Saving..." : "Снимам...", + "seconds ago" : "пред секунди", "Couldn't send reset email. Please contact your administrator." : "Не можам да истпратам порака за ресетирање. Ве молам контактирајте го вашиот администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Врската за ресетирање на вашата лозинка е испратена на вашата е-адреса. Ако не ја добиете во разумно време, проверете ги вашите папки за спам/ѓубре.<br>Ако не е таму прашајте го вашиот локален администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Вашите датотеки се шифрирани. Ако не сте го овозможиле клучот за враќање, нема да можете да ги повратите вашите податоци откога вашата лозинка ќе биде ресетирана.<br>Ако не сте сигурни што да правите, ве молам контактирајте го вашиот локален администратор пред да продолжите.<br/>Дали навистина сакате да продолжите?", diff --git a/core/l10n/my_MM.js b/core/l10n/my_MM.js index 564eaebeeec..fc47c956844 100644 --- a/core/l10n/my_MM.js +++ b/core/l10n/my_MM.js @@ -13,6 +13,7 @@ OC.L10N.register( "October" : "အောက်တိုဘာ", "November" : "နိုဝင်ဘာ", "December" : "ဒီဇင်ဘာ", + "seconds ago" : "စက္ကန့်အနည်းငယ်က", "No" : "မဟုတ်ဘူး", "Yes" : "ဟုတ်", "Choose" : "ရွေးချယ်", diff --git a/core/l10n/my_MM.json b/core/l10n/my_MM.json index 6840d924488..157e38e0312 100644 --- a/core/l10n/my_MM.json +++ b/core/l10n/my_MM.json @@ -11,6 +11,7 @@ "October" : "အောက်တိုဘာ", "November" : "နိုဝင်ဘာ", "December" : "ဒီဇင်ဘာ", + "seconds ago" : "စက္ကန့်အနည်းငယ်က", "No" : "မဟုတ်ဘူး", "Yes" : "ဟုတ်", "Choose" : "ရွေးချယ်", diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js index 13f133dbaf4..13cf58087a9 100644 --- a/core/l10n/nb_NO.js +++ b/core/l10n/nb_NO.js @@ -71,6 +71,7 @@ OC.L10N.register( "Dec." : "Des.", "Settings" : "Innstillinger", "Saving..." : "Lagrer...", + "seconds ago" : "for få sekunder siden", "Couldn't send reset email. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling. Kontakt administratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lenken for tilbakestilling av passordet ditt er sendt til din e-postadresse. Hvis du ikke mottar den innen rimelig tid, sjekk mappen for søppelpost.<br>Hvis du ikke finner den der, kontakt din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?", @@ -182,8 +183,6 @@ OC.L10N.register( "New Password" : "Nytt passord", "Reset password" : "Tilbakestill passord", "Searching other places" : "Søker andre steder", - "No search results in other places" : "Ingen søkeresultater på andre steder", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søkeresultat fra andre steder","{count} søkeresultater fra andre steder"], "Personal" : "Personlig", "Users" : "Brukere", "Apps" : "Apper", diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json index beb7a53e57b..efdf8439833 100644 --- a/core/l10n/nb_NO.json +++ b/core/l10n/nb_NO.json @@ -69,6 +69,7 @@ "Dec." : "Des.", "Settings" : "Innstillinger", "Saving..." : "Lagrer...", + "seconds ago" : "for få sekunder siden", "Couldn't send reset email. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling. Kontakt administratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lenken for tilbakestilling av passordet ditt er sendt til din e-postadresse. Hvis du ikke mottar den innen rimelig tid, sjekk mappen for søppelpost.<br>Hvis du ikke finner den der, kontakt din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?", @@ -180,8 +181,6 @@ "New Password" : "Nytt passord", "Reset password" : "Tilbakestill passord", "Searching other places" : "Søker andre steder", - "No search results in other places" : "Ingen søkeresultater på andre steder", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søkeresultat fra andre steder","{count} søkeresultater fra andre steder"], "Personal" : "Personlig", "Users" : "Brukere", "Apps" : "Apper", diff --git a/core/l10n/nds.js b/core/l10n/nds.js index 4cb36aaaaac..9c81f34e70f 100644 --- a/core/l10n/nds.js +++ b/core/l10n/nds.js @@ -1,8 +1,115 @@ OC.L10N.register( "core", { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] + "Couldn't send mail to following users: %s " : "Senden der E-Mail an folgende Benutzer fehlgeschlagen: %s", + "Preparing update" : "Bereite Aktualisierung vor", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrierungstests werden übersprungen - \"update.skip-migration-test\" ist in der config.php aktiviert", + "Turned on maintenance mode" : "Wartungsmodus eingeschaltet", + "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", + "Maintenance mode is kept active" : "Wartungsmodus wird fortgeführt", + "Updated database" : "Datenbank wurde aktualisiert", + "Checked database schema update" : "Datenbankschemaaktualisierung wurde geprüft", + "Checked database schema update for apps" : "Datenbankschemaaktualisierung für Apps wurde geprüft", + "Updated \"%s\" to %s" : "\"%s\" auf %s aktualisiert", + "Repair warning: " : "Reparaturwarnung", + "Repair error: " : "Reparaturfehler", + "Set log level to debug - current level: \"%s\"" : "Protokollierungsstufe auf Debug gesetzt - Aktuelle Stufe: \"%s\"", + "Reset log level to \"%s\"" : "Protokollierungsstufe auf \"%s\" zurückgesetzt", + "Following incompatible apps have been disabled: %s" : "Folgende inkompatible Apps wurden deaktiviert: %s", + "Following apps have been disabled: %s" : "Folgende Apps wurden deaktiviert: %s", + "Already up to date" : "Bereits aktuell", + "File is too big" : "Datei ist zu groß", + "Invalid file provided" : "Ungültige Datei geliefert", + "No image or file provided" : "Kein Bild oder keine Datei geliefert", + "Unknown filetype" : "Unbekannter Dateityp", + "Invalid image" : "Ungültiges Bild", + "No temporary profile picture available, try again" : "Kein flüchtiges Profilbild verfügbar, bitte versuche es noch einmal", + "No crop data provided" : "Keine Angaben zum Zuschneiden geliefert", + "No valid crop data provided" : "Keine gültigen Angaben zum Zuschnitt geliefert", + "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Sunday" : "Sonntag", + "Monday" : "Montag", + "Tuesday" : "Dienstag", + "Wednesday" : "Mittwoch", + "Thursday" : "Donnerstag", + "Friday" : "Freitag", + "Saturday" : "Samstag", + "Sun." : "Son.", + "Mon." : "Mon.", + "Tue." : "Die.", + "Wed." : "Mit.", + "Thu." : "Don.", + "Fri." : "Fre.", + "Sat." : "Sam.", + "Su" : "So", + "Mo" : "Mo", + "Tu" : "Di", + "We" : "Mi", + "Th" : "Do", + "Fr" : "Fr", + "Sa" : "Sa", + "January" : "Januar", + "February" : "Februar", + "March" : "März", + "April" : "April", + "May" : "Mai", + "June" : "Juni", + "July" : "Juli", + "August" : "August", + "September" : "September", + "October" : "Oktober", + "November" : "November", + "December" : "Dezember", + "Jan." : "Jan.", + "Feb." : "Feb.", + "Mar." : "Mrz.", + "Apr." : "Apr.", + "May." : "Mai.", + "Jun." : "Jun.", + "Jul." : "Jul.", + "Aug." : "Aug.", + "Sep." : "Sep.", + "Oct." : "Okt.", + "Nov." : "Nov.", + "Dec." : "Dez.", + "Settings" : "Einstellungen", + "Saving..." : "Speichern...", + "seconds ago" : "vor wenigen Sekunden", + "Couldn't send reset email. Please contact your administrator." : "E-Mail zum Zurücksetzen konnte nicht gesendet werden. Bitte wende Dich an Deinem Administrator.", + "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Zurücksetzen deines Passworts wurde an Deine E-Mailadresse geschickt. Wenn Du diesen in einer angemessenen Zeit nicht erhältst, prüfe bitte deine Spam/Junk Ordner.<br> Wenn die E-Mail dort nicht ist, wende Dich an Deinen lokalen Administrator.", + "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Wenn Dein Wiederherstellungsschlüssel nicht aktiviert ist, gibt es keine Möglichkeit die Daten wiederherzustellen, nachdem Dein Passwort zurückgesetzt wurde.<br /> Wenn Du nicht sicher weißt was zu tun ist, wende Dich bitte an deinen Adminstrator bevor du fortfährst.<br />Willst du wirklich fortfahren?", + "I know what I'm doing" : "Ich weiß was ich tue", + "Password can not be changed. Please contact your administrator." : "Das Passwort kann nicht geändert werden. Bitte wende Dich an Deinen Administrator.", + "No" : "Nein", + "Yes" : "Ja", + "Choose" : "Auswählen", + "Error loading file picker template: {error}" : "Fehler beim Laden der Vorlage zum Auswählen von Dateien: {error}", + "Ok" : "Ok", + "Error loading message template: {error}" : "Fehler beim Laden der Nachrichtenvorlage: {error}", + "read-only" : "Nur Lesezugriff", + "_{count} file conflict_::_{count} file conflicts_" : ["{count} Dateikonflikt","{count} Dateikonflikte"], + "One file conflict" : "Ein Dateikonflikt", + "New Files" : "Neue Dateien", + "Already existing files" : "Bereits vorhandene Dateien", + "Which files do you want to keep?" : "Welche Dateien willst du behalten?", + "If you select both versions, the copied file will have a number added to its name." : "Wenn Du beide Versionen behältst, wird eine Nummer an den Namen der kopierten Datei angehängt.", + "Cancel" : "Abbrechen", + "Continue" : "Fortsetzen", + "(all selected)" : "(alle ausgewählt)", + "({count} selected)" : "({count} ausgewählt)", + "Error loading file exists template" : "Fehler beim Laden der Vorlage \"Datei existiert\"", + "Very weak password" : "Sehr schwaches Passwort", + "Weak password" : "Schwaches Passwort", + "So-so password" : "Mittelstarkes Passwort", + "Good password" : "Gutes Passwort", + "Strong password" : "Starkes Passwort", + "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Dein Webserver ist für die Dateisynchronisierung noch nicht ordentlich eingerichtet, da die WebDAV-Schnittstelle fehlerhaft scheint. ", + "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server ist nicht mit dem Internet verbunden. Das bedeutet, dass manche Funktionen, wie das Einbinden von externen Speichern, Benachrichtigungen über Aktualisierungen oder die Installation von Drittanbieter Apps nicht zur Verfügung stehen. Auch der Fernzugriff auf Dateien und das Senden von Hinweis-E-Mails könnte nicht funktionieren. Wir empfehlen die Internetverbindung dieses Servers zu aktivieren, wenn Du diese Funktionen nutzen möchtest.", + "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Der Zugriff auf Dein Datenverzeichnis und Deine Dateien ist über das Internet vermutlich möglich. Die .htaccess-Datei greift nicht. Wir empfehlen dringend den Webserver derart zu konfigurieren, dass das Datenverzeichnis nicht mehr zugreifbar ist oder das Datenverzeichnis nach außerhalb des Dokumentenwurzelverzeichnisses des Webservers zu verschieben.", + "Password" : "Passwort", + "Share" : "Teilen", + "Delete" : "Löschen", + "Personal" : "Persönlich", + "Username" : "Benutzername" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/nds.json b/core/l10n/nds.json index 43fce52c5cf..e62ab93e307 100644 --- a/core/l10n/nds.json +++ b/core/l10n/nds.json @@ -1,6 +1,113 @@ { "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] + "Couldn't send mail to following users: %s " : "Senden der E-Mail an folgende Benutzer fehlgeschlagen: %s", + "Preparing update" : "Bereite Aktualisierung vor", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migrierungstests werden übersprungen - \"update.skip-migration-test\" ist in der config.php aktiviert", + "Turned on maintenance mode" : "Wartungsmodus eingeschaltet", + "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", + "Maintenance mode is kept active" : "Wartungsmodus wird fortgeführt", + "Updated database" : "Datenbank wurde aktualisiert", + "Checked database schema update" : "Datenbankschemaaktualisierung wurde geprüft", + "Checked database schema update for apps" : "Datenbankschemaaktualisierung für Apps wurde geprüft", + "Updated \"%s\" to %s" : "\"%s\" auf %s aktualisiert", + "Repair warning: " : "Reparaturwarnung", + "Repair error: " : "Reparaturfehler", + "Set log level to debug - current level: \"%s\"" : "Protokollierungsstufe auf Debug gesetzt - Aktuelle Stufe: \"%s\"", + "Reset log level to \"%s\"" : "Protokollierungsstufe auf \"%s\" zurückgesetzt", + "Following incompatible apps have been disabled: %s" : "Folgende inkompatible Apps wurden deaktiviert: %s", + "Following apps have been disabled: %s" : "Folgende Apps wurden deaktiviert: %s", + "Already up to date" : "Bereits aktuell", + "File is too big" : "Datei ist zu groß", + "Invalid file provided" : "Ungültige Datei geliefert", + "No image or file provided" : "Kein Bild oder keine Datei geliefert", + "Unknown filetype" : "Unbekannter Dateityp", + "Invalid image" : "Ungültiges Bild", + "No temporary profile picture available, try again" : "Kein flüchtiges Profilbild verfügbar, bitte versuche es noch einmal", + "No crop data provided" : "Keine Angaben zum Zuschneiden geliefert", + "No valid crop data provided" : "Keine gültigen Angaben zum Zuschnitt geliefert", + "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Sunday" : "Sonntag", + "Monday" : "Montag", + "Tuesday" : "Dienstag", + "Wednesday" : "Mittwoch", + "Thursday" : "Donnerstag", + "Friday" : "Freitag", + "Saturday" : "Samstag", + "Sun." : "Son.", + "Mon." : "Mon.", + "Tue." : "Die.", + "Wed." : "Mit.", + "Thu." : "Don.", + "Fri." : "Fre.", + "Sat." : "Sam.", + "Su" : "So", + "Mo" : "Mo", + "Tu" : "Di", + "We" : "Mi", + "Th" : "Do", + "Fr" : "Fr", + "Sa" : "Sa", + "January" : "Januar", + "February" : "Februar", + "March" : "März", + "April" : "April", + "May" : "Mai", + "June" : "Juni", + "July" : "Juli", + "August" : "August", + "September" : "September", + "October" : "Oktober", + "November" : "November", + "December" : "Dezember", + "Jan." : "Jan.", + "Feb." : "Feb.", + "Mar." : "Mrz.", + "Apr." : "Apr.", + "May." : "Mai.", + "Jun." : "Jun.", + "Jul." : "Jul.", + "Aug." : "Aug.", + "Sep." : "Sep.", + "Oct." : "Okt.", + "Nov." : "Nov.", + "Dec." : "Dez.", + "Settings" : "Einstellungen", + "Saving..." : "Speichern...", + "seconds ago" : "vor wenigen Sekunden", + "Couldn't send reset email. Please contact your administrator." : "E-Mail zum Zurücksetzen konnte nicht gesendet werden. Bitte wende Dich an Deinem Administrator.", + "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Zurücksetzen deines Passworts wurde an Deine E-Mailadresse geschickt. Wenn Du diesen in einer angemessenen Zeit nicht erhältst, prüfe bitte deine Spam/Junk Ordner.<br> Wenn die E-Mail dort nicht ist, wende Dich an Deinen lokalen Administrator.", + "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Wenn Dein Wiederherstellungsschlüssel nicht aktiviert ist, gibt es keine Möglichkeit die Daten wiederherzustellen, nachdem Dein Passwort zurückgesetzt wurde.<br /> Wenn Du nicht sicher weißt was zu tun ist, wende Dich bitte an deinen Adminstrator bevor du fortfährst.<br />Willst du wirklich fortfahren?", + "I know what I'm doing" : "Ich weiß was ich tue", + "Password can not be changed. Please contact your administrator." : "Das Passwort kann nicht geändert werden. Bitte wende Dich an Deinen Administrator.", + "No" : "Nein", + "Yes" : "Ja", + "Choose" : "Auswählen", + "Error loading file picker template: {error}" : "Fehler beim Laden der Vorlage zum Auswählen von Dateien: {error}", + "Ok" : "Ok", + "Error loading message template: {error}" : "Fehler beim Laden der Nachrichtenvorlage: {error}", + "read-only" : "Nur Lesezugriff", + "_{count} file conflict_::_{count} file conflicts_" : ["{count} Dateikonflikt","{count} Dateikonflikte"], + "One file conflict" : "Ein Dateikonflikt", + "New Files" : "Neue Dateien", + "Already existing files" : "Bereits vorhandene Dateien", + "Which files do you want to keep?" : "Welche Dateien willst du behalten?", + "If you select both versions, the copied file will have a number added to its name." : "Wenn Du beide Versionen behältst, wird eine Nummer an den Namen der kopierten Datei angehängt.", + "Cancel" : "Abbrechen", + "Continue" : "Fortsetzen", + "(all selected)" : "(alle ausgewählt)", + "({count} selected)" : "({count} ausgewählt)", + "Error loading file exists template" : "Fehler beim Laden der Vorlage \"Datei existiert\"", + "Very weak password" : "Sehr schwaches Passwort", + "Weak password" : "Schwaches Passwort", + "So-so password" : "Mittelstarkes Passwort", + "Good password" : "Gutes Passwort", + "Strong password" : "Starkes Passwort", + "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Dein Webserver ist für die Dateisynchronisierung noch nicht ordentlich eingerichtet, da die WebDAV-Schnittstelle fehlerhaft scheint. ", + "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server ist nicht mit dem Internet verbunden. Das bedeutet, dass manche Funktionen, wie das Einbinden von externen Speichern, Benachrichtigungen über Aktualisierungen oder die Installation von Drittanbieter Apps nicht zur Verfügung stehen. Auch der Fernzugriff auf Dateien und das Senden von Hinweis-E-Mails könnte nicht funktionieren. Wir empfehlen die Internetverbindung dieses Servers zu aktivieren, wenn Du diese Funktionen nutzen möchtest.", + "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Der Zugriff auf Dein Datenverzeichnis und Deine Dateien ist über das Internet vermutlich möglich. Die .htaccess-Datei greift nicht. Wir empfehlen dringend den Webserver derart zu konfigurieren, dass das Datenverzeichnis nicht mehr zugreifbar ist oder das Datenverzeichnis nach außerhalb des Dokumentenwurzelverzeichnisses des Webservers zu verschieben.", + "Password" : "Passwort", + "Share" : "Teilen", + "Delete" : "Löschen", + "Personal" : "Persönlich", + "Username" : "Benutzername" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/nl.js b/core/l10n/nl.js index 0b12185cae4..4828e3ba098 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Kon geen e-mail sturen aan de volgende gebruikers: %s", "Preparing update" : "Update voorbereiden", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migratietests worden overgeslagen - \"update.skip-migration-test\" is geactiveerd in config.php", "Turned on maintenance mode" : "Onderhoudsmodus ingeschakeld", "Turned off maintenance mode" : "Onderhoudsmodus uitgeschakeld", "Maintenance mode is kept active" : "Onderhoudsmodus blijft actief", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Bijgewerkt \"%s\" naar %s", "Repair warning: " : "Reparatiewaarschuwing:", "Repair error: " : "Reparatiefout:", + "Set log level to debug - current level: \"%s\"" : "Instellen logniveau op debug - huidige niveau: \"%s\"", + "Reset log level to \"%s\"" : "Terugzetten logniveau op \"#%s\"", "Following incompatible apps have been disabled: %s" : "De volgende incompatibele apps zijn uitgeschakeld: %s", "Following apps have been disabled: %s" : "De volgende apps zijn gedeactiveerd: %s", "Already up to date" : "Al bijgewerkt", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Geen afbeelding of bestand opgegeven", "Unknown filetype" : "Onbekend bestandsformaat", "Invalid image" : "Ongeldige afbeelding", + "An error occurred. Please contact your admin." : "Er trad een fout op. Neem contact op met uw beheerder.", "No temporary profile picture available, try again" : "Geen tijdelijke profielafbeelding beschikbaar. Probeer het opnieuw", "No crop data provided" : "Geen bijsnijdingsgegevens opgegeven", "No valid crop data provided" : "Geen geldige bijsnijdingsgegevens opgegeven", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Instellingen", "Saving..." : "Opslaan", + "seconds ago" : "seconden geleden", "Couldn't send reset email. Please contact your administrator." : "Kon herstel e-mail niet versturen. Neem contact op met uw beheerder.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "De link om uw wachtwoord te herstellen is per e-mail naar u verstuurd. Als u dit bericht niet binnen redelijke tijd hebt ontvangen, controleer dan uw spammap. <br>Als het daar niet in zit, neem dan contact op met uw beheerder.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Uw bestanden zijn versleuteld. Als u de herstelsleutel niet hebt geactiveerd, is er geen mogelijk om uw gegevens terug te krijgen nadat uw wachtwoord is hersteld. <br>Als u niet weet wat u moet doen, neem dan eerst contact op met uw beheerder. <br>Wilt u echt verder gaan?", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom is niet leesbaar door PHP, hetgeen wordt afgeraden wegens beveiligingsredenen. Meer informatie in onze <a href=\"{docLink}\">documentatie</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "UwPHP versie ({version}) wordt niet langer <a href=\"{phpLink}\">ondersteund door PHP</a>. We adviseren u om uw PHP versie te upgraden voor betere prestaties en security updates geleverd door PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of u hebt toegang tot ownCloud via een vertrouwde proxy. Als u ownCloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat ownCloud ziet kan spoofen. Meer informatie is te vinden in onze <a href=\"{docLink}\">documentatie</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a href=\"{wikiLink}\">memcached wiki over beide modules</a>.", "Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "De \"{header}\" HTTP header is niet overeenkomstig met \"{expected}\" geconfigureerd. Dit is een potentieel security of privacy risico en we adviseren om deze instelling te wijzigen.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", @@ -168,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["download %n bestand","download %n bestanden"], "{version} is available. Get more information on how to update." : "{version} is beschikbaar. Meer informatie over het bijwerken.", "Updating {productName} to version {version}, this may take a while." : "Bijwerken {productName} naar versie {version}, dit kan even duren.", + "An error occurred." : "Er heeft zich een fout voorgedaan.", "Please reload the page." : "Herlaad deze pagina.", "The update was unsuccessful. " : "De update is niet geslaagd.", "The update was successful. There were warnings." : "De update is geslaagd. Er zijn wel waarschuwingen.", @@ -182,8 +189,8 @@ OC.L10N.register( "New Password" : "Nieuw wachtwoord", "Reset password" : "Reset wachtwoord", "Searching other places" : "Zoeken op andere plaatsen", - "No search results in other places" : "Geen zoekresultaten op andere plaatsen", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} zoekresultaat op andere plaatsen","{count} zoekresultaten op andere plaatsen"], + "No search results in other folders" : "Geen zoekresultaten in andere mappen", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} zoekresultaat in een andere map","{count} zoekresultaten in andere mappen"], "Personal" : "Persoonlijk", "Users" : "Gebruikers", "Apps" : "Apps", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index 7a9765d8c3a..900d89cdc50 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Kon geen e-mail sturen aan de volgende gebruikers: %s", "Preparing update" : "Update voorbereiden", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Migratietests worden overgeslagen - \"update.skip-migration-test\" is geactiveerd in config.php", "Turned on maintenance mode" : "Onderhoudsmodus ingeschakeld", "Turned off maintenance mode" : "Onderhoudsmodus uitgeschakeld", "Maintenance mode is kept active" : "Onderhoudsmodus blijft actief", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Bijgewerkt \"%s\" naar %s", "Repair warning: " : "Reparatiewaarschuwing:", "Repair error: " : "Reparatiefout:", + "Set log level to debug - current level: \"%s\"" : "Instellen logniveau op debug - huidige niveau: \"%s\"", + "Reset log level to \"%s\"" : "Terugzetten logniveau op \"#%s\"", "Following incompatible apps have been disabled: %s" : "De volgende incompatibele apps zijn uitgeschakeld: %s", "Following apps have been disabled: %s" : "De volgende apps zijn gedeactiveerd: %s", "Already up to date" : "Al bijgewerkt", @@ -18,6 +21,7 @@ "No image or file provided" : "Geen afbeelding of bestand opgegeven", "Unknown filetype" : "Onbekend bestandsformaat", "Invalid image" : "Ongeldige afbeelding", + "An error occurred. Please contact your admin." : "Er trad een fout op. Neem contact op met uw beheerder.", "No temporary profile picture available, try again" : "Geen tijdelijke profielafbeelding beschikbaar. Probeer het opnieuw", "No crop data provided" : "Geen bijsnijdingsgegevens opgegeven", "No valid crop data provided" : "Geen geldige bijsnijdingsgegevens opgegeven", @@ -69,6 +73,7 @@ "Dec." : "Dec.", "Settings" : "Instellingen", "Saving..." : "Opslaan", + "seconds ago" : "seconden geleden", "Couldn't send reset email. Please contact your administrator." : "Kon herstel e-mail niet versturen. Neem contact op met uw beheerder.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "De link om uw wachtwoord te herstellen is per e-mail naar u verstuurd. Als u dit bericht niet binnen redelijke tijd hebt ontvangen, controleer dan uw spammap. <br>Als het daar niet in zit, neem dan contact op met uw beheerder.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Uw bestanden zijn versleuteld. Als u de herstelsleutel niet hebt geactiveerd, is er geen mogelijk om uw gegevens terug te krijgen nadat uw wachtwoord is hersteld. <br>Als u niet weet wat u moet doen, neem dan eerst contact op met uw beheerder. <br>Wilt u echt verder gaan?", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom is niet leesbaar door PHP, hetgeen wordt afgeraden wegens beveiligingsredenen. Meer informatie in onze <a href=\"{docLink}\">documentatie</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "UwPHP versie ({version}) wordt niet langer <a href=\"{phpLink}\">ondersteund door PHP</a>. We adviseren u om uw PHP versie te upgraden voor betere prestaties en security updates geleverd door PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of u hebt toegang tot ownCloud via een vertrouwde proxy. Als u ownCloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat ownCloud ziet kan spoofen. Meer informatie is te vinden in onze <a href=\"{docLink}\">documentatie</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a href=\"{wikiLink}\">memcached wiki over beide modules</a>.", "Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "De \"{header}\" HTTP header is niet overeenkomstig met \"{expected}\" geconfigureerd. Dit is een potentieel security of privacy risico en we adviseren om deze instelling te wijzigen.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", @@ -166,6 +172,7 @@ "_download %n file_::_download %n files_" : ["download %n bestand","download %n bestanden"], "{version} is available. Get more information on how to update." : "{version} is beschikbaar. Meer informatie over het bijwerken.", "Updating {productName} to version {version}, this may take a while." : "Bijwerken {productName} naar versie {version}, dit kan even duren.", + "An error occurred." : "Er heeft zich een fout voorgedaan.", "Please reload the page." : "Herlaad deze pagina.", "The update was unsuccessful. " : "De update is niet geslaagd.", "The update was successful. There were warnings." : "De update is geslaagd. Er zijn wel waarschuwingen.", @@ -180,8 +187,8 @@ "New Password" : "Nieuw wachtwoord", "Reset password" : "Reset wachtwoord", "Searching other places" : "Zoeken op andere plaatsen", - "No search results in other places" : "Geen zoekresultaten op andere plaatsen", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} zoekresultaat op andere plaatsen","{count} zoekresultaten op andere plaatsen"], + "No search results in other folders" : "Geen zoekresultaten in andere mappen", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} zoekresultaat in een andere map","{count} zoekresultaten in andere mappen"], "Personal" : "Persoonlijk", "Users" : "Gebruikers", "Apps" : "Apps", diff --git a/core/l10n/nn_NO.js b/core/l10n/nn_NO.js index dce6076578d..161fa88958d 100644 --- a/core/l10n/nn_NO.js +++ b/core/l10n/nn_NO.js @@ -50,6 +50,7 @@ OC.L10N.register( "Dec." : "Des.", "Settings" : "Innstillingar", "Saving..." : "Lagrar …", + "seconds ago" : "sekund sidan", "I know what I'm doing" : "Eg veit kva eg gjer", "No" : "Nei", "Yes" : "Ja", diff --git a/core/l10n/nn_NO.json b/core/l10n/nn_NO.json index 1f6883b3361..654df3317cb 100644 --- a/core/l10n/nn_NO.json +++ b/core/l10n/nn_NO.json @@ -48,6 +48,7 @@ "Dec." : "Des.", "Settings" : "Innstillingar", "Saving..." : "Lagrar …", + "seconds ago" : "sekund sidan", "I know what I'm doing" : "Eg veit kva eg gjer", "No" : "Nei", "Yes" : "Ja", diff --git a/core/l10n/oc.js b/core/l10n/oc.js index 07cd7897afd..a61d44857cb 100644 --- a/core/l10n/oc.js +++ b/core/l10n/oc.js @@ -27,24 +27,24 @@ OC.L10N.register( "Friday" : "Divendres", "Saturday" : "Dissabte", "Sun." : "Dim.", - "Mon." : "Luns.", - "Tue." : "Març.", - "Wed." : "Mec.", + "Mon." : "Lun.", + "Tue." : "Mar.", + "Wed." : "Mèc.", "Thu." : "Jòu.", "Fri." : "Ven.", "Sat." : "Sab.", - "January" : "genièr", - "February" : "febrièr", - "March" : "març", - "April" : "abril", - "May" : "mai", - "June" : "junh", - "July" : "julhet", - "August" : "agost", - "September" : "setembre", - "October" : "octobre", - "November" : "novembre", - "December" : "decembre", + "January" : "Genièr", + "February" : "Febrièr", + "March" : "Març", + "April" : "Abril", + "May" : "Mai", + "June" : "Junh", + "July" : "Julhet", + "August" : "Agost", + "September" : "Setembre", + "October" : "Octobre", + "November" : "Novembre", + "December" : "Decembre", "Jan." : "Gen.", "Feb." : "Feb.", "Mar." : "Mar.", @@ -53,12 +53,13 @@ OC.L10N.register( "Jun." : "Jun.", "Jul." : "Jul.", "Aug." : "Ago.", - "Sep." : "Sep.", + "Sep." : "Set.", "Oct." : "Oct.", "Nov." : "Nov.", "Dec." : "Dec.", "Settings" : "Paramètres", "Saving..." : "Enregistrament…", + "seconds ago" : "i a qualques segondas", "Couldn't send reset email. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion. Contactatz vòstre administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lo ligam que permet de reïnicializar vòstre senhal ven d'èsser mandat a vòstra adreça de corrièl.<br>Se o recebètz pas dins un relambi rasonable, contactatz vòstre administrator.<br>Doblidetz pas de verificar dins vòstre dorsièr corrièr indesirable / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vòstres fichièrs son chifrats. Se avètz pas activat la clau de recuperacion, i aurà pas cap de mejan de recuperar vòstras donadas un còp lo senhal reïnicializat.<br />Se sètz pas segur(a) de çò que fasètz, contactatz vòstre administrator abans de contunhar. <br />Sètz segur que volètz contunhar ?", @@ -162,7 +163,6 @@ OC.L10N.register( "New Password" : "Senhal novèl", "Reset password" : "Reïnicializar lo senhal", "Searching other places" : "Recèrca en cors dins d'autres emplaçaments", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat dins d'autres emplaçaments","{count} resultats dins d'autres emplaçaments"], "Personal" : "Personal", "Users" : "Utilizaires", "Apps" : "Aplicacions", diff --git a/core/l10n/oc.json b/core/l10n/oc.json index a67f4970175..00927bdf52b 100644 --- a/core/l10n/oc.json +++ b/core/l10n/oc.json @@ -25,24 +25,24 @@ "Friday" : "Divendres", "Saturday" : "Dissabte", "Sun." : "Dim.", - "Mon." : "Luns.", - "Tue." : "Març.", - "Wed." : "Mec.", + "Mon." : "Lun.", + "Tue." : "Mar.", + "Wed." : "Mèc.", "Thu." : "Jòu.", "Fri." : "Ven.", "Sat." : "Sab.", - "January" : "genièr", - "February" : "febrièr", - "March" : "març", - "April" : "abril", - "May" : "mai", - "June" : "junh", - "July" : "julhet", - "August" : "agost", - "September" : "setembre", - "October" : "octobre", - "November" : "novembre", - "December" : "decembre", + "January" : "Genièr", + "February" : "Febrièr", + "March" : "Març", + "April" : "Abril", + "May" : "Mai", + "June" : "Junh", + "July" : "Julhet", + "August" : "Agost", + "September" : "Setembre", + "October" : "Octobre", + "November" : "Novembre", + "December" : "Decembre", "Jan." : "Gen.", "Feb." : "Feb.", "Mar." : "Mar.", @@ -51,12 +51,13 @@ "Jun." : "Jun.", "Jul." : "Jul.", "Aug." : "Ago.", - "Sep." : "Sep.", + "Sep." : "Set.", "Oct." : "Oct.", "Nov." : "Nov.", "Dec." : "Dec.", "Settings" : "Paramètres", "Saving..." : "Enregistrament…", + "seconds ago" : "i a qualques segondas", "Couldn't send reset email. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion. Contactatz vòstre administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lo ligam que permet de reïnicializar vòstre senhal ven d'èsser mandat a vòstra adreça de corrièl.<br>Se o recebètz pas dins un relambi rasonable, contactatz vòstre administrator.<br>Doblidetz pas de verificar dins vòstre dorsièr corrièr indesirable / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vòstres fichièrs son chifrats. Se avètz pas activat la clau de recuperacion, i aurà pas cap de mejan de recuperar vòstras donadas un còp lo senhal reïnicializat.<br />Se sètz pas segur(a) de çò que fasètz, contactatz vòstre administrator abans de contunhar. <br />Sètz segur que volètz contunhar ?", @@ -160,7 +161,6 @@ "New Password" : "Senhal novèl", "Reset password" : "Reïnicializar lo senhal", "Searching other places" : "Recèrca en cors dins d'autres emplaçaments", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat dins d'autres emplaçaments","{count} resultats dins d'autres emplaçaments"], "Personal" : "Personal", "Users" : "Utilizaires", "Apps" : "Aplicacions", diff --git a/core/l10n/pa.js b/core/l10n/pa.js index ec3e48920f5..2ab5eb0faff 100644 --- a/core/l10n/pa.js +++ b/core/l10n/pa.js @@ -22,6 +22,7 @@ OC.L10N.register( "December" : "ਦਸੰਬਰ", "Settings" : "ਸੈਟਿੰਗ", "Saving..." : "...ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ", + "seconds ago" : "ਸਕਿੰਟ ਪਹਿਲਾਂ", "No" : "ਨਹੀਂ", "Yes" : "ਹਾਂ", "Choose" : "ਚੁਣੋ", diff --git a/core/l10n/pa.json b/core/l10n/pa.json index 853b3a5d86f..8a8d992589b 100644 --- a/core/l10n/pa.json +++ b/core/l10n/pa.json @@ -20,6 +20,7 @@ "December" : "ਦਸੰਬਰ", "Settings" : "ਸੈਟਿੰਗ", "Saving..." : "...ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ", + "seconds ago" : "ਸਕਿੰਟ ਪਹਿਲਾਂ", "No" : "ਨਹੀਂ", "Yes" : "ਹਾਂ", "Choose" : "ਚੁਣੋ", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index 75190fcdb36..525c4aef880 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -57,6 +57,7 @@ OC.L10N.register( "Dec." : "Gru.", "Settings" : "Ustawienia", "Saving..." : "Zapisywanie...", + "seconds ago" : "sekund temu", "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link do zresetowanego hasła, został wysłany na twój adres e-mail. Jeśli nie dostałeś wiadomości w rozsądnym czasie, sprawdź folder ze spamem.<br> Jeśli nie ma wiadomości w tym folderze, skontaktuj się ze swoim administratorem.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index 69a036f69a0..d187cbcc626 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -55,6 +55,7 @@ "Dec." : "Gru.", "Settings" : "Ustawienia", "Saving..." : "Zapisywanie...", + "seconds ago" : "sekund temu", "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link do zresetowanego hasła, został wysłany na twój adres e-mail. Jeśli nie dostałeś wiadomości w rozsądnym czasie, sprawdź folder ze spamem.<br> Jeśli nie ma wiadomości w tym folderze, skontaktuj się ze swoim administratorem.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index ca6b56ae0a1..a11d02acb78 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s", "Preparing update" : "Preparando atualização", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Os ensaios de migração forão ignoradas - \"update.skip-migration-test\" está ativado no config.php", "Turned on maintenance mode" : "Ativar modo de manutenção", "Turned off maintenance mode" : "Desligar o modo de manutenção", "Maintenance mode is kept active" : "O modo de manutenção está sendo mantido como ativo", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Atualizado \"%s\" para %s", "Repair warning: " : "Aviso de reparação:", "Repair error: " : "Reparação de erro:", + "Set log level to debug - current level: \"%s\"" : "Configure o nível de log para debug - nível corrente: \"%s\"", + "Reset log level to \"%s\"" : "Reconfigurar o nível de log para \"%s\"", "Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s", "Following apps have been disabled: %s" : "Os seguintes aplicativos foram desabilitados: %s", "Already up to date" : "Já está atualizado", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "Nenhuma imagem ou arquivo fornecido", "Unknown filetype" : "Tipo de arquivo desconhecido", "Invalid image" : "Imagem inválida", + "An error occurred. Please contact your admin." : "Ocorreu um erro. Entre em contato com seu administrador.", "No temporary profile picture available, try again" : "Nenhuma imagem temporária disponível no perfil, tente novamente", "No crop data provided" : "Nenhum dado para coleta foi fornecido", "No valid crop data provided" : "Nenhum dado recortado válido", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "Dez.", "Settings" : "Configurações", "Saving..." : "Salvando...", + "seconds ago" : "segundos atrás", "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição. Por favor, contate o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "O link para redefinir sua senha foi enviada para o seu e-mail. Se você não recebê-lo dentro de um período razoável de tempo, verifique suas pastas de spam/lixo. <br> Se ele não estiver lá, pergunte ao administrador do local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida. <br/> Se você não tem certeza do que fazer, por favor, contate o administrador antes de continuar. <br/> Você realmente deseja continuar?", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom não pode ser lido por PHP o que é altamente desencorajado por razões de segurança. Mais informações podem ser encontradas em nossa <a href=\"{docLink}\">documentation</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão do PHP ({version}) não é <a href=\"{phpLink}\">suportada pela PHP</a>. Nós o incentivamos a atualizar sua versão do PHP para tirar proveito de atualizações de desempenho e de segurança fornecidos pela PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não está acessando ownCloud de um proxy confiável, esta é uma questão de segurança e pode permitir a um invasor falsificar seu endereço IP como visível para ownCloud. Mais informações podem ser encontradas em nossa <a href=\"{docLink}\">documentação</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurado como cache distribuído, mas o módulo PHP errado \"memcache\" está instalado. \\OC\\Memcache\\Memcached somente suporta \"memcached\" e não \"memcache\". Veja o <a href=\"{wikiLink}\">memcached wiki sobre esse módulo</a>.", "Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O \"{header}\" cabeçalho HTTP não está configurado igual ao \"{expected}\". Este é um risco potencial para a segurança e recomendamos ajustar essa configuração.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho \"Transporte-de-Segurança-Restrita\"HTTP não está configurada para menos de \"{seconds}\" segundos. Para uma maior segurança recomendamos a ativação HSTS conforme descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.", @@ -168,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["baixar %n arquivo","baixar %n arquivos"], "{version} is available. Get more information on how to update." : "{version} está disponível. Obtenha mais informações sobre como atualizar.", "Updating {productName} to version {version}, this may take a while." : "Atualizando {productName} para a versão {version}, isso pode demorar um pouco.", + "An error occurred." : "Ocorreu um erro.", "Please reload the page." : "Por favor recarregue a página", "The update was unsuccessful. " : "A atualização não foi bem sucedida.", "The update was successful. There were warnings." : "A atualização foi bem sucedida. Havia advertências.", @@ -182,8 +189,8 @@ OC.L10N.register( "New Password" : "Nova Senha", "Reset password" : "Redefinir senha", "Searching other places" : "Pesquisando em outros lugares", - "No search results in other places" : "Nenhum resultado de pesquisa em outros lugares", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultados da pesquisa em outros lugares","{count} resultados da pesquisa em outros lugares"], + "No search results in other folders" : "Nenhum resultado de pesquisa em outras pastas", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado da pesquisa em outras pastas","{count} resultados da pesquisa em outras pastas"], "Personal" : "Pessoal", "Users" : "Usuários", "Apps" : "Aplicações", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index 7441ad571eb..efced19042d 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s", "Preparing update" : "Preparando atualização", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Os ensaios de migração forão ignoradas - \"update.skip-migration-test\" está ativado no config.php", "Turned on maintenance mode" : "Ativar modo de manutenção", "Turned off maintenance mode" : "Desligar o modo de manutenção", "Maintenance mode is kept active" : "O modo de manutenção está sendo mantido como ativo", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Atualizado \"%s\" para %s", "Repair warning: " : "Aviso de reparação:", "Repair error: " : "Reparação de erro:", + "Set log level to debug - current level: \"%s\"" : "Configure o nível de log para debug - nível corrente: \"%s\"", + "Reset log level to \"%s\"" : "Reconfigurar o nível de log para \"%s\"", "Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s", "Following apps have been disabled: %s" : "Os seguintes aplicativos foram desabilitados: %s", "Already up to date" : "Já está atualizado", @@ -18,6 +21,7 @@ "No image or file provided" : "Nenhuma imagem ou arquivo fornecido", "Unknown filetype" : "Tipo de arquivo desconhecido", "Invalid image" : "Imagem inválida", + "An error occurred. Please contact your admin." : "Ocorreu um erro. Entre em contato com seu administrador.", "No temporary profile picture available, try again" : "Nenhuma imagem temporária disponível no perfil, tente novamente", "No crop data provided" : "Nenhum dado para coleta foi fornecido", "No valid crop data provided" : "Nenhum dado recortado válido", @@ -69,6 +73,7 @@ "Dec." : "Dez.", "Settings" : "Configurações", "Saving..." : "Salvando...", + "seconds ago" : "segundos atrás", "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição. Por favor, contate o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "O link para redefinir sua senha foi enviada para o seu e-mail. Se você não recebê-lo dentro de um período razoável de tempo, verifique suas pastas de spam/lixo. <br> Se ele não estiver lá, pergunte ao administrador do local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida. <br/> Se você não tem certeza do que fazer, por favor, contate o administrador antes de continuar. <br/> Você realmente deseja continuar?", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom não pode ser lido por PHP o que é altamente desencorajado por razões de segurança. Mais informações podem ser encontradas em nossa <a href=\"{docLink}\">documentation</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão do PHP ({version}) não é <a href=\"{phpLink}\">suportada pela PHP</a>. Nós o incentivamos a atualizar sua versão do PHP para tirar proveito de atualizações de desempenho e de segurança fornecidos pela PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não está acessando ownCloud de um proxy confiável, esta é uma questão de segurança e pode permitir a um invasor falsificar seu endereço IP como visível para ownCloud. Mais informações podem ser encontradas em nossa <a href=\"{docLink}\">documentação</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurado como cache distribuído, mas o módulo PHP errado \"memcache\" está instalado. \\OC\\Memcache\\Memcached somente suporta \"memcached\" e não \"memcache\". Veja o <a href=\"{wikiLink}\">memcached wiki sobre esse módulo</a>.", "Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O \"{header}\" cabeçalho HTTP não está configurado igual ao \"{expected}\". Este é um risco potencial para a segurança e recomendamos ajustar essa configuração.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho \"Transporte-de-Segurança-Restrita\"HTTP não está configurada para menos de \"{seconds}\" segundos. Para uma maior segurança recomendamos a ativação HSTS conforme descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.", @@ -166,6 +172,7 @@ "_download %n file_::_download %n files_" : ["baixar %n arquivo","baixar %n arquivos"], "{version} is available. Get more information on how to update." : "{version} está disponível. Obtenha mais informações sobre como atualizar.", "Updating {productName} to version {version}, this may take a while." : "Atualizando {productName} para a versão {version}, isso pode demorar um pouco.", + "An error occurred." : "Ocorreu um erro.", "Please reload the page." : "Por favor recarregue a página", "The update was unsuccessful. " : "A atualização não foi bem sucedida.", "The update was successful. There were warnings." : "A atualização foi bem sucedida. Havia advertências.", @@ -180,8 +187,8 @@ "New Password" : "Nova Senha", "Reset password" : "Redefinir senha", "Searching other places" : "Pesquisando em outros lugares", - "No search results in other places" : "Nenhum resultado de pesquisa em outros lugares", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultados da pesquisa em outros lugares","{count} resultados da pesquisa em outros lugares"], + "No search results in other folders" : "Nenhum resultado de pesquisa em outras pastas", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado da pesquisa em outras pastas","{count} resultados da pesquisa em outras pastas"], "Personal" : "Pessoal", "Users" : "Usuários", "Apps" : "Aplicações", diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js index 0db31437384..903124c6b63 100644 --- a/core/l10n/pt_PT.js +++ b/core/l10n/pt_PT.js @@ -71,6 +71,7 @@ OC.L10N.register( "Dec." : "Dez.", "Settings" : "Definições", "Saving..." : "A guardar ...", + "seconds ago" : "segundos atrás", "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?", @@ -149,6 +150,7 @@ OC.L10N.register( "Share with users or groups …" : "Partilhar com utilizadores ou grupos...", "Share with users, groups or remote users …" : "Partilhar com utilizadores, grupos ou utilizadores remotos...", "Warning" : "Aviso", + "Error while sending notification" : "Erro enquanto estava a enviar a notificação", "The object type is not specified." : "O tipo de objeto não está especificado.", "Enter new" : "Introduza novo", "Delete" : "Apagar", @@ -178,8 +180,6 @@ OC.L10N.register( "New Password" : "Nova palavra-passe", "Reset password" : "Repor palavra-passe", "Searching other places" : "A pesquisar noutros lugares", - "No search results in other places" : "Nenhuns resultados em outros locais", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de pesquisa noutros lugares","{count} resultados de pesquisa noutros lugares"], "Personal" : "Pessoal", "Users" : "Utilizadores", "Apps" : "Apps", diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json index 64b67ce8856..733f7375feb 100644 --- a/core/l10n/pt_PT.json +++ b/core/l10n/pt_PT.json @@ -69,6 +69,7 @@ "Dec." : "Dez.", "Settings" : "Definições", "Saving..." : "A guardar ...", + "seconds ago" : "segundos atrás", "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?", @@ -147,6 +148,7 @@ "Share with users or groups …" : "Partilhar com utilizadores ou grupos...", "Share with users, groups or remote users …" : "Partilhar com utilizadores, grupos ou utilizadores remotos...", "Warning" : "Aviso", + "Error while sending notification" : "Erro enquanto estava a enviar a notificação", "The object type is not specified." : "O tipo de objeto não está especificado.", "Enter new" : "Introduza novo", "Delete" : "Apagar", @@ -176,8 +178,6 @@ "New Password" : "Nova palavra-passe", "Reset password" : "Repor palavra-passe", "Searching other places" : "A pesquisar noutros lugares", - "No search results in other places" : "Nenhuns resultados em outros locais", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de pesquisa noutros lugares","{count} resultados de pesquisa noutros lugares"], "Personal" : "Pessoal", "Users" : "Utilizadores", "Apps" : "Apps", diff --git a/core/l10n/ro.js b/core/l10n/ro.js index 051f85db9b8..45f5cdece60 100644 --- a/core/l10n/ro.js +++ b/core/l10n/ro.js @@ -52,6 +52,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Setări", "Saving..." : "Se salvează...", + "seconds ago" : "secunde în urmă", "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "I know what I'm doing" : "Eu știu ce fac", "Password can not be changed. Please contact your administrator." : "Parola nu poate fi modificata. Vă rugăm să contactați administratorul dvs.", diff --git a/core/l10n/ro.json b/core/l10n/ro.json index db2280b78f1..1f85508c86e 100644 --- a/core/l10n/ro.json +++ b/core/l10n/ro.json @@ -50,6 +50,7 @@ "Dec." : "Dec.", "Settings" : "Setări", "Saving..." : "Se salvează...", + "seconds ago" : "secunde în urmă", "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "I know what I'm doing" : "Eu știu ce fac", "Password can not be changed. Please contact your administrator." : "Parola nu poate fi modificata. Vă rugăm să contactați administratorul dvs.", diff --git a/core/l10n/ru.js b/core/l10n/ru.js index 40019986dcc..ca13f012abc 100644 --- a/core/l10n/ru.js +++ b/core/l10n/ru.js @@ -2,6 +2,8 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Невозможно отправить письмо следующим пользователям: %s", + "Preparing update" : "Подготовка к обновлению", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Миграционные тесты пропущены - параметр \"update.skip-migration-test\" указан в config.php", "Turned on maintenance mode" : "Режим отладки включён", "Turned off maintenance mode" : "Режим отладки отключён", "Maintenance mode is kept active" : "Режим обслуживания оставлен включенным", @@ -11,13 +13,17 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Обновлено \"%s\" до %s", "Repair warning: " : "Предупреждение восстановления:", "Repair error: " : "Ошибка восстановления:", + "Set log level to debug - current level: \"%s\"" : "Установить отладочное журналирование - текущий уровень: \"%s\"", + "Reset log level to \"%s\"" : "Сбросить уровень журналирования в \"%s\"", "Following incompatible apps have been disabled: %s" : "Следующие несовместимые приложения были отключены: %s", "Following apps have been disabled: %s" : "Были отключены следующие приложения: %s", + "Already up to date" : "Не нуждается в обновлении", "File is too big" : "Файл слишком большой", "Invalid file provided" : "Указан неправильный файл", "No image or file provided" : "Не указано изображение или файл", "Unknown filetype" : "Неизвестный тип файла", "Invalid image" : "Некорректное изображение", + "An error occurred. Please contact your admin." : "Произошла ошибка. Пожалуйста, свяжитесь с Вашим администратором.", "No temporary profile picture available, try again" : "Временная картинка профиля недоступна, повторите попытку", "No crop data provided" : "Не указана информация о кадрировании", "No valid crop data provided" : "Не указаны корректные данные о кадрировании", @@ -36,6 +42,13 @@ OC.L10N.register( "Thu." : "Чт.", "Fri." : "Пт.", "Sat." : "Сб.", + "Su" : "Вс", + "Mo" : "Пн", + "Tu" : "Вт", + "We" : "Ср", + "Th" : "Чт", + "Fr" : "Пт", + "Sa" : "Сб", "January" : "Январь", "February" : "Февраль", "March" : "Март", @@ -62,6 +75,7 @@ OC.L10N.register( "Dec." : "Дек.", "Settings" : "Настройки", "Saving..." : "Сохранение...", + "seconds ago" : "несколько секунд назад", "Couldn't send reset email. Please contact your administrator." : "Не удалось отправить письмо для сброса пароля. Пожалуйста, свяжитесь с вашим администратором.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ссылка для сброса пароля была отправлена на ваш email. Если вы не получили письмо в течении разумного промежутка времени, проверьте папку спама.<br>Если его там нет, то обратитесь к вашему администратору.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваши файлы зашифрованы. Если вы не включили ключ восстановления, то ваши данные будут недоступны после сброса пароля.<br />Если вы не уверены что делать дальше - обратитесь к вашему администратору.<br />Вы действительно хотите продолжить?", @@ -97,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom не может быть прочитан PHP, что крайне нежелательно по причинам безопасности. Дополнительную информацию можно найти в a href=\"{docLink}\">документации</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версия PHP ({version}) более не <a href=\"{phpLink}\">поддерживается PHP</a>. Мы советуем Вам обновить Вашу версию PHP для получения обновлений производительности и безопасности, предоставляемых PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси сервера некорректна, либо Вы заходите в ownCloud через доверенный прокси. Если Вы не заходите в ownCloud через доверенный прокси, это может быть небезопасно, так как злоумышленник может подменить видимые Owncloud IP-адреса. Более подробную информацию можно найти в нашей <a href=\"{docLink}\">документации</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached настроен на распределенный кеш, но установлен не поддерживаемый модуль PHP \"memcache\". \\OC\\Memcache\\Memcached поддерживает только модуль \"memcached\"! Информацию о модулях читайте на странице <a href=\"{wikiLink}\">memcached</a>.", "Error occurred while checking server setup" : "Произошла ошибка при проверке настроек сервера", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Заголовок HTTP \"{header}\" не настроен на ожидаемый \"{expected}\". Это потенциальная проблема безопасности и мы рекомендуем изменить эти настройки.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Заголовок HTTP \"Strict-Transport-Security\" должен быть настроен хотя бы на \"{seconds}\" секунд. Для улучшения безопасности мы рекомендуем включить HSTS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.", @@ -136,12 +151,14 @@ OC.L10N.register( "change" : "изменить", "delete" : "удалить", "access control" : "контроль доступа", + "Share details could not be loaded for this item." : "Информация об общем доступе для этого элемента не может быть загружена.", "An error occured. Please try again" : "Произошла ошибка. Попробуйте ещё раз", "Share" : "Поделиться", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поделиться с людьми на других серверах ownCloud используя синтакс username@example.com/owncloud", "Share with users or groups …" : "Поделиться с пользователями или группами ...", "Share with users, groups or remote users …" : "Поделиться с пользователями, группами или удаленными пользователями ...", "Warning" : "Предупреждение", + "Error while sending notification" : "Ошибка отправки уведомления", "The object type is not specified." : "Тип объекта не указан", "Enter new" : "Ввести новое", "Delete" : "Удалить", @@ -157,11 +174,13 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["скачать %n файл","скачать %n файла","скачать %n файлов","скачать %n файлов"], "{version} is available. Get more information on how to update." : "Доступна версия {version}. Получить дополнительную информацию о порядке обновления.", "Updating {productName} to version {version}, this may take a while." : "Идет обновление {productName} до версии {version}, пожалуйста, подождите.", + "An error occurred." : "Произошла ошибка.", "Please reload the page." : "Обновите страницу.", "The update was unsuccessful. " : "Обновление не удалось.", "The update was successful. There were warnings." : "Обновление прошло успешно. Были предупреждения.", "The update was successful. Redirecting you to ownCloud now." : "Обновление прошло успешно. Перенаправляем в ownCloud.", "Couldn't reset password because the token is invalid" : "Невозможно сбросить пароль из-за неверного токена", + "Couldn't reset password because the token is expired" : "Не удается сбросить пароль, так как токен истек.", "Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Невозможно отправить письмо для сброса пароля, для вашей учетной записи не указан адрес электронной почты. Пожалуйста, свяжитесь с администратором.", "%s password reset" : "Сброс пароля %s", @@ -170,8 +189,8 @@ OC.L10N.register( "New Password" : "Новый пароль", "Reset password" : "Сбросить пароль", "Searching other places" : "Идет поиск в других местах", - "No search results in other places" : "В других местах ничего не найдено", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат поиска в других местах","{count} результата поиска в других местах","{count} результатов поиска в других местах","{count} результатов поиска в других местах"], + "No search results in other folders" : "Нет результатов поиска в других папках", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат в другой папке","{count} результата в другой папке","{count} результатов в другой папке","{count} результатов в другой папке"], "Personal" : "Личное", "Users" : "Пользователи", "Apps" : "Приложения", @@ -248,6 +267,10 @@ OC.L10N.register( "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Пожалуйста, свяжитесь с вашим администратором. Если вы администратор этого сервера, сконфигурируйте \"trusted_domain\" в config/config.php. Пример настройки можно найти в /config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "В зависимости от конфигурации, как администратор вы можете также внести домен в доверенные с помощью кнопки ниже.", "Add \"%s\" as trusted domain" : "Добавить \"%s\" как доверенный домен", + "App update required" : "Требуется обновление приложения", + "%s will be updated to version %s" : "%s будет обновлен до версии %s", + "These apps will be updated:" : "Следующие приложения будут обновлены:", + "These incompatible apps will be disabled:" : "Эти несовместимые приложения будут отключены:", "The theme %s has been disabled." : "Тема %s была отключена.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продолжением убедитесь, что вы сделали резервную копию базы данных, каталога конфигурации и каталога с данными.", "Start update" : "Запустить обновление", diff --git a/core/l10n/ru.json b/core/l10n/ru.json index 25c4313bd17..f00d40a16f9 100644 --- a/core/l10n/ru.json +++ b/core/l10n/ru.json @@ -1,5 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Невозможно отправить письмо следующим пользователям: %s", + "Preparing update" : "Подготовка к обновлению", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Миграционные тесты пропущены - параметр \"update.skip-migration-test\" указан в config.php", "Turned on maintenance mode" : "Режим отладки включён", "Turned off maintenance mode" : "Режим отладки отключён", "Maintenance mode is kept active" : "Режим обслуживания оставлен включенным", @@ -9,13 +11,17 @@ "Updated \"%s\" to %s" : "Обновлено \"%s\" до %s", "Repair warning: " : "Предупреждение восстановления:", "Repair error: " : "Ошибка восстановления:", + "Set log level to debug - current level: \"%s\"" : "Установить отладочное журналирование - текущий уровень: \"%s\"", + "Reset log level to \"%s\"" : "Сбросить уровень журналирования в \"%s\"", "Following incompatible apps have been disabled: %s" : "Следующие несовместимые приложения были отключены: %s", "Following apps have been disabled: %s" : "Были отключены следующие приложения: %s", + "Already up to date" : "Не нуждается в обновлении", "File is too big" : "Файл слишком большой", "Invalid file provided" : "Указан неправильный файл", "No image or file provided" : "Не указано изображение или файл", "Unknown filetype" : "Неизвестный тип файла", "Invalid image" : "Некорректное изображение", + "An error occurred. Please contact your admin." : "Произошла ошибка. Пожалуйста, свяжитесь с Вашим администратором.", "No temporary profile picture available, try again" : "Временная картинка профиля недоступна, повторите попытку", "No crop data provided" : "Не указана информация о кадрировании", "No valid crop data provided" : "Не указаны корректные данные о кадрировании", @@ -34,6 +40,13 @@ "Thu." : "Чт.", "Fri." : "Пт.", "Sat." : "Сб.", + "Su" : "Вс", + "Mo" : "Пн", + "Tu" : "Вт", + "We" : "Ср", + "Th" : "Чт", + "Fr" : "Пт", + "Sa" : "Сб", "January" : "Январь", "February" : "Февраль", "March" : "Март", @@ -60,6 +73,7 @@ "Dec." : "Дек.", "Settings" : "Настройки", "Saving..." : "Сохранение...", + "seconds ago" : "несколько секунд назад", "Couldn't send reset email. Please contact your administrator." : "Не удалось отправить письмо для сброса пароля. Пожалуйста, свяжитесь с вашим администратором.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ссылка для сброса пароля была отправлена на ваш email. Если вы не получили письмо в течении разумного промежутка времени, проверьте папку спама.<br>Если его там нет, то обратитесь к вашему администратору.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваши файлы зашифрованы. Если вы не включили ключ восстановления, то ваши данные будут недоступны после сброса пароля.<br />Если вы не уверены что делать дальше - обратитесь к вашему администратору.<br />Вы действительно хотите продолжить?", @@ -95,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom не может быть прочитан PHP, что крайне нежелательно по причинам безопасности. Дополнительную информацию можно найти в a href=\"{docLink}\">документации</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версия PHP ({version}) более не <a href=\"{phpLink}\">поддерживается PHP</a>. Мы советуем Вам обновить Вашу версию PHP для получения обновлений производительности и безопасности, предоставляемых PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси сервера некорректна, либо Вы заходите в ownCloud через доверенный прокси. Если Вы не заходите в ownCloud через доверенный прокси, это может быть небезопасно, так как злоумышленник может подменить видимые Owncloud IP-адреса. Более подробную информацию можно найти в нашей <a href=\"{docLink}\">документации</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached настроен на распределенный кеш, но установлен не поддерживаемый модуль PHP \"memcache\". \\OC\\Memcache\\Memcached поддерживает только модуль \"memcached\"! Информацию о модулях читайте на странице <a href=\"{wikiLink}\">memcached</a>.", "Error occurred while checking server setup" : "Произошла ошибка при проверке настроек сервера", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Заголовок HTTP \"{header}\" не настроен на ожидаемый \"{expected}\". Это потенциальная проблема безопасности и мы рекомендуем изменить эти настройки.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Заголовок HTTP \"Strict-Transport-Security\" должен быть настроен хотя бы на \"{seconds}\" секунд. Для улучшения безопасности мы рекомендуем включить HSTS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.", @@ -134,12 +149,14 @@ "change" : "изменить", "delete" : "удалить", "access control" : "контроль доступа", + "Share details could not be loaded for this item." : "Информация об общем доступе для этого элемента не может быть загружена.", "An error occured. Please try again" : "Произошла ошибка. Попробуйте ещё раз", "Share" : "Поделиться", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поделиться с людьми на других серверах ownCloud используя синтакс username@example.com/owncloud", "Share with users or groups …" : "Поделиться с пользователями или группами ...", "Share with users, groups or remote users …" : "Поделиться с пользователями, группами или удаленными пользователями ...", "Warning" : "Предупреждение", + "Error while sending notification" : "Ошибка отправки уведомления", "The object type is not specified." : "Тип объекта не указан", "Enter new" : "Ввести новое", "Delete" : "Удалить", @@ -155,11 +172,13 @@ "_download %n file_::_download %n files_" : ["скачать %n файл","скачать %n файла","скачать %n файлов","скачать %n файлов"], "{version} is available. Get more information on how to update." : "Доступна версия {version}. Получить дополнительную информацию о порядке обновления.", "Updating {productName} to version {version}, this may take a while." : "Идет обновление {productName} до версии {version}, пожалуйста, подождите.", + "An error occurred." : "Произошла ошибка.", "Please reload the page." : "Обновите страницу.", "The update was unsuccessful. " : "Обновление не удалось.", "The update was successful. There were warnings." : "Обновление прошло успешно. Были предупреждения.", "The update was successful. Redirecting you to ownCloud now." : "Обновление прошло успешно. Перенаправляем в ownCloud.", "Couldn't reset password because the token is invalid" : "Невозможно сбросить пароль из-за неверного токена", + "Couldn't reset password because the token is expired" : "Не удается сбросить пароль, так как токен истек.", "Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Невозможно отправить письмо для сброса пароля, для вашей учетной записи не указан адрес электронной почты. Пожалуйста, свяжитесь с администратором.", "%s password reset" : "Сброс пароля %s", @@ -168,8 +187,8 @@ "New Password" : "Новый пароль", "Reset password" : "Сбросить пароль", "Searching other places" : "Идет поиск в других местах", - "No search results in other places" : "В других местах ничего не найдено", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат поиска в других местах","{count} результата поиска в других местах","{count} результатов поиска в других местах","{count} результатов поиска в других местах"], + "No search results in other folders" : "Нет результатов поиска в других папках", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат в другой папке","{count} результата в другой папке","{count} результатов в другой папке","{count} результатов в другой папке"], "Personal" : "Личное", "Users" : "Пользователи", "Apps" : "Приложения", @@ -246,6 +265,10 @@ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Пожалуйста, свяжитесь с вашим администратором. Если вы администратор этого сервера, сконфигурируйте \"trusted_domain\" в config/config.php. Пример настройки можно найти в /config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "В зависимости от конфигурации, как администратор вы можете также внести домен в доверенные с помощью кнопки ниже.", "Add \"%s\" as trusted domain" : "Добавить \"%s\" как доверенный домен", + "App update required" : "Требуется обновление приложения", + "%s will be updated to version %s" : "%s будет обновлен до версии %s", + "These apps will be updated:" : "Следующие приложения будут обновлены:", + "These incompatible apps will be disabled:" : "Эти несовместимые приложения будут отключены:", "The theme %s has been disabled." : "Тема %s была отключена.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продолжением убедитесь, что вы сделали резервную копию базы данных, каталога конфигурации и каталога с данными.", "Start update" : "Запустить обновление", diff --git a/core/l10n/si_LK.js b/core/l10n/si_LK.js index dfdc037fb5a..3852cc7a3bf 100644 --- a/core/l10n/si_LK.js +++ b/core/l10n/si_LK.js @@ -41,6 +41,7 @@ OC.L10N.register( "Dec." : "දෙසැ.", "Settings" : "සිටුවම්", "Saving..." : "සුරැකෙමින් පවතී...", + "seconds ago" : "තත්පරයන්ට පෙර", "No" : "එපා", "Yes" : "ඔව්", "Choose" : "තෝරන්න", diff --git a/core/l10n/si_LK.json b/core/l10n/si_LK.json index 62387a67e3f..6289858021c 100644 --- a/core/l10n/si_LK.json +++ b/core/l10n/si_LK.json @@ -39,6 +39,7 @@ "Dec." : "දෙසැ.", "Settings" : "සිටුවම්", "Saving..." : "සුරැකෙමින් පවතී...", + "seconds ago" : "තත්පරයන්ට පෙර", "No" : "එපා", "Yes" : "ඔව්", "Choose" : "තෝරන්න", diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js index 075694831e2..044f126f353 100644 --- a/core/l10n/sk_SK.js +++ b/core/l10n/sk_SK.js @@ -67,6 +67,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Nastavenia", "Saving..." : "Ukladám...", + "seconds ago" : "pred sekundami", "Couldn't send reset email. Please contact your administrator." : "Nemožno poslať email pre obnovu. Kontaktujte prosím vášho administrátora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovu hesla bol odoslaný na váš email. Pokiaľ ho neobdržíte v primeranom čase, skontrolujte spam / priečinok nevyžiadanej pošty. <br> Ak tam nie je, kontaktujte svojho administrátora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?", @@ -166,8 +167,6 @@ OC.L10N.register( "New Password" : "Nové heslo", "Reset password" : "Obnovenie hesla", "Searching other places" : "Prehľadanie ostatných umiestnení", - "No search results in other places" : "Žiadne výsledky z prehľadávania v ostatných umiestneniach", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} výsledok v ostatných umiestneniach","{count} výsledky v ostatných umiestneniach","{count} výsledkov v ostatných umiestneniach"], "Personal" : "Osobné", "Users" : "Používatelia", "Apps" : "Aplikácie", diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json index c9ab6cfacc3..7938364de5f 100644 --- a/core/l10n/sk_SK.json +++ b/core/l10n/sk_SK.json @@ -65,6 +65,7 @@ "Dec." : "Dec.", "Settings" : "Nastavenia", "Saving..." : "Ukladám...", + "seconds ago" : "pred sekundami", "Couldn't send reset email. Please contact your administrator." : "Nemožno poslať email pre obnovu. Kontaktujte prosím vášho administrátora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovu hesla bol odoslaný na váš email. Pokiaľ ho neobdržíte v primeranom čase, skontrolujte spam / priečinok nevyžiadanej pošty. <br> Ak tam nie je, kontaktujte svojho administrátora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?", @@ -164,8 +165,6 @@ "New Password" : "Nové heslo", "Reset password" : "Obnovenie hesla", "Searching other places" : "Prehľadanie ostatných umiestnení", - "No search results in other places" : "Žiadne výsledky z prehľadávania v ostatných umiestneniach", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} výsledok v ostatných umiestneniach","{count} výsledky v ostatných umiestneniach","{count} výsledkov v ostatných umiestneniach"], "Personal" : "Osobné", "Users" : "Používatelia", "Apps" : "Aplikácie", diff --git a/core/l10n/sl.js b/core/l10n/sl.js index b0edc70f232..fd415376b14 100644 --- a/core/l10n/sl.js +++ b/core/l10n/sl.js @@ -54,6 +54,7 @@ OC.L10N.register( "Dec." : "dec", "Settings" : "Nastavitve", "Saving..." : "Poteka shranjevanje ...", + "seconds ago" : "pred nekaj sekundami", "Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Povezava za ponastavitev gesla je bila poslana na naveden elektronski naslov. V kolikor sporočila ne dobite v kratkem, preverite tudi mapo neželene pošte.<br> Če sporočila ni niti v tej mapi, stopite v stik s skrbnikom.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?", diff --git a/core/l10n/sl.json b/core/l10n/sl.json index 5e720949dd1..df0ec47a292 100644 --- a/core/l10n/sl.json +++ b/core/l10n/sl.json @@ -52,6 +52,7 @@ "Dec." : "dec", "Settings" : "Nastavitve", "Saving..." : "Poteka shranjevanje ...", + "seconds ago" : "pred nekaj sekundami", "Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Povezava za ponastavitev gesla je bila poslana na naveden elektronski naslov. V kolikor sporočila ne dobite v kratkem, preverite tudi mapo neželene pošte.<br> Če sporočila ni niti v tej mapi, stopite v stik s skrbnikom.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?", diff --git a/core/l10n/sq.js b/core/l10n/sq.js index 70633586661..1df18f40ab5 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -1,32 +1,51 @@ OC.L10N.register( "core", { - "Couldn't send mail to following users: %s " : "Nuk mund ti dërgoj e-mail këtyre përdoruesve: %s", + "Couldn't send mail to following users: %s " : "S’u dërgua dot e-mail përdoruesve vijues: %s ", + "Preparing update" : "Po përgatitet përditësimi", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Testet e migrimit janë anashkaluar - \"update.skip-migration-test\" është aktivizuar te config.php", "Turned on maintenance mode" : "Mënyra e mirëmbajtjes u aktivizua", "Turned off maintenance mode" : "Mënyra e mirëmbajtjes u çaktivizua", - "Updated database" : "Database-i u azhurnua", - "Checked database schema update" : "Përditësim i skemës së kontrolluar të bazës së të dhënave", - "Checked database schema update for apps" : "Përditësim i skemës së kontrolluar të bazës së të dhënave për aplikacionet", + "Maintenance mode is kept active" : "Mënyra mirëmbajtje është mbajtur e aktivizuar", + "Updated database" : "U përditësua baza e të dhënave", + "Checked database schema update" : "U kontrollua përditësimi i skemës së bazës së të dhënave", + "Checked database schema update for apps" : "U kontrollua përditësimi i skemës së bazës së të dhënave për aplikacionet", "Updated \"%s\" to %s" : "U përditësua \"%s\" në %s", - "No image or file provided" : "Nuk është dhënë asnjë imazh apo skedar", - "Unknown filetype" : "Tip i panjohur skedari", - "Invalid image" : "Imazh i pavlefshëm", - "No temporary profile picture available, try again" : "Nuk është i mundur asnjë imazh profili i përkohshëm, provoni përsëri", - "No crop data provided" : "Nuk është dhënë asnjë parametër prerjeje", - "Sunday" : "E djelë", + "Repair warning: " : "Sinjalizim ndreqjeje: ", + "Repair error: " : "Gabim ndreqjeje: ", + "Set log level to debug - current level: \"%s\"" : "Caktoni debug si nivel regjistri - niveli i tanishëm: \"%s\"", + "Reset log level to \"%s\"" : "Riktheni nivel regjistri në \"%s\"", + "Following incompatible apps have been disabled: %s" : "Janë çaktivizuar aplikacionet e papërputhshme vijuese: %s", + "Following apps have been disabled: %s" : "Janë çaktivizuar aplikacionet vijuese : %s", + "Already up to date" : "Tashmë e përditësuar", + "File is too big" : "Kartela është shumë e madhe", + "Invalid file provided" : "U dha kartelë e pavlefshme", + "No image or file provided" : "S’u dha figurë apo kartelë", + "Unknown filetype" : "Lloj i panjohur kartele", + "Invalid image" : "Figurë e pavlefshme", + "An error occurred. Please contact your admin." : "Ndodhi një gabim. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "No temporary profile picture available, try again" : "S’ka gati foto të përkohshme profili, riprovoni", + "Sunday" : "E dielë", "Monday" : "E hënë", "Tuesday" : "E martë", "Wednesday" : "E mërkurë", "Thursday" : "E enjte", "Friday" : "E premte", "Saturday" : "E shtunë", - "Sun." : "Djelë", - "Mon." : "Hën", - "Tue." : "Mar", - "Wed." : "Mër", - "Thu." : "Enj", - "Fri." : "Pre", - "Sat." : "Shtu", + "Sun." : "Die.", + "Mon." : "Hën.", + "Tue." : "Mar.", + "Wed." : "Mër.", + "Thu." : "Enj.", + "Fri." : "Pre.", + "Sat." : "Sht.", + "Su" : "Di", + "Mo" : "Hë", + "Tu" : "Ma", + "We" : "Më", + "Th" : "En", + "Fr" : "Pr", + "Sa" : "Sh", "January" : "Janar", "February" : "Shkurt", "March" : "Mars", @@ -39,170 +58,221 @@ OC.L10N.register( "October" : "Tetor", "November" : "Nëntor", "December" : "Dhjetor", - "Jan." : "Jan", - "Feb." : "Shk", - "Mar." : "Mar", - "Apr." : "Pri", - "May." : "Maj", - "Jun." : "Qer", - "Jul." : "Kor", - "Aug." : "Gush", - "Sep." : "Shta", - "Oct." : "Tet", - "Nov." : "Nën", - "Dec." : "Dhje", - "Settings" : "Parametra", - "Saving..." : "Duke ruajtur...", - "Couldn't send reset email. Please contact your administrator." : "Emaili i rivendosjes nuk mund të dërgohet. Ju lutem kontaktoni me administratorin.", - "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lidhja për rivendosjen e kodit tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme spam.<br>Nëse nuk është as aty, pyesni administratorin tuaj.", - "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Skedarët tuaj janë të kodifikuar. Nëse nuk keni aktivizuar çelësin e restaurimit, të dhënat tuaja nuk do të jenë të arritshme pasi të keni rivendosur kodin.<br />Nëse nuk jeni i sigurt, ju lutemi kontaktoni administratorin tuaj përpara se të vazhdoni. Jeni i sigurt që dëshironi të vazhdoni?", - "I know what I'm doing" : "Unë e di se çfarë po bëj", - "Password can not be changed. Please contact your administrator." : "Fjalëkalimi nuk mund të ndryshohet. Ju lutem kontaktoni me administratorin.", + "Jan." : "Jan.", + "Feb." : "Shk.", + "Mar." : "Mar.", + "Apr." : "Pri.", + "May." : "Maj.", + "Jun." : "Qer.", + "Jul." : "Kor.", + "Aug." : "Gus.", + "Sep." : "Sht.", + "Oct." : "Tet.", + "Nov." : "Nën.", + "Dec." : "Dhj.", + "Settings" : "Rregullime", + "Saving..." : "Po ruhet …", + "seconds ago" : "sekonda më parë", + "Couldn't send reset email. Please contact your administrator." : "S’u dërgua dot email-i i ricaktimit. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lidhja për ricaktimin e fjalëkalimi tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme/postës së pavlerë.<br>Nëse s’është as aty, pyetni përgjegjësin tuaj lokal.", + "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?", + "I know what I'm doing" : "E di se ç’bëj", + "Password can not be changed. Please contact your administrator." : "Fjalëkalimi nuk mund të ndryshohet. Ju lutemi, lidhuni me përgjegjësin tuaj.", "No" : "Jo", "Yes" : "Po", - "Choose" : "Zgjidh", - "Error loading file picker template: {error}" : "Gabim gjatë ngarkimit të shabllonit të zgjedhësit të skedarëve: {error}", + "Choose" : "Zgjidhni", + "Error loading file picker template: {error}" : "Gabim në ngarkimin e gjedhes së marrësit të kartelave: {error}", "Ok" : "Në rregull", - "Error loading message template: {error}" : "Gabim gjatë ngarkimit të shabllonit të mesazheve: {error}", - "_{count} file conflict_::_{count} file conflicts_" : ["{count} konflikt skedari","{count} konflikte skedarësh"], - "One file conflict" : "Një konflikt skedari", - "New Files" : "Skedarë të rinj", - "Already existing files" : "Skedarë ekzistues", - "Which files do you want to keep?" : "Cilët skedarë dëshironi të mbani?", - "If you select both versions, the copied file will have a number added to its name." : "Nëse i zgjidhni të dyja versionet, skedarit të kopjuar do ti shtohet një numër në emrin e tij.", - "Cancel" : "Anulo", + "Error loading message template: {error}" : "Gabim gjatë ngarkimit të gjedhes së mesazheve: {error}", + "read-only" : "vetëm për lexim", + "_{count} file conflict_::_{count} file conflicts_" : ["{count} përplasje kartelash","{count} përplasje kartelash"], + "One file conflict" : "Një përplasje kartele", + "New Files" : "Kartela të Reja", + "Already existing files" : "Kartela ekzistuese", + "Which files do you want to keep?" : "Cilat kartela doni të mbani?", + "If you select both versions, the copied file will have a number added to its name." : "Nëse përzgjidhni të dy versionet, kartelës së kopjuar do t’i shtohet një numër në emrin e saj.", + "Cancel" : "Anuloje", "Continue" : "Vazhdo", - "(all selected)" : "(të gjitha të zgjedhura)", - "({count} selected)" : "({count} të zgjedhur)", - "Error loading file exists template" : "Gabim gjatë ngarkimit të shabllonit të skedarit ekzistues", + "(all selected)" : "(krejt të përzgjedhurat)", + "({count} selected)" : "({count} të përzgjedhura)", + "Error loading file exists template" : "Gabim në ngarkimin e gjedhes kartela ekziston", "Very weak password" : "Fjalëkalim shumë i dobët", "Weak password" : "Fjalëkalim i dobët", - "So-so password" : "Fjalëkalim i pranueshëm", + "So-so password" : "Fjalëkalim çka", "Good password" : "Fjalëkalim i mirë", - "Strong password" : "Fjalëkalim shumë i mirë", - "Error occurred while checking server setup" : "Gabim gjatë kontrollit të konfigurimit të serverit", + "Strong password" : "Fjalëkalim i fortë", + "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Shërbyesi juaj web ende s’është rregulluar për të lejuar njëkohësim kartelash, ngaqë ndërfaqja WebDAV duket se është e dëmtuar.", + "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ky shërbyes nuk ka lidhje Internet që funksionon. Kjo do të thotë që disa prej veçorive, të tilla si montimi i depozitave të jashtme, njoftimet mbi përditësime apo instalim aplikacionesh nga palë të treta, s’do të funksionojnë. Edhe hyrja në kartela së largëti, apo dërgimi i email-eve për njoftime mund të mos funksionojnë. Këshillojmë të aktivizoni për këtë shërbyes lidhjen në Internet, nëse doni t’i keni krejt këto veçori.", + "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti. Kartela .htaccess s’funksionon. Këshillojmë me forcë që ta formësoni shërbyesin tuaj web në një mënyrë që drejtoria e të dhënave të mos lejojë më hyrje, ose ta zhvendosni drejtorinë e të dhënave jashtë rrënjës së dokumenteve të shërbyesit web.", + "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "S’ka të formësuar fshehtinë kujtese. Që të shtoni suksesshmërinë e shërbyesit tuaj, ju lutemi, formësoni një memcache, në mundet. Të dhëna të mëtejshme mund të gjenden te <a href=\"{docLink}\">dokumentimi</a> ynë.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom s’është i lexueshëm nga PHP-ja, çka shkëshillohet me forcë, për arsye sigurie. Më tepër informacion mund të gjendet te <a href=\"{docLink}\">dokumentimi</a> ynë.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Versioni juaj i PHP -së ({version}) nuk <a href=\"{phpLink}\">mbulohet më nga PHP-ja</a>. Ju nxisim ta përmirësoni PHP-në me një version të ri që të përfitoni nga përditësimi i punimit dhe sigurisë të ofruara nga PHP-ja.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a href=\"{docLink}\">dokumentimi</a> ynë.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached është formësuar si fshehtinë e shpërndarë, por është instaluar moduli i gabuar PHP \"memcache\". \\OC\\Memcache\\Memcached mbulon vetëm \"memcached\" dhe jo \"memcache\". Shihni <a href=\"{wikiLink}\">memcached wiki për të dy modulet</a>.", + "Error occurred while checking server setup" : "Ndodhi një gabim gjatë kontrollit të rregullimit të shërbyesit", + "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Kryet HTTP \"{header}\" s’është formësuar të jetë i njëjtë me \"{expected}\". Ky është një rrezik potencial sigurie dhe privatësie dhe këshillojmë të ndreqet ky rregullim.", + "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Kryet HTTP \"Strict-Transport-Security\" s’është formësuar të paktën \"{seconds}\". Për siguri të thelluar këshillojmë aktivizimin e HSTS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.", + "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Po e përdorni këtë sajt përmes HTTP-je. Këshillojmë me forcë ta formësoni shërbyesin tuaj të kërkojë medoemos përdorimin e HTTPS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.", "Shared" : "Ndarë", "Shared with {recipients}" : "Ndarë me {recipients}", - "Error" : "Veprim i gabuar", - "Error while sharing" : "Veprim i gabuar gjatë ndarjes", - "Error while unsharing" : "Veprim i gabuar gjatë heqjes së ndarjes", - "Error while changing permissions" : "Veprim i gabuar gjatë ndryshimit të lejeve", - "Error setting expiration date" : "Veprim i gabuar gjatë caktimit të datës së përfundimit", - "The public link will expire no later than {days} days after it is created" : "Lidhja publike do të skadojë jo më vonë se {days} ditë pas krijimit", - "Set expiration date" : "Cakto datën e përfundimit", - "Expiration" : "Data e skadimit", - "Expiration date" : "Data e përfundimit", - "Sending ..." : "Duke dërguar...", + "Error" : "Gabim", + "Error while sharing" : "Gabim gjatë ndarjes", + "Error while unsharing" : "Gabim gjatë heqjes së ndarjes", + "Error while changing permissions" : "Gabim gjatë ndryshimit të lejeve", + "Error setting expiration date" : "Gabim në caktimin e datës së skadimit", + "The public link will expire no later than {days} days after it is created" : "Lidhja publike do të skadojë jo më vonë se {days} ditë pas krijimit të saj", + "Set expiration date" : "Caktoni datë skadimi", + "Expiration" : "Skadim", + "Expiration date" : "Datë skadimi", + "Sending ..." : "Po dërgohet …", "Email sent" : "Email-i u dërgua", - "Resharing is not allowed" : "Rindarja nuk lejohet", - "Share link" : "Ndaje lidhjen", - "Password protect" : "Mbro me kod", - "Password" : "Kodi", + "Resharing is not allowed" : "Nuk lejohen rindarjet", + "Share link" : "Lidhje ndarjeje", + "Link" : "Lidhje", + "Password protect" : "Mbroje me fjalëkalim", + "Password" : "Fjalëkalim", "Choose a password for the public link" : "Zgjidhni një fjalëkalim për lidhjen publike", - "Email link to person" : "Dërgo email me lidhjen", - "Send" : "Dërgo", + "Allow editing" : "Lejo përpunim", + "Email link to person" : "Dërgoja personit lidhjen me email", + "Send" : "Dërgoje", "Shared with you and the group {group} by {owner}" : "Ndarë me ju dhe me grupin {group} nga {owner}", "Shared with you by {owner}" : "Ndarë me ju nga {owner}", "Shared in {item} with {user}" : "Ndarë në {item} me {user}", - "group" : "grupi", + "group" : "grup", + "remote" : "i largët", "notify by email" : "njofto me email", - "Unshare" : "Hiq ndarjen", + "Unshare" : "Hiqe ndarjen", "can share" : "mund të ndajnë", - "can edit" : "mund të ndryshosh", - "create" : "krijo", - "delete" : "elimino", - "access control" : "kontrollimi i hyrjeve", - "Share" : "Nda", + "can edit" : "mund të përpunojnë", + "create" : "krijoje", + "change" : "ndërroje", + "delete" : "fshije", + "access control" : "kontroll hyrjesh", + "Share details could not be loaded for this item." : "Për këtë objekt s’u ngarkuan dot hollësi ndarjeje.", + "An error occured. Please try again" : "Ndodhi një gabim. Ju lutemi, riprovoni", + "Share" : "Ndaje", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Ndajeni me persona në ownCloud-e të tjera duke përdorur sintaksën username@example.com/owncloud", + "Share with users or groups …" : "Ndajeni me përdorues ose grupe …", + "Share with users, groups or remote users …" : "Ndajeni me përdorues, grupe ose përdorues të largët …", "Warning" : "Kujdes", - "The object type is not specified." : "Nuk është specifikuar tipi i objektit.", - "Enter new" : "Jep të re", - "Delete" : "Elimino", - "Add" : "Shto", - "Edit tags" : "Modifiko tag", - "Error loading dialog template: {error}" : "Gabim gjatë ngarkimit të shabllonit: {error}", - "No tags selected for deletion." : "Nuk është zgjedhur asnjë tag për fshirje.", + "Error while sending notification" : "Gabim gjatë dërgimit të njoftimit", + "The object type is not specified." : "S’është specifikuar lloji i objektit.", + "Enter new" : "Jep të ri", + "Delete" : "Fshije", + "Add" : "Shtoni", + "Edit tags" : "Përpunoni etiketa", + "Error loading dialog template: {error}" : "Gabim gjatë ngarkimit të gjedhes së dialogut: {error}", + "No tags selected for deletion." : "S’u përzgjodhën etiketa fshirje.", "unknown text" : "tekst i panjohur", - "Hello world!" : "Përshendetje të gjithëve!", - "sunny" : "diell", - "Hello {name}, the weather is {weather}" : "Përshëndetje {name}, koha është {weather}", - "_download %n file_::_download %n files_" : ["shkarko %n skedar","shkarko %n skedarë"], - "Updating {productName} to version {version}, this may take a while." : "Po përditësoj {productName} në versionin {version}, kjo mund të zgjasë pak.", - "Please reload the page." : "Ju lutem ringarkoni faqen.", - "The update was successful. Redirecting you to ownCloud now." : "Azhurnimi u krye. Tani do t'ju kaloj tek ownCloud-i.", - "Couldn't reset password because the token is invalid" : "Nuk mund të rivendos fjalëkalimin sepse shenja është e pavlefshme.", - "Couldn't send reset email. Please make sure your username is correct." : "Emaili i rivendosjes nuk mund të dërgohet. Ju lutem sigurohuni që përdoruesi juaj është i saktë.", - "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Emaili i rivendosjes nuk mund të dërgohet sepse nuk ekziston asnjë adresë email për këtë përdorues. Ju lutem kontaktoni me administratorin.", - "%s password reset" : "Kodi i %s -it u rivendos", - "Use the following link to reset your password: {link}" : "Përdorni lidhjen në vijim për të rivendosur kodin: {link}", - "New password" : "Kodi i ri", - "New Password" : "Fjalëkalim i ri", - "Reset password" : "Rivendos kodin", + "Hello world!" : "Hello world!", + "sunny" : "me diell", + "Hello {name}, the weather is {weather}" : "Tungjatjeta {name}, koha është {weather}", + "Hello {name}" : "Tungjatjeta {name}", + "_download %n file_::_download %n files_" : ["shkarko %n kartelë","shkarko %n kartela"], + "{version} is available. Get more information on how to update." : "Është gati {version}. Merrni më tepër informacion se si ta përditësoni.", + "Updating {productName} to version {version}, this may take a while." : "Po përditësohet {productName} me versionin {version}, kjo mund të zgjasë pak.", + "An error occurred." : "Ndodhi një gabim.", + "Please reload the page." : "Ju lutemi, ringarkoni faqen.", + "The update was unsuccessful. " : "Përditësimi qe i pasuksesshëm. ", + "The update was successful. There were warnings." : "Përditësimi qe i suksesshëm. Pati sinjalizime.", + "The update was successful. Redirecting you to ownCloud now." : "Përditësimi qe i suksesshëm. Po ridrejtoheni te ownCloud-i.", + "Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm", + "Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar", + "Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.", + "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "%s password reset" : "U ricaktua fjalëkalimi për %s", + "Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}", + "New password" : "Fjalëkalim i ri", + "New Password" : "Fjalëkalim i Ri", + "Reset password" : "Ricaktoni fjalëkalimin", + "Searching other places" : "Po kërkohet në vende të tjera", + "No search results in other folders" : "S’u gjetën përfundime në dosje të tjera", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} përfundim kërkimi në një tjetër dosje","{count} përfundime kërkimi në dosje të tjera"], "Personal" : "Personale", - "Users" : "Përdoruesit", - "Apps" : "App", + "Users" : "Përdorues", + "Apps" : "Aplikacione", "Admin" : "Admin", "Help" : "Ndihmë", - "Error loading tags" : "Gabim gjatë ngarkimit të etiketave.", + "Error loading tags" : "Gabim gjatë ngarkimit të etiketave", "Tag already exists" : "Etiketa ekziston", "Error deleting tag(s)" : "Gabim gjatë fshirjes së etiketës(ave)", "Error tagging" : "Gabim etiketimi", "Error untagging" : "Gabim në heqjen e etiketës", - "Error favoriting" : "Gabim në ruajtjen si të preferuar", - "Error unfavoriting" : "Gabim në heqjen nga të preferuarat", + "Error favoriting" : "Gabim në ruajtjen si të parapëlqyer", + "Error unfavoriting" : "Gabim në heqjen nga të parapëlqyerat", "Access forbidden" : "Ndalohet hyrja", - "File not found" : "Skedari nuk mund të gjendet", - "The specified document has not been found on the server." : "Dokumenti i përcaktuar nuk mund të gjendet në server.", - "You can click here to return to %s." : "Ju mund të klikoni këtu për tu kthyer në %s.", - "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Tungjatjeta,\n\nju njoftojmë se %s ka ndarë %s me ju.\nShikojeni në: %s\n\n", - "The share will expire on %s." : "Ndarja do të skadojë në %s.", - "Cheers!" : "Gjithë të mirat", - "Internal Server Error" : "Gabim i brendshëm në server", - "The server encountered an internal error and was unable to complete your request." : "Serveri u përball me një gabim të brendshem dhe nuk mundet të mbarojë detyrën që i keni ngarkuar.", - "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Ju lutem kontaktoni me administratorin e serverit nëse ky gabim shfaqet herë të tjera, ju lutem përfshini dhe detajet e mëposhtme teknike në raportin tuaj.", - "More details can be found in the server log." : "Detaje të mëtejshme mund të gjenden në listën e veprimeve të serverit.", - "Technical details" : "Detaje teknike", - "Remote Address: %s" : "Adresa tjetër: %s", - "Request ID: %s" : "ID e kërkesës: %s", - "Code: %s" : "Kodi: %s", - "Message: %s" : "Mesazhi: %s", - "File: %s" : "Skedari: %s", - "Line: %s" : "Rreshti: %s", + "File not found" : "S’u gjet kartelë", + "The specified document has not been found on the server." : "Dokumenti i përcaktuar s’u gjet në shërbyes.", + "You can click here to return to %s." : "Mund të klikoni këtu për t’u kthyer te %s.", + "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që %s ndau me ju %s.\nShiheni: %s\n\n", + "The share will expire on %s." : "Ndarja do të skadojë më %s.", + "Cheers!" : "Gëzuar!", + "Internal Server Error" : "Gabim i Brendshëm Shërbyesi", + "The server encountered an internal error and was unable to complete your request." : "Shërbyesi hasi një gabim të brendshëm dhe s’qe në gjendje të plotësojë kërkesën tuaj.", + "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Nëse ky gabim shfaqet shumë herë, ju lutemi, lidhuni me përgjegjësin e shërbyesit, dhe përfshini hollësitë teknike më poshtë në njoftimin tuaj.", + "More details can be found in the server log." : "Më tepër hollësi mund të gjenden në regjistrin e shërbyesit.", + "Technical details" : "Hollësi teknike", + "Remote Address: %s" : "Adresë e Largët: %s", + "Request ID: %s" : "ID Kërkese: %s", + "Type: %s" : "Lloj: %s", + "Code: %s" : "Kod: %s", + "Message: %s" : "Mesazh: %s", + "File: %s" : "Kartelë: %s", + "Line: %s" : "Rresht: %s", "Trace" : "Gjurmim", - "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Dosja dhe skedarët e të dhënave tuaja mbase janë të arritshme nga interneti sepse skedari .htaccess nuk po punon.", - "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Për më shumë informacion mbi konfigurimin e duhur të serverit tuaj, ju lutem shikoni <a href=\"%s\" target=\"_blank\">dokumentacionin</a>.", - "Create an <strong>admin account</strong>" : "Krijo një <strong>llogari administruesi</strong>", - "Username" : "Përdoruesi", - "Storage & database" : "Ruajtja dhe baza e të dhënave", - "Data folder" : "Emri i dosjes", - "Configure the database" : "Konfiguro database-in", - "Only %s is available." : "Vetëm %s është e disponueshme.", - "Database user" : "Përdoruesi i database-it", - "Database password" : "Kodi i database-it", - "Database name" : "Emri i database-it", + "Security warning" : "Sinjalizim sigurie", + "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti, ngaqë kartela .htaccess s’funksionon.", + "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Për të dhëna se si të formësohet si duhet shërbyesi juaj, ju lutemi, shihni <a href=\"%s\" target=\"_blank\">dokumentimin</a>.", + "Create an <strong>admin account</strong>" : "Krijoni një <strong>llogari administruesi</strong>", + "Username" : "Emër përdoruesi", + "Storage & database" : "Depozitë & bazë të dhënash", + "Data folder" : "Dosje të dhënash", + "Configure the database" : "Formësoni bazën e të dhënave", + "Only %s is available." : "Vetëm %s është gati.", + "Install and activate additional PHP modules to choose other database types." : "Që të zgjidhni të tjera lloje bazash të dhënash, instaloni dhe aktivizoni module PHP shtesë.", + "For more details check out the documentation." : "Për më tepër të dhëna shihni dokumentimin.", + "Database user" : "Përdorues baze të dhënash", + "Database password" : "Fjalëkalim baze të dhënash", + "Database name" : "Emër baze të dhënash", "Database tablespace" : "Tablespace-i i database-it", - "Database host" : "Pozicioni (host) i database-it", - "Finish setup" : "Mbaro setup-in", - "Finishing …" : "Duke përfunduar ...", - "Log out" : "Dalje", + "Database host" : "Strehë baze të dhënash", + "Performance warning" : "Sinjalizim funksionimi", + "SQLite will be used as database." : "Si bazë të dhënash do të përdoret SQL-ja.", + "For larger installations we recommend to choose a different database backend." : "Për instalime më të mëdha këshillojmë të zgjidhni një tjetër program shërbyesi baze të dhënash.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Përdorimi i SQLite-it shkëshillohet veçanërisht, kur për njëkohësim kartelash përdoret klienti desktop.", + "Finish setup" : "Përfundoje rregullimin", + "Finishing …" : "Po përfundohet …", + "Need help?" : "Ju duhet ndihmë?", + "See the documentation" : "Shihni dokumentimin", + "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Ky aplikacion lyp JavaScript për punim të saktë. Ju lutemi, {linkstart}aktivizoni JavaScript-in{linkend} dhe ringarkoni faqen.", + "Log out" : "Dilni", "Search" : "Kërko", - "Server side authentication failed!" : "Verifikimi në krahun e serverit dështoi!", - "Please contact your administrator." : "Ju lutem kontaktoni administratorin.", - "Log in" : "Hyrje", - "remember" : "kujto", - "Alternative Logins" : "Hyrje alternative", - "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Tungjatjeta,<br><br>dëshirojmë t'ju njoftojmë se %s ka ndarë <strong>%s</strong> me ju.<br><a href=\"%s\">Klikoni këtu për ta shikuar!</a><br>", + "Server side authentication failed!" : "Mirëfilltësimi më anë të shërbyesit dështoi!", + "Please contact your administrator." : "Ju lutemi, lidhuni me përgjegjësin tuaj.", + "An internal error occured." : "Ndodhi një gabim i brendshëm.", + "Please try again or contact your administrator." : "Ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj.", + "Log in" : "Hyni", + "Wrong password. Reset it?" : "Fjalëkalim i gabuar. Të ricaktohet?", + "remember" : "mbaje mend", + "Alternative Logins" : "Hyrje Alternative", + "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Njatjeta,<br><br>thjesht po ju bëjmë të ditur që %s ndau me ju <strong>%s</strong>.<br><a href=\"%s\">Shiheni!</a><br><br>", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", - "This means only administrators can use the instance." : "Kjo dmth që vetëm administratorët mund të shfrytëzojnë instancën.", - "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktoni administratorin e sistemit nëse ky mesazh vazhdon ose është shfaqur papritmas.", - "Thank you for your patience." : "Ju faleminderit për durimin tuaj.", - "You are accessing the server from an untrusted domain." : "Ju po qaseni në server nga një domain jo i besuar.", - "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Ju lutem kontaktoni me administratorin. Nëse jeni administrator i kësaj instance, konfiguroni parametrin \"domain i besuar\" në config/config.php . Një konfigurim shembull është dhënë në config/config.sample.php", - "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Në varësi të konfigurimit tuaj, ju si administrator mundet gjithashtu të jeni i aftë të përdorni butonin e mëposhtëm për ti dhënë besim këtij domain.", - "Add \"%s\" as trusted domain" : "Shtoni \"%s\" si domain të besuar", - "The theme %s has been disabled." : "Tema %s u bllokua.", - "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Ju lutem sigurohuni që bazës së të dhënave, dosjes së konfigurimit dhe dosjes së të dhënave ti jetë bërë një kopje rezervë përpara se të vazhdoni më tutje.", - "Start update" : "Fillo përditësimin.", - "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Për të shmangur momente bllokimi gjatë punës me instalime të mëdha, në vend të kësaj ju mund të kryeni komandën e mëposhtme nga dosja juaj e instalimit:", - "This page will refresh itself when the %s instance is available again." : "Kjo faqe do të ringarkohet automatikisht kur instanca %s të jetë sërish e disponueshme." + "This means only administrators can use the instance." : "Kjo do të thotë që instancën mund ta përdorin vetëm administratorët.", + "Contact your system administrator if this message persists or appeared unexpectedly." : "Nëse ky mesazh shfaqet vazhdimisht ose u shfaq papritmas, lidhuni me përgjegjësin e sistemit.", + "Thank you for your patience." : "Ju faleminderit për durimin.", + "You are accessing the server from an untrusted domain." : "Po hyni në shërbyes nga një përkatësi jo e besuar.", + "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Ju lutemi, lidhuni me përgjegjësin tuaj. Nëse jeni një përgjegjës në këtë instancë, formësoni rregullimin \"trusted_domain\" te config/config.php. Një formësim shembull jepet te config/config.sample.php.", + "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Në varësi të formësimit tuaj, si administrator mundet gjithashtu të jeni në gjendje të përdorni butonin më poshtë për ta besuar këtë përkatësi.", + "Add \"%s\" as trusted domain" : "Shtojeni \"%s\" si përkatësi të besuar", + "App update required" : "Lypset përditësim aplikacioni", + "%s will be updated to version %s" : "%s do të përditësohet me versionin %s", + "These apps will be updated:" : "Do të përditësohen këto aplikacione:", + "These incompatible apps will be disabled:" : "Do të çaktivizohen këto aplikacione të papërputhshme:", + "The theme %s has been disabled." : "Tema %s u çaktivizua.", + "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Ju lutemi, para se të vazhdoni më tej, sigurohuni që baza e të dhënave, dosja e formësimeve dhe dosja e të dhënave janë kopjeruajtur.", + "Start update" : "Fillo përditësimin", + "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Për të shmangur çaste bllokimi pune me instalime të mëdha, mundeni të ekzekutoni urdhrin vijues që nga drejtoria juaj e instalimit:", + "This %s instance is currently in maintenance mode, which may take a while." : "Kjo instancë %s hëpërhë gjendet nën mënyrën mirëmbajtje, çka mund të zgjasë ca.", + "This page will refresh itself when the %s instance is available again." : "Kjo faqe do të rifreskohet vetiu, sapo instanca %s të jetë sërish gati." }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 70351a75482..7b7c14010bb 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -1,30 +1,49 @@ { "translations": { - "Couldn't send mail to following users: %s " : "Nuk mund ti dërgoj e-mail këtyre përdoruesve: %s", + "Couldn't send mail to following users: %s " : "S’u dërgua dot e-mail përdoruesve vijues: %s ", + "Preparing update" : "Po përgatitet përditësimi", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Testet e migrimit janë anashkaluar - \"update.skip-migration-test\" është aktivizuar te config.php", "Turned on maintenance mode" : "Mënyra e mirëmbajtjes u aktivizua", "Turned off maintenance mode" : "Mënyra e mirëmbajtjes u çaktivizua", - "Updated database" : "Database-i u azhurnua", - "Checked database schema update" : "Përditësim i skemës së kontrolluar të bazës së të dhënave", - "Checked database schema update for apps" : "Përditësim i skemës së kontrolluar të bazës së të dhënave për aplikacionet", + "Maintenance mode is kept active" : "Mënyra mirëmbajtje është mbajtur e aktivizuar", + "Updated database" : "U përditësua baza e të dhënave", + "Checked database schema update" : "U kontrollua përditësimi i skemës së bazës së të dhënave", + "Checked database schema update for apps" : "U kontrollua përditësimi i skemës së bazës së të dhënave për aplikacionet", "Updated \"%s\" to %s" : "U përditësua \"%s\" në %s", - "No image or file provided" : "Nuk është dhënë asnjë imazh apo skedar", - "Unknown filetype" : "Tip i panjohur skedari", - "Invalid image" : "Imazh i pavlefshëm", - "No temporary profile picture available, try again" : "Nuk është i mundur asnjë imazh profili i përkohshëm, provoni përsëri", - "No crop data provided" : "Nuk është dhënë asnjë parametër prerjeje", - "Sunday" : "E djelë", + "Repair warning: " : "Sinjalizim ndreqjeje: ", + "Repair error: " : "Gabim ndreqjeje: ", + "Set log level to debug - current level: \"%s\"" : "Caktoni debug si nivel regjistri - niveli i tanishëm: \"%s\"", + "Reset log level to \"%s\"" : "Riktheni nivel regjistri në \"%s\"", + "Following incompatible apps have been disabled: %s" : "Janë çaktivizuar aplikacionet e papërputhshme vijuese: %s", + "Following apps have been disabled: %s" : "Janë çaktivizuar aplikacionet vijuese : %s", + "Already up to date" : "Tashmë e përditësuar", + "File is too big" : "Kartela është shumë e madhe", + "Invalid file provided" : "U dha kartelë e pavlefshme", + "No image or file provided" : "S’u dha figurë apo kartelë", + "Unknown filetype" : "Lloj i panjohur kartele", + "Invalid image" : "Figurë e pavlefshme", + "An error occurred. Please contact your admin." : "Ndodhi një gabim. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "No temporary profile picture available, try again" : "S’ka gati foto të përkohshme profili, riprovoni", + "Sunday" : "E dielë", "Monday" : "E hënë", "Tuesday" : "E martë", "Wednesday" : "E mërkurë", "Thursday" : "E enjte", "Friday" : "E premte", "Saturday" : "E shtunë", - "Sun." : "Djelë", - "Mon." : "Hën", - "Tue." : "Mar", - "Wed." : "Mër", - "Thu." : "Enj", - "Fri." : "Pre", - "Sat." : "Shtu", + "Sun." : "Die.", + "Mon." : "Hën.", + "Tue." : "Mar.", + "Wed." : "Mër.", + "Thu." : "Enj.", + "Fri." : "Pre.", + "Sat." : "Sht.", + "Su" : "Di", + "Mo" : "Hë", + "Tu" : "Ma", + "We" : "Më", + "Th" : "En", + "Fr" : "Pr", + "Sa" : "Sh", "January" : "Janar", "February" : "Shkurt", "March" : "Mars", @@ -37,170 +56,221 @@ "October" : "Tetor", "November" : "Nëntor", "December" : "Dhjetor", - "Jan." : "Jan", - "Feb." : "Shk", - "Mar." : "Mar", - "Apr." : "Pri", - "May." : "Maj", - "Jun." : "Qer", - "Jul." : "Kor", - "Aug." : "Gush", - "Sep." : "Shta", - "Oct." : "Tet", - "Nov." : "Nën", - "Dec." : "Dhje", - "Settings" : "Parametra", - "Saving..." : "Duke ruajtur...", - "Couldn't send reset email. Please contact your administrator." : "Emaili i rivendosjes nuk mund të dërgohet. Ju lutem kontaktoni me administratorin.", - "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lidhja për rivendosjen e kodit tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme spam.<br>Nëse nuk është as aty, pyesni administratorin tuaj.", - "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Skedarët tuaj janë të kodifikuar. Nëse nuk keni aktivizuar çelësin e restaurimit, të dhënat tuaja nuk do të jenë të arritshme pasi të keni rivendosur kodin.<br />Nëse nuk jeni i sigurt, ju lutemi kontaktoni administratorin tuaj përpara se të vazhdoni. Jeni i sigurt që dëshironi të vazhdoni?", - "I know what I'm doing" : "Unë e di se çfarë po bëj", - "Password can not be changed. Please contact your administrator." : "Fjalëkalimi nuk mund të ndryshohet. Ju lutem kontaktoni me administratorin.", + "Jan." : "Jan.", + "Feb." : "Shk.", + "Mar." : "Mar.", + "Apr." : "Pri.", + "May." : "Maj.", + "Jun." : "Qer.", + "Jul." : "Kor.", + "Aug." : "Gus.", + "Sep." : "Sht.", + "Oct." : "Tet.", + "Nov." : "Nën.", + "Dec." : "Dhj.", + "Settings" : "Rregullime", + "Saving..." : "Po ruhet …", + "seconds ago" : "sekonda më parë", + "Couldn't send reset email. Please contact your administrator." : "S’u dërgua dot email-i i ricaktimit. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lidhja për ricaktimin e fjalëkalimi tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme/postës së pavlerë.<br>Nëse s’është as aty, pyetni përgjegjësin tuaj lokal.", + "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?", + "I know what I'm doing" : "E di se ç’bëj", + "Password can not be changed. Please contact your administrator." : "Fjalëkalimi nuk mund të ndryshohet. Ju lutemi, lidhuni me përgjegjësin tuaj.", "No" : "Jo", "Yes" : "Po", - "Choose" : "Zgjidh", - "Error loading file picker template: {error}" : "Gabim gjatë ngarkimit të shabllonit të zgjedhësit të skedarëve: {error}", + "Choose" : "Zgjidhni", + "Error loading file picker template: {error}" : "Gabim në ngarkimin e gjedhes së marrësit të kartelave: {error}", "Ok" : "Në rregull", - "Error loading message template: {error}" : "Gabim gjatë ngarkimit të shabllonit të mesazheve: {error}", - "_{count} file conflict_::_{count} file conflicts_" : ["{count} konflikt skedari","{count} konflikte skedarësh"], - "One file conflict" : "Një konflikt skedari", - "New Files" : "Skedarë të rinj", - "Already existing files" : "Skedarë ekzistues", - "Which files do you want to keep?" : "Cilët skedarë dëshironi të mbani?", - "If you select both versions, the copied file will have a number added to its name." : "Nëse i zgjidhni të dyja versionet, skedarit të kopjuar do ti shtohet një numër në emrin e tij.", - "Cancel" : "Anulo", + "Error loading message template: {error}" : "Gabim gjatë ngarkimit të gjedhes së mesazheve: {error}", + "read-only" : "vetëm për lexim", + "_{count} file conflict_::_{count} file conflicts_" : ["{count} përplasje kartelash","{count} përplasje kartelash"], + "One file conflict" : "Një përplasje kartele", + "New Files" : "Kartela të Reja", + "Already existing files" : "Kartela ekzistuese", + "Which files do you want to keep?" : "Cilat kartela doni të mbani?", + "If you select both versions, the copied file will have a number added to its name." : "Nëse përzgjidhni të dy versionet, kartelës së kopjuar do t’i shtohet një numër në emrin e saj.", + "Cancel" : "Anuloje", "Continue" : "Vazhdo", - "(all selected)" : "(të gjitha të zgjedhura)", - "({count} selected)" : "({count} të zgjedhur)", - "Error loading file exists template" : "Gabim gjatë ngarkimit të shabllonit të skedarit ekzistues", + "(all selected)" : "(krejt të përzgjedhurat)", + "({count} selected)" : "({count} të përzgjedhura)", + "Error loading file exists template" : "Gabim në ngarkimin e gjedhes kartela ekziston", "Very weak password" : "Fjalëkalim shumë i dobët", "Weak password" : "Fjalëkalim i dobët", - "So-so password" : "Fjalëkalim i pranueshëm", + "So-so password" : "Fjalëkalim çka", "Good password" : "Fjalëkalim i mirë", - "Strong password" : "Fjalëkalim shumë i mirë", - "Error occurred while checking server setup" : "Gabim gjatë kontrollit të konfigurimit të serverit", + "Strong password" : "Fjalëkalim i fortë", + "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Shërbyesi juaj web ende s’është rregulluar për të lejuar njëkohësim kartelash, ngaqë ndërfaqja WebDAV duket se është e dëmtuar.", + "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ky shërbyes nuk ka lidhje Internet që funksionon. Kjo do të thotë që disa prej veçorive, të tilla si montimi i depozitave të jashtme, njoftimet mbi përditësime apo instalim aplikacionesh nga palë të treta, s’do të funksionojnë. Edhe hyrja në kartela së largëti, apo dërgimi i email-eve për njoftime mund të mos funksionojnë. Këshillojmë të aktivizoni për këtë shërbyes lidhjen në Internet, nëse doni t’i keni krejt këto veçori.", + "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti. Kartela .htaccess s’funksionon. Këshillojmë me forcë që ta formësoni shërbyesin tuaj web në një mënyrë që drejtoria e të dhënave të mos lejojë më hyrje, ose ta zhvendosni drejtorinë e të dhënave jashtë rrënjës së dokumenteve të shërbyesit web.", + "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "S’ka të formësuar fshehtinë kujtese. Që të shtoni suksesshmërinë e shërbyesit tuaj, ju lutemi, formësoni një memcache, në mundet. Të dhëna të mëtejshme mund të gjenden te <a href=\"{docLink}\">dokumentimi</a> ynë.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom s’është i lexueshëm nga PHP-ja, çka shkëshillohet me forcë, për arsye sigurie. Më tepër informacion mund të gjendet te <a href=\"{docLink}\">dokumentimi</a> ynë.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Versioni juaj i PHP -së ({version}) nuk <a href=\"{phpLink}\">mbulohet më nga PHP-ja</a>. Ju nxisim ta përmirësoni PHP-në me një version të ri që të përfitoni nga përditësimi i punimit dhe sigurisë të ofruara nga PHP-ja.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a href=\"{docLink}\">dokumentimi</a> ynë.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached është formësuar si fshehtinë e shpërndarë, por është instaluar moduli i gabuar PHP \"memcache\". \\OC\\Memcache\\Memcached mbulon vetëm \"memcached\" dhe jo \"memcache\". Shihni <a href=\"{wikiLink}\">memcached wiki për të dy modulet</a>.", + "Error occurred while checking server setup" : "Ndodhi një gabim gjatë kontrollit të rregullimit të shërbyesit", + "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Kryet HTTP \"{header}\" s’është formësuar të jetë i njëjtë me \"{expected}\". Ky është një rrezik potencial sigurie dhe privatësie dhe këshillojmë të ndreqet ky rregullim.", + "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Kryet HTTP \"Strict-Transport-Security\" s’është formësuar të paktën \"{seconds}\". Për siguri të thelluar këshillojmë aktivizimin e HSTS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.", + "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Po e përdorni këtë sajt përmes HTTP-je. Këshillojmë me forcë ta formësoni shërbyesin tuaj të kërkojë medoemos përdorimin e HTTPS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.", "Shared" : "Ndarë", "Shared with {recipients}" : "Ndarë me {recipients}", - "Error" : "Veprim i gabuar", - "Error while sharing" : "Veprim i gabuar gjatë ndarjes", - "Error while unsharing" : "Veprim i gabuar gjatë heqjes së ndarjes", - "Error while changing permissions" : "Veprim i gabuar gjatë ndryshimit të lejeve", - "Error setting expiration date" : "Veprim i gabuar gjatë caktimit të datës së përfundimit", - "The public link will expire no later than {days} days after it is created" : "Lidhja publike do të skadojë jo më vonë se {days} ditë pas krijimit", - "Set expiration date" : "Cakto datën e përfundimit", - "Expiration" : "Data e skadimit", - "Expiration date" : "Data e përfundimit", - "Sending ..." : "Duke dërguar...", + "Error" : "Gabim", + "Error while sharing" : "Gabim gjatë ndarjes", + "Error while unsharing" : "Gabim gjatë heqjes së ndarjes", + "Error while changing permissions" : "Gabim gjatë ndryshimit të lejeve", + "Error setting expiration date" : "Gabim në caktimin e datës së skadimit", + "The public link will expire no later than {days} days after it is created" : "Lidhja publike do të skadojë jo më vonë se {days} ditë pas krijimit të saj", + "Set expiration date" : "Caktoni datë skadimi", + "Expiration" : "Skadim", + "Expiration date" : "Datë skadimi", + "Sending ..." : "Po dërgohet …", "Email sent" : "Email-i u dërgua", - "Resharing is not allowed" : "Rindarja nuk lejohet", - "Share link" : "Ndaje lidhjen", - "Password protect" : "Mbro me kod", - "Password" : "Kodi", + "Resharing is not allowed" : "Nuk lejohen rindarjet", + "Share link" : "Lidhje ndarjeje", + "Link" : "Lidhje", + "Password protect" : "Mbroje me fjalëkalim", + "Password" : "Fjalëkalim", "Choose a password for the public link" : "Zgjidhni një fjalëkalim për lidhjen publike", - "Email link to person" : "Dërgo email me lidhjen", - "Send" : "Dërgo", + "Allow editing" : "Lejo përpunim", + "Email link to person" : "Dërgoja personit lidhjen me email", + "Send" : "Dërgoje", "Shared with you and the group {group} by {owner}" : "Ndarë me ju dhe me grupin {group} nga {owner}", "Shared with you by {owner}" : "Ndarë me ju nga {owner}", "Shared in {item} with {user}" : "Ndarë në {item} me {user}", - "group" : "grupi", + "group" : "grup", + "remote" : "i largët", "notify by email" : "njofto me email", - "Unshare" : "Hiq ndarjen", + "Unshare" : "Hiqe ndarjen", "can share" : "mund të ndajnë", - "can edit" : "mund të ndryshosh", - "create" : "krijo", - "delete" : "elimino", - "access control" : "kontrollimi i hyrjeve", - "Share" : "Nda", + "can edit" : "mund të përpunojnë", + "create" : "krijoje", + "change" : "ndërroje", + "delete" : "fshije", + "access control" : "kontroll hyrjesh", + "Share details could not be loaded for this item." : "Për këtë objekt s’u ngarkuan dot hollësi ndarjeje.", + "An error occured. Please try again" : "Ndodhi një gabim. Ju lutemi, riprovoni", + "Share" : "Ndaje", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Ndajeni me persona në ownCloud-e të tjera duke përdorur sintaksën username@example.com/owncloud", + "Share with users or groups …" : "Ndajeni me përdorues ose grupe …", + "Share with users, groups or remote users …" : "Ndajeni me përdorues, grupe ose përdorues të largët …", "Warning" : "Kujdes", - "The object type is not specified." : "Nuk është specifikuar tipi i objektit.", - "Enter new" : "Jep të re", - "Delete" : "Elimino", - "Add" : "Shto", - "Edit tags" : "Modifiko tag", - "Error loading dialog template: {error}" : "Gabim gjatë ngarkimit të shabllonit: {error}", - "No tags selected for deletion." : "Nuk është zgjedhur asnjë tag për fshirje.", + "Error while sending notification" : "Gabim gjatë dërgimit të njoftimit", + "The object type is not specified." : "S’është specifikuar lloji i objektit.", + "Enter new" : "Jep të ri", + "Delete" : "Fshije", + "Add" : "Shtoni", + "Edit tags" : "Përpunoni etiketa", + "Error loading dialog template: {error}" : "Gabim gjatë ngarkimit të gjedhes së dialogut: {error}", + "No tags selected for deletion." : "S’u përzgjodhën etiketa fshirje.", "unknown text" : "tekst i panjohur", - "Hello world!" : "Përshendetje të gjithëve!", - "sunny" : "diell", - "Hello {name}, the weather is {weather}" : "Përshëndetje {name}, koha është {weather}", - "_download %n file_::_download %n files_" : ["shkarko %n skedar","shkarko %n skedarë"], - "Updating {productName} to version {version}, this may take a while." : "Po përditësoj {productName} në versionin {version}, kjo mund të zgjasë pak.", - "Please reload the page." : "Ju lutem ringarkoni faqen.", - "The update was successful. Redirecting you to ownCloud now." : "Azhurnimi u krye. Tani do t'ju kaloj tek ownCloud-i.", - "Couldn't reset password because the token is invalid" : "Nuk mund të rivendos fjalëkalimin sepse shenja është e pavlefshme.", - "Couldn't send reset email. Please make sure your username is correct." : "Emaili i rivendosjes nuk mund të dërgohet. Ju lutem sigurohuni që përdoruesi juaj është i saktë.", - "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Emaili i rivendosjes nuk mund të dërgohet sepse nuk ekziston asnjë adresë email për këtë përdorues. Ju lutem kontaktoni me administratorin.", - "%s password reset" : "Kodi i %s -it u rivendos", - "Use the following link to reset your password: {link}" : "Përdorni lidhjen në vijim për të rivendosur kodin: {link}", - "New password" : "Kodi i ri", - "New Password" : "Fjalëkalim i ri", - "Reset password" : "Rivendos kodin", + "Hello world!" : "Hello world!", + "sunny" : "me diell", + "Hello {name}, the weather is {weather}" : "Tungjatjeta {name}, koha është {weather}", + "Hello {name}" : "Tungjatjeta {name}", + "_download %n file_::_download %n files_" : ["shkarko %n kartelë","shkarko %n kartela"], + "{version} is available. Get more information on how to update." : "Është gati {version}. Merrni më tepër informacion se si ta përditësoni.", + "Updating {productName} to version {version}, this may take a while." : "Po përditësohet {productName} me versionin {version}, kjo mund të zgjasë pak.", + "An error occurred." : "Ndodhi një gabim.", + "Please reload the page." : "Ju lutemi, ringarkoni faqen.", + "The update was unsuccessful. " : "Përditësimi qe i pasuksesshëm. ", + "The update was successful. There were warnings." : "Përditësimi qe i suksesshëm. Pati sinjalizime.", + "The update was successful. Redirecting you to ownCloud now." : "Përditësimi qe i suksesshëm. Po ridrejtoheni te ownCloud-i.", + "Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm", + "Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar", + "Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.", + "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "%s password reset" : "U ricaktua fjalëkalimi për %s", + "Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}", + "New password" : "Fjalëkalim i ri", + "New Password" : "Fjalëkalim i Ri", + "Reset password" : "Ricaktoni fjalëkalimin", + "Searching other places" : "Po kërkohet në vende të tjera", + "No search results in other folders" : "S’u gjetën përfundime në dosje të tjera", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} përfundim kërkimi në një tjetër dosje","{count} përfundime kërkimi në dosje të tjera"], "Personal" : "Personale", - "Users" : "Përdoruesit", - "Apps" : "App", + "Users" : "Përdorues", + "Apps" : "Aplikacione", "Admin" : "Admin", "Help" : "Ndihmë", - "Error loading tags" : "Gabim gjatë ngarkimit të etiketave.", + "Error loading tags" : "Gabim gjatë ngarkimit të etiketave", "Tag already exists" : "Etiketa ekziston", "Error deleting tag(s)" : "Gabim gjatë fshirjes së etiketës(ave)", "Error tagging" : "Gabim etiketimi", "Error untagging" : "Gabim në heqjen e etiketës", - "Error favoriting" : "Gabim në ruajtjen si të preferuar", - "Error unfavoriting" : "Gabim në heqjen nga të preferuarat", + "Error favoriting" : "Gabim në ruajtjen si të parapëlqyer", + "Error unfavoriting" : "Gabim në heqjen nga të parapëlqyerat", "Access forbidden" : "Ndalohet hyrja", - "File not found" : "Skedari nuk mund të gjendet", - "The specified document has not been found on the server." : "Dokumenti i përcaktuar nuk mund të gjendet në server.", - "You can click here to return to %s." : "Ju mund të klikoni këtu për tu kthyer në %s.", - "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Tungjatjeta,\n\nju njoftojmë se %s ka ndarë %s me ju.\nShikojeni në: %s\n\n", - "The share will expire on %s." : "Ndarja do të skadojë në %s.", - "Cheers!" : "Gjithë të mirat", - "Internal Server Error" : "Gabim i brendshëm në server", - "The server encountered an internal error and was unable to complete your request." : "Serveri u përball me një gabim të brendshem dhe nuk mundet të mbarojë detyrën që i keni ngarkuar.", - "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Ju lutem kontaktoni me administratorin e serverit nëse ky gabim shfaqet herë të tjera, ju lutem përfshini dhe detajet e mëposhtme teknike në raportin tuaj.", - "More details can be found in the server log." : "Detaje të mëtejshme mund të gjenden në listën e veprimeve të serverit.", - "Technical details" : "Detaje teknike", - "Remote Address: %s" : "Adresa tjetër: %s", - "Request ID: %s" : "ID e kërkesës: %s", - "Code: %s" : "Kodi: %s", - "Message: %s" : "Mesazhi: %s", - "File: %s" : "Skedari: %s", - "Line: %s" : "Rreshti: %s", + "File not found" : "S’u gjet kartelë", + "The specified document has not been found on the server." : "Dokumenti i përcaktuar s’u gjet në shërbyes.", + "You can click here to return to %s." : "Mund të klikoni këtu për t’u kthyer te %s.", + "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që %s ndau me ju %s.\nShiheni: %s\n\n", + "The share will expire on %s." : "Ndarja do të skadojë më %s.", + "Cheers!" : "Gëzuar!", + "Internal Server Error" : "Gabim i Brendshëm Shërbyesi", + "The server encountered an internal error and was unable to complete your request." : "Shërbyesi hasi një gabim të brendshëm dhe s’qe në gjendje të plotësojë kërkesën tuaj.", + "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Nëse ky gabim shfaqet shumë herë, ju lutemi, lidhuni me përgjegjësin e shërbyesit, dhe përfshini hollësitë teknike më poshtë në njoftimin tuaj.", + "More details can be found in the server log." : "Më tepër hollësi mund të gjenden në regjistrin e shërbyesit.", + "Technical details" : "Hollësi teknike", + "Remote Address: %s" : "Adresë e Largët: %s", + "Request ID: %s" : "ID Kërkese: %s", + "Type: %s" : "Lloj: %s", + "Code: %s" : "Kod: %s", + "Message: %s" : "Mesazh: %s", + "File: %s" : "Kartelë: %s", + "Line: %s" : "Rresht: %s", "Trace" : "Gjurmim", - "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Dosja dhe skedarët e të dhënave tuaja mbase janë të arritshme nga interneti sepse skedari .htaccess nuk po punon.", - "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Për më shumë informacion mbi konfigurimin e duhur të serverit tuaj, ju lutem shikoni <a href=\"%s\" target=\"_blank\">dokumentacionin</a>.", - "Create an <strong>admin account</strong>" : "Krijo një <strong>llogari administruesi</strong>", - "Username" : "Përdoruesi", - "Storage & database" : "Ruajtja dhe baza e të dhënave", - "Data folder" : "Emri i dosjes", - "Configure the database" : "Konfiguro database-in", - "Only %s is available." : "Vetëm %s është e disponueshme.", - "Database user" : "Përdoruesi i database-it", - "Database password" : "Kodi i database-it", - "Database name" : "Emri i database-it", + "Security warning" : "Sinjalizim sigurie", + "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti, ngaqë kartela .htaccess s’funksionon.", + "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Për të dhëna se si të formësohet si duhet shërbyesi juaj, ju lutemi, shihni <a href=\"%s\" target=\"_blank\">dokumentimin</a>.", + "Create an <strong>admin account</strong>" : "Krijoni një <strong>llogari administruesi</strong>", + "Username" : "Emër përdoruesi", + "Storage & database" : "Depozitë & bazë të dhënash", + "Data folder" : "Dosje të dhënash", + "Configure the database" : "Formësoni bazën e të dhënave", + "Only %s is available." : "Vetëm %s është gati.", + "Install and activate additional PHP modules to choose other database types." : "Që të zgjidhni të tjera lloje bazash të dhënash, instaloni dhe aktivizoni module PHP shtesë.", + "For more details check out the documentation." : "Për më tepër të dhëna shihni dokumentimin.", + "Database user" : "Përdorues baze të dhënash", + "Database password" : "Fjalëkalim baze të dhënash", + "Database name" : "Emër baze të dhënash", "Database tablespace" : "Tablespace-i i database-it", - "Database host" : "Pozicioni (host) i database-it", - "Finish setup" : "Mbaro setup-in", - "Finishing …" : "Duke përfunduar ...", - "Log out" : "Dalje", + "Database host" : "Strehë baze të dhënash", + "Performance warning" : "Sinjalizim funksionimi", + "SQLite will be used as database." : "Si bazë të dhënash do të përdoret SQL-ja.", + "For larger installations we recommend to choose a different database backend." : "Për instalime më të mëdha këshillojmë të zgjidhni një tjetër program shërbyesi baze të dhënash.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Përdorimi i SQLite-it shkëshillohet veçanërisht, kur për njëkohësim kartelash përdoret klienti desktop.", + "Finish setup" : "Përfundoje rregullimin", + "Finishing …" : "Po përfundohet …", + "Need help?" : "Ju duhet ndihmë?", + "See the documentation" : "Shihni dokumentimin", + "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Ky aplikacion lyp JavaScript për punim të saktë. Ju lutemi, {linkstart}aktivizoni JavaScript-in{linkend} dhe ringarkoni faqen.", + "Log out" : "Dilni", "Search" : "Kërko", - "Server side authentication failed!" : "Verifikimi në krahun e serverit dështoi!", - "Please contact your administrator." : "Ju lutem kontaktoni administratorin.", - "Log in" : "Hyrje", - "remember" : "kujto", - "Alternative Logins" : "Hyrje alternative", - "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Tungjatjeta,<br><br>dëshirojmë t'ju njoftojmë se %s ka ndarë <strong>%s</strong> me ju.<br><a href=\"%s\">Klikoni këtu për ta shikuar!</a><br>", + "Server side authentication failed!" : "Mirëfilltësimi më anë të shërbyesit dështoi!", + "Please contact your administrator." : "Ju lutemi, lidhuni me përgjegjësin tuaj.", + "An internal error occured." : "Ndodhi një gabim i brendshëm.", + "Please try again or contact your administrator." : "Ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj.", + "Log in" : "Hyni", + "Wrong password. Reset it?" : "Fjalëkalim i gabuar. Të ricaktohet?", + "remember" : "mbaje mend", + "Alternative Logins" : "Hyrje Alternative", + "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Njatjeta,<br><br>thjesht po ju bëjmë të ditur që %s ndau me ju <strong>%s</strong>.<br><a href=\"%s\">Shiheni!</a><br><br>", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", - "This means only administrators can use the instance." : "Kjo dmth që vetëm administratorët mund të shfrytëzojnë instancën.", - "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktoni administratorin e sistemit nëse ky mesazh vazhdon ose është shfaqur papritmas.", - "Thank you for your patience." : "Ju faleminderit për durimin tuaj.", - "You are accessing the server from an untrusted domain." : "Ju po qaseni në server nga një domain jo i besuar.", - "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Ju lutem kontaktoni me administratorin. Nëse jeni administrator i kësaj instance, konfiguroni parametrin \"domain i besuar\" në config/config.php . Një konfigurim shembull është dhënë në config/config.sample.php", - "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Në varësi të konfigurimit tuaj, ju si administrator mundet gjithashtu të jeni i aftë të përdorni butonin e mëposhtëm për ti dhënë besim këtij domain.", - "Add \"%s\" as trusted domain" : "Shtoni \"%s\" si domain të besuar", - "The theme %s has been disabled." : "Tema %s u bllokua.", - "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Ju lutem sigurohuni që bazës së të dhënave, dosjes së konfigurimit dhe dosjes së të dhënave ti jetë bërë një kopje rezervë përpara se të vazhdoni më tutje.", - "Start update" : "Fillo përditësimin.", - "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Për të shmangur momente bllokimi gjatë punës me instalime të mëdha, në vend të kësaj ju mund të kryeni komandën e mëposhtme nga dosja juaj e instalimit:", - "This page will refresh itself when the %s instance is available again." : "Kjo faqe do të ringarkohet automatikisht kur instanca %s të jetë sërish e disponueshme." + "This means only administrators can use the instance." : "Kjo do të thotë që instancën mund ta përdorin vetëm administratorët.", + "Contact your system administrator if this message persists or appeared unexpectedly." : "Nëse ky mesazh shfaqet vazhdimisht ose u shfaq papritmas, lidhuni me përgjegjësin e sistemit.", + "Thank you for your patience." : "Ju faleminderit për durimin.", + "You are accessing the server from an untrusted domain." : "Po hyni në shërbyes nga një përkatësi jo e besuar.", + "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Ju lutemi, lidhuni me përgjegjësin tuaj. Nëse jeni një përgjegjës në këtë instancë, formësoni rregullimin \"trusted_domain\" te config/config.php. Një formësim shembull jepet te config/config.sample.php.", + "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Në varësi të formësimit tuaj, si administrator mundet gjithashtu të jeni në gjendje të përdorni butonin më poshtë për ta besuar këtë përkatësi.", + "Add \"%s\" as trusted domain" : "Shtojeni \"%s\" si përkatësi të besuar", + "App update required" : "Lypset përditësim aplikacioni", + "%s will be updated to version %s" : "%s do të përditësohet me versionin %s", + "These apps will be updated:" : "Do të përditësohen këto aplikacione:", + "These incompatible apps will be disabled:" : "Do të çaktivizohen këto aplikacione të papërputhshme:", + "The theme %s has been disabled." : "Tema %s u çaktivizua.", + "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Ju lutemi, para se të vazhdoni më tej, sigurohuni që baza e të dhënave, dosja e formësimeve dhe dosja e të dhënave janë kopjeruajtur.", + "Start update" : "Fillo përditësimin", + "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Për të shmangur çaste bllokimi pune me instalime të mëdha, mundeni të ekzekutoni urdhrin vijues që nga drejtoria juaj e instalimit:", + "This %s instance is currently in maintenance mode, which may take a while." : "Kjo instancë %s hëpërhë gjendet nën mënyrën mirëmbajtje, çka mund të zgjasë ca.", + "This page will refresh itself when the %s instance is available again." : "Kjo faqe do të rifreskohet vetiu, sapo instanca %s të jetë sërish gati." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/sr.js b/core/l10n/sr.js index 820b32ad61e..f34b4213f0f 100644 --- a/core/l10n/sr.js +++ b/core/l10n/sr.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Не могу да пошаљем е-пошту следећим корисницима: %s ", + "Preparing update" : "Припремам надоградњу", "Turned on maintenance mode" : "Режим одржавања укључен", "Turned off maintenance mode" : "Режим одржавања искључен", "Maintenance mode is kept active" : "Режим одржавања се држи активним", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Грешка поправке:", "Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s", "Following apps have been disabled: %s" : "Следеће апликације су искључене: %s", + "File is too big" : "Фајл је превелик", "Invalid file provided" : "Понуђени фајл је неисправан", "No image or file provided" : "Није дата ни слика ни фајл", "Unknown filetype" : "Непознат тип фајла", @@ -35,6 +37,13 @@ OC.L10N.register( "Thu." : "чет", "Fri." : "пет", "Sat." : "суб", + "Su" : "Не", + "Mo" : "По", + "Tu" : "Ут", + "We" : "Ср", + "Th" : "Че", + "Fr" : "Пе", + "Sa" : "Су", "January" : "јануар", "February" : "фебруар", "March" : "март", @@ -61,6 +70,7 @@ OC.L10N.register( "Dec." : "дец", "Settings" : "Поставке", "Saving..." : "Уписујем...", + "seconds ago" : "пре пар секунди", "Couldn't send reset email. Please contact your administrator." : "Не могу да пошаљем е-пошту за ресетовање лозинке. Контактирајте администратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Веза за ресетовање лозинке је послата на вашу е-адресу. Ако је не примите ускоро, проверите фасцикле за нежељену пошту.<br>Ако није ни тамо, контактирајте вашег администратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Фајлови су вам шифровани. Ако нисте укључили кључ за опоравак, нећете моћи да повратите податке након ресетовања лозинке.<br />Ако нисте сигурни шта да радите, контактирајте администратора пре него што наставите.<br />Да ли желите да наставите?", @@ -165,8 +175,6 @@ OC.L10N.register( "New Password" : "Нова лозинка", "Reset password" : "Ресетуј лозинку", "Searching other places" : "Претражујем остала места", - "No search results in other places" : "Нема резултата претраге на другим местима", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат претраге на осталим местима","{count} резултата претраге на осталим местима","{count} резултата претраге на осталим местима"], "Personal" : "Лично", "Users" : "Корисници", "Apps" : "Апликације", diff --git a/core/l10n/sr.json b/core/l10n/sr.json index 2607a8ba79b..3825ab821cb 100644 --- a/core/l10n/sr.json +++ b/core/l10n/sr.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Не могу да пошаљем е-пошту следећим корисницима: %s ", + "Preparing update" : "Припремам надоградњу", "Turned on maintenance mode" : "Режим одржавања укључен", "Turned off maintenance mode" : "Режим одржавања искључен", "Maintenance mode is kept active" : "Режим одржавања се држи активним", @@ -11,6 +12,7 @@ "Repair error: " : "Грешка поправке:", "Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s", "Following apps have been disabled: %s" : "Следеће апликације су искључене: %s", + "File is too big" : "Фајл је превелик", "Invalid file provided" : "Понуђени фајл је неисправан", "No image or file provided" : "Није дата ни слика ни фајл", "Unknown filetype" : "Непознат тип фајла", @@ -33,6 +35,13 @@ "Thu." : "чет", "Fri." : "пет", "Sat." : "суб", + "Su" : "Не", + "Mo" : "По", + "Tu" : "Ут", + "We" : "Ср", + "Th" : "Че", + "Fr" : "Пе", + "Sa" : "Су", "January" : "јануар", "February" : "фебруар", "March" : "март", @@ -59,6 +68,7 @@ "Dec." : "дец", "Settings" : "Поставке", "Saving..." : "Уписујем...", + "seconds ago" : "пре пар секунди", "Couldn't send reset email. Please contact your administrator." : "Не могу да пошаљем е-пошту за ресетовање лозинке. Контактирајте администратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Веза за ресетовање лозинке је послата на вашу е-адресу. Ако је не примите ускоро, проверите фасцикле за нежељену пошту.<br>Ако није ни тамо, контактирајте вашег администратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Фајлови су вам шифровани. Ако нисте укључили кључ за опоравак, нећете моћи да повратите податке након ресетовања лозинке.<br />Ако нисте сигурни шта да радите, контактирајте администратора пре него што наставите.<br />Да ли желите да наставите?", @@ -163,8 +173,6 @@ "New Password" : "Нова лозинка", "Reset password" : "Ресетуј лозинку", "Searching other places" : "Претражујем остала места", - "No search results in other places" : "Нема резултата претраге на другим местима", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат претраге на осталим местима","{count} резултата претраге на осталим местима","{count} резултата претраге на осталим местима"], "Personal" : "Лично", "Users" : "Корисници", "Apps" : "Апликације", diff --git a/core/l10n/sr@latin.js b/core/l10n/sr@latin.js index 276252e324f..d57db178ec2 100644 --- a/core/l10n/sr@latin.js +++ b/core/l10n/sr@latin.js @@ -53,6 +53,7 @@ OC.L10N.register( "Dec." : "dec", "Settings" : "Podešavanja", "Saving..." : "Snimam...", + "seconds ago" : "Pre par sekundi", "Couldn't send reset email. Please contact your administrator." : "Nemoguće slanje e-mail-a za ponovno postavljanje lozinke. Molimo Vas kontaktirajte Vašeg administratora", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link za ponovno postavljanje Vaše lozinke je poslat na Vašu e-mail adresu. Ako ga ne primite u razumnom roku, proverite fascikle za neželjenu poštu.<br>Ako ga nema ni tamo, kontaktirajte Vašeg lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaši fajlovi su šifrovani. Ako nista omogućili ključ za povrat fajlova, neće biti načina da dobijete ponovo svoje podatke posle promene lozinke.<br />Ako niste sigurni šta da radite, molimo Vas da kontaktirate Vašeg administratora pre nego što nastavite.<br />Da li zaista želite da nastavite?", diff --git a/core/l10n/sr@latin.json b/core/l10n/sr@latin.json index 03766ee0948..cbc738d0010 100644 --- a/core/l10n/sr@latin.json +++ b/core/l10n/sr@latin.json @@ -51,6 +51,7 @@ "Dec." : "dec", "Settings" : "Podešavanja", "Saving..." : "Snimam...", + "seconds ago" : "Pre par sekundi", "Couldn't send reset email. Please contact your administrator." : "Nemoguće slanje e-mail-a za ponovno postavljanje lozinke. Molimo Vas kontaktirajte Vašeg administratora", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link za ponovno postavljanje Vaše lozinke je poslat na Vašu e-mail adresu. Ako ga ne primite u razumnom roku, proverite fascikle za neželjenu poštu.<br>Ako ga nema ni tamo, kontaktirajte Vašeg lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaši fajlovi su šifrovani. Ako nista omogućili ključ za povrat fajlova, neće biti načina da dobijete ponovo svoje podatke posle promene lozinke.<br />Ako niste sigurni šta da radite, molimo Vas da kontaktirate Vašeg administratora pre nego što nastavite.<br />Da li zaista želite da nastavite?", diff --git a/core/l10n/sv.js b/core/l10n/sv.js index e2d5edf3f5d..24bfac63cc3 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -53,6 +53,7 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Inställningar", "Saving..." : "Sparar...", + "seconds ago" : "sekunder sedan", "Couldn't send reset email. Please contact your administrator." : "Kunde inte skicka återställningsmail. Vänligen kontakta din administratör.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Länken för att återställa ditt lösenord har skickats till din e-mail. Om du inte mottar något inom kort, kontrollera spam/skräpkorgen.<br>Om det inte finns något där, vänligen kontakta din lokala administratör.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?", @@ -145,7 +146,6 @@ OC.L10N.register( "New password" : "Nytt lösenord", "New Password" : "Nytt lösenord", "Reset password" : "Återställ lösenordet", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} sökresultat på andra platser","{count} sökresultat på andra platser"], "Personal" : "Personligt", "Users" : "Användare", "Apps" : "Program", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index c25a4afc5e7..c98f97de9b9 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -51,6 +51,7 @@ "Dec." : "Dec.", "Settings" : "Inställningar", "Saving..." : "Sparar...", + "seconds ago" : "sekunder sedan", "Couldn't send reset email. Please contact your administrator." : "Kunde inte skicka återställningsmail. Vänligen kontakta din administratör.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Länken för att återställa ditt lösenord har skickats till din e-mail. Om du inte mottar något inom kort, kontrollera spam/skräpkorgen.<br>Om det inte finns något där, vänligen kontakta din lokala administratör.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?", @@ -143,7 +144,6 @@ "New password" : "Nytt lösenord", "New Password" : "Nytt lösenord", "Reset password" : "Återställ lösenordet", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} sökresultat på andra platser","{count} sökresultat på andra platser"], "Personal" : "Personligt", "Users" : "Användare", "Apps" : "Program", diff --git a/core/l10n/ta_LK.js b/core/l10n/ta_LK.js index d10cea1833f..1f61734642b 100644 --- a/core/l10n/ta_LK.js +++ b/core/l10n/ta_LK.js @@ -41,6 +41,7 @@ OC.L10N.register( "Dec." : "மார்கழி", "Settings" : "அமைப்புகள்", "Saving..." : "சேமிக்கப்படுகிறது...", + "seconds ago" : "செக்கன்களுக்கு முன்", "No" : "இல்லை", "Yes" : "ஆம்", "Choose" : "தெரிவுசெய்க ", diff --git a/core/l10n/ta_LK.json b/core/l10n/ta_LK.json index 1d19146d104..89aadd5b791 100644 --- a/core/l10n/ta_LK.json +++ b/core/l10n/ta_LK.json @@ -39,6 +39,7 @@ "Dec." : "மார்கழி", "Settings" : "அமைப்புகள்", "Saving..." : "சேமிக்கப்படுகிறது...", + "seconds ago" : "செக்கன்களுக்கு முன்", "No" : "இல்லை", "Yes" : "ஆம்", "Choose" : "தெரிவுசெய்க ", diff --git a/core/l10n/te.js b/core/l10n/te.js index 6169beff101..f2be12f12da 100644 --- a/core/l10n/te.js +++ b/core/l10n/te.js @@ -21,6 +21,7 @@ OC.L10N.register( "November" : "నవంబర్", "December" : "డిసెంబర్", "Settings" : "అమరికలు", + "seconds ago" : "క్షణాల క్రితం", "No" : "కాదు", "Yes" : "అవును", "Ok" : "సరే", diff --git a/core/l10n/te.json b/core/l10n/te.json index b09f286afbc..f165c3f457f 100644 --- a/core/l10n/te.json +++ b/core/l10n/te.json @@ -19,6 +19,7 @@ "November" : "నవంబర్", "December" : "డిసెంబర్", "Settings" : "అమరికలు", + "seconds ago" : "క్షణాల క్రితం", "No" : "కాదు", "Yes" : "అవును", "Ok" : "సరే", diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js index 3ed34bc336d..24f13a2c8fe 100644 --- a/core/l10n/th_TH.js +++ b/core/l10n/th_TH.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "ไม่สามารถส่งอีเมลไปยังผู้ใช้: %s", "Preparing update" : "เตรียมอัพเดท", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "ทดสอบการย้ายจะถูกข้าม \"update.skip-migration-test\" สามารถเปิดใช้งานได้ใน config.php", "Turned on maintenance mode" : "เปิดโหมดการบำรุงรักษา", "Turned off maintenance mode" : "ปิดโหมดการบำรุงรักษา", "Maintenance mode is kept active" : "โหมดการบำรุงรักษาจะถูกเก็บไว้ใช้งาน", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "อัพเดท \"%s\" ไปยัง %s", "Repair warning: " : "เตือนการซ่อมแซม:", "Repair error: " : "เกิดข้อผิดพลาดในการซ่อมแซม:", + "Set log level to debug - current level: \"%s\"" : "การตั้งค่าระดับของการบันทึกเพื่อแก้ปัญหา - ระดับปัจจุบันคือ: \"%s\"", + "Reset log level to \"%s\"" : "รีเซ็ทระดับการบันทึกเป็น \"%s\"", "Following incompatible apps have been disabled: %s" : "แอพพลิเคชันต่อไปนี้เข้ากันไม่ได้มันจะถูกปิดการใช้งาน: %s", "Following apps have been disabled: %s" : "แอพฯดังต่อไปนี้ถูกปิดการใช้งาน: %s", "Already up to date" : "มีอยู่แล้วถึงวันที่", @@ -20,6 +23,7 @@ OC.L10N.register( "No image or file provided" : "ไม่มีรูปภาพหรือไฟล์ที่ระบุ", "Unknown filetype" : "ไม่รู้จักชนิดของไฟล์", "Invalid image" : "รูปภาพไม่ถูกต้อง", + "An error occurred. Please contact your admin." : "เกิดข้อผิดพลาด กรุณาติดต่อผู้ดูแลระบบของคุณ", "No temporary profile picture available, try again" : "ไม่มีรูปภาพโปรไฟล์ชั่วคราว กรุณาลองใหม่อีกครั้ง", "No crop data provided" : "ไม่มีการครอบตัดข้อมูลที่ระบุ", "No valid crop data provided" : "ไม่ได้ระบุข้อมูลการครอบตัดที่ถูกต้อง", @@ -71,6 +75,7 @@ OC.L10N.register( "Dec." : "ธ.ค.", "Settings" : "ตั้งค่า", "Saving..." : "กำลังบันทึกข้อมูล...", + "seconds ago" : "วินาที ก่อนหน้านี้", "Couldn't send reset email. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาติดต่อผู้ดูแลระบบ", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "ลิงค์ที่ใช้สำหรับตั้งค่ารหัสผ่านใหม่ ของคุณ ได้ถูกส่งไปยังอีเมลของคุณ หากคุณยังไม่ได้รับอีกเมล ลองไปดูที่โฟลเดอร์ สแปม/ถังขยะ ในอีเมลของคุณ <br>ทั้งนี้หากหาอีเมลไม่พบกรุณาติดต่อผู้ดูแลระบบ", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ไฟล์ของคุณจะถูกเข้ารหัส หากคุณยังไม่ได้เปิดใช้งานรหัสการกู้คืน คุณจะได้รับข้อมูลของคุณกลับมาหลังจากที่รหัสผ่านของคุณถูกรีเซ็ต<br /> หากคุณไม่แน่ใจว่าควรทำอย่างไรโปรดติดต่อผู้ดูแลระบบของคุณก่อนที่คุณจะดำเนินการต่อไป <br /> คุณต้องการดำเนินการต่อ?", @@ -106,6 +111,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ไม่สามารถอ่านโดย PHP ซึ่งมีผลด้านความปลอดภัยเป็นอย่างมาก สามารถดูข้อมูลเพิ่มเติมได้ที่ <a href=\"{docLink}\">เอกสาร</a>", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "PHP รุ่น ({version}) ของคุณ จะไม่ได้รับ <a href=\"{phpLink}\">การสนับสนุนโดย PHP</a> เราขอแนะนำให้คุณอัพเกรดรุ่นของ PHP เพื่อความปลอดภัย", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "การกำหนดค่าพร็อกซี่ไม่ถูกต้องหรือคุณกำลังเข้าถึง ownCloud จากพร็อกซี่ที่เชื่อถือได้ ถ้าคุณไม่ได้เข้าถึง ownCloud จากพร็อกซี่ที่เชื่อถือได้ นี้เป็นปัญหาด้านความปลอดภัย คุณอาจถูกโจมดีจากผู้ไม่หวังดี อ่านข้อมูลเพิ่มเติมได้ที่ <a href=\"{docLink}\">เอกสาร</a>", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached เป็นการกำหนดค่าแคช แต่มีโมดูล PHP ของ \"memcache\" ที่ผิดพลาดได้ถูกติดตั้ง \\OC\\Memcache\\Memcached สนับสนุนเฉพาะ \"memcached\" ไม่ใช่ \"memcache\" ดูได้ที่ <a href=\"{wikiLink}\">วิกิพีเดียเกี่ยวกับโมดูล Memcached</a>", "Error occurred while checking server setup" : "เกิดข้อผิดพลาดขณะที่ทำการตรวจสอบการติดตั้งเซิร์ฟเวอร์", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" ไม่ได้กำหนดค่าส่วนหัว Http ให้เท่ากับ \"{expected}\" นี่คือระบบการรักษาความปลอดภัยที่มีศักยภาพหรือลดความเสี่ยงที่จะเกิดขึ้นเราขอแนะนำให้ปรับการตั้งค่านี้", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" ส่วนหัว HTTP ไม่ได้กำหนดค่าให้น้อยกว่า \"{seconds}\" วินาที เพื่อความปลอดภัยที่เพิ่มขึ้นเราขอแนะนำให้เปิดใช้งาน HSTS ที่อธิบายไว้ใน <a href=\"{docUrl}\">เคล็ดลับการรักษาความปลอดภัย</a> ของเรา", @@ -168,6 +174,7 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["ดาวน์โหลด %n ไฟล์"], "{version} is available. Get more information on how to update." : "{version} สามารถใช้ได้ รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัพเดท", "Updating {productName} to version {version}, this may take a while." : "กำลังอัพเดท {productName} ไปยังรุ่น {version} อาจใช้เวลาสักครู่", + "An error occurred." : "เกิดข้อผิดพลาด", "Please reload the page." : "โปรดโหลดหน้าเว็บใหม่", "The update was unsuccessful. " : "อัพเดทไม่สำเร็จ", "The update was successful. There were warnings." : "การอัพเดทสำเร็จ แต่มีคำเตือนอยู่", @@ -182,8 +189,8 @@ OC.L10N.register( "New Password" : "รหัสผ่านใหม่", "Reset password" : "เปลี่ยนรหัสผ่านใหม่", "Searching other places" : "กำลังค้นหาสถานที่อื่นๆ", - "No search results in other places" : "ไม่มีผลการค้นหาในสถานที่อื่นๆ", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} ผลการค้นหาในสถานที่อื่นๆ"], + "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["ค้นหาพบ {count} ผลลัพธ์ในโฟลเดอร์อื่นๆ"], "Personal" : "ส่วนตัว", "Users" : "ผู้ใช้งาน", "Apps" : "แอปฯ", diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json index ecf02c36b4b..2742a569a6a 100644 --- a/core/l10n/th_TH.json +++ b/core/l10n/th_TH.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "ไม่สามารถส่งอีเมลไปยังผู้ใช้: %s", "Preparing update" : "เตรียมอัพเดท", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "ทดสอบการย้ายจะถูกข้าม \"update.skip-migration-test\" สามารถเปิดใช้งานได้ใน config.php", "Turned on maintenance mode" : "เปิดโหมดการบำรุงรักษา", "Turned off maintenance mode" : "ปิดโหมดการบำรุงรักษา", "Maintenance mode is kept active" : "โหมดการบำรุงรักษาจะถูกเก็บไว้ใช้งาน", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "อัพเดท \"%s\" ไปยัง %s", "Repair warning: " : "เตือนการซ่อมแซม:", "Repair error: " : "เกิดข้อผิดพลาดในการซ่อมแซม:", + "Set log level to debug - current level: \"%s\"" : "การตั้งค่าระดับของการบันทึกเพื่อแก้ปัญหา - ระดับปัจจุบันคือ: \"%s\"", + "Reset log level to \"%s\"" : "รีเซ็ทระดับการบันทึกเป็น \"%s\"", "Following incompatible apps have been disabled: %s" : "แอพพลิเคชันต่อไปนี้เข้ากันไม่ได้มันจะถูกปิดการใช้งาน: %s", "Following apps have been disabled: %s" : "แอพฯดังต่อไปนี้ถูกปิดการใช้งาน: %s", "Already up to date" : "มีอยู่แล้วถึงวันที่", @@ -18,6 +21,7 @@ "No image or file provided" : "ไม่มีรูปภาพหรือไฟล์ที่ระบุ", "Unknown filetype" : "ไม่รู้จักชนิดของไฟล์", "Invalid image" : "รูปภาพไม่ถูกต้อง", + "An error occurred. Please contact your admin." : "เกิดข้อผิดพลาด กรุณาติดต่อผู้ดูแลระบบของคุณ", "No temporary profile picture available, try again" : "ไม่มีรูปภาพโปรไฟล์ชั่วคราว กรุณาลองใหม่อีกครั้ง", "No crop data provided" : "ไม่มีการครอบตัดข้อมูลที่ระบุ", "No valid crop data provided" : "ไม่ได้ระบุข้อมูลการครอบตัดที่ถูกต้อง", @@ -69,6 +73,7 @@ "Dec." : "ธ.ค.", "Settings" : "ตั้งค่า", "Saving..." : "กำลังบันทึกข้อมูล...", + "seconds ago" : "วินาที ก่อนหน้านี้", "Couldn't send reset email. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาติดต่อผู้ดูแลระบบ", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "ลิงค์ที่ใช้สำหรับตั้งค่ารหัสผ่านใหม่ ของคุณ ได้ถูกส่งไปยังอีเมลของคุณ หากคุณยังไม่ได้รับอีกเมล ลองไปดูที่โฟลเดอร์ สแปม/ถังขยะ ในอีเมลของคุณ <br>ทั้งนี้หากหาอีเมลไม่พบกรุณาติดต่อผู้ดูแลระบบ", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ไฟล์ของคุณจะถูกเข้ารหัส หากคุณยังไม่ได้เปิดใช้งานรหัสการกู้คืน คุณจะได้รับข้อมูลของคุณกลับมาหลังจากที่รหัสผ่านของคุณถูกรีเซ็ต<br /> หากคุณไม่แน่ใจว่าควรทำอย่างไรโปรดติดต่อผู้ดูแลระบบของคุณก่อนที่คุณจะดำเนินการต่อไป <br /> คุณต้องการดำเนินการต่อ?", @@ -104,6 +109,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom ไม่สามารถอ่านโดย PHP ซึ่งมีผลด้านความปลอดภัยเป็นอย่างมาก สามารถดูข้อมูลเพิ่มเติมได้ที่ <a href=\"{docLink}\">เอกสาร</a>", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "PHP รุ่น ({version}) ของคุณ จะไม่ได้รับ <a href=\"{phpLink}\">การสนับสนุนโดย PHP</a> เราขอแนะนำให้คุณอัพเกรดรุ่นของ PHP เพื่อความปลอดภัย", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "การกำหนดค่าพร็อกซี่ไม่ถูกต้องหรือคุณกำลังเข้าถึง ownCloud จากพร็อกซี่ที่เชื่อถือได้ ถ้าคุณไม่ได้เข้าถึง ownCloud จากพร็อกซี่ที่เชื่อถือได้ นี้เป็นปัญหาด้านความปลอดภัย คุณอาจถูกโจมดีจากผู้ไม่หวังดี อ่านข้อมูลเพิ่มเติมได้ที่ <a href=\"{docLink}\">เอกสาร</a>", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached เป็นการกำหนดค่าแคช แต่มีโมดูล PHP ของ \"memcache\" ที่ผิดพลาดได้ถูกติดตั้ง \\OC\\Memcache\\Memcached สนับสนุนเฉพาะ \"memcached\" ไม่ใช่ \"memcache\" ดูได้ที่ <a href=\"{wikiLink}\">วิกิพีเดียเกี่ยวกับโมดูล Memcached</a>", "Error occurred while checking server setup" : "เกิดข้อผิดพลาดขณะที่ทำการตรวจสอบการติดตั้งเซิร์ฟเวอร์", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" ไม่ได้กำหนดค่าส่วนหัว Http ให้เท่ากับ \"{expected}\" นี่คือระบบการรักษาความปลอดภัยที่มีศักยภาพหรือลดความเสี่ยงที่จะเกิดขึ้นเราขอแนะนำให้ปรับการตั้งค่านี้", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" ส่วนหัว HTTP ไม่ได้กำหนดค่าให้น้อยกว่า \"{seconds}\" วินาที เพื่อความปลอดภัยที่เพิ่มขึ้นเราขอแนะนำให้เปิดใช้งาน HSTS ที่อธิบายไว้ใน <a href=\"{docUrl}\">เคล็ดลับการรักษาความปลอดภัย</a> ของเรา", @@ -166,6 +172,7 @@ "_download %n file_::_download %n files_" : ["ดาวน์โหลด %n ไฟล์"], "{version} is available. Get more information on how to update." : "{version} สามารถใช้ได้ รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัพเดท", "Updating {productName} to version {version}, this may take a while." : "กำลังอัพเดท {productName} ไปยังรุ่น {version} อาจใช้เวลาสักครู่", + "An error occurred." : "เกิดข้อผิดพลาด", "Please reload the page." : "โปรดโหลดหน้าเว็บใหม่", "The update was unsuccessful. " : "อัพเดทไม่สำเร็จ", "The update was successful. There were warnings." : "การอัพเดทสำเร็จ แต่มีคำเตือนอยู่", @@ -180,8 +187,8 @@ "New Password" : "รหัสผ่านใหม่", "Reset password" : "เปลี่ยนรหัสผ่านใหม่", "Searching other places" : "กำลังค้นหาสถานที่อื่นๆ", - "No search results in other places" : "ไม่มีผลการค้นหาในสถานที่อื่นๆ", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} ผลการค้นหาในสถานที่อื่นๆ"], + "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["ค้นหาพบ {count} ผลลัพธ์ในโฟลเดอร์อื่นๆ"], "Personal" : "ส่วนตัว", "Users" : "ผู้ใช้งาน", "Apps" : "แอปฯ", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index 075c7470f4e..a040c37e73e 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Şu kullanıcılara posta gönderilemedi: %s", "Preparing update" : "Güncelleme hazırlanıyor", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Taşıma testleri atlandı - config.php içerisinde \"update.skip-migration-test\" etkinleştirildi", "Turned on maintenance mode" : "Bakım kipi etkinleştirildi", "Turned off maintenance mode" : "Bakım kipi kapatıldı", "Maintenance mode is kept active" : "Bakım kipi etkin tutuldu", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "\"%s\", %s sürümüne güncellendi", "Repair warning: " : "Onarım uyarısı:", "Repair error: " : "Onarım hatası:", + "Set log level to debug - current level: \"%s\"" : "Günlük seviyesini hata ayıklamaya ayarla - geçerli seviye: \"%s\"", + "Reset log level to \"%s\"" : "Günlük seviyesini \"%s\" olarak sıfırla", "Following incompatible apps have been disabled: %s" : "Aşağıdaki uyumsuz uygulamalar devre dışı bırakıldı: %s", "Following apps have been disabled: %s" : "Aşağıdaki uygulamalar devre dışı bırakıldı: %s", "Already up to date" : "Zaten güncel", @@ -71,6 +74,7 @@ OC.L10N.register( "Dec." : "Ara.", "Settings" : "Ayarlar", "Saving..." : "Kaydediliyor...", + "seconds ago" : "saniyeler önce", "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Parolanızı değiştirme bağlantısı e-posta adresinize gönderildi. Makul bir süre içerisinde almadıysanız spam/gereksiz klasörlerini kontrol ediniz.<br>Bu konumlarda da yoksa yerel sistem yöneticinize sorunuz.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?", @@ -145,12 +149,14 @@ OC.L10N.register( "change" : "değiştir", "delete" : "sil", "access control" : "erişim kontrolü", + "Share details could not be loaded for this item." : "Bu öge için paylaşma ayrıntıları yüklenemedi.", "An error occured. Please try again" : "Bir hata oluştu. Lütfen yeniden deneyin", "Share" : "Paylaş", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş", "Share with users or groups …" : "Kullanıcı ve gruplarla paylaş...", "Share with users, groups or remote users …" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...", "Warning" : "Uyarı", + "Error while sending notification" : "Bildirim gönderilirken hata", "The object type is not specified." : "Nesne türü belirtilmemiş.", "Enter new" : "Yeni girin", "Delete" : "Sil", @@ -180,8 +186,8 @@ OC.L10N.register( "New Password" : "Yeni Parola", "Reset password" : "Parolayı sıfırla", "Searching other places" : "Diğer konumlarda aranıyor", - "No search results in other places" : "Diğer konumlarda arama sonucu yok", - "_{count} search result in other places_::_{count} search results in other places_" : ["Diğer konumlarda {count} arama sonucu","Diğer konumlarda {count} arama sonucu"], + "No search results in other folders" : "Diğer klasörlerde arama sonucu yok", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["Diğer klasörlerde {count} arama sonucu","Diğer bir klasörde {count} arama sonucu"], "Personal" : "Kişisel", "Users" : "Kullanıcılar", "Apps" : "Uygulamalar", @@ -261,7 +267,7 @@ OC.L10N.register( "App update required" : "Uygulama güncellemesi gerekli", "%s will be updated to version %s" : "%s, %s sürümüne güncellenecek", "These apps will be updated:" : "Bu uygulamalar güncellenecek:", - "These incompatible apps will be disabled:" : "Bu uyumsuz uygulamalar kapatılacaklar:", + "These incompatible apps will be disabled:" : "Bu uyumsuz uygulamalar devre dışı bırakılacak:", "The theme %s has been disabled." : "%s teması devre dışı bırakıldı.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Devam etmeden önce lütfen veritabanının, yapılandırma ve veri klasörlerinin yedeklenmiş olduğundan emin olun.", "Start update" : "Güncellemeyi başlat", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 9aa0942c957..2da5a2dec94 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Şu kullanıcılara posta gönderilemedi: %s", "Preparing update" : "Güncelleme hazırlanıyor", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Taşıma testleri atlandı - config.php içerisinde \"update.skip-migration-test\" etkinleştirildi", "Turned on maintenance mode" : "Bakım kipi etkinleştirildi", "Turned off maintenance mode" : "Bakım kipi kapatıldı", "Maintenance mode is kept active" : "Bakım kipi etkin tutuldu", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "\"%s\", %s sürümüne güncellendi", "Repair warning: " : "Onarım uyarısı:", "Repair error: " : "Onarım hatası:", + "Set log level to debug - current level: \"%s\"" : "Günlük seviyesini hata ayıklamaya ayarla - geçerli seviye: \"%s\"", + "Reset log level to \"%s\"" : "Günlük seviyesini \"%s\" olarak sıfırla", "Following incompatible apps have been disabled: %s" : "Aşağıdaki uyumsuz uygulamalar devre dışı bırakıldı: %s", "Following apps have been disabled: %s" : "Aşağıdaki uygulamalar devre dışı bırakıldı: %s", "Already up to date" : "Zaten güncel", @@ -69,6 +72,7 @@ "Dec." : "Ara.", "Settings" : "Ayarlar", "Saving..." : "Kaydediliyor...", + "seconds ago" : "saniyeler önce", "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Parolanızı değiştirme bağlantısı e-posta adresinize gönderildi. Makul bir süre içerisinde almadıysanız spam/gereksiz klasörlerini kontrol ediniz.<br>Bu konumlarda da yoksa yerel sistem yöneticinize sorunuz.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?", @@ -143,12 +147,14 @@ "change" : "değiştir", "delete" : "sil", "access control" : "erişim kontrolü", + "Share details could not be loaded for this item." : "Bu öge için paylaşma ayrıntıları yüklenemedi.", "An error occured. Please try again" : "Bir hata oluştu. Lütfen yeniden deneyin", "Share" : "Paylaş", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş", "Share with users or groups …" : "Kullanıcı ve gruplarla paylaş...", "Share with users, groups or remote users …" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...", "Warning" : "Uyarı", + "Error while sending notification" : "Bildirim gönderilirken hata", "The object type is not specified." : "Nesne türü belirtilmemiş.", "Enter new" : "Yeni girin", "Delete" : "Sil", @@ -178,8 +184,8 @@ "New Password" : "Yeni Parola", "Reset password" : "Parolayı sıfırla", "Searching other places" : "Diğer konumlarda aranıyor", - "No search results in other places" : "Diğer konumlarda arama sonucu yok", - "_{count} search result in other places_::_{count} search results in other places_" : ["Diğer konumlarda {count} arama sonucu","Diğer konumlarda {count} arama sonucu"], + "No search results in other folders" : "Diğer klasörlerde arama sonucu yok", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["Diğer klasörlerde {count} arama sonucu","Diğer bir klasörde {count} arama sonucu"], "Personal" : "Kişisel", "Users" : "Kullanıcılar", "Apps" : "Uygulamalar", @@ -259,7 +265,7 @@ "App update required" : "Uygulama güncellemesi gerekli", "%s will be updated to version %s" : "%s, %s sürümüne güncellenecek", "These apps will be updated:" : "Bu uygulamalar güncellenecek:", - "These incompatible apps will be disabled:" : "Bu uyumsuz uygulamalar kapatılacaklar:", + "These incompatible apps will be disabled:" : "Bu uyumsuz uygulamalar devre dışı bırakılacak:", "The theme %s has been disabled." : "%s teması devre dışı bırakıldı.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Devam etmeden önce lütfen veritabanının, yapılandırma ve veri klasörlerinin yedeklenmiş olduğundan emin olun.", "Start update" : "Güncellemeyi başlat", diff --git a/core/l10n/uk.js b/core/l10n/uk.js index f5c6ad86d9e..1cd0de81ff5 100644 --- a/core/l10n/uk.js +++ b/core/l10n/uk.js @@ -2,8 +2,10 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Неможливо надіслати листа наступним користувачам: %s ", + "Preparing update" : "Підготовка до оновлення", "Turned on maintenance mode" : "Увімкнено режим технічного обслуговування", "Turned off maintenance mode" : "Вимкнено режим технічного обслуговування", + "Maintenance mode is kept active" : "Режим обслуговування залишається активним", "Updated database" : "Базу даних оновлено", "Checked database schema update" : "Перевірено оновлення схеми бази даних", "Checked database schema update for apps" : "Перевірено оновлення схеми бази даних для додатків", @@ -11,6 +13,9 @@ OC.L10N.register( "Repair warning: " : "Попередження відновлення:", "Repair error: " : "Помилка відновлення:", "Following incompatible apps have been disabled: %s" : "Наступні несумісні додатки були вимкнені: %s", + "Following apps have been disabled: %s" : "Наступні додатки були вимкнені: %s", + "Already up to date" : "Актуально", + "File is too big" : "Файл занадто великий", "Invalid file provided" : "Надано невірний файл", "No image or file provided" : "Зображення або файлу не надано", "Unknown filetype" : "Невідомий тип файлу", @@ -26,13 +31,20 @@ OC.L10N.register( "Thursday" : "Четвер", "Friday" : "П'ятниця", "Saturday" : "Субота", - "Sun." : "Нед.", + "Sun." : "Нд.", "Mon." : "Пн.", "Tue." : "Вт.", "Wed." : "Ср.", "Thu." : "Чт.", "Fri." : "Пт.", "Sat." : "Сб.", + "Su" : "Нд.", + "Mo" : "Пн.", + "Tu" : "Вт.", + "We" : "Ср.", + "Th" : "Чт.", + "Fr" : "Пт.", + "Sa" : "Сб.", "January" : "Січень", "February" : "Лютий", "March" : "Березень", @@ -59,6 +71,7 @@ OC.L10N.register( "Dec." : "Гру.", "Settings" : "Налаштування", "Saving..." : "Збереження...", + "seconds ago" : "секунди тому", "Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого паролю було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваші файли зашифровані. Якщо ви не зробили ключ відновлення, після скидання паролю відновити ваші дані буде неможливо.<br /> Якщо ви не знаєте, що робити, будь ласка, зверніться до адміністратора перед продовженням.<br /> Ви дійсно хочете продовжити?", @@ -92,6 +105,7 @@ OC.L10N.register( "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Кеш пам'яті не налаштований. Задля покращення продуктивності, будь ласка, налаштуйте memcache, якщо є можливість. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom не доступний для читання PHP, що вкрай небажано з міркувань безпеки. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версія PHP ({version}) більше <a href=\"{phpLink}\">не підтримується</a>. Ми рекомендуємо вам оновити версію PHP щоб отримати кращу продуктивність та оновлення безпеки.", "Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не налаштований як \"{expected}\". Це потенційний ризик для безпеки чи приватності і ми радимо виправити це налаштування.", "Shared" : "Опубліковано", @@ -135,6 +149,7 @@ OC.L10N.register( "Share with users or groups …" : "Поширити серед користувачів або груп ...", "Share with users, groups or remote users …" : "Поширити серед локальних чи віддалених користувачів або груп ...", "Warning" : "Попередження", + "Error while sending notification" : "Помилка при надсиланні повідомлення", "The object type is not specified." : "Не визначено тип об'єкту.", "Enter new" : "Введіть новий", "Delete" : "Видалити", @@ -152,8 +167,10 @@ OC.L10N.register( "Updating {productName} to version {version}, this may take a while." : "Оновлення {productName} до версії {version}, це може займати деякий час.", "Please reload the page." : "Будь ласка, перезавантажте сторінку.", "The update was unsuccessful. " : "Оновлення завершилось невдачею.", + "The update was successful. There were warnings." : "Оновлення виконалось успішно, але були попередження.", "The update was successful. Redirecting you to ownCloud now." : "Оновлення виконалось успішно. Перенаправляємо вас на ownCloud.", "Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним", + "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів", "Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.", "%s password reset" : "%s скидання паролю", @@ -162,7 +179,8 @@ OC.L10N.register( "New Password" : "Новий пароль", "Reset password" : "Скинути пароль", "Searching other places" : "Йде пошук в інших місцях", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат пошуку в інших місцях","{count} результатів пошуку в інших місцях","{count} результати пошуку в інших місцях"], + "No search results in other folders" : "В інших теках нічого не знайдено", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат пошуку в інших теках","{count} результатів пошуку в інших теках","{count} результатів пошуку в інших теках"], "Personal" : "Особисте", "Users" : "Користувачі", "Apps" : "Додатки", @@ -227,6 +245,7 @@ OC.L10N.register( "An internal error occured." : "Виникла внутрішня помилка.", "Please try again or contact your administrator." : "Будь ласка, спробуйте ще раз або зверніться до адміністратора.", "Log in" : "Увійти", + "Wrong password. Reset it?" : "Невірний пароль. Скинути його?", "remember" : "запам'ятати", "Alternative Logins" : "Альтернативні імена користувача", "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Агов,<br><br>просто повідомляємо вам, що %s поділився »%s« з вами.<br><a href=\"%s\">Перегляньте!</a><br><br>", @@ -238,6 +257,10 @@ OC.L10N.register( "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Будь ласка, зверніться до адміністратора. Якщо ви є адміністратором цього серверу, ви можете налаштувати опцію \"trusted_domain\" в конфігураційному файлі config/config.php. Приклад конфігурації знаходиться в файлі config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Залежно від конфігурації Ви як адміністратор можете додати цей домен у список довірених, використовуйте кнопку нижче.", "Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений домен", + "App update required" : "Додаток потребує оновлення", + "%s will be updated to version %s" : "%s буде оновлено до версії %s", + "These apps will be updated:" : "Ці додатки будуть оновлені:", + "These incompatible apps will be disabled:" : "Ці несумісні додатки будуть вимкнені:", "The theme %s has been disabled." : "Тему %s було вимкнено.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продовженням переконайтеся, що ви зробили резервну копію бази даних, каталогу конфігурації та каталогу з даними.", "Start update" : "Почати оновлення", diff --git a/core/l10n/uk.json b/core/l10n/uk.json index 1c12acf311e..4e066cd6dd7 100644 --- a/core/l10n/uk.json +++ b/core/l10n/uk.json @@ -1,7 +1,9 @@ { "translations": { "Couldn't send mail to following users: %s " : "Неможливо надіслати листа наступним користувачам: %s ", + "Preparing update" : "Підготовка до оновлення", "Turned on maintenance mode" : "Увімкнено режим технічного обслуговування", "Turned off maintenance mode" : "Вимкнено режим технічного обслуговування", + "Maintenance mode is kept active" : "Режим обслуговування залишається активним", "Updated database" : "Базу даних оновлено", "Checked database schema update" : "Перевірено оновлення схеми бази даних", "Checked database schema update for apps" : "Перевірено оновлення схеми бази даних для додатків", @@ -9,6 +11,9 @@ "Repair warning: " : "Попередження відновлення:", "Repair error: " : "Помилка відновлення:", "Following incompatible apps have been disabled: %s" : "Наступні несумісні додатки були вимкнені: %s", + "Following apps have been disabled: %s" : "Наступні додатки були вимкнені: %s", + "Already up to date" : "Актуально", + "File is too big" : "Файл занадто великий", "Invalid file provided" : "Надано невірний файл", "No image or file provided" : "Зображення або файлу не надано", "Unknown filetype" : "Невідомий тип файлу", @@ -24,13 +29,20 @@ "Thursday" : "Четвер", "Friday" : "П'ятниця", "Saturday" : "Субота", - "Sun." : "Нед.", + "Sun." : "Нд.", "Mon." : "Пн.", "Tue." : "Вт.", "Wed." : "Ср.", "Thu." : "Чт.", "Fri." : "Пт.", "Sat." : "Сб.", + "Su" : "Нд.", + "Mo" : "Пн.", + "Tu" : "Вт.", + "We" : "Ср.", + "Th" : "Чт.", + "Fr" : "Пт.", + "Sa" : "Сб.", "January" : "Січень", "February" : "Лютий", "March" : "Березень", @@ -57,6 +69,7 @@ "Dec." : "Гру.", "Settings" : "Налаштування", "Saving..." : "Збереження...", + "seconds ago" : "секунди тому", "Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого паролю було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваші файли зашифровані. Якщо ви не зробили ключ відновлення, після скидання паролю відновити ваші дані буде неможливо.<br /> Якщо ви не знаєте, що робити, будь ласка, зверніться до адміністратора перед продовженням.<br /> Ви дійсно хочете продовжити?", @@ -90,6 +103,7 @@ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Кеш пам'яті не налаштований. Задля покращення продуктивності, будь ласка, налаштуйте memcache, якщо є можливість. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom не доступний для читання PHP, що вкрай небажано з міркувань безпеки. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.", + "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версія PHP ({version}) більше <a href=\"{phpLink}\">не підтримується</a>. Ми рекомендуємо вам оновити версію PHP щоб отримати кращу продуктивність та оновлення безпеки.", "Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не налаштований як \"{expected}\". Це потенційний ризик для безпеки чи приватності і ми радимо виправити це налаштування.", "Shared" : "Опубліковано", @@ -133,6 +147,7 @@ "Share with users or groups …" : "Поширити серед користувачів або груп ...", "Share with users, groups or remote users …" : "Поширити серед локальних чи віддалених користувачів або груп ...", "Warning" : "Попередження", + "Error while sending notification" : "Помилка при надсиланні повідомлення", "The object type is not specified." : "Не визначено тип об'єкту.", "Enter new" : "Введіть новий", "Delete" : "Видалити", @@ -150,8 +165,10 @@ "Updating {productName} to version {version}, this may take a while." : "Оновлення {productName} до версії {version}, це може займати деякий час.", "Please reload the page." : "Будь ласка, перезавантажте сторінку.", "The update was unsuccessful. " : "Оновлення завершилось невдачею.", + "The update was successful. There were warnings." : "Оновлення виконалось успішно, але були попередження.", "The update was successful. Redirecting you to ownCloud now." : "Оновлення виконалось успішно. Перенаправляємо вас на ownCloud.", "Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним", + "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів", "Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.", "%s password reset" : "%s скидання паролю", @@ -160,7 +177,8 @@ "New Password" : "Новий пароль", "Reset password" : "Скинути пароль", "Searching other places" : "Йде пошук в інших місцях", - "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат пошуку в інших місцях","{count} результатів пошуку в інших місцях","{count} результати пошуку в інших місцях"], + "No search results in other folders" : "В інших теках нічого не знайдено", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат пошуку в інших теках","{count} результатів пошуку в інших теках","{count} результатів пошуку в інших теках"], "Personal" : "Особисте", "Users" : "Користувачі", "Apps" : "Додатки", @@ -225,6 +243,7 @@ "An internal error occured." : "Виникла внутрішня помилка.", "Please try again or contact your administrator." : "Будь ласка, спробуйте ще раз або зверніться до адміністратора.", "Log in" : "Увійти", + "Wrong password. Reset it?" : "Невірний пароль. Скинути його?", "remember" : "запам'ятати", "Alternative Logins" : "Альтернативні імена користувача", "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Агов,<br><br>просто повідомляємо вам, що %s поділився »%s« з вами.<br><a href=\"%s\">Перегляньте!</a><br><br>", @@ -236,6 +255,10 @@ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Будь ласка, зверніться до адміністратора. Якщо ви є адміністратором цього серверу, ви можете налаштувати опцію \"trusted_domain\" в конфігураційному файлі config/config.php. Приклад конфігурації знаходиться в файлі config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Залежно від конфігурації Ви як адміністратор можете додати цей домен у список довірених, використовуйте кнопку нижче.", "Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений домен", + "App update required" : "Додаток потребує оновлення", + "%s will be updated to version %s" : "%s буде оновлено до версії %s", + "These apps will be updated:" : "Ці додатки будуть оновлені:", + "These incompatible apps will be disabled:" : "Ці несумісні додатки будуть вимкнені:", "The theme %s has been disabled." : "Тему %s було вимкнено.", "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продовженням переконайтеся, що ви зробили резервну копію бази даних, каталогу конфігурації та каталогу з даними.", "Start update" : "Почати оновлення", diff --git a/core/l10n/ur_PK.js b/core/l10n/ur_PK.js index 58bc1695810..f2e922a8221 100644 --- a/core/l10n/ur_PK.js +++ b/core/l10n/ur_PK.js @@ -29,6 +29,7 @@ OC.L10N.register( "December" : "دسمبر", "Settings" : "ترتیبات", "Saving..." : "محفوظ ھو رہا ہے ...", + "seconds ago" : "سیکنڈز پہلے", "No" : "نہیں", "Yes" : "ہاں", "Choose" : "منتخب کریں", diff --git a/core/l10n/ur_PK.json b/core/l10n/ur_PK.json index 037c35e29b0..763bdcb5f6f 100644 --- a/core/l10n/ur_PK.json +++ b/core/l10n/ur_PK.json @@ -27,6 +27,7 @@ "December" : "دسمبر", "Settings" : "ترتیبات", "Saving..." : "محفوظ ھو رہا ہے ...", + "seconds ago" : "سیکنڈز پہلے", "No" : "نہیں", "Yes" : "ہاں", "Choose" : "منتخب کریں", diff --git a/core/l10n/vi.js b/core/l10n/vi.js index e22aaa2b4a7..be73909d894 100644 --- a/core/l10n/vi.js +++ b/core/l10n/vi.js @@ -50,6 +50,7 @@ OC.L10N.register( "Dec." : "Tháng 12", "Settings" : "Cài đặt", "Saving..." : "Đang lưu...", + "seconds ago" : "vài giây trước", "No" : "Không", "Yes" : "Có", "Choose" : "Chọn", diff --git a/core/l10n/vi.json b/core/l10n/vi.json index acf5e2de9ab..6cb490030c3 100644 --- a/core/l10n/vi.json +++ b/core/l10n/vi.json @@ -48,6 +48,7 @@ "Dec." : "Tháng 12", "Settings" : "Cài đặt", "Saving..." : "Đang lưu...", + "seconds ago" : "vài giây trước", "No" : "Không", "Yes" : "Có", "Choose" : "Chọn", diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index 8b4a199c02c..305caeb0b80 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -12,6 +12,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "更新 \"%s\" 为 %s", "Repair warning: " : "修复警告:", "Repair error: " : "修复错误:", + "Set log level to debug - current level: \"%s\"" : "设置日志级别为 调试 - 目前级别:%s", + "Reset log level to \"%s\"" : "重设日志级别为 \"%s\"", "Following incompatible apps have been disabled: %s" : "下列不兼容应用已经被禁用:%s", "Following apps have been disabled: %s" : "下列应用已经被禁用:%s", "Already up to date" : "已经是最新", @@ -71,6 +73,7 @@ OC.L10N.register( "Dec." : "十二月", "Settings" : "设置", "Saving..." : "保存中...", + "seconds ago" : "几秒前", "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<br>如果未能收到邮件请联系管理员。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已被加密。如果您没有启用恢复密钥,密码重置后您将无法取回您的文件。<br />在继续之前,如果有疑问请联系您的管理员。<br />确认继续?", @@ -145,12 +148,14 @@ OC.L10N.register( "change" : "更改", "delete" : "删除", "access control" : "访问控制", + "Share details could not be loaded for this item." : "无法加载这个项目的分享详情", "An error occured. Please try again" : "发生了一个错误请重新尝试", "Share" : "分享", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户", "Share with users or groups …" : "分享给其他用户或组 ...", "Share with users, groups or remote users …" : "分享给其他用户、组或远程用户 ...", "Warning" : "警告", + "Error while sending notification" : "发送通知时出现错误", "The object type is not specified." : "未指定对象类型。", "Enter new" : "输入新...", "Delete" : "删除", @@ -180,8 +185,8 @@ OC.L10N.register( "New Password" : "新密码", "Reset password" : "重置密码", "Searching other places" : "搜索其他地方", - "No search results in other places" : "在其他地方没有搜索结果", - "_{count} search result in other places_::_{count} search results in other places_" : ["在其他地方有 {count} 个搜索结果"], + "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"], "Personal" : "个人", "Users" : "用户", "Apps" : "应用", diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index 23d3fc19366..001338a4383 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -10,6 +10,8 @@ "Updated \"%s\" to %s" : "更新 \"%s\" 为 %s", "Repair warning: " : "修复警告:", "Repair error: " : "修复错误:", + "Set log level to debug - current level: \"%s\"" : "设置日志级别为 调试 - 目前级别:%s", + "Reset log level to \"%s\"" : "重设日志级别为 \"%s\"", "Following incompatible apps have been disabled: %s" : "下列不兼容应用已经被禁用:%s", "Following apps have been disabled: %s" : "下列应用已经被禁用:%s", "Already up to date" : "已经是最新", @@ -69,6 +71,7 @@ "Dec." : "十二月", "Settings" : "设置", "Saving..." : "保存中...", + "seconds ago" : "几秒前", "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<br>如果未能收到邮件请联系管理员。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已被加密。如果您没有启用恢复密钥,密码重置后您将无法取回您的文件。<br />在继续之前,如果有疑问请联系您的管理员。<br />确认继续?", @@ -143,12 +146,14 @@ "change" : "更改", "delete" : "删除", "access control" : "访问控制", + "Share details could not be loaded for this item." : "无法加载这个项目的分享详情", "An error occured. Please try again" : "发生了一个错误请重新尝试", "Share" : "分享", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户", "Share with users or groups …" : "分享给其他用户或组 ...", "Share with users, groups or remote users …" : "分享给其他用户、组或远程用户 ...", "Warning" : "警告", + "Error while sending notification" : "发送通知时出现错误", "The object type is not specified." : "未指定对象类型。", "Enter new" : "输入新...", "Delete" : "删除", @@ -178,8 +183,8 @@ "New Password" : "新密码", "Reset password" : "重置密码", "Searching other places" : "搜索其他地方", - "No search results in other places" : "在其他地方没有搜索结果", - "_{count} search result in other places_::_{count} search results in other places_" : ["在其他地方有 {count} 个搜索结果"], + "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"], "Personal" : "个人", "Users" : "用户", "Apps" : "应用", diff --git a/core/l10n/zh_HK.js b/core/l10n/zh_HK.js index 571ab585cd5..04ffd8c0ca4 100644 --- a/core/l10n/zh_HK.js +++ b/core/l10n/zh_HK.js @@ -22,6 +22,7 @@ OC.L10N.register( "December" : "十二月", "Settings" : "設定", "Saving..." : "儲存中...", + "seconds ago" : "秒前", "No" : "否", "Yes" : "是", "Ok" : "確認", diff --git a/core/l10n/zh_HK.json b/core/l10n/zh_HK.json index d7aa79c78a7..2d9e8565855 100644 --- a/core/l10n/zh_HK.json +++ b/core/l10n/zh_HK.json @@ -20,6 +20,7 @@ "December" : "十二月", "Settings" : "設定", "Saving..." : "儲存中...", + "seconds ago" : "秒前", "No" : "否", "Yes" : "是", "Ok" : "確認", diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js index 900c210d6b4..c17dc5f09e2 100644 --- a/core/l10n/zh_TW.js +++ b/core/l10n/zh_TW.js @@ -71,6 +71,7 @@ OC.L10N.register( "Dec." : "十二月", "Settings" : "設定", "Saving..." : "儲存中...", + "seconds ago" : "幾秒前", "Couldn't send reset email. Please contact your administrator." : "無法寄送重設 email ,請聯絡系統管理員", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "重設密碼的連結已經 email 至你的信箱,如果你在一段時間內沒收到,請檢查垃圾郵件資料夾,如果還是找不到,請聯絡系統管理員。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的檔案是加密的,如果您沒有啟用救援金鑰,當您重設密碼之後將無法存取您的資料。<br/>如果不確定該怎麼做,請聯絡您的系統管理員。<br/>您確定要繼續嗎?", diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json index 2e94ebb294b..e336e6f5e74 100644 --- a/core/l10n/zh_TW.json +++ b/core/l10n/zh_TW.json @@ -69,6 +69,7 @@ "Dec." : "十二月", "Settings" : "設定", "Saving..." : "儲存中...", + "seconds ago" : "幾秒前", "Couldn't send reset email. Please contact your administrator." : "無法寄送重設 email ,請聯絡系統管理員", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "重設密碼的連結已經 email 至你的信箱,如果你在一段時間內沒收到,請檢查垃圾郵件資料夾,如果還是找不到,請聯絡系統管理員。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的檔案是加密的,如果您沒有啟用救援金鑰,當您重設密碼之後將無法存取您的資料。<br/>如果不確定該怎麼做,請聯絡您的系統管理員。<br/>您確定要繼續嗎?", diff --git a/core/lostpassword/templates/email.php b/core/lostpassword/templates/email.php index db968246600..618ac5dcd5c 100644 --- a/core/lostpassword/templates/email.php +++ b/core/lostpassword/templates/email.php @@ -1,7 +1,6 @@ <?php /** * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/core/register_command.php b/core/register_command.php index 114e115c491..4044d2d200c 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -1,6 +1,7 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> + * @author Björn Schießle <schiessle@owncloud.com> * @author Christian Kampka <christian@kampka.net> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> @@ -28,7 +29,8 @@ /** @var $application Symfony\Component\Console\Application */ $application->add(new OC\Core\Command\Status); $application->add(new OC\Core\Command\Check(\OC::$server->getConfig())); -$application->add(new OC\Core\Command\App\CheckCode()); +$infoParser = new \OC\App\InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator()); +$application->add(new OC\Core\Command\App\CheckCode($infoParser)); $application->add(new OC\Core\Command\L10n\CreateJs()); if (\OC::$server->getConfig()->getSystemValue('installed', false)) { @@ -92,7 +94,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) { $application->add(new OC\Core\Command\Maintenance\Repair(new \OC\Repair(\OC\Repair::getRepairSteps()), \OC::$server->getConfig())); $application->add(new OC\Core\Command\Maintenance\SingleUser(\OC::$server->getConfig())); - $application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig())); + $application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig(), \OC::$server->getLogger())); $application->add(new OC\Core\Command\User\Add(\OC::$server->getUserManager(), \OC::$server->getGroupManager())); $application->add(new OC\Core\Command\User\Delete(\OC::$server->getUserManager())); diff --git a/core/search/js/search.js b/core/search/js/search.js index bc67eb0e154..4e83a070170 100644 --- a/core/search/js/search.js +++ b/core/search/js/search.js @@ -217,10 +217,10 @@ $status.addClass('emptycontent').removeClass('status'); $status.html(''); $status.append('<div class="icon-search"></div>'); - $status.append('<h2>' + t('core', 'No search results in other places') + '</h2>'); + $status.append('<h2>' + t('core', 'No search results in other folders') + '</h2>'); } else { $status.removeClass('emptycontent').addClass('status'); - $status.text(n('core', '{count} search result in other places', '{count} search results in other places', count, {count:count})); + $status.text(n('core', '{count} search result in another folder', '{count} search results in other folders', count, {count:count})); } } function renderCurrent() { diff --git a/core/setup/controller.php b/core/setup/controller.php index f616ae5a5b3..36ba33f2a42 100644 --- a/core/setup/controller.php +++ b/core/setup/controller.php @@ -1,7 +1,6 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> - * @author cmeh <cmeh@users.noreply.github.com> * @author ideaship <ideaship@users.noreply.github.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> diff --git a/core/shipped.json b/core/shipped.json index 7993b61569c..184308d7a48 100644 --- a/core/shipped.json +++ b/core/shipped.json @@ -3,11 +3,12 @@ "shippedApps": [ "activity", "admin_audit", + "encryption", + "dav", "enterprise_key", "external", "files", "files_antivirus", - "encryption", "files_external", "files_ldap_home", "files_locking", @@ -21,6 +22,7 @@ "firewall", "firstrunwizard", "gallery", + "notifications", "objectstore", "provisioning_api", "sharepoint", @@ -29,7 +31,6 @@ "user_external", "user_ldap", "user_shibboleth", - "user_webdavauth", "windows_network_drive" ] } diff --git a/core/templates/login.php b/core/templates/login.php index 08c7768a432..6751d92f656 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -55,10 +55,9 @@ script('core', [ autocomplete="on" autocapitalize="off" autocorrect="off" required> <label for="password" class="infield"><?php p($l->t('Password')); ?></label> <img class="svg" id="password-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt=""/> + <input type="submit" id="submit" class="login primary icon-confirm svg" title="<?php p($l->t('Log in')); ?>" value="" disabled="disabled"/> </p> - <input type="submit" id="submit" class="login primary icon-confirm" title="<?php p($l->t('Log in')); ?>" value="" disabled="disabled"/> - <?php if (isset($_['invalidpassword']) && ($_['invalidpassword'])): ?> <a id="lost-password" class="warning" href=""> <?php p($l->t('Wrong password. Reset it?')); ?> @@ -66,7 +65,7 @@ script('core', [ <?php endif; ?> <?php if ($_['rememberLoginAllowed'] === true) : ?> <div class="remember-login-container"> - <input type="checkbox" name="remember_login" value="1" id="remember_login" class="white"> + <input type="checkbox" name="remember_login" value="1" id="remember_login" class="checkbox checkbox--white"> <label for="remember_login"><?php p($l->t('remember')); ?></label> </div> <?php endif; ?> diff --git a/core/vendor/strengthify/jquery.strengthify.js b/core/vendor/strengthify/jquery.strengthify.js index 21f5fa82956..4fcc4d7c7c4 100644 --- a/core/vendor/strengthify/jquery.strengthify.js +++ b/core/vendor/strengthify/jquery.strengthify.js @@ -58,7 +58,7 @@ dataType: 'script', url: options.zxcvbn }).done(function() { - me.bind('keyup input', function() { + me.bind('keyup input change', function() { var password = $(this).val(), // hide strengthigy if no input is provided opacity = (password === '') ? 0 : 1, @@ -3,9 +3,11 @@ * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Christopher Schäpers <kondou@ts.unde.re> * @author Jakob Sack <mail@jakobsack.de> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Oliver Kohl D.Sc. <oliver@kohl.bz> + * @author Phil Davis <phil.davis@inf.org> * @author Robin Appelman <icewind@owncloud.com> * @author Steffen Lindner <mail@steffen-lindner.de> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -113,7 +115,7 @@ try { \OCP\BackgroundJob::setExecutionType('cron'); } - // open the file and try to lock if. If it is not locked, the background + // open the file and try to lock it. If it is not locked, the background // job can be executed, otherwise another instance is already running $fp = fopen($lockFile, 'w'); $isLocked = flock($fp, LOCK_EX|LOCK_NB, $wouldBlock); diff --git a/index.php b/index.php index 536a55ad6eb..5c376dcf285 100644 --- a/index.php +++ b/index.php @@ -1,6 +1,5 @@ <?php /** - * @author Frank Karlitschek <frank@owncloud.org> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> diff --git a/l10n/.tx/config b/l10n/.tx/config index 875e1324dbc..a91a236641e 100644 --- a/l10n/.tx/config +++ b/l10n/.tx/config @@ -62,9 +62,3 @@ source_file = templates/user_ldap.pot source_lang = en type = PO -[owncloud.user_webdavauth] -file_filter = <lang>/user_webdavauth.po -source_file = templates/user_webdavauth.pot -source_lang = en -type = PO - diff --git a/l10n/rm-old.sh b/l10n/rm-old.sh index 30e4509db25..e5e1348014b 100644 --- a/l10n/rm-old.sh +++ b/l10n/rm-old.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash lang=(ach ady af_ZA ak am_ET ar ast az bal be bg_BG bn_BD bn_IN bs ca cs_CZ cy_GB da de de_AT de_DE el en_GB en@pirate eo es es_AR es_CL es_MX et_EE eu fa fi_FI fil fr fy_NL gl gu he hi hr hu_HU hy ia id io is it ja jv ka_GE km kn ko ku_IQ la lb lo lt_LT lv mg mk ml ml_IN mn mr ms_MY mt_MT my_MM nb_NO nds ne nl nn_NO nqo oc or_IN pa pl pt_BR pt_PT ro ru si_LK sk_SK sl sq sr sr@latin su sv sw_KE ta_IN ta_LK te tg_TJ th_TH tl_PH tr tzl tzm ug uk ur_PK uz vi yo zh_CN zh_HK zh_TW) diff --git a/lib/autoloader.php b/lib/autoloader.php index 8361f31b038..f60f5a358ca 100644 --- a/lib/autoloader.php +++ b/lib/autoloader.php @@ -5,6 +5,7 @@ * @author Markus Goetz <markus@woboq.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Victor Dubiniuk <dubiniuk@owncloud.com> * diff --git a/lib/base.php b/lib/base.php index f5ba05ded74..09e1d0aea49 100644 --- a/lib/base.php +++ b/lib/base.php @@ -13,15 +13,17 @@ * @author Frank Karlitschek <frank@owncloud.org> * @author Georg Ehrke <georg@owncloud.com> * @author Hugo Gonzalez Labrador <hglavra@gmail.com> + * @author Individual IT Services <info@individual-it.net> * @author Jakob Sack <mail@jakobsack.de> - * @author Jan-Christoph Borchardt <hey@jancborchardt.net> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author marc0s <marcos@tenak.net> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Owen Winkler <a_github@midnightcircus.com> + * @author Phil Davis <phil.davis@inf.org> * @author Ramiro Aparicio <rapariciog@gmail.com> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> @@ -228,7 +230,7 @@ class OC { public static function checkConfig() { $l = \OC::$server->getL10N('lib'); - // Create config in case it does not already exists + // Create config if it does not already exist $configFilePath = self::$configDir .'/config.php'; if(!file_exists($configFilePath)) { @touch($configFilePath); @@ -237,7 +239,7 @@ class OC { // Check if config is writable $configFileWritable = is_writable($configFilePath); if (!$configFileWritable && !OC_Helper::isReadOnlyConfigEnabled() - || !$configFileWritable && \OCP\Util::needUpgrade()) { + || !$configFileWritable && self::checkUpgrade(false)) { if (self::$CLI) { echo $l->t('Cannot write into "config" directory!')."\n"; echo $l->t('This can usually be fixed by giving the webserver write access to the config directory')."\n"; @@ -314,7 +316,7 @@ class OC { } /** - * check if the instance needs to preform an upgrade + * check if the instance needs to perform an upgrade * * @return bool * @deprecated use \OCP\Util::needUpgrade() instead @@ -376,63 +378,6 @@ class OC { $tmpl->printPage(); } - public static function initTemplateEngine() { - // Add the stuff we need always - // following logic will import all vendor libraries that are - // specified in core/js/core.json - $fileContent = file_get_contents(OC::$SERVERROOT . '/core/js/core.json'); - if($fileContent !== false) { - $coreDependencies = json_decode($fileContent, true); - foreach($coreDependencies['vendor'] as $vendorLibrary) { - // remove trailing ".js" as addVendorScript will append it - OC_Util::addVendorScript( - substr($vendorLibrary, 0, strlen($vendorLibrary) - 3)); - } - } else { - throw new \Exception('Cannot read core/js/core.json'); - } - - OC_Util::addScript("placeholders"); - OC_Util::addScript("compatibility"); - OC_Util::addScript("jquery.ocdialog"); - OC_Util::addScript("oc-dialogs"); - OC_Util::addScript("js"); - OC_Util::addScript("l10n"); - OC_Util::addTranslations("core"); - OC_Util::addScript("octemplate"); - OC_Util::addScript("eventsource"); - OC_Util::addScript("config"); - OC_Util::addScript('search', 'search'); - OC_Util::addScript("oc-requesttoken"); - OC_Util::addScript("apps"); - OC_Util::addScript('mimetype'); - OC_Util::addScript('mimetypelist'); - OC_Util::addVendorScript('snapjs/dist/latest/snap'); - OC_Util::addVendorScript('core', 'backbone/backbone'); - OC_Util::addScript('oc-backbone'); - - // avatars - if (\OC::$server->getSystemConfig()->getValue('enable_avatars', true) === true) { - \OC_Util::addScript('placeholder'); - \OC_Util::addVendorScript('blueimp-md5/js/md5'); - \OC_Util::addScript('jquery.avatar'); - \OC_Util::addScript('avatar'); - } - - OC_Util::addStyle("styles"); - OC_Util::addStyle("header"); - OC_Util::addStyle("mobile"); - OC_Util::addStyle("icons"); - OC_Util::addStyle("fonts"); - OC_Util::addStyle("apps"); - OC_Util::addStyle("fixes"); - OC_Util::addStyle("multiselect"); - OC_Util::addVendorStyle('jquery-ui/themes/base/jquery-ui'); - OC_Util::addStyle('jquery-ui-fixes'); - OC_Util::addStyle("tooltip"); - OC_Util::addStyle("jquery.ocdialog"); - } - public static function initSession() { // prevents javascript from accessing php session cookies ini_set('session.cookie_httponly', true); @@ -482,7 +427,8 @@ class OC { // session timeout if ($session->exists('LAST_ACTIVITY') && (time() - $session->get('LAST_ACTIVITY') > $sessionLifeTime)) { if (isset($_COOKIE[session_name()])) { - setcookie(session_name(), '', time() - 42000, $cookie_path); + setcookie(session_name(), null, -1, self::$WEBROOT ? : '/'); + unset($_COOKIE[session_name()]); } session_unset(); session_destroy(); @@ -567,7 +513,7 @@ class OC { //try to configure php to enable big file uploads. //this doesn´t work always depending on the webserver and php configuration. - //Let´s try to overwrite some defaults anyways + //Let´s try to overwrite some defaults anyway //try to set the maximum execution time to 60min @set_time_limit(3600); @@ -611,7 +557,6 @@ class OC { self::initSession(); } \OC::$server->getEventLogger()->end('init_session'); - self::initTemplateEngine(); self::checkConfig(); self::checkInstalled(); @@ -664,6 +609,14 @@ class OC { OC_User::useBackend(new OC_User_Database()); OC_Group::useBackend(new OC_Group_Database()); + // Subscribe to the hook + \OCP\Util::connectHook( + '\OCA\Files_Sharing\API\Server2Server', + 'preLoginNameUsedAsUserName', + '\OC_User_Database', + 'preLoginNameUsedAsUserName' + ); + //setup extra user backends if (!self::checkUpgrade(false)) { OC_User::setupBackends(); @@ -673,7 +626,7 @@ class OC { self::registerFilesystemHooks(); if ($systemConfig->getValue('enable_previews', true)) { self::registerPreviewHooks(); - } + } self::registerShareHooks(); self::registerLogRotate(); self::registerLocalAddressBook(); @@ -686,12 +639,6 @@ class OC { $lockProvider = \OC::$server->getLockingProvider(); register_shutdown_function(array($lockProvider, 'releaseAll')); - if ($systemConfig->getValue('installed', false) && !self::checkUpgrade(false)) { - if (\OC::$server->getConfig()->getAppValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { - OC_Util::addScript('backgroundjobs'); - } - } - // Check whether the sample configuration has been copied if($systemConfig->getValue('copied_sample_config', false)) { $l = \OC::$server->getL10N('lib'); @@ -742,7 +689,7 @@ class OC { */ public static function registerCacheHooks() { //don't try to do this before we are properly setup - if (\OC::$server->getSystemConfig()->getValue('installed', false) && !\OCP\Util::needUpgrade()) { + if (\OC::$server->getSystemConfig()->getValue('installed', false) && !self::checkUpgrade(false)) { // NOTE: This will be replaced to use OCP $userSession = self::$server->getUserSession(); @@ -778,7 +725,7 @@ class OC { */ public static function registerLogRotate() { $systemConfig = \OC::$server->getSystemConfig(); - if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !\OCP\Util::needUpgrade()) { + if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) { //don't try to do this before we are properly setup //use custom logfile path if defined, otherwise use default of owncloud.log in data directory \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/owncloud.log')); @@ -803,8 +750,9 @@ class OC { OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete'); OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete'); OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files'); - OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete'); + OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions'); OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete'); + OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions'); } /** @@ -870,8 +818,7 @@ class OC { // Load minimum set of apps if (!self::checkUpgrade(false) - && !$systemConfig->getValue('maintenance', false) - && !\OCP\Util::needUpgrade()) { + && !$systemConfig->getValue('maintenance', false)) { // For logged-in users: Load everything if(OC_User::isLoggedIn()) { OC_App::loadApps(); @@ -884,7 +831,7 @@ class OC { if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) { try { - if (!$systemConfig->getValue('maintenance', false) && !\OCP\Util::needUpgrade()) { + if (!$systemConfig->getValue('maintenance', false) && !self::checkUpgrade(false)) { OC_App::loadApps(array('filesystem', 'logging')); OC_App::loadApps(); } diff --git a/lib/l10n/af_ZA.js b/lib/l10n/af_ZA.js index 05dad16ea68..fbd3c49ad44 100644 --- a/lib/l10n/af_ZA.js +++ b/lib/l10n/af_ZA.js @@ -10,6 +10,7 @@ OC.L10N.register( "today" : "vandag", "seconds ago" : "sekondes gelede", "web services under your control" : "webdienste onder jou beheer", - "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate." + "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate.", + "Apps" : "Toepassings" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/af_ZA.json b/lib/l10n/af_ZA.json index dcf24d58fd6..a17cac172e7 100644 --- a/lib/l10n/af_ZA.json +++ b/lib/l10n/af_ZA.json @@ -8,6 +8,7 @@ "today" : "vandag", "seconds ago" : "sekondes gelede", "web services under your control" : "webdienste onder jou beheer", - "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate." + "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate.", + "Apps" : "Toepassings" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js index 9ec243672e1..e4cc5ca2131 100644 --- a/lib/l10n/ar.js +++ b/lib/l10n/ar.js @@ -37,6 +37,7 @@ OC.L10N.register( "Set an admin password." : "اعداد كلمة مرور للمدير", "%s shared »%s« with you" : "%s شارك »%s« معك", "Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"", + "Apps" : "التطبيقات", "A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح", "A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة" }, diff --git a/lib/l10n/ar.json b/lib/l10n/ar.json index 06d47dc255a..2e6a83fd969 100644 --- a/lib/l10n/ar.json +++ b/lib/l10n/ar.json @@ -35,6 +35,7 @@ "Set an admin password." : "اعداد كلمة مرور للمدير", "%s shared »%s« with you" : "%s شارك »%s« معك", "Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"", + "Apps" : "التطبيقات", "A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح", "A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" diff --git a/lib/l10n/ast.js b/lib/l10n/ast.js index 3fb120b255b..5535c14a84a 100644 --- a/lib/l10n/ast.js +++ b/lib/l10n/ast.js @@ -60,7 +60,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s compartió »%s« contigo", "Sharing %s failed, because the file does not exist" : "Compartir %s falló, porque'l ficheru nun esiste", "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Compartir %s falló, yá que l'usuariu %s ye'l dueñu del elementu", "Sharing %s failed, because the user %s does not exist" : "Compartir %s falló, yá que l'usuariu %s nun esiste", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Compartir %s falló, yá que l'usuariu %s nun ye miembru de nengún de los grupos de los que ye miembru %s", "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s", @@ -76,12 +75,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartíu %s tien d'implementar la interfaz OCP\\Share_Backend", "Sharing backend %s not found" : "Nun s'alcontró'l botón de compartición %s", "Sharing backend for %s not found" : "Nun s'alcontró'l botón de partición pa %s", - "Sharing %s failed, because the user %s is the original sharer" : "Compartir %s falló, yá que l'usuariu %s ye'l compartidor orixinal", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartir %s falló, porque los permisos perpasen los otorgaos a %s", "Sharing %s failed, because resharing is not allowed" : "Compartir %s falló, porque nun se permite la re-compartición", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartir %s falló porque'l motor compartíu pa %s podría nun atopar el so orixe", "Sharing %s failed, because the file could not be found in the file cache" : "Compartir %s falló, yá que'l ficheru nun pudo atopase na caché de ficheru", "Could not find category \"%s\"" : "Nun pudo alcontrase la estaya \"%s.\"", + "Apps" : "Aplicaciones", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Namái tan permitíos los siguientes caráuteres nun nome d'usuariu: \"a-z\", \"A-Z\", \"0-9\", y \"_.@-\"", "A valid username must be provided" : "Tien d'apurrise un nome d'usuariu válidu", "A valid password must be provided" : "Tien d'apurrise una contraseña válida", diff --git a/lib/l10n/ast.json b/lib/l10n/ast.json index f51d08ad731..4b625a7476c 100644 --- a/lib/l10n/ast.json +++ b/lib/l10n/ast.json @@ -58,7 +58,6 @@ "%s shared »%s« with you" : "%s compartió »%s« contigo", "Sharing %s failed, because the file does not exist" : "Compartir %s falló, porque'l ficheru nun esiste", "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Compartir %s falló, yá que l'usuariu %s ye'l dueñu del elementu", "Sharing %s failed, because the user %s does not exist" : "Compartir %s falló, yá que l'usuariu %s nun esiste", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Compartir %s falló, yá que l'usuariu %s nun ye miembru de nengún de los grupos de los que ye miembru %s", "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s", @@ -74,12 +73,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartíu %s tien d'implementar la interfaz OCP\\Share_Backend", "Sharing backend %s not found" : "Nun s'alcontró'l botón de compartición %s", "Sharing backend for %s not found" : "Nun s'alcontró'l botón de partición pa %s", - "Sharing %s failed, because the user %s is the original sharer" : "Compartir %s falló, yá que l'usuariu %s ye'l compartidor orixinal", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartir %s falló, porque los permisos perpasen los otorgaos a %s", "Sharing %s failed, because resharing is not allowed" : "Compartir %s falló, porque nun se permite la re-compartición", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartir %s falló porque'l motor compartíu pa %s podría nun atopar el so orixe", "Sharing %s failed, because the file could not be found in the file cache" : "Compartir %s falló, yá que'l ficheru nun pudo atopase na caché de ficheru", "Could not find category \"%s\"" : "Nun pudo alcontrase la estaya \"%s.\"", + "Apps" : "Aplicaciones", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Namái tan permitíos los siguientes caráuteres nun nome d'usuariu: \"a-z\", \"A-Z\", \"0-9\", y \"_.@-\"", "A valid username must be provided" : "Tien d'apurrise un nome d'usuariu válidu", "A valid password must be provided" : "Tien d'apurrise una contraseña válida", diff --git a/lib/l10n/bg_BG.js b/lib/l10n/bg_BG.js index a02d35061ef..bdbec28e93d 100644 --- a/lib/l10n/bg_BG.js +++ b/lib/l10n/bg_BG.js @@ -69,7 +69,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.", "Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.", "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.", - "Sharing %s failed, because the user %s is the item owner" : "Споделяне на %s е неуспешно, защото потребител %s е оригиналния собственик.", "Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които %s членува.", "Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.", @@ -86,12 +85,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Споделянето на сървърния %s трябва да поддържа OCP\\Share_Backend интерфейс.", "Sharing backend %s not found" : "Споделянето на сървърния %s не е открито.", "Sharing backend for %s not found" : "Споделянето на сървъра за %s не е открито.", - "Sharing %s failed, because the user %s is the original sharer" : "Споделяне на %s е неуспешно, защото потребител %s е оригиналния собственик.", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.", "Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторно споделяне не е разрешено.", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.", "Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.", "Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".", + "Apps" : "Приложения", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само следните символи са разрешени в потребителското име: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\".", "A valid username must be provided" : "Валидно потребителско име трябва да бъде зададено.", "A valid password must be provided" : "Валидна парола трябва да бъде зададена.", diff --git a/lib/l10n/bg_BG.json b/lib/l10n/bg_BG.json index 3b9b899e53f..d9628d21548 100644 --- a/lib/l10n/bg_BG.json +++ b/lib/l10n/bg_BG.json @@ -67,7 +67,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.", "Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.", "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.", - "Sharing %s failed, because the user %s is the item owner" : "Споделяне на %s е неуспешно, защото потребител %s е оригиналния собственик.", "Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които %s членува.", "Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.", @@ -84,12 +83,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Споделянето на сървърния %s трябва да поддържа OCP\\Share_Backend интерфейс.", "Sharing backend %s not found" : "Споделянето на сървърния %s не е открито.", "Sharing backend for %s not found" : "Споделянето на сървъра за %s не е открито.", - "Sharing %s failed, because the user %s is the original sharer" : "Споделяне на %s е неуспешно, защото потребител %s е оригиналния собственик.", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.", "Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторно споделяне не е разрешено.", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.", "Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.", "Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".", + "Apps" : "Приложения", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само следните символи са разрешени в потребителското име: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\".", "A valid username must be provided" : "Валидно потребителско име трябва да бъде зададено.", "A valid password must be provided" : "Валидна парола трябва да бъде зададена.", diff --git a/lib/l10n/bn_BD.js b/lib/l10n/bn_BD.js index 3ebf53a2240..f9a899ba5df 100644 --- a/lib/l10n/bn_BD.js +++ b/lib/l10n/bn_BD.js @@ -33,6 +33,7 @@ OC.L10N.register( "Unknown user" : "অপরিচিত ব্যবহারকারী", "%s shared »%s« with you" : "%s আপনার সাথে »%s« ভাগাভাগি করেছে", "Sharing %s failed, because the file does not exist" : "%s ভাগাভাগি ব্যার্থ, কারণ ফাইলটি নেই", - "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা" + "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা", + "Apps" : "অ্যাপ" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/bn_BD.json b/lib/l10n/bn_BD.json index 47e4311939a..2c384053014 100644 --- a/lib/l10n/bn_BD.json +++ b/lib/l10n/bn_BD.json @@ -31,6 +31,7 @@ "Unknown user" : "অপরিচিত ব্যবহারকারী", "%s shared »%s« with you" : "%s আপনার সাথে »%s« ভাগাভাগি করেছে", "Sharing %s failed, because the file does not exist" : "%s ভাগাভাগি ব্যার্থ, কারণ ফাইলটি নেই", - "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা" + "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা", + "Apps" : "অ্যাপ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/bs.js b/lib/l10n/bs.js index 004d5cd2aac..b4fccf12d5d 100644 --- a/lib/l10n/bs.js +++ b/lib/l10n/bs.js @@ -11,6 +11,7 @@ OC.L10N.register( "Authentication error" : "Grešna autentifikacije", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s na ovoj platformi neće raditi kako treba. Korištenje na vlastiti rizik!", "For the best results, please consider using a GNU/Linux server instead." : "Umjesto toga, za najbolje rezultate, molimo razmislite o mogućnosti korištenje GNU/Linux servera.", + "Apps" : "Aplikacije", "A valid username must be provided" : "Nužno je navesti valjano korisničko ime", "A valid password must be provided" : "Nužno je navesti valjanu lozinku", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Uzrok tome je vjerojatno neki ubrzivač predmemorisanja kao što je Zend OPcache ili eAccelerator." diff --git a/lib/l10n/bs.json b/lib/l10n/bs.json index f4da9911f97..e9514de8275 100644 --- a/lib/l10n/bs.json +++ b/lib/l10n/bs.json @@ -9,6 +9,7 @@ "Authentication error" : "Grešna autentifikacije", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s na ovoj platformi neće raditi kako treba. Korištenje na vlastiti rizik!", "For the best results, please consider using a GNU/Linux server instead." : "Umjesto toga, za najbolje rezultate, molimo razmislite o mogućnosti korištenje GNU/Linux servera.", + "Apps" : "Aplikacije", "A valid username must be provided" : "Nužno je navesti valjano korisničko ime", "A valid password must be provided" : "Nužno je navesti valjanu lozinku", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Uzrok tome je vjerojatno neki ubrzivač predmemorisanja kao što je Zend OPcache ili eAccelerator." diff --git a/lib/l10n/ca.js b/lib/l10n/ca.js index 1a2b29e088b..16ad1566bee 100644 --- a/lib/l10n/ca.js +++ b/lib/l10n/ca.js @@ -58,7 +58,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s ha compartit »%s« amb tu", "Sharing %s failed, because the file does not exist" : "Ha fallat en compartir %s, perquè el fitxer no existeix", "You are not allowed to share %s" : "No se us permet compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Ha fallat en compartir %s, perquè l'usuari %s és el propietari de l'element", "Sharing %s failed, because the user %s does not exist" : "Ha fallat en compartir %s, perquè l'usuari %s no existeix", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ha fallat en compartir %s, perquè l'usuari %s no és membre de cap grup dels que %s és membre", "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s", @@ -74,12 +73,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El rerefons de compartició %s ha d'implementar la interfície OCP\\Share_Backend", "Sharing backend %s not found" : "El rerefons de compartició %s no s'ha trobat", "Sharing backend for %s not found" : "El rerefons de compartició per a %s no s'ha trobat", - "Sharing %s failed, because the user %s is the original sharer" : "Ha fallat en compartir %s perquè l'usuari %s és qui comparteix inicialment", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ha fallat en compartir %s perquè els permisos excedeixen els permesos per a %s", "Sharing %s failed, because resharing is not allowed" : "Ha fallat en compartir %s, perquè no es permet compartir de nou", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ha fallat en compartir %s, perquè el rerefons de compartir per %s no pot trobar la seva font", "Sharing %s failed, because the file could not be found in the file cache" : "Ha fallat en compartir %s, perquè el fitxer no s'ha trobat en el fitxer cau", "Could not find category \"%s\"" : "No s'ha trobat la categoria \"%s\"", + "Apps" : "Aplicacions", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Només els caràcters següents estan permesos en el nom d'usuari: \"a-z\", \"A-Z\", \"0-9\" i \"_.@-\"", "A valid username must be provided" : "Heu de facilitar un nom d'usuari vàlid", "A valid password must be provided" : "Heu de facilitar una contrasenya vàlida", diff --git a/lib/l10n/ca.json b/lib/l10n/ca.json index 2fac46f86a0..86f41fcfb34 100644 --- a/lib/l10n/ca.json +++ b/lib/l10n/ca.json @@ -56,7 +56,6 @@ "%s shared »%s« with you" : "%s ha compartit »%s« amb tu", "Sharing %s failed, because the file does not exist" : "Ha fallat en compartir %s, perquè el fitxer no existeix", "You are not allowed to share %s" : "No se us permet compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Ha fallat en compartir %s, perquè l'usuari %s és el propietari de l'element", "Sharing %s failed, because the user %s does not exist" : "Ha fallat en compartir %s, perquè l'usuari %s no existeix", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ha fallat en compartir %s, perquè l'usuari %s no és membre de cap grup dels que %s és membre", "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s", @@ -72,12 +71,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El rerefons de compartició %s ha d'implementar la interfície OCP\\Share_Backend", "Sharing backend %s not found" : "El rerefons de compartició %s no s'ha trobat", "Sharing backend for %s not found" : "El rerefons de compartició per a %s no s'ha trobat", - "Sharing %s failed, because the user %s is the original sharer" : "Ha fallat en compartir %s perquè l'usuari %s és qui comparteix inicialment", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ha fallat en compartir %s perquè els permisos excedeixen els permesos per a %s", "Sharing %s failed, because resharing is not allowed" : "Ha fallat en compartir %s, perquè no es permet compartir de nou", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ha fallat en compartir %s, perquè el rerefons de compartir per %s no pot trobar la seva font", "Sharing %s failed, because the file could not be found in the file cache" : "Ha fallat en compartir %s, perquè el fitxer no s'ha trobat en el fitxer cau", "Could not find category \"%s\"" : "No s'ha trobat la categoria \"%s\"", + "Apps" : "Aplicacions", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Només els caràcters següents estan permesos en el nom d'usuari: \"a-z\", \"A-Z\", \"0-9\" i \"_.@-\"", "A valid username must be provided" : "Heu de facilitar un nom d'usuari vàlid", "A valid password must be provided" : "Heu de facilitar una contrasenya vàlida", diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js index 65ff43b4f23..1872abc6fa3 100644 --- a/lib/l10n/cs_CZ.js +++ b/lib/l10n/cs_CZ.js @@ -87,7 +87,7 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Sdílení %s selhalo, podpůrná vrstva nepodporuje typ sdílení %i", "Sharing %s failed, because the file does not exist" : "Sdílení %s selhalo, protože soubor neexistuje", "You are not allowed to share %s" : "Nemáte povoleno sdílet %s", - "Sharing %s failed, because the user %s is the item owner" : "Sdílení položky %s selhalo, protože uživatel %s je jejím vlastníkem", + "Sharing %s failed, because you can not share with yourself" : "Sdílení %s selhalo, protože nemůžete sdílet sami se sebou", "Sharing %s failed, because the user %s does not exist" : "Sdílení položky %s selhalo, protože uživatel %s neexistuje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sdílení položky %s selhalo, protože uživatel %s není členem žádné skupiny společné s uživatelem %s", "Sharing %s failed, because this item is already shared with %s" : "Sdílení položky %s selhalo, protože položka již je s uživatelem %s sdílena", @@ -106,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Úložiště pro sdílení %s musí implementovat rozhraní OCP\\Share_Backend", "Sharing backend %s not found" : "Úložiště sdílení %s nenalezeno", "Sharing backend for %s not found" : "Úložiště sdílení pro %s nenalezeno", - "Sharing %s failed, because the user %s is the original sharer" : "Sdílení položky %s selhalo, protože byla sdílena uživatelem %s jako první", + "Sharing failed, because the user %s is the original sharer" : "Sdílení položky selhalo, protože uživatel %s je originálním vlastníkem", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sdílení položky %s selhalo, protože jsou k tomu nutná vyšší oprávnění, než jaká byla %s povolena.", "Sharing %s failed, because resharing is not allowed" : "Sdílení položky %s selhalo, protože znovu-sdílení není povoleno", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sdílení položky %s selhalo, protože úložiště sdílení %s nenalezla zdroj", "Sharing %s failed, because the file could not be found in the file cache" : "Sdílení položky %s selhalo, protože soubor nebyl nalezen ve vyrovnávací paměti", "Could not find category \"%s\"" : "Nelze nalézt kategorii \"%s\"", + "Apps" : "Aplikace", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Pouze následující znaky jsou povoleny v uživatelském jménu: \"a-z\", \"A-Z\", \"0-9\" a \"_.@-\"", "A valid username must be provided" : "Musíte zadat platné uživatelské jméno", "A valid password must be provided" : "Musíte zadat platné heslo", diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json index 501210dd0f8..b001ef6f2c5 100644 --- a/lib/l10n/cs_CZ.json +++ b/lib/l10n/cs_CZ.json @@ -85,7 +85,7 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Sdílení %s selhalo, podpůrná vrstva nepodporuje typ sdílení %i", "Sharing %s failed, because the file does not exist" : "Sdílení %s selhalo, protože soubor neexistuje", "You are not allowed to share %s" : "Nemáte povoleno sdílet %s", - "Sharing %s failed, because the user %s is the item owner" : "Sdílení položky %s selhalo, protože uživatel %s je jejím vlastníkem", + "Sharing %s failed, because you can not share with yourself" : "Sdílení %s selhalo, protože nemůžete sdílet sami se sebou", "Sharing %s failed, because the user %s does not exist" : "Sdílení položky %s selhalo, protože uživatel %s neexistuje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sdílení položky %s selhalo, protože uživatel %s není členem žádné skupiny společné s uživatelem %s", "Sharing %s failed, because this item is already shared with %s" : "Sdílení položky %s selhalo, protože položka již je s uživatelem %s sdílena", @@ -104,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Úložiště pro sdílení %s musí implementovat rozhraní OCP\\Share_Backend", "Sharing backend %s not found" : "Úložiště sdílení %s nenalezeno", "Sharing backend for %s not found" : "Úložiště sdílení pro %s nenalezeno", - "Sharing %s failed, because the user %s is the original sharer" : "Sdílení položky %s selhalo, protože byla sdílena uživatelem %s jako první", + "Sharing failed, because the user %s is the original sharer" : "Sdílení položky selhalo, protože uživatel %s je originálním vlastníkem", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sdílení položky %s selhalo, protože jsou k tomu nutná vyšší oprávnění, než jaká byla %s povolena.", "Sharing %s failed, because resharing is not allowed" : "Sdílení položky %s selhalo, protože znovu-sdílení není povoleno", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sdílení položky %s selhalo, protože úložiště sdílení %s nenalezla zdroj", "Sharing %s failed, because the file could not be found in the file cache" : "Sdílení položky %s selhalo, protože soubor nebyl nalezen ve vyrovnávací paměti", "Could not find category \"%s\"" : "Nelze nalézt kategorii \"%s\"", + "Apps" : "Aplikace", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Pouze následující znaky jsou povoleny v uživatelském jménu: \"a-z\", \"A-Z\", \"0-9\" a \"_.@-\"", "A valid username must be provided" : "Musíte zadat platné uživatelské jméno", "A valid password must be provided" : "Musíte zadat platné heslo", diff --git a/lib/l10n/cy_GB.js b/lib/l10n/cy_GB.js index 851e37b43ae..fde170d5994 100644 --- a/lib/l10n/cy_GB.js +++ b/lib/l10n/cy_GB.js @@ -25,6 +25,7 @@ OC.L10N.register( "PostgreSQL username and/or password not valid" : "Enw a/neu gyfrinair PostgreSQL annilys", "Set an admin username." : "Creu enw defnyddiwr i'r gweinyddwr.", "Set an admin password." : "Gosod cyfrinair y gweinyddwr.", - "Could not find category \"%s\"" : "Methu canfod categori \"%s\"" + "Could not find category \"%s\"" : "Methu canfod categori \"%s\"", + "Apps" : "Pecynnau" }, "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/lib/l10n/cy_GB.json b/lib/l10n/cy_GB.json index 2088b3c2f9d..48422c82c56 100644 --- a/lib/l10n/cy_GB.json +++ b/lib/l10n/cy_GB.json @@ -23,6 +23,7 @@ "PostgreSQL username and/or password not valid" : "Enw a/neu gyfrinair PostgreSQL annilys", "Set an admin username." : "Creu enw defnyddiwr i'r gweinyddwr.", "Set an admin password." : "Gosod cyfrinair y gweinyddwr.", - "Could not find category \"%s\"" : "Methu canfod categori \"%s\"" + "Could not find category \"%s\"" : "Methu canfod categori \"%s\"", + "Apps" : "Pecynnau" },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" }
\ No newline at end of file diff --git a/lib/l10n/da.js b/lib/l10n/da.js index 285e9ac55d1..db939815143 100644 --- a/lib/l10n/da.js +++ b/lib/l10n/da.js @@ -87,7 +87,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Deling af %s mislykkedes, fordi backenden ikke tillader delinger fra typen %i", "Sharing %s failed, because the file does not exist" : "Deling af %s mislykkedes, fordi filen ikke eksisterer", "You are not allowed to share %s" : "Du har ikke tilladelse til at dele %s", - "Sharing %s failed, because the user %s is the item owner" : "Der skete en fejl ved deling af %s, brugeren %s er ejer af objektet", "Sharing %s failed, because the user %s does not exist" : "Der skete en fejl ved deling af %s, brugeren %s eksistere ikke", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Der skete en fejl ved deling af %s, brugeren %s er ikke medlem af nogle grupper som %s er medlem af", "Sharing %s failed, because this item is already shared with %s" : "Der skete en fejl ved deling af %s, objektet er allerede delt med %s", @@ -106,12 +105,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delingsbackend'en %s skal implementere grænsefladen OCP\\Share_Backend", "Sharing backend %s not found" : "Delingsbackend'en %s blev ikke fundet", "Sharing backend for %s not found" : "Delingsbackend'en for %s blev ikke fundet", - "Sharing %s failed, because the user %s is the original sharer" : "Deling af %s mislykkedes, fordi brugeren %s er den som delte oprindeligt", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Deling af %s mislykkedes, fordi tilladelserne overskred de tillaldelser som %s var tildelt", "Sharing %s failed, because resharing is not allowed" : "Deling af %s mislykkedes, fordi videredeling ikke er tilladt", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling af %s mislykkedes, fordi back-enden ikke kunne finde kilden til %s", "Sharing %s failed, because the file could not be found in the file cache" : "Deling af %s mislykkedes, fordi filen ikke kunne findes i fil-cachen", "Could not find category \"%s\"" : "Kunne ikke finde kategorien \"%s\"", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Det er kun tilladt at benytte følgene karakterer i et brugernavn \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Et gyldigt brugernavn skal angives", "A valid password must be provided" : "En gyldig adgangskode skal angives", diff --git a/lib/l10n/da.json b/lib/l10n/da.json index 1b9ed304596..e06ef9fcfc6 100644 --- a/lib/l10n/da.json +++ b/lib/l10n/da.json @@ -85,7 +85,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Deling af %s mislykkedes, fordi backenden ikke tillader delinger fra typen %i", "Sharing %s failed, because the file does not exist" : "Deling af %s mislykkedes, fordi filen ikke eksisterer", "You are not allowed to share %s" : "Du har ikke tilladelse til at dele %s", - "Sharing %s failed, because the user %s is the item owner" : "Der skete en fejl ved deling af %s, brugeren %s er ejer af objektet", "Sharing %s failed, because the user %s does not exist" : "Der skete en fejl ved deling af %s, brugeren %s eksistere ikke", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Der skete en fejl ved deling af %s, brugeren %s er ikke medlem af nogle grupper som %s er medlem af", "Sharing %s failed, because this item is already shared with %s" : "Der skete en fejl ved deling af %s, objektet er allerede delt med %s", @@ -104,12 +103,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delingsbackend'en %s skal implementere grænsefladen OCP\\Share_Backend", "Sharing backend %s not found" : "Delingsbackend'en %s blev ikke fundet", "Sharing backend for %s not found" : "Delingsbackend'en for %s blev ikke fundet", - "Sharing %s failed, because the user %s is the original sharer" : "Deling af %s mislykkedes, fordi brugeren %s er den som delte oprindeligt", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Deling af %s mislykkedes, fordi tilladelserne overskred de tillaldelser som %s var tildelt", "Sharing %s failed, because resharing is not allowed" : "Deling af %s mislykkedes, fordi videredeling ikke er tilladt", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling af %s mislykkedes, fordi back-enden ikke kunne finde kilden til %s", "Sharing %s failed, because the file could not be found in the file cache" : "Deling af %s mislykkedes, fordi filen ikke kunne findes i fil-cachen", "Could not find category \"%s\"" : "Kunne ikke finde kategorien \"%s\"", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Det er kun tilladt at benytte følgene karakterer i et brugernavn \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Et gyldigt brugernavn skal angives", "A valid password must be provided" : "En gyldig adgangskode skal angives", diff --git a/lib/l10n/de.js b/lib/l10n/de.js index f4341e53b4d..efa4bc265dd 100644 --- a/lib/l10n/de.js +++ b/lib/l10n/de.js @@ -49,6 +49,7 @@ OC.L10N.register( "Can't read file" : "Datei kann nicht gelesen werden", "App directory already exists" : "Das Applikationsverzeichnis existiert bereits", "Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s", + "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s", "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben", "No href specified when installing app from http" : "Für die Installation der Applikation über http wurde keine Quelle (href) angegeben", "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben", @@ -86,10 +87,11 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %i nicht erlaubt.", "Sharing %s failed, because the file does not exist" : "Freigabe von %s fehlgeschlagen, da die Datei nicht existiert", "You are not allowed to share %s" : "Die Freigabe von %s ist Dir nicht erlaubt", - "Sharing %s failed, because the user %s is the item owner" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s Besitzer des Objektes ist", + "Sharing %s failed, because you can not share with yourself" : "Freigabe von %s fehlgeschlagen, da du nichts mit dir selbst teilen kannst", "Sharing %s failed, because the user %s does not exist" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s nicht existiert", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s kein Gruppenmitglied einer der Gruppen von %s ist", "Sharing %s failed, because this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", + "Sharing %s failed, because this item is already shared with user %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit Nutzer %s geteilt wird", "Sharing %s failed, because the group %s does not exist" : "Freigabe von %s fehlgeschlagen, da die Gruppe %s nicht existiert", "Sharing %s failed, because %s is not a member of the group %s" : "Freigabe von %s fehlgeschlagen, da %s kein Mitglied der Gruppe %s ist", "You need to provide a password to create a public link, only protected links are allowed" : "Es sind nur geschützte Links zulässig, daher müssen Sie ein Passwort angeben, um einen öffentlichen Link zu generieren", @@ -104,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Freigabe-Backend %s muss in der OCP\\Share_Backend - Schnittstelle implementiert werden", "Sharing backend %s not found" : "Freigabe-Backend %s nicht gefunden", "Sharing backend for %s not found" : "Freigabe-Backend für %s nicht gefunden", - "Sharing %s failed, because the user %s is the original sharer" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s der offizielle Freigeber ist", + "Sharing failed, because the user %s is the original sharer" : "Freigabe fehlgeschlagen, da der Nutzer %s der offizielle Freigeber ist", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Freigabe von %s fehlgeschlagen, da die Berechtigungen die erteilten Berechtigungen %s überschreiten", "Sharing %s failed, because resharing is not allowed" : "Freigabe von %s fehlgeschlagen, da das nochmalige Freigeben einer Freigabe nicht erlaubt ist", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte", "Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte", "Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“", "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", diff --git a/lib/l10n/de.json b/lib/l10n/de.json index 18dbd51317e..7767be50840 100644 --- a/lib/l10n/de.json +++ b/lib/l10n/de.json @@ -47,6 +47,7 @@ "Can't read file" : "Datei kann nicht gelesen werden", "App directory already exists" : "Das Applikationsverzeichnis existiert bereits", "Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s", + "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s", "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben", "No href specified when installing app from http" : "Für die Installation der Applikation über http wurde keine Quelle (href) angegeben", "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben", @@ -84,10 +85,11 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %i nicht erlaubt.", "Sharing %s failed, because the file does not exist" : "Freigabe von %s fehlgeschlagen, da die Datei nicht existiert", "You are not allowed to share %s" : "Die Freigabe von %s ist Dir nicht erlaubt", - "Sharing %s failed, because the user %s is the item owner" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s Besitzer des Objektes ist", + "Sharing %s failed, because you can not share with yourself" : "Freigabe von %s fehlgeschlagen, da du nichts mit dir selbst teilen kannst", "Sharing %s failed, because the user %s does not exist" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s nicht existiert", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s kein Gruppenmitglied einer der Gruppen von %s ist", "Sharing %s failed, because this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", + "Sharing %s failed, because this item is already shared with user %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit Nutzer %s geteilt wird", "Sharing %s failed, because the group %s does not exist" : "Freigabe von %s fehlgeschlagen, da die Gruppe %s nicht existiert", "Sharing %s failed, because %s is not a member of the group %s" : "Freigabe von %s fehlgeschlagen, da %s kein Mitglied der Gruppe %s ist", "You need to provide a password to create a public link, only protected links are allowed" : "Es sind nur geschützte Links zulässig, daher müssen Sie ein Passwort angeben, um einen öffentlichen Link zu generieren", @@ -102,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Freigabe-Backend %s muss in der OCP\\Share_Backend - Schnittstelle implementiert werden", "Sharing backend %s not found" : "Freigabe-Backend %s nicht gefunden", "Sharing backend for %s not found" : "Freigabe-Backend für %s nicht gefunden", - "Sharing %s failed, because the user %s is the original sharer" : "Freigabe von %s fehlgeschlagen, da der Nutzer %s der offizielle Freigeber ist", + "Sharing failed, because the user %s is the original sharer" : "Freigabe fehlgeschlagen, da der Nutzer %s der offizielle Freigeber ist", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Freigabe von %s fehlgeschlagen, da die Berechtigungen die erteilten Berechtigungen %s überschreiten", "Sharing %s failed, because resharing is not allowed" : "Freigabe von %s fehlgeschlagen, da das nochmalige Freigeben einer Freigabe nicht erlaubt ist", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte", "Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte", "Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“", "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js index 9eda034348f..c70eb531685 100644 --- a/lib/l10n/de_DE.js +++ b/lib/l10n/de_DE.js @@ -86,7 +86,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %i nicht erlaubt.", "Sharing %s failed, because the file does not exist" : "Freigabe von %s fehlgeschlagen, da die Datei nicht existiert", "You are not allowed to share %s" : "Die Freigabe von %s ist Ihnen nicht erlaubt", - "Sharing %s failed, because the user %s is the item owner" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s Besitzer des Objektes ist", "Sharing %s failed, because the user %s does not exist" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s nicht existiert", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s kein Gruppenmitglied einer der Gruppen von %s ist", "Sharing %s failed, because this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", @@ -104,12 +103,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Freigabe-Backend %s muss in der OCP\\Share_Backend - Schnittstelle implementiert werden", "Sharing backend %s not found" : "Freigabe-Backend %s nicht gefunden", "Sharing backend for %s not found" : "Freigabe-Backend für %s nicht gefunden", - "Sharing %s failed, because the user %s is the original sharer" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s der ursprünglich Teilende ist", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Freigabe von %s fehlgeschlagen, da die Berechtigungen die erteilten Berechtigungen %s überschreiten", "Sharing %s failed, because resharing is not allowed" : "Freigabe von %s fehlgeschlagen, da das nochmalige Freigeben einer Freigabe nicht erlaubt ist", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte", "Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte", "Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“", "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json index 9a9b4341a56..e2761438d74 100644 --- a/lib/l10n/de_DE.json +++ b/lib/l10n/de_DE.json @@ -84,7 +84,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Freigabe von %s fehlgeschlagen, da das Backend die Freigabe vom Typ %i nicht erlaubt.", "Sharing %s failed, because the file does not exist" : "Freigabe von %s fehlgeschlagen, da die Datei nicht existiert", "You are not allowed to share %s" : "Die Freigabe von %s ist Ihnen nicht erlaubt", - "Sharing %s failed, because the user %s is the item owner" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s Besitzer des Objektes ist", "Sharing %s failed, because the user %s does not exist" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s nicht existiert", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s kein Gruppenmitglied einer der Gruppen von %s ist", "Sharing %s failed, because this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", @@ -102,12 +101,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Freigabe-Backend %s muss in der OCP\\Share_Backend - Schnittstelle implementiert werden", "Sharing backend %s not found" : "Freigabe-Backend %s nicht gefunden", "Sharing backend for %s not found" : "Freigabe-Backend für %s nicht gefunden", - "Sharing %s failed, because the user %s is the original sharer" : "Freigabe von %s fehlgeschlagen, da der Benutzer %s der ursprünglich Teilende ist", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Freigabe von %s fehlgeschlagen, da die Berechtigungen die erteilten Berechtigungen %s überschreiten", "Sharing %s failed, because resharing is not allowed" : "Freigabe von %s fehlgeschlagen, da das nochmalige Freigeben einer Freigabe nicht erlaubt ist", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte", "Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte", "Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“", "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", diff --git a/lib/l10n/el.js b/lib/l10n/el.js index ee9ad8efd42..7b0dffa8bfb 100644 --- a/lib/l10n/el.js +++ b/lib/l10n/el.js @@ -84,7 +84,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Αποτυχία διαμοιρασμού %s, γιατί το σύστημα υποστήριξης δεν επιτρέπει κοινόχρηστα τύπου %i", "Sharing %s failed, because the file does not exist" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν υπάρχει", "You are not allowed to share %s" : "Δεν επιτρέπεται να διαμοιράσετε τον πόρο %s", - "Sharing %s failed, because the user %s is the item owner" : "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s είναι ο ιδιοκτήτης του αντικειμένου", "Sharing %s failed, because the user %s does not exist" : "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν υπάρχει", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν είναι μέλος καμίας ομάδας στην οποία ο χρήστης %s είναι μέλος", "Sharing %s failed, because this item is already shared with %s" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο ήδη με τον χρήστη %s", @@ -103,12 +102,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Το σύστημα διαμοιρασμού %s πρέπει να υλοποιεί την διεπαφή OCP\\Share_Backend", "Sharing backend %s not found" : "Το σύστημα διαμοιρασμού %s δεν βρέθηκε", "Sharing backend for %s not found" : "Το σύστημα διαμοιρασμού για το %s δεν βρέθηκε", - "Sharing %s failed, because the user %s is the original sharer" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο αρχικά από τον χρήστη %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ο διαμοιρασμός του %s απέτυχε, γιατί τα δικαιώματα υπερτερούν αυτά που είναι ορισμένα για το %s", "Sharing %s failed, because resharing is not allowed" : "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν επιτρέπεται ο επαναδιαμοιρασμός", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν ήταν δυνατό να εντοπίσει την πηγή το σύστημα διαμοιρασμού για το %s ", "Sharing %s failed, because the file could not be found in the file cache" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση αρχείων", "Could not find category \"%s\"" : "Αδυναμία εύρεσης κατηγορίας \"%s\"", + "Apps" : "Εφαρμογές", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Μόνο οι παρακάτων χαρακτήρες επιτρέπονται σε ένα όνομα χρήστη: \"a-z\", \"A-Z\", \"0-9\" και \"_.@-\"", "A valid username must be provided" : "Πρέπει να δοθεί έγκυρο όνομα χρήστη", "A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό", diff --git a/lib/l10n/el.json b/lib/l10n/el.json index d0235598f7e..65524a490f3 100644 --- a/lib/l10n/el.json +++ b/lib/l10n/el.json @@ -82,7 +82,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Αποτυχία διαμοιρασμού %s, γιατί το σύστημα υποστήριξης δεν επιτρέπει κοινόχρηστα τύπου %i", "Sharing %s failed, because the file does not exist" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν υπάρχει", "You are not allowed to share %s" : "Δεν επιτρέπεται να διαμοιράσετε τον πόρο %s", - "Sharing %s failed, because the user %s is the item owner" : "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s είναι ο ιδιοκτήτης του αντικειμένου", "Sharing %s failed, because the user %s does not exist" : "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν υπάρχει", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν είναι μέλος καμίας ομάδας στην οποία ο χρήστης %s είναι μέλος", "Sharing %s failed, because this item is already shared with %s" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο ήδη με τον χρήστη %s", @@ -101,12 +100,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Το σύστημα διαμοιρασμού %s πρέπει να υλοποιεί την διεπαφή OCP\\Share_Backend", "Sharing backend %s not found" : "Το σύστημα διαμοιρασμού %s δεν βρέθηκε", "Sharing backend for %s not found" : "Το σύστημα διαμοιρασμού για το %s δεν βρέθηκε", - "Sharing %s failed, because the user %s is the original sharer" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο αρχικά από τον χρήστη %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ο διαμοιρασμός του %s απέτυχε, γιατί τα δικαιώματα υπερτερούν αυτά που είναι ορισμένα για το %s", "Sharing %s failed, because resharing is not allowed" : "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν επιτρέπεται ο επαναδιαμοιρασμός", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν ήταν δυνατό να εντοπίσει την πηγή το σύστημα διαμοιρασμού για το %s ", "Sharing %s failed, because the file could not be found in the file cache" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση αρχείων", "Could not find category \"%s\"" : "Αδυναμία εύρεσης κατηγορίας \"%s\"", + "Apps" : "Εφαρμογές", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Μόνο οι παρακάτων χαρακτήρες επιτρέπονται σε ένα όνομα χρήστη: \"a-z\", \"A-Z\", \"0-9\" και \"_.@-\"", "A valid username must be provided" : "Πρέπει να δοθεί έγκυρο όνομα χρήστη", "A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό", diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js index 0e252700f5a..bad1d486936 100644 --- a/lib/l10n/en_GB.js +++ b/lib/l10n/en_GB.js @@ -82,7 +82,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Sharing %s failed, because the backend does not allow shares from type %i", "Sharing %s failed, because the file does not exist" : "Sharing %s failed, because the file does not exist", "You are not allowed to share %s" : "You are not allowed to share %s", - "Sharing %s failed, because the user %s is the item owner" : "Sharing %s failed, because the user %s is the item owner", "Sharing %s failed, because the user %s does not exist" : "Sharing %s failed, because the user %s does not exist", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of", "Sharing %s failed, because this item is already shared with %s" : "Sharing %s failed, because this item is already shared with %s", @@ -100,12 +99,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Sharing backend %s must implement the interface OCP\\Share_Backend", "Sharing backend %s not found" : "Sharing backend %s not found", "Sharing backend for %s not found" : "Sharing backend for %s not found", - "Sharing %s failed, because the user %s is the original sharer" : "Sharing %s failed, because the user %s is the original sharer", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sharing %s failed, because the permissions exceed permissions granted to %s", "Sharing %s failed, because resharing is not allowed" : "Sharing %s failed, because resharing is not allowed", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sharing %s failed, because the sharing backend for %s could not find its source", "Sharing %s failed, because the file could not be found in the file cache" : "Sharing %s failed, because the file could not be found in the file cache", "Could not find category \"%s\"" : "Could not find category \"%s\"", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "A valid username must be provided", "A valid password must be provided" : "A valid password must be provided", diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json index 9c57df59762..4c6c7e714c4 100644 --- a/lib/l10n/en_GB.json +++ b/lib/l10n/en_GB.json @@ -80,7 +80,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Sharing %s failed, because the backend does not allow shares from type %i", "Sharing %s failed, because the file does not exist" : "Sharing %s failed, because the file does not exist", "You are not allowed to share %s" : "You are not allowed to share %s", - "Sharing %s failed, because the user %s is the item owner" : "Sharing %s failed, because the user %s is the item owner", "Sharing %s failed, because the user %s does not exist" : "Sharing %s failed, because the user %s does not exist", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of", "Sharing %s failed, because this item is already shared with %s" : "Sharing %s failed, because this item is already shared with %s", @@ -98,12 +97,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Sharing backend %s must implement the interface OCP\\Share_Backend", "Sharing backend %s not found" : "Sharing backend %s not found", "Sharing backend for %s not found" : "Sharing backend for %s not found", - "Sharing %s failed, because the user %s is the original sharer" : "Sharing %s failed, because the user %s is the original sharer", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sharing %s failed, because the permissions exceed permissions granted to %s", "Sharing %s failed, because resharing is not allowed" : "Sharing %s failed, because resharing is not allowed", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sharing %s failed, because the sharing backend for %s could not find its source", "Sharing %s failed, because the file could not be found in the file cache" : "Sharing %s failed, because the file could not be found in the file cache", "Could not find category \"%s\"" : "Could not find category \"%s\"", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "A valid username must be provided", "A valid password must be provided" : "A valid password must be provided", diff --git a/lib/l10n/eo.js b/lib/l10n/eo.js index df94b174599..b69c0836197 100644 --- a/lib/l10n/eo.js +++ b/lib/l10n/eo.js @@ -48,16 +48,15 @@ OC.L10N.register( "%s via %s" : "%s per %s", "Sharing %s failed, because the file does not exist" : "Kunhavigo de %s malsukcesis, ĉar la dosiero ne ekzistas", "You are not allowed to share %s" : "Vi ne permesatas kunhavigi %s", - "Sharing %s failed, because the user %s is the item owner" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s posedas la eron", "Sharing %s failed, because the user %s does not exist" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s ne ekzistas", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s estas ano de neniu grupo, de kiu %s estas ano", "Sharing %s failed, because this item is already shared with %s" : "Kunhavigo de %s malsukcesis, ĉar la ero jam kunhavatas kun %s", "Sharing %s failed, because the group %s does not exist" : "Kunhavigo de %s malsukcesis, ĉar la grupo %s ne ekzistas", "Sharing %s failed, because %s is not a member of the group %s" : "Kunhavigo de %s malsukcesis, ĉar %s ne estas ano de la grupo %s", "Sharing %s failed, because sharing with links is not allowed" : "Kunhavo de %s malsukcesis, ĉar kunhavo per ligiloj ne permesatas", - "Sharing %s failed, because the user %s is the original sharer" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s estas la origina kunhaviginto", "Sharing %s failed, because resharing is not allowed" : "Kunhavigo de %s malsukcesis, ĉar rekunhavigo ne permesatas", "Could not find category \"%s\"" : "Ne troviĝis kategorio “%s”", + "Apps" : "Aplikaĵoj", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Nur la jenaj signoj permesatas en uzantonomo: «a-z», «A-Z», «0-9» kaj «_.@-»", "A valid username must be provided" : "Valida uzantonomo devas proviziĝi", "A valid password must be provided" : "Valida pasvorto devas proviziĝi", diff --git a/lib/l10n/eo.json b/lib/l10n/eo.json index 8140c421d57..37558aef9e2 100644 --- a/lib/l10n/eo.json +++ b/lib/l10n/eo.json @@ -46,16 +46,15 @@ "%s via %s" : "%s per %s", "Sharing %s failed, because the file does not exist" : "Kunhavigo de %s malsukcesis, ĉar la dosiero ne ekzistas", "You are not allowed to share %s" : "Vi ne permesatas kunhavigi %s", - "Sharing %s failed, because the user %s is the item owner" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s posedas la eron", "Sharing %s failed, because the user %s does not exist" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s ne ekzistas", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s estas ano de neniu grupo, de kiu %s estas ano", "Sharing %s failed, because this item is already shared with %s" : "Kunhavigo de %s malsukcesis, ĉar la ero jam kunhavatas kun %s", "Sharing %s failed, because the group %s does not exist" : "Kunhavigo de %s malsukcesis, ĉar la grupo %s ne ekzistas", "Sharing %s failed, because %s is not a member of the group %s" : "Kunhavigo de %s malsukcesis, ĉar %s ne estas ano de la grupo %s", "Sharing %s failed, because sharing with links is not allowed" : "Kunhavo de %s malsukcesis, ĉar kunhavo per ligiloj ne permesatas", - "Sharing %s failed, because the user %s is the original sharer" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s estas la origina kunhaviginto", "Sharing %s failed, because resharing is not allowed" : "Kunhavigo de %s malsukcesis, ĉar rekunhavigo ne permesatas", "Could not find category \"%s\"" : "Ne troviĝis kategorio “%s”", + "Apps" : "Aplikaĵoj", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Nur la jenaj signoj permesatas en uzantonomo: «a-z», «A-Z», «0-9» kaj «_.@-»", "A valid username must be provided" : "Valida uzantonomo devas proviziĝi", "A valid password must be provided" : "Valida pasvorto devas proviziĝi", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index 3f1d751fc1e..a6ca5eddc13 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -23,7 +23,7 @@ OC.L10N.register( "Admin" : "Administración", "Recommended" : "Recomendado", "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "La App \"%s\" no puede ser instalada porque no es compatible con esta versión de ownCloud.", - "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La App \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La app \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s", "No app name specified" : "No se ha especificado nombre de la aplicación", "Unknown filetype" : "Tipo de archivo desconocido", "Invalid image" : "Imagen inválida", @@ -87,7 +87,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "No se pudo compartir %s porque el repositorio no permite recursos compartidos del tipo %i", "Sharing %s failed, because the file does not exist" : "No se pudo compartir %s porque el archivo no existe", "You are not allowed to share %s" : "Usted no está autorizado para compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Se ha fallado al compartir %s, ya que el usuario %s es el dueño del elemento", "Sharing %s failed, because the user %s does not exist" : "Se ha fallado al compartir %s, ya que el usuario %s no existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Se ha fallado al compartir %s, ya que el usuario %s no es miembro de ningún grupo del que %s sea miembro", "Sharing %s failed, because this item is already shared with %s" : "Se falló al compartir %s, ya que este elemento ya está compartido con %s", @@ -106,19 +105,19 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartido %s debe implementar la interfaz OCP\\Share_Backend", "Sharing backend %s not found" : "El motor compartido %s no se ha encontrado", "Sharing backend for %s not found" : "Motor compartido para %s no encontrado", - "Sharing %s failed, because the user %s is the original sharer" : "Se ha fallado al compartir %s, ya que el usuario %s es el compartidor original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Se ha fallado al compartir %s, ya que los permisos superan los permisos otorgados a %s", "Sharing %s failed, because resharing is not allowed" : "Se ha fallado al compartir %s, ya que volver a compartir no está permitido", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Se ha fallado al compartir %s porque el motor compartido para %s podría no encontrar su origen", "Sharing %s failed, because the file could not be found in the file cache" : "Se ha fallado al compartir %s, ya que el archivo no pudo ser encontrado en el cache de archivo", "Could not find category \"%s\"" : "No puede encontrar la categoría \"%s\"", + "Apps" : "Aplicaciones", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo los siguientes caracteres están permitidos en un nombre de usuario: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido", "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "The username is already being used" : "El nombre de usuario ya está en uso", "No database drivers (sqlite, mysql, or postgresql) installed." : "No están instalados los drivers de BBDD (sqlite, mysql, o postgresql)", "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada", - "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Ejecutar el servidor ownCloud en la plataforma Microsoft Windows no está soportada. Sugerimos que utilice un servidor Linux en una máquina virtual si no posee opción de migrar de servidor. Encuentre paquetes de Linux así como implementar máquinas virtuales en <a href=\"%s\">%s</a>. Para migrar instalaciones actuales hacia Linux puede encontrar algunos consejos y un script de migración en <a href=\"%s\">nuestra documentación</a>.", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "No está soportado ejecutar el servidor ownCloud en la plataforma Microsoft Windows. Sugerimos que utilice un servidor GNU/Linux en una máquina virtual si no posee opción de migrar de servidor. Encuentre paquetes de GNU/Linux así como implementar máquinas virtuales en <a href=\"%s\">%s</a>. Para migrar instalaciones actuales hacia GNU/Linux puede encontrar algunos consejos y un script de migración en <a href=\"%s\">nuestra documentación</a>.", "Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración", "Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Esto puede solucionarse fácilmente %sdándole permisos de escritura al servidor en el directorio%s de apps o deshabilitando la tienda de apps en el archivo de configuración.", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index 75b8060b819..0fe0eb485cc 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -21,7 +21,7 @@ "Admin" : "Administración", "Recommended" : "Recomendado", "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "La App \"%s\" no puede ser instalada porque no es compatible con esta versión de ownCloud.", - "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La App \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La app \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s", "No app name specified" : "No se ha especificado nombre de la aplicación", "Unknown filetype" : "Tipo de archivo desconocido", "Invalid image" : "Imagen inválida", @@ -85,7 +85,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "No se pudo compartir %s porque el repositorio no permite recursos compartidos del tipo %i", "Sharing %s failed, because the file does not exist" : "No se pudo compartir %s porque el archivo no existe", "You are not allowed to share %s" : "Usted no está autorizado para compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Se ha fallado al compartir %s, ya que el usuario %s es el dueño del elemento", "Sharing %s failed, because the user %s does not exist" : "Se ha fallado al compartir %s, ya que el usuario %s no existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Se ha fallado al compartir %s, ya que el usuario %s no es miembro de ningún grupo del que %s sea miembro", "Sharing %s failed, because this item is already shared with %s" : "Se falló al compartir %s, ya que este elemento ya está compartido con %s", @@ -104,19 +103,19 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartido %s debe implementar la interfaz OCP\\Share_Backend", "Sharing backend %s not found" : "El motor compartido %s no se ha encontrado", "Sharing backend for %s not found" : "Motor compartido para %s no encontrado", - "Sharing %s failed, because the user %s is the original sharer" : "Se ha fallado al compartir %s, ya que el usuario %s es el compartidor original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Se ha fallado al compartir %s, ya que los permisos superan los permisos otorgados a %s", "Sharing %s failed, because resharing is not allowed" : "Se ha fallado al compartir %s, ya que volver a compartir no está permitido", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Se ha fallado al compartir %s porque el motor compartido para %s podría no encontrar su origen", "Sharing %s failed, because the file could not be found in the file cache" : "Se ha fallado al compartir %s, ya que el archivo no pudo ser encontrado en el cache de archivo", "Could not find category \"%s\"" : "No puede encontrar la categoría \"%s\"", + "Apps" : "Aplicaciones", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo los siguientes caracteres están permitidos en un nombre de usuario: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido", "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "The username is already being used" : "El nombre de usuario ya está en uso", "No database drivers (sqlite, mysql, or postgresql) installed." : "No están instalados los drivers de BBDD (sqlite, mysql, o postgresql)", "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada", - "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Ejecutar el servidor ownCloud en la plataforma Microsoft Windows no está soportada. Sugerimos que utilice un servidor Linux en una máquina virtual si no posee opción de migrar de servidor. Encuentre paquetes de Linux así como implementar máquinas virtuales en <a href=\"%s\">%s</a>. Para migrar instalaciones actuales hacia Linux puede encontrar algunos consejos y un script de migración en <a href=\"%s\">nuestra documentación</a>.", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "No está soportado ejecutar el servidor ownCloud en la plataforma Microsoft Windows. Sugerimos que utilice un servidor GNU/Linux en una máquina virtual si no posee opción de migrar de servidor. Encuentre paquetes de GNU/Linux así como implementar máquinas virtuales en <a href=\"%s\">%s</a>. Para migrar instalaciones actuales hacia GNU/Linux puede encontrar algunos consejos y un script de migración en <a href=\"%s\">nuestra documentación</a>.", "Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración", "Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Esto puede solucionarse fácilmente %sdándole permisos de escritura al servidor en el directorio%s de apps o deshabilitando la tienda de apps en el archivo de configuración.", diff --git a/lib/l10n/es_AR.js b/lib/l10n/es_AR.js index 572933980cb..58c5f473851 100644 --- a/lib/l10n/es_AR.js +++ b/lib/l10n/es_AR.js @@ -46,6 +46,7 @@ OC.L10N.register( "Set an admin password." : "Configurar una contraseña de administrador.", "%s shared »%s« with you" : "%s compartió \"%s\" con vos", "Could not find category \"%s\"" : "No fue posible encontrar la categoría \"%s\"", + "Apps" : "Apps", "A valid username must be provided" : "Debe ingresar un nombre de usuario válido", "A valid password must be provided" : "Debe ingresar una contraseña válida" }, diff --git a/lib/l10n/es_AR.json b/lib/l10n/es_AR.json index 9a459d7117d..605aecb1ab1 100644 --- a/lib/l10n/es_AR.json +++ b/lib/l10n/es_AR.json @@ -44,6 +44,7 @@ "Set an admin password." : "Configurar una contraseña de administrador.", "%s shared »%s« with you" : "%s compartió \"%s\" con vos", "Could not find category \"%s\"" : "No fue posible encontrar la categoría \"%s\"", + "Apps" : "Apps", "A valid username must be provided" : "Debe ingresar un nombre de usuario válido", "A valid password must be provided" : "Debe ingresar una contraseña válida" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/lib/l10n/es_MX.js b/lib/l10n/es_MX.js index 253b5fce3ab..b9cbf96c7af 100644 --- a/lib/l10n/es_MX.js +++ b/lib/l10n/es_MX.js @@ -52,6 +52,7 @@ OC.L10N.register( "Set an admin password." : "Configurar la contraseña del administrador.", "%s shared »%s« with you" : "%s ha compartido »%s« contigo", "Could not find category \"%s\"" : "No puede encontrar la categoria \"%s\"", + "Apps" : "Aplicaciones", "A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido", "A valid password must be provided" : "Se debe proporcionar una contraseña válida" }, diff --git a/lib/l10n/es_MX.json b/lib/l10n/es_MX.json index 0bd876d2e70..53db7b10151 100644 --- a/lib/l10n/es_MX.json +++ b/lib/l10n/es_MX.json @@ -50,6 +50,7 @@ "Set an admin password." : "Configurar la contraseña del administrador.", "%s shared »%s« with you" : "%s ha compartido »%s« contigo", "Could not find category \"%s\"" : "No puede encontrar la categoria \"%s\"", + "Apps" : "Aplicaciones", "A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido", "A valid password must be provided" : "Se debe proporcionar una contraseña válida" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js index 9ab86b3a415..740c0fe7c34 100644 --- a/lib/l10n/et_EE.js +++ b/lib/l10n/et_EE.js @@ -14,6 +14,7 @@ OC.L10N.register( "The library %s is not available." : "Teek %s pole saadaval.", "Following platforms are supported: %s" : "Toetatud on järgnevad platformid: %s", "ownCloud %s or higher is required." : "ownCloud %s või uuem on nõutav.", + "ownCloud %s or lower is required." : "ownCloud %s või vanem on nõutav.", "Help" : "Abiinfo", "Personal" : "Isiklik", "Users" : "Kasutajad", @@ -70,7 +71,6 @@ OC.L10N.register( "%s via %s" : "%s läbi %s", "Sharing %s failed, because the file does not exist" : "%s jagamine ebaõnnestus, kuna faili pole olemas", "You are not allowed to share %s" : "Sul pole lubatud %s jagada", - "Sharing %s failed, because the user %s is the item owner" : "%s jagamine ebaõnnestus, kuna kuna kasutaja %s on üksuse omanik", "Sharing %s failed, because the user %s does not exist" : "%s jagamine ebaõnnestus, kuna kasutajat %s pole olemas", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s jagamine ebaõnnestus, kuna kasutaja %s pole ühegi grupi liige, millede liige on %s", "Sharing %s failed, because this item is already shared with %s" : "%s jagamine ebaõnnestus, kuna see üksus on juba jagatud %s", @@ -87,12 +87,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Jagamise tagarakend %s peab kasutusele võtma OCP\\Share_Backend liidese", "Sharing backend %s not found" : "Jagamise tagarakendit %s ei leitud", "Sharing backend for %s not found" : "Jagamise tagarakendit %s jaoks ei leitud", - "Sharing %s failed, because the user %s is the original sharer" : "%s jagamine ebaõnnestus, kuna kasutaja %s on algne jagaja", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s jagamine ebaõnnestus, kuna antud õigused ületavad %s jaoks määratud õigusi", "Sharing %s failed, because resharing is not allowed" : "%s jagamine ebaõnnestus, kuna edasijagamine pole lubatud", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s jagamine ebaõnnestus, kuna jagamise tagarakend ei suutnud leida %s jaoks lähteallikat", "Sharing %s failed, because the file could not be found in the file cache" : "%s jagamine ebaõnnestus, kuna faili ei suudetud leida failide puhvrist", "Could not find category \"%s\"" : "Ei leia kategooriat \"%s\"", + "Apps" : "Rakendused", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kasutajanimes on lubatud ainult järgnevad tähemärgid: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"", "A valid username must be provided" : "Sisesta nõuetele vastav kasutajatunnus", "A valid password must be provided" : "Sisesta nõuetele vastav parool", diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json index acbb36fe431..dee76603531 100644 --- a/lib/l10n/et_EE.json +++ b/lib/l10n/et_EE.json @@ -12,6 +12,7 @@ "The library %s is not available." : "Teek %s pole saadaval.", "Following platforms are supported: %s" : "Toetatud on järgnevad platformid: %s", "ownCloud %s or higher is required." : "ownCloud %s või uuem on nõutav.", + "ownCloud %s or lower is required." : "ownCloud %s või vanem on nõutav.", "Help" : "Abiinfo", "Personal" : "Isiklik", "Users" : "Kasutajad", @@ -68,7 +69,6 @@ "%s via %s" : "%s läbi %s", "Sharing %s failed, because the file does not exist" : "%s jagamine ebaõnnestus, kuna faili pole olemas", "You are not allowed to share %s" : "Sul pole lubatud %s jagada", - "Sharing %s failed, because the user %s is the item owner" : "%s jagamine ebaõnnestus, kuna kuna kasutaja %s on üksuse omanik", "Sharing %s failed, because the user %s does not exist" : "%s jagamine ebaõnnestus, kuna kasutajat %s pole olemas", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s jagamine ebaõnnestus, kuna kasutaja %s pole ühegi grupi liige, millede liige on %s", "Sharing %s failed, because this item is already shared with %s" : "%s jagamine ebaõnnestus, kuna see üksus on juba jagatud %s", @@ -85,12 +85,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Jagamise tagarakend %s peab kasutusele võtma OCP\\Share_Backend liidese", "Sharing backend %s not found" : "Jagamise tagarakendit %s ei leitud", "Sharing backend for %s not found" : "Jagamise tagarakendit %s jaoks ei leitud", - "Sharing %s failed, because the user %s is the original sharer" : "%s jagamine ebaõnnestus, kuna kasutaja %s on algne jagaja", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s jagamine ebaõnnestus, kuna antud õigused ületavad %s jaoks määratud õigusi", "Sharing %s failed, because resharing is not allowed" : "%s jagamine ebaõnnestus, kuna edasijagamine pole lubatud", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s jagamine ebaõnnestus, kuna jagamise tagarakend ei suutnud leida %s jaoks lähteallikat", "Sharing %s failed, because the file could not be found in the file cache" : "%s jagamine ebaõnnestus, kuna faili ei suudetud leida failide puhvrist", "Could not find category \"%s\"" : "Ei leia kategooriat \"%s\"", + "Apps" : "Rakendused", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kasutajanimes on lubatud ainult järgnevad tähemärgid: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"", "A valid username must be provided" : "Sisesta nõuetele vastav kasutajatunnus", "A valid password must be provided" : "Sisesta nõuetele vastav parool", diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js index 6bf5d8f0315..eaecc698361 100644 --- a/lib/l10n/eu.js +++ b/lib/l10n/eu.js @@ -71,7 +71,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "%s partekatzeak huts egin du, motorrak %i motako partekatzeak baimentzen ez dituelako", "Sharing %s failed, because the file does not exist" : "%s elkarbanatzeak huts egin du, fitxategia ez delako existitzen", "You are not allowed to share %s" : "Ez zadue %s elkarbanatzeko baimendua", - "Sharing %s failed, because the user %s is the item owner" : "%s elkarbanatzeak huts egin du, %s erabiltzailea jabea delako", "Sharing %s failed, because the user %s does not exist" : "%s elkarbanatzeak huts egin du, %s erabiltzailea existitzen ez delako", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s elkarbanatzeak huts egin du, %s erabiltzailea ez delako %s partaide den talderen bateko partaidea", "Sharing %s failed, because this item is already shared with %s" : "%s elkarbanatzeak huts egin du, dagoeneko %s erabiltzailearekin elkarbanatuta dagoelako", @@ -88,12 +87,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "%s elkarbanaketa motorra OCP\\Share_Backend interfazea inplementatu behar du ", "Sharing backend %s not found" : "Ez da %s elkarbanaketa motorra aurkitu", "Sharing backend for %s not found" : "Ez da %srako elkarbanaketa motorrik aurkitu", - "Sharing %s failed, because the user %s is the original sharer" : "%s elkarbanatzeak huts egin du, %s erabiltzailea jatorrizko elkarbanatzailea delako", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s elkarbanatzeak huts egin du, baimenak %sri emandakoak baino gehiago direlako", "Sharing %s failed, because resharing is not allowed" : "%s elkarbanatzeak huts egin du, ber-elkarbanatzea baimenduta ez dagoelako", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s elkarbanatzeak huts egin du, %sren elkarbanaketa motorrak bere iturria aurkitu ezin duelako", "Sharing %s failed, because the file could not be found in the file cache" : "%s elkarbanatzeak huts egin du, fitxategia katxean aurkitu ez delako", "Could not find category \"%s\"" : "Ezin da \"%s\" kategoria aurkitu", + "Apps" : "Aplikazioak", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bakarrik hurrengo karaketerak onartzen dira erabiltzaile izenean: \"a-z\", \"A-Z\", \"0-9\", eta \"_.@-\"", "A valid username must be provided" : "Baliozko erabiltzaile izena eman behar da", "A valid password must be provided" : "Baliozko pasahitza eman behar da", diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json index 2f9c4033615..9c6c00e7d8f 100644 --- a/lib/l10n/eu.json +++ b/lib/l10n/eu.json @@ -69,7 +69,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "%s partekatzeak huts egin du, motorrak %i motako partekatzeak baimentzen ez dituelako", "Sharing %s failed, because the file does not exist" : "%s elkarbanatzeak huts egin du, fitxategia ez delako existitzen", "You are not allowed to share %s" : "Ez zadue %s elkarbanatzeko baimendua", - "Sharing %s failed, because the user %s is the item owner" : "%s elkarbanatzeak huts egin du, %s erabiltzailea jabea delako", "Sharing %s failed, because the user %s does not exist" : "%s elkarbanatzeak huts egin du, %s erabiltzailea existitzen ez delako", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s elkarbanatzeak huts egin du, %s erabiltzailea ez delako %s partaide den talderen bateko partaidea", "Sharing %s failed, because this item is already shared with %s" : "%s elkarbanatzeak huts egin du, dagoeneko %s erabiltzailearekin elkarbanatuta dagoelako", @@ -86,12 +85,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "%s elkarbanaketa motorra OCP\\Share_Backend interfazea inplementatu behar du ", "Sharing backend %s not found" : "Ez da %s elkarbanaketa motorra aurkitu", "Sharing backend for %s not found" : "Ez da %srako elkarbanaketa motorrik aurkitu", - "Sharing %s failed, because the user %s is the original sharer" : "%s elkarbanatzeak huts egin du, %s erabiltzailea jatorrizko elkarbanatzailea delako", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s elkarbanatzeak huts egin du, baimenak %sri emandakoak baino gehiago direlako", "Sharing %s failed, because resharing is not allowed" : "%s elkarbanatzeak huts egin du, ber-elkarbanatzea baimenduta ez dagoelako", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s elkarbanatzeak huts egin du, %sren elkarbanaketa motorrak bere iturria aurkitu ezin duelako", "Sharing %s failed, because the file could not be found in the file cache" : "%s elkarbanatzeak huts egin du, fitxategia katxean aurkitu ez delako", "Could not find category \"%s\"" : "Ezin da \"%s\" kategoria aurkitu", + "Apps" : "Aplikazioak", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bakarrik hurrengo karaketerak onartzen dira erabiltzaile izenean: \"a-z\", \"A-Z\", \"0-9\", eta \"_.@-\"", "A valid username must be provided" : "Baliozko erabiltzaile izena eman behar da", "A valid password must be provided" : "Baliozko pasahitza eman behar da", diff --git a/lib/l10n/fa.js b/lib/l10n/fa.js index 8e3a0c6071f..205ddf45c4e 100644 --- a/lib/l10n/fa.js +++ b/lib/l10n/fa.js @@ -1,24 +1,51 @@ OC.L10N.register( "lib", { + "Cannot write into \"config\" directory!" : "نمیتوانید داخل دایرکتوری \"config\" تغییراتی ایجاد کنید", + "See %s" : "مشاهده %s", + "Sample configuration detected" : "فایل پیکربندی نمونه پیدا شد", + "PHP %s or higher is required." : "PHP نسخهی %s یا بالاتر نیاز است.", + "Following databases are supported: %s" : "پایگاهداده های ذکر شده مورد نیاز است: %s", + "The command line tool %s could not be found" : "ابزار کامندلاین %s پیدا نشد", + "The library %s is not available." : "کتابخانهی %s در دسترس نیست.", + "Library %s with a version higher than %s is required - available version %s." : "کتابخانه %s با نسخهی بالاتر از %s نیاز است - نسخهی موجود %s.", + "Library %s with a version lower than %s is required - available version %s." : "کتابخانه %s با نسخهی پایینتر از %s نیاز است - نسخهی موجود %s.", + "ownCloud %s or higher is required." : "ownCloud با نسخهی %s یا بالاتر نیاز است.", + "ownCloud %s or lower is required." : "ownCloud با نسخهی %s یا پایینتر نیاز است.", "Help" : "راهنما", "Personal" : "شخصی", "Users" : "کاربران", "Admin" : "مدیر", + "Recommended" : "پیشنهاد شده", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "امکان نصب برنامهی \"%s\" به علت عدم سازگاری با این نسخه از ownCloud وجود ندارد.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "امکان نصب برنامه \"%s\" با توجه به برآورده نکردن نیازمندی زیر وجود ندارد: %s", + "No app name specified" : "اسم اپلیکیشن مشخص نشده است", "Unknown filetype" : "نوع فایل ناشناخته", "Invalid image" : "عکس نامعتبر", "today" : "امروز", "yesterday" : "دیروز", + "_%n day ago_::_%n days ago_" : ["%n روز پیش"], "last month" : "ماه قبل", "_%n month ago_::_%n months ago_" : ["%n ماه قبل"], "last year" : "سال قبل", + "_%n year ago_::_%n years ago_" : ["%n سال پیش"], "_%n hour ago_::_%n hours ago_" : ["%n ساعت قبل"], "_%n minute ago_::_%n minutes ago_" : ["%n دقیقه قبل"], "seconds ago" : "ثانیهها پیش", "web services under your control" : "سرویس های تحت وب در کنترل شما", + "Empty filename is not allowed" : "نام فایل نمیتواند خالی باشد", + "File name is a reserved word" : "این نام فایل جزو کلمات رزرو میباشد", + "File name contains at least one invalid character" : "نام فایل دارای حداقل یک کاراکتر نامعتبر است", + "File name is too long" : "نام فایل خیلی بزرگ است", + "File is currently busy, please try again later" : "فایل در حال حاضر مشغول است، لطفا مجددا تلاش کنید", + "Can't read file" : "امکان خواندن فایل وجود ندارد", + "App directory already exists" : "برنامه در حال حاضر وجود دارد", + "Can't create app folder. Please fix permissions. %s" : "امکان ایجاد پوشهی برنامه وجود ندارد. لطفا اجازههای دسترسی را تصحیح کنید. %s", + "No source specified when installing app" : "هیچ مبدائی در زمان نصب برنامه مشخص نشده است", "Application is not enabled" : "برنامه فعال نشده است", "Authentication error" : "خطا در اعتبار سنجی", "Token expired. Please reload page." : "رمز منقضی شده است. لطفا دوباره صفحه را بارگذاری نمایید.", + "Unknown user" : "کاربر نامعلوم", "%s enter the database username." : "%s نام کاربری پایگاه داده را وارد نمایید.", "%s enter the database name." : "%s نام پایگاه داده را وارد نمایید.", "%s you may not use dots in the database name" : "%s شما نباید از نقطه در نام پایگاه داده استفاده نمایید.", @@ -33,7 +60,16 @@ OC.L10N.register( "Set an admin password." : "یک رمزعبور برای مدیر تنظیم نمایید.", "%s shared »%s« with you" : "%s به اشتراک گذاشته شده است »%s« توسط شما", "Could not find category \"%s\"" : "دسته بندی %s یافت نشد", + "Apps" : " برنامه ها", "A valid username must be provided" : "نام کاربری صحیح باید وارد شود", - "A valid password must be provided" : "رمز عبور صحیح باید وارد شود" + "A valid password must be provided" : "رمز عبور صحیح باید وارد شود", + "The username is already being used" : "نامکاربری قبلا استفاده شده است", + "Microsoft Windows Platform is not supported" : "بستر Microsoft Windows پشتیبانی نمیشود", + "Cannot write into \"config\" directory" : "امکان نوشتن درون شاخهی \"config\" وجود ندارد", + "Please ask your server administrator to install the module." : "لطفا از مدیر سیستم بخواهید تا ماژول را نصب کند.", + "PHP module %s not installed." : "ماژول PHP %s نصب نشده است.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 نیاز است", + "Please upgrade your database version" : "لطفا نسخهی پایگاهدادهی خود را بروز کنید", + "Error occurred while checking PostgreSQL version" : "خطا در هنگام بررسی نسخهی PostgreSQL" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/fa.json b/lib/l10n/fa.json index f434f6517af..626225538a0 100644 --- a/lib/l10n/fa.json +++ b/lib/l10n/fa.json @@ -1,22 +1,49 @@ { "translations": { + "Cannot write into \"config\" directory!" : "نمیتوانید داخل دایرکتوری \"config\" تغییراتی ایجاد کنید", + "See %s" : "مشاهده %s", + "Sample configuration detected" : "فایل پیکربندی نمونه پیدا شد", + "PHP %s or higher is required." : "PHP نسخهی %s یا بالاتر نیاز است.", + "Following databases are supported: %s" : "پایگاهداده های ذکر شده مورد نیاز است: %s", + "The command line tool %s could not be found" : "ابزار کامندلاین %s پیدا نشد", + "The library %s is not available." : "کتابخانهی %s در دسترس نیست.", + "Library %s with a version higher than %s is required - available version %s." : "کتابخانه %s با نسخهی بالاتر از %s نیاز است - نسخهی موجود %s.", + "Library %s with a version lower than %s is required - available version %s." : "کتابخانه %s با نسخهی پایینتر از %s نیاز است - نسخهی موجود %s.", + "ownCloud %s or higher is required." : "ownCloud با نسخهی %s یا بالاتر نیاز است.", + "ownCloud %s or lower is required." : "ownCloud با نسخهی %s یا پایینتر نیاز است.", "Help" : "راهنما", "Personal" : "شخصی", "Users" : "کاربران", "Admin" : "مدیر", + "Recommended" : "پیشنهاد شده", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "امکان نصب برنامهی \"%s\" به علت عدم سازگاری با این نسخه از ownCloud وجود ندارد.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "امکان نصب برنامه \"%s\" با توجه به برآورده نکردن نیازمندی زیر وجود ندارد: %s", + "No app name specified" : "اسم اپلیکیشن مشخص نشده است", "Unknown filetype" : "نوع فایل ناشناخته", "Invalid image" : "عکس نامعتبر", "today" : "امروز", "yesterday" : "دیروز", + "_%n day ago_::_%n days ago_" : ["%n روز پیش"], "last month" : "ماه قبل", "_%n month ago_::_%n months ago_" : ["%n ماه قبل"], "last year" : "سال قبل", + "_%n year ago_::_%n years ago_" : ["%n سال پیش"], "_%n hour ago_::_%n hours ago_" : ["%n ساعت قبل"], "_%n minute ago_::_%n minutes ago_" : ["%n دقیقه قبل"], "seconds ago" : "ثانیهها پیش", "web services under your control" : "سرویس های تحت وب در کنترل شما", + "Empty filename is not allowed" : "نام فایل نمیتواند خالی باشد", + "File name is a reserved word" : "این نام فایل جزو کلمات رزرو میباشد", + "File name contains at least one invalid character" : "نام فایل دارای حداقل یک کاراکتر نامعتبر است", + "File name is too long" : "نام فایل خیلی بزرگ است", + "File is currently busy, please try again later" : "فایل در حال حاضر مشغول است، لطفا مجددا تلاش کنید", + "Can't read file" : "امکان خواندن فایل وجود ندارد", + "App directory already exists" : "برنامه در حال حاضر وجود دارد", + "Can't create app folder. Please fix permissions. %s" : "امکان ایجاد پوشهی برنامه وجود ندارد. لطفا اجازههای دسترسی را تصحیح کنید. %s", + "No source specified when installing app" : "هیچ مبدائی در زمان نصب برنامه مشخص نشده است", "Application is not enabled" : "برنامه فعال نشده است", "Authentication error" : "خطا در اعتبار سنجی", "Token expired. Please reload page." : "رمز منقضی شده است. لطفا دوباره صفحه را بارگذاری نمایید.", + "Unknown user" : "کاربر نامعلوم", "%s enter the database username." : "%s نام کاربری پایگاه داده را وارد نمایید.", "%s enter the database name." : "%s نام پایگاه داده را وارد نمایید.", "%s you may not use dots in the database name" : "%s شما نباید از نقطه در نام پایگاه داده استفاده نمایید.", @@ -31,7 +58,16 @@ "Set an admin password." : "یک رمزعبور برای مدیر تنظیم نمایید.", "%s shared »%s« with you" : "%s به اشتراک گذاشته شده است »%s« توسط شما", "Could not find category \"%s\"" : "دسته بندی %s یافت نشد", + "Apps" : " برنامه ها", "A valid username must be provided" : "نام کاربری صحیح باید وارد شود", - "A valid password must be provided" : "رمز عبور صحیح باید وارد شود" + "A valid password must be provided" : "رمز عبور صحیح باید وارد شود", + "The username is already being used" : "نامکاربری قبلا استفاده شده است", + "Microsoft Windows Platform is not supported" : "بستر Microsoft Windows پشتیبانی نمیشود", + "Cannot write into \"config\" directory" : "امکان نوشتن درون شاخهی \"config\" وجود ندارد", + "Please ask your server administrator to install the module." : "لطفا از مدیر سیستم بخواهید تا ماژول را نصب کند.", + "PHP module %s not installed." : "ماژول PHP %s نصب نشده است.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 نیاز است", + "Please upgrade your database version" : "لطفا نسخهی پایگاهدادهی خود را بروز کنید", + "Error occurred while checking PostgreSQL version" : "خطا در هنگام بررسی نسخهی PostgreSQL" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js index 6960162e0ab..00d9dddf034 100644 --- a/lib/l10n/fi_FI.js +++ b/lib/l10n/fi_FI.js @@ -79,7 +79,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s jakoi kohteen »%s« kanssasi", "Sharing %s failed, because the file does not exist" : "Kohteen %s jakaminen epäonnistui, koska tiedostoa ei ole olemassa", "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.", - "Sharing %s failed, because the user %s is the item owner" : "Kohteen %s jakaminen epäonnistui, koska käyttäjä %s on kohteen omistaja", "Sharing %s failed, because the user %s does not exist" : "Kohteen %s jakaminen epäonnistui, koska käyttäjää %s ei ole olemassa", "Sharing %s failed, because this item is already shared with %s" : "Kohteen %s jakaminen epäonnistui, koska kohde on jo jaettu käyttäjän %s kanssa", "Sharing %s failed, because this item is already shared with user %s" : "Kohteen %s jakaminen epäonnistui, koska kohde on jo jaettu käyttäjän %s kanssa", @@ -93,16 +92,17 @@ OC.L10N.register( "Cannot clear expiration date. Shares are required to have an expiration date." : "Vanhenemispäivän tyhjentäminen ei onnistu. Jaoille on määritelty pakolliseksi vanhenemispäivä.", "Sharing backend %s not found" : "Jakamisen taustaosaa %s ei löytynyt", "Sharing backend for %s not found" : "Jakamisen taustaosaa kohteelle %s ei löytynyt", - "Sharing %s failed, because the user %s is the original sharer" : "Kohteen %s jakaminen epäonnistui, koska käyttäjä %s on alkuperäinen jakaja", "Sharing %s failed, because resharing is not allowed" : "Kohteen %s jakaminen epäonnistui, koska jakaminen uudelleen ei ole sallittu", "Sharing %s failed, because the file could not be found in the file cache" : "Kohteen %s jakaminen epäonnistui, koska tiedostoa ei löytynyt tiedostovälimuistista", "Could not find category \"%s\"" : "Luokkaa \"%s\" ei löytynyt", + "Apps" : "Sovellukset", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Vain seuraavat merkit ovat sallittuja käyttäjätunnuksessa: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"", "A valid username must be provided" : "Anna kelvollinen käyttäjätunnus", "A valid password must be provided" : "Anna kelvollinen salasana", "The username is already being used" : "Käyttäjätunnus on jo käytössä", "No database drivers (sqlite, mysql, or postgresql) installed." : "Tietokanta-ajureita (sqlite, mysql tai postgresql) ei ole asennettu.", "Microsoft Windows Platform is not supported" : "Microsoft Windows -alusta ei ole tuettu", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "ownCloud-palvelin ei ole tuettu Microsoft Windows -alustalla. Suosittelemme käyttämään Linux-palvelinta virtuaalikoneessa, jos itse palvelimeen ei voi asentaa Linux-jakelua käyttöjärjestelmäksi. Linux-paketit ja virtuaalikoneiden levykuvat ovat saatavilla osoitteesta <a href=\"%s\">%s</a>. Tarjoamme vinkkejä ja siirtoskriptejä nykyisten asennusten siirtämiseksi Linux-alustalle <a href=\"%s\">dokumenaation kautta</a>.", "Cannot write into \"config\" directory" : "Hakemistoon \"config\" kirjoittaminen ei onnistu", "Cannot write into \"apps\" directory" : "Hakemistoon \"apps\" kirjoittaminen ei onnistu", "Cannot create \"data\" directory (%s)" : "Kansion \"data\" luominen ei onnistu (%s)", diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json index 7d23189b358..cddec0a3e5c 100644 --- a/lib/l10n/fi_FI.json +++ b/lib/l10n/fi_FI.json @@ -77,7 +77,6 @@ "%s shared »%s« with you" : "%s jakoi kohteen »%s« kanssasi", "Sharing %s failed, because the file does not exist" : "Kohteen %s jakaminen epäonnistui, koska tiedostoa ei ole olemassa", "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.", - "Sharing %s failed, because the user %s is the item owner" : "Kohteen %s jakaminen epäonnistui, koska käyttäjä %s on kohteen omistaja", "Sharing %s failed, because the user %s does not exist" : "Kohteen %s jakaminen epäonnistui, koska käyttäjää %s ei ole olemassa", "Sharing %s failed, because this item is already shared with %s" : "Kohteen %s jakaminen epäonnistui, koska kohde on jo jaettu käyttäjän %s kanssa", "Sharing %s failed, because this item is already shared with user %s" : "Kohteen %s jakaminen epäonnistui, koska kohde on jo jaettu käyttäjän %s kanssa", @@ -91,16 +90,17 @@ "Cannot clear expiration date. Shares are required to have an expiration date." : "Vanhenemispäivän tyhjentäminen ei onnistu. Jaoille on määritelty pakolliseksi vanhenemispäivä.", "Sharing backend %s not found" : "Jakamisen taustaosaa %s ei löytynyt", "Sharing backend for %s not found" : "Jakamisen taustaosaa kohteelle %s ei löytynyt", - "Sharing %s failed, because the user %s is the original sharer" : "Kohteen %s jakaminen epäonnistui, koska käyttäjä %s on alkuperäinen jakaja", "Sharing %s failed, because resharing is not allowed" : "Kohteen %s jakaminen epäonnistui, koska jakaminen uudelleen ei ole sallittu", "Sharing %s failed, because the file could not be found in the file cache" : "Kohteen %s jakaminen epäonnistui, koska tiedostoa ei löytynyt tiedostovälimuistista", "Could not find category \"%s\"" : "Luokkaa \"%s\" ei löytynyt", + "Apps" : "Sovellukset", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Vain seuraavat merkit ovat sallittuja käyttäjätunnuksessa: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"", "A valid username must be provided" : "Anna kelvollinen käyttäjätunnus", "A valid password must be provided" : "Anna kelvollinen salasana", "The username is already being used" : "Käyttäjätunnus on jo käytössä", "No database drivers (sqlite, mysql, or postgresql) installed." : "Tietokanta-ajureita (sqlite, mysql tai postgresql) ei ole asennettu.", "Microsoft Windows Platform is not supported" : "Microsoft Windows -alusta ei ole tuettu", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "ownCloud-palvelin ei ole tuettu Microsoft Windows -alustalla. Suosittelemme käyttämään Linux-palvelinta virtuaalikoneessa, jos itse palvelimeen ei voi asentaa Linux-jakelua käyttöjärjestelmäksi. Linux-paketit ja virtuaalikoneiden levykuvat ovat saatavilla osoitteesta <a href=\"%s\">%s</a>. Tarjoamme vinkkejä ja siirtoskriptejä nykyisten asennusten siirtämiseksi Linux-alustalle <a href=\"%s\">dokumenaation kautta</a>.", "Cannot write into \"config\" directory" : "Hakemistoon \"config\" kirjoittaminen ei onnistu", "Cannot write into \"apps\" directory" : "Hakemistoon \"apps\" kirjoittaminen ei onnistu", "Cannot create \"data\" directory (%s)" : "Kansion \"data\" luominen ei onnistu (%s)", diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index d0abd693e0c..446eb5ce3a0 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -86,7 +86,7 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Le partage de %s a échoué car l’infrastructure n'autorise pas les partages de type %i", "Sharing %s failed, because the file does not exist" : "Le partage de %s a échoué car le fichier n'existe pas", "You are not allowed to share %s" : "Vous n'êtes pas autorisé à partager %s", - "Sharing %s failed, because the user %s is the item owner" : "Le partage de %s a échoué car l'utilisateur %s est le propriétaire de l'objet", + "Sharing %s failed, because you can not share with yourself" : "Le partage de %s a échoué car vous ne pouvez pas partager avec vous-même", "Sharing %s failed, because the user %s does not exist" : "Le partage de %s a échoué car l'utilisateur %s n'existe pas", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Le partage de %s a échoué car l'utilisateur %s n'est membre d'aucun groupe auquel %s appartient", "Sharing %s failed, because this item is already shared with %s" : "Le partage de %s a échoué car cet objet est déjà partagé avec %s", @@ -105,12 +105,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Le service de partage %s doit implémenter l'interface OCP\\Share_Backend", "Sharing backend %s not found" : "Service de partage %s non trouvé", "Sharing backend for %s not found" : "Le service de partage pour %s est introuvable", - "Sharing %s failed, because the user %s is the original sharer" : "Le partage de %s a échoué car l'utilisateur %s est l'utilisateur à l'origine du partage.", + "Sharing failed, because the user %s is the original sharer" : "Le partage a échoué car l'utilisateur %s est le propriétaire original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Le partage de %s a échoué car les permissions dépassent celles accordées à %s", "Sharing %s failed, because resharing is not allowed" : "Le partage de %s a échoué car le repartage n'est pas autorisé", - "Sharing %s failed, because the sharing backend for %s could not find its source" : "Le partage de %s a échoué car la source n'a pas été trouvée pour le partage %s.", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Le partage de %s a échoué car le service %s n'a pas trouvé sa source..", "Sharing %s failed, because the file could not be found in the file cache" : "Le partage de %s a échoué car le fichier n'a pas été trouvé dans les fichiers mis en cache.", "Could not find category \"%s\"" : "Impossible de trouver la catégorie \"%s\"", + "Apps" : "Applications", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", et \"_.@-\"", "A valid username must be provided" : "Un nom d'utilisateur valide doit être saisi", "A valid password must be provided" : "Un mot de passe valide doit être saisi", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index d0a90797df9..9993a38e427 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -84,7 +84,7 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Le partage de %s a échoué car l’infrastructure n'autorise pas les partages de type %i", "Sharing %s failed, because the file does not exist" : "Le partage de %s a échoué car le fichier n'existe pas", "You are not allowed to share %s" : "Vous n'êtes pas autorisé à partager %s", - "Sharing %s failed, because the user %s is the item owner" : "Le partage de %s a échoué car l'utilisateur %s est le propriétaire de l'objet", + "Sharing %s failed, because you can not share with yourself" : "Le partage de %s a échoué car vous ne pouvez pas partager avec vous-même", "Sharing %s failed, because the user %s does not exist" : "Le partage de %s a échoué car l'utilisateur %s n'existe pas", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Le partage de %s a échoué car l'utilisateur %s n'est membre d'aucun groupe auquel %s appartient", "Sharing %s failed, because this item is already shared with %s" : "Le partage de %s a échoué car cet objet est déjà partagé avec %s", @@ -103,12 +103,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Le service de partage %s doit implémenter l'interface OCP\\Share_Backend", "Sharing backend %s not found" : "Service de partage %s non trouvé", "Sharing backend for %s not found" : "Le service de partage pour %s est introuvable", - "Sharing %s failed, because the user %s is the original sharer" : "Le partage de %s a échoué car l'utilisateur %s est l'utilisateur à l'origine du partage.", + "Sharing failed, because the user %s is the original sharer" : "Le partage a échoué car l'utilisateur %s est le propriétaire original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Le partage de %s a échoué car les permissions dépassent celles accordées à %s", "Sharing %s failed, because resharing is not allowed" : "Le partage de %s a échoué car le repartage n'est pas autorisé", - "Sharing %s failed, because the sharing backend for %s could not find its source" : "Le partage de %s a échoué car la source n'a pas été trouvée pour le partage %s.", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Le partage de %s a échoué car le service %s n'a pas trouvé sa source..", "Sharing %s failed, because the file could not be found in the file cache" : "Le partage de %s a échoué car le fichier n'a pas été trouvé dans les fichiers mis en cache.", "Could not find category \"%s\"" : "Impossible de trouver la catégorie \"%s\"", + "Apps" : "Applications", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", et \"_.@-\"", "A valid username must be provided" : "Un nom d'utilisateur valide doit être saisi", "A valid password must be provided" : "Un mot de passe valide doit être saisi", diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js index bc2afd3f6e5..ec7514de7a3 100644 --- a/lib/l10n/gl.js +++ b/lib/l10n/gl.js @@ -86,7 +86,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Fallou a compartición de %s, xa que a infraestrutura non permite accións do tipo %i", "Sharing %s failed, because the file does not exist" : "Fallou a compartición de %s, o ficheiro non existe", "You are not allowed to share %s" : "Non ten permiso para compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Fallou a compartición de %s, o propietario do elemento é o usuario %s", "Sharing %s failed, because the user %s does not exist" : "Fallou a compartición de %s, o usuario %s non existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Fallou a compartición de %s, o usuario %s non é membro de ningún grupo que sexa membro de %s", "Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s", @@ -104,12 +103,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "A infraestrutura de compartición %s ten que implementar a interface OCP\\Share_Backend", "Sharing backend %s not found" : "Non se atopou a infraestrutura de compartición %s", "Sharing backend for %s not found" : "Non se atopou a infraestrutura de compartición para %s", - "Sharing %s failed, because the user %s is the original sharer" : "Fallou a compartición de %s, a compartición orixinal é do usuario %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Fallou a compartición de %s, os permisos superan os permisos concedidos a %s", "Sharing %s failed, because resharing is not allowed" : "Fallou a compartición de %s, non está permitido repetir a compartción", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Fallou a compartición de %s, a infraestrutura de compartición para %s non foi quen de atopar a orixe", "Sharing %s failed, because the file could not be found in the file cache" : "Fallou a compartición de %s, non foi posíbel atopar o ficheiro na caché de ficheiros", "Could not find category \"%s\"" : "Non foi posíbel atopar a categoría «%s»", + "Apps" : "Aplicacións", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Só se permiten os seguintes caracteres no nome de usuario: «a-z», «A-Z», «0-9», e «_.@-»", "A valid username must be provided" : "Debe fornecer un nome de usuario", "A valid password must be provided" : "Debe fornecer un contrasinal", diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json index 9607f9fad18..6993e165a46 100644 --- a/lib/l10n/gl.json +++ b/lib/l10n/gl.json @@ -84,7 +84,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Fallou a compartición de %s, xa que a infraestrutura non permite accións do tipo %i", "Sharing %s failed, because the file does not exist" : "Fallou a compartición de %s, o ficheiro non existe", "You are not allowed to share %s" : "Non ten permiso para compartir %s", - "Sharing %s failed, because the user %s is the item owner" : "Fallou a compartición de %s, o propietario do elemento é o usuario %s", "Sharing %s failed, because the user %s does not exist" : "Fallou a compartición de %s, o usuario %s non existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Fallou a compartición de %s, o usuario %s non é membro de ningún grupo que sexa membro de %s", "Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s", @@ -102,12 +101,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "A infraestrutura de compartición %s ten que implementar a interface OCP\\Share_Backend", "Sharing backend %s not found" : "Non se atopou a infraestrutura de compartición %s", "Sharing backend for %s not found" : "Non se atopou a infraestrutura de compartición para %s", - "Sharing %s failed, because the user %s is the original sharer" : "Fallou a compartición de %s, a compartición orixinal é do usuario %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Fallou a compartición de %s, os permisos superan os permisos concedidos a %s", "Sharing %s failed, because resharing is not allowed" : "Fallou a compartición de %s, non está permitido repetir a compartción", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Fallou a compartición de %s, a infraestrutura de compartición para %s non foi quen de atopar a orixe", "Sharing %s failed, because the file could not be found in the file cache" : "Fallou a compartición de %s, non foi posíbel atopar o ficheiro na caché de ficheiros", "Could not find category \"%s\"" : "Non foi posíbel atopar a categoría «%s»", + "Apps" : "Aplicacións", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Só se permiten os seguintes caracteres no nome de usuario: «a-z», «A-Z», «0-9», e «_.@-»", "A valid username must be provided" : "Debe fornecer un nome de usuario", "A valid password must be provided" : "Debe fornecer un contrasinal", diff --git a/lib/l10n/he.js b/lib/l10n/he.js index 33a67415541..66acae5b804 100644 --- a/lib/l10n/he.js +++ b/lib/l10n/he.js @@ -16,6 +16,7 @@ OC.L10N.register( "Token expired. Please reload page." : "פג תוקף. נא לטעון שוב את הדף.", "%s shared »%s« with you" : "%s שיתף/שיתפה איתך את »%s«", "Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“", + "Apps" : "יישומים", "A valid username must be provided" : "יש לספק שם משתמש תקני", "A valid password must be provided" : "יש לספק ססמה תקנית" }, diff --git a/lib/l10n/he.json b/lib/l10n/he.json index a66c1f252c8..55df638cb11 100644 --- a/lib/l10n/he.json +++ b/lib/l10n/he.json @@ -14,6 +14,7 @@ "Token expired. Please reload page." : "פג תוקף. נא לטעון שוב את הדף.", "%s shared »%s« with you" : "%s שיתף/שיתפה איתך את »%s«", "Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“", + "Apps" : "יישומים", "A valid username must be provided" : "יש לספק שם משתמש תקני", "A valid password must be provided" : "יש לספק ססמה תקנית" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/lib/l10n/hi.js b/lib/l10n/hi.js index fced66d581c..78defefb3b2 100644 --- a/lib/l10n/hi.js +++ b/lib/l10n/hi.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Help" : "सहयोग", "Personal" : "यक्तिगत", - "Users" : "उपयोगकर्ता" + "Users" : "उपयोगकर्ता", + "Apps" : "Apps" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/hi.json b/lib/l10n/hi.json index 8a77c13a367..90409d07975 100644 --- a/lib/l10n/hi.json +++ b/lib/l10n/hi.json @@ -1,6 +1,7 @@ { "translations": { "Help" : "सहयोग", "Personal" : "यक्तिगत", - "Users" : "उपयोगकर्ता" + "Users" : "उपयोगकर्ता", + "Apps" : "Apps" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/hr.js b/lib/l10n/hr.js index 16ac6ff2821..a5c11df6f1e 100644 --- a/lib/l10n/hr.js +++ b/lib/l10n/hr.js @@ -65,7 +65,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s je s vama podijelio »%s«", "Sharing %s failed, because the file does not exist" : "Dijeljenje %s nije uspjelo jer ta datoteka ne postoji", "You are not allowed to share %s" : "Nije vam dopušteno dijeliti %s", - "Sharing %s failed, because the user %s is the item owner" : "Dijeljenje %s nije uspjelo jer je korisnik %s vlasnik te stavke", "Sharing %s failed, because the user %s does not exist" : "Dijeljenje %s nije uspjelo jer korisnik %s ne postoji", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Dijeljenje %s nije uspjelo jer korisnik %s nije član niti jedne grupe u kojoj je %s član", "Sharing %s failed, because this item is already shared with %s" : "Dijeljenje %s nije uspjelo jer je ova stavka već podijeljena s %s", @@ -81,12 +80,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Dijeljenje pozadine %s mora implementirati sučelje OCP\\Share_Backend", "Sharing backend %s not found" : "Dijeljenje pozadine %s nije nađeno", "Sharing backend for %s not found" : "Dijeljenje pozadine za %s nije nađeno", - "Sharing %s failed, because the user %s is the original sharer" : "Dijeljenje %s nije uspjelo jer je korisnik %s izvorni djelitelj", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Dijeljenje %s nije uspjelo jer dozvole premašuju dozvole za koje %s ima odobrenje.", "Sharing %s failed, because resharing is not allowed" : "Dijeljenje %s nije uspjelo jer ponovno dijeljenje nije dopušteno.", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Dijeljenje %s nije uspjelo jer pozadina za %s nije mogla pronaći svoj izvor", "Sharing %s failed, because the file could not be found in the file cache" : "Dijeljenje %s nije uspjelo jer u predmemoriji datoteke datoteka nije nađena.", "Could not find category \"%s\"" : "Kategorija \"%s\" nije nađena", + "Apps" : "Aplikacije", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Samo su sljedeći znakovi dopušteni u korisničkom imenu: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Nužno je navesti ispravno korisničko ime", "A valid password must be provided" : "Nužno je navesti ispravnu lozinku", diff --git a/lib/l10n/hr.json b/lib/l10n/hr.json index 291e59261ba..0acba06fb8a 100644 --- a/lib/l10n/hr.json +++ b/lib/l10n/hr.json @@ -63,7 +63,6 @@ "%s shared »%s« with you" : "%s je s vama podijelio »%s«", "Sharing %s failed, because the file does not exist" : "Dijeljenje %s nije uspjelo jer ta datoteka ne postoji", "You are not allowed to share %s" : "Nije vam dopušteno dijeliti %s", - "Sharing %s failed, because the user %s is the item owner" : "Dijeljenje %s nije uspjelo jer je korisnik %s vlasnik te stavke", "Sharing %s failed, because the user %s does not exist" : "Dijeljenje %s nije uspjelo jer korisnik %s ne postoji", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Dijeljenje %s nije uspjelo jer korisnik %s nije član niti jedne grupe u kojoj je %s član", "Sharing %s failed, because this item is already shared with %s" : "Dijeljenje %s nije uspjelo jer je ova stavka već podijeljena s %s", @@ -79,12 +78,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Dijeljenje pozadine %s mora implementirati sučelje OCP\\Share_Backend", "Sharing backend %s not found" : "Dijeljenje pozadine %s nije nađeno", "Sharing backend for %s not found" : "Dijeljenje pozadine za %s nije nađeno", - "Sharing %s failed, because the user %s is the original sharer" : "Dijeljenje %s nije uspjelo jer je korisnik %s izvorni djelitelj", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Dijeljenje %s nije uspjelo jer dozvole premašuju dozvole za koje %s ima odobrenje.", "Sharing %s failed, because resharing is not allowed" : "Dijeljenje %s nije uspjelo jer ponovno dijeljenje nije dopušteno.", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Dijeljenje %s nije uspjelo jer pozadina za %s nije mogla pronaći svoj izvor", "Sharing %s failed, because the file could not be found in the file cache" : "Dijeljenje %s nije uspjelo jer u predmemoriji datoteke datoteka nije nađena.", "Could not find category \"%s\"" : "Kategorija \"%s\" nije nađena", + "Apps" : "Aplikacije", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Samo su sljedeći znakovi dopušteni u korisničkom imenu: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Nužno je navesti ispravno korisničko ime", "A valid password must be provided" : "Nužno je navesti ispravnu lozinku", diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js index e7287ccd5a1..7f4bc21063a 100644 --- a/lib/l10n/hu_HU.js +++ b/lib/l10n/hu_HU.js @@ -73,7 +73,6 @@ OC.L10N.register( "%s via %s" : "%s über %s", "Sharing %s failed, because the file does not exist" : "%s megosztása sikertelen, mert a fájl nem létezik", "You are not allowed to share %s" : "Önnek nincs jogosultsága %s megosztására", - "Sharing %s failed, because the user %s is the item owner" : "%s megosztása nem sikerült, mert %s felhasználó az állomány tulajdonosa", "Sharing %s failed, because the user %s does not exist" : "%s megosztása nem sikerült, mert %s felhasználó nem létezik", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s megosztása nem sikerült, mert %s felhasználó nem tagja egyik olyan csoportnak sem, aminek %s tagja", "Sharing %s failed, because this item is already shared with %s" : "%s megosztása nem sikerült, mert ez már meg van osztva %s-vel", @@ -89,12 +88,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Az %s megosztási alrendszernek támogatnia kell az OCP\\Share_Backend interface-t", "Sharing backend %s not found" : "A %s megosztási alrendszer nem található", "Sharing backend for %s not found" : "%s megosztási alrendszere nem található", - "Sharing %s failed, because the user %s is the original sharer" : "%s megosztása nem sikerült, mert %s felhasználó az eredeti megosztó", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s megosztása nem sikerült, mert a jogosultságok túllépik azt, ami %s rendelkezésére áll", "Sharing %s failed, because resharing is not allowed" : "%s megosztása nem sikerült, mert a megosztás továbbadása nincs engedélyezve", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s megosztása nem sikerült, mert %s megosztási alrendszere nem találja", "Sharing %s failed, because the file could not be found in the file cache" : "%s megosztása nem sikerült, mert a fájl nem található a gyorsítótárban", "Could not find category \"%s\"" : "Ez a kategória nem található: \"%s\"", + "Apps" : "Alkalmazások", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "A felhasználónévben csak a következő karakterek fordulhatnak elő: \"a-z\", \"A-Z\", \"0-9\", és \"_.@-\"", "A valid username must be provided" : "Érvényes felhasználónevet kell megadnia", "A valid password must be provided" : "Érvényes jelszót kell megadnia", diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json index 8620c13e2ac..180b65181c2 100644 --- a/lib/l10n/hu_HU.json +++ b/lib/l10n/hu_HU.json @@ -71,7 +71,6 @@ "%s via %s" : "%s über %s", "Sharing %s failed, because the file does not exist" : "%s megosztása sikertelen, mert a fájl nem létezik", "You are not allowed to share %s" : "Önnek nincs jogosultsága %s megosztására", - "Sharing %s failed, because the user %s is the item owner" : "%s megosztása nem sikerült, mert %s felhasználó az állomány tulajdonosa", "Sharing %s failed, because the user %s does not exist" : "%s megosztása nem sikerült, mert %s felhasználó nem létezik", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s megosztása nem sikerült, mert %s felhasználó nem tagja egyik olyan csoportnak sem, aminek %s tagja", "Sharing %s failed, because this item is already shared with %s" : "%s megosztása nem sikerült, mert ez már meg van osztva %s-vel", @@ -87,12 +86,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Az %s megosztási alrendszernek támogatnia kell az OCP\\Share_Backend interface-t", "Sharing backend %s not found" : "A %s megosztási alrendszer nem található", "Sharing backend for %s not found" : "%s megosztási alrendszere nem található", - "Sharing %s failed, because the user %s is the original sharer" : "%s megosztása nem sikerült, mert %s felhasználó az eredeti megosztó", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s megosztása nem sikerült, mert a jogosultságok túllépik azt, ami %s rendelkezésére áll", "Sharing %s failed, because resharing is not allowed" : "%s megosztása nem sikerült, mert a megosztás továbbadása nincs engedélyezve", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s megosztása nem sikerült, mert %s megosztási alrendszere nem találja", "Sharing %s failed, because the file could not be found in the file cache" : "%s megosztása nem sikerült, mert a fájl nem található a gyorsítótárban", "Could not find category \"%s\"" : "Ez a kategória nem található: \"%s\"", + "Apps" : "Alkalmazások", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "A felhasználónévben csak a következő karakterek fordulhatnak elő: \"a-z\", \"A-Z\", \"0-9\", és \"_.@-\"", "A valid username must be provided" : "Érvényes felhasználónevet kell megadnia", "A valid password must be provided" : "Érvényes jelszót kell megadnia", diff --git a/lib/l10n/hy.js b/lib/l10n/hy.js index c52c1de970f..b6fc39257f8 100644 --- a/lib/l10n/hy.js +++ b/lib/l10n/hy.js @@ -1,6 +1,7 @@ OC.L10N.register( "lib", { - "Personal" : "Անձնական" + "Personal" : "Անձնական", + "today" : "այսօր" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/hy.json b/lib/l10n/hy.json index 9b571e73868..68db5355112 100644 --- a/lib/l10n/hy.json +++ b/lib/l10n/hy.json @@ -1,4 +1,5 @@ { "translations": { - "Personal" : "Անձնական" + "Personal" : "Անձնական", + "today" : "այսօր" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/ia.js b/lib/l10n/ia.js index f24e9b44828..d251c690053 100644 --- a/lib/l10n/ia.js +++ b/lib/l10n/ia.js @@ -13,6 +13,7 @@ OC.L10N.register( "last year" : "ultime anno", "seconds ago" : "secundas passate", "web services under your control" : "servicios web sub tu controlo", - "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux." + "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux.", + "Apps" : "Applicationes" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ia.json b/lib/l10n/ia.json index 21b6e68af21..e642869a055 100644 --- a/lib/l10n/ia.json +++ b/lib/l10n/ia.json @@ -11,6 +11,7 @@ "last year" : "ultime anno", "seconds ago" : "secundas passate", "web services under your control" : "servicios web sub tu controlo", - "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux." + "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux.", + "Apps" : "Applicationes" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/id.js b/lib/l10n/id.js index 0de6a4124fb..4452a95ea7b 100644 --- a/lib/l10n/id.js +++ b/lib/l10n/id.js @@ -87,7 +87,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Gagal berbagi %s, karena backend tidak mengizinkan berbagi dengan tipe %i", "Sharing %s failed, because the file does not exist" : "Gagal membagikan %s, karena berkas tidak ada", "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s", - "Sharing %s failed, because the user %s is the item owner" : "Gagal membagikan %s, karena pengguna %s adalah pemilik item", "Sharing %s failed, because the user %s does not exist" : "Gagal membagikan %s, karena pengguna %s tidak ada", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Gagal membagikan %s, karena pengguna %s bukan merupakan anggota dari grup yang %s ikuti", "Sharing %s failed, because this item is already shared with %s" : "Gagal membagkan %s, karena item ini sudah dibagikan dengan %s", @@ -106,12 +105,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend berbagi %s harus mengimplementasi antarmuka OCP\\Share_Backend", "Sharing backend %s not found" : "Backend berbagi %s tidak ditemukan", "Sharing backend for %s not found" : "Backend berbagi untuk %s tidak ditemukan", - "Sharing %s failed, because the user %s is the original sharer" : "Gagal berbagi %s. karena pengguna %s adalah yang membagikan pertama", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Gagal membagikan %s, karena izin melebihi izin yang diberikan untuk %s", "Sharing %s failed, because resharing is not allowed" : "Gagal berbagi %s, karena membagikan ulang tidak diizinkan", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Berbagi %s gagal, karena backend berbagi untuk %s tidak menemukan sumbernya", "Sharing %s failed, because the file could not be found in the file cache" : "Gagal berbagi %s, karena berkas tidak ditemukan di berkas cache", "Could not find category \"%s\"" : "Tidak menemukan kategori \"%s\"", + "Apps" : "Aplikasi", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Hanya karakter berikut yang diizinkan dalam nama pengguna: \"a-z\", \"A-Z\", \"0-9\", dan \"_.@-\"", "A valid username must be provided" : "Tuliskan nama pengguna yang valid", "A valid password must be provided" : "Tuliskan sandi yang valid", diff --git a/lib/l10n/id.json b/lib/l10n/id.json index e1b3a9f93b0..6d0e4ffdc8a 100644 --- a/lib/l10n/id.json +++ b/lib/l10n/id.json @@ -85,7 +85,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Gagal berbagi %s, karena backend tidak mengizinkan berbagi dengan tipe %i", "Sharing %s failed, because the file does not exist" : "Gagal membagikan %s, karena berkas tidak ada", "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s", - "Sharing %s failed, because the user %s is the item owner" : "Gagal membagikan %s, karena pengguna %s adalah pemilik item", "Sharing %s failed, because the user %s does not exist" : "Gagal membagikan %s, karena pengguna %s tidak ada", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Gagal membagikan %s, karena pengguna %s bukan merupakan anggota dari grup yang %s ikuti", "Sharing %s failed, because this item is already shared with %s" : "Gagal membagkan %s, karena item ini sudah dibagikan dengan %s", @@ -104,12 +103,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend berbagi %s harus mengimplementasi antarmuka OCP\\Share_Backend", "Sharing backend %s not found" : "Backend berbagi %s tidak ditemukan", "Sharing backend for %s not found" : "Backend berbagi untuk %s tidak ditemukan", - "Sharing %s failed, because the user %s is the original sharer" : "Gagal berbagi %s. karena pengguna %s adalah yang membagikan pertama", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Gagal membagikan %s, karena izin melebihi izin yang diberikan untuk %s", "Sharing %s failed, because resharing is not allowed" : "Gagal berbagi %s, karena membagikan ulang tidak diizinkan", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Berbagi %s gagal, karena backend berbagi untuk %s tidak menemukan sumbernya", "Sharing %s failed, because the file could not be found in the file cache" : "Gagal berbagi %s, karena berkas tidak ditemukan di berkas cache", "Could not find category \"%s\"" : "Tidak menemukan kategori \"%s\"", + "Apps" : "Aplikasi", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Hanya karakter berikut yang diizinkan dalam nama pengguna: \"a-z\", \"A-Z\", \"0-9\", dan \"_.@-\"", "A valid username must be provided" : "Tuliskan nama pengguna yang valid", "A valid password must be provided" : "Tuliskan sandi yang valid", diff --git a/lib/l10n/is.js b/lib/l10n/is.js index 7661ee829fb..d2c3602e070 100644 --- a/lib/l10n/is.js +++ b/lib/l10n/is.js @@ -16,6 +16,7 @@ OC.L10N.register( "Application is not enabled" : "Forrit ekki virkt", "Authentication error" : "Villa við auðkenningu", "Token expired. Please reload page." : "Auðkenning útrunnin. Vinsamlegast skráðu þig aftur inn.", - "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\"" + "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\"", + "Apps" : "Forrit" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/lib/l10n/is.json b/lib/l10n/is.json index 81fec382eb3..100409a868b 100644 --- a/lib/l10n/is.json +++ b/lib/l10n/is.json @@ -14,6 +14,7 @@ "Application is not enabled" : "Forrit ekki virkt", "Authentication error" : "Villa við auðkenningu", "Token expired. Please reload page." : "Auðkenning útrunnin. Vinsamlegast skráðu þig aftur inn.", - "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\"" + "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\"", + "Apps" : "Forrit" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/lib/l10n/it.js b/lib/l10n/it.js index d0cf725013b..7523d14a007 100644 --- a/lib/l10n/it.js +++ b/lib/l10n/it.js @@ -87,7 +87,7 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Condivisione di %s non riuscita, poiché il motore non consente condivisioni del tipo %i", "Sharing %s failed, because the file does not exist" : "Condivisione di %s non riuscita, poiché il file non esiste", "You are not allowed to share %s" : "Non ti è consentito condividere %s", - "Sharing %s failed, because the user %s is the item owner" : "Condivisione di %s non riuscita, poiché l'utente %s è il proprietario dell'oggetto", + "Sharing %s failed, because you can not share with yourself" : "Condivisione di %s non riuscita, poiché non puoi condividere con te stesso", "Sharing %s failed, because the user %s does not exist" : "Condivisione di %s non riuscita, poiché l'utente %s non esiste", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Condivisione di %s non riuscita, poiché l'utente %s non appartiene ad alcun gruppo di cui %s è membro", "Sharing %s failed, because this item is already shared with %s" : "Condivisione di %s non riuscita, poiché l'oggetto è già condiviso con %s", @@ -106,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Il motore di condivisione %s deve implementare l'interfaccia OCP\\Share_Backend", "Sharing backend %s not found" : "Motore di condivisione %s non trovato", "Sharing backend for %s not found" : "Motore di condivisione di %s non trovato", - "Sharing %s failed, because the user %s is the original sharer" : "Condivisione di %s non riuscita, poiché l'utente %s l'ha condiviso precedentemente", + "Sharing failed, because the user %s is the original sharer" : "Condivisione non riuscita, poiché l'utente %s ha condiviso in origine", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Condivisione di %s non riuscita, poiché i permessi superano quelli accordati a %s", "Sharing %s failed, because resharing is not allowed" : "Condivisione di %s non riuscita, poiché la ri-condivisione non è consentita", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Condivisione di %s non riuscita, poiché il motore di condivisione per %s non riesce a trovare la sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "Condivisione di %s non riuscita, poiché il file non è stato trovato nella cache", "Could not find category \"%s\"" : "Impossibile trovare la categoria \"%s\"", + "Apps" : "Applicazioni", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo i seguenti caratteri sono ammessi in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" : "Deve essere fornito un nome utente valido", "A valid password must be provided" : "Deve essere fornita una password valida", diff --git a/lib/l10n/it.json b/lib/l10n/it.json index 81038c0e425..dc16360e5a5 100644 --- a/lib/l10n/it.json +++ b/lib/l10n/it.json @@ -85,7 +85,7 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Condivisione di %s non riuscita, poiché il motore non consente condivisioni del tipo %i", "Sharing %s failed, because the file does not exist" : "Condivisione di %s non riuscita, poiché il file non esiste", "You are not allowed to share %s" : "Non ti è consentito condividere %s", - "Sharing %s failed, because the user %s is the item owner" : "Condivisione di %s non riuscita, poiché l'utente %s è il proprietario dell'oggetto", + "Sharing %s failed, because you can not share with yourself" : "Condivisione di %s non riuscita, poiché non puoi condividere con te stesso", "Sharing %s failed, because the user %s does not exist" : "Condivisione di %s non riuscita, poiché l'utente %s non esiste", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Condivisione di %s non riuscita, poiché l'utente %s non appartiene ad alcun gruppo di cui %s è membro", "Sharing %s failed, because this item is already shared with %s" : "Condivisione di %s non riuscita, poiché l'oggetto è già condiviso con %s", @@ -104,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Il motore di condivisione %s deve implementare l'interfaccia OCP\\Share_Backend", "Sharing backend %s not found" : "Motore di condivisione %s non trovato", "Sharing backend for %s not found" : "Motore di condivisione di %s non trovato", - "Sharing %s failed, because the user %s is the original sharer" : "Condivisione di %s non riuscita, poiché l'utente %s l'ha condiviso precedentemente", + "Sharing failed, because the user %s is the original sharer" : "Condivisione non riuscita, poiché l'utente %s ha condiviso in origine", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Condivisione di %s non riuscita, poiché i permessi superano quelli accordati a %s", "Sharing %s failed, because resharing is not allowed" : "Condivisione di %s non riuscita, poiché la ri-condivisione non è consentita", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Condivisione di %s non riuscita, poiché il motore di condivisione per %s non riesce a trovare la sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "Condivisione di %s non riuscita, poiché il file non è stato trovato nella cache", "Could not find category \"%s\"" : "Impossibile trovare la categoria \"%s\"", + "Apps" : "Applicazioni", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo i seguenti caratteri sono ammessi in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" : "Deve essere fornito un nome utente valido", "A valid password must be provided" : "Deve essere fornita una password valida", diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js index 20ad385491c..9f7625bca75 100644 --- a/lib/l10n/ja.js +++ b/lib/l10n/ja.js @@ -86,7 +86,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "%s の共有に失敗しました。%i タイプからの共有は許可されていないからです。", "Sharing %s failed, because the file does not exist" : "%s の共有に失敗しました。そのようなファイルは存在しないからです。", "You are not allowed to share %s" : "%s を共有することを許可されていません。", - "Sharing %s failed, because the user %s is the item owner" : "%s の共有に失敗しました。ユーザー %s がアイテム所有者です。", "Sharing %s failed, because the user %s does not exist" : "%s の共有に失敗しました。ユーザー %s が存在しません。", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s の共有に失敗しました。ユーザー %s はどのグループにも属していません。%s は、??のメンバーです。", "Sharing %s failed, because this item is already shared with %s" : "%s の共有に失敗しました。このアイテムはすでに %s で共有されています。", @@ -104,12 +103,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "%s のバックエンドの共有には、OCP\\Share_Backend インターフェースを実装しなければなりません。", "Sharing backend %s not found" : "共有バックエンド %s が見つかりません", "Sharing backend for %s not found" : "%s のための共有バックエンドが見つかりません", - "Sharing %s failed, because the user %s is the original sharer" : "%s の共有に失敗しました。ユーザー %s が元々の共有者であるからです。", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s の共有に失敗しました。%s に付与されている許可を超えているからです。", "Sharing %s failed, because resharing is not allowed" : "%s の共有に失敗しました。再共有が許されていないからです。", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s の共有に失敗しました。%s のバックエンド共有に必要なソースが見つかりませんでした。", "Sharing %s failed, because the file could not be found in the file cache" : "%s の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。", "Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした", + "Apps" : "アプリ", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "有効なユーザー名を指定する必要があります", "A valid password must be provided" : "有効なパスワードを指定する必要があります", diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json index 0bb7269a52e..52b2c6bd7d9 100644 --- a/lib/l10n/ja.json +++ b/lib/l10n/ja.json @@ -84,7 +84,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "%s の共有に失敗しました。%i タイプからの共有は許可されていないからです。", "Sharing %s failed, because the file does not exist" : "%s の共有に失敗しました。そのようなファイルは存在しないからです。", "You are not allowed to share %s" : "%s を共有することを許可されていません。", - "Sharing %s failed, because the user %s is the item owner" : "%s の共有に失敗しました。ユーザー %s がアイテム所有者です。", "Sharing %s failed, because the user %s does not exist" : "%s の共有に失敗しました。ユーザー %s が存在しません。", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s の共有に失敗しました。ユーザー %s はどのグループにも属していません。%s は、??のメンバーです。", "Sharing %s failed, because this item is already shared with %s" : "%s の共有に失敗しました。このアイテムはすでに %s で共有されています。", @@ -102,12 +101,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "%s のバックエンドの共有には、OCP\\Share_Backend インターフェースを実装しなければなりません。", "Sharing backend %s not found" : "共有バックエンド %s が見つかりません", "Sharing backend for %s not found" : "%s のための共有バックエンドが見つかりません", - "Sharing %s failed, because the user %s is the original sharer" : "%s の共有に失敗しました。ユーザー %s が元々の共有者であるからです。", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s の共有に失敗しました。%s に付与されている許可を超えているからです。", "Sharing %s failed, because resharing is not allowed" : "%s の共有に失敗しました。再共有が許されていないからです。", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s の共有に失敗しました。%s のバックエンド共有に必要なソースが見つかりませんでした。", "Sharing %s failed, because the file could not be found in the file cache" : "%s の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。", "Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした", + "Apps" : "アプリ", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "有効なユーザー名を指定する必要があります", "A valid password must be provided" : "有効なパスワードを指定する必要があります", diff --git a/lib/l10n/ka_GE.js b/lib/l10n/ka_GE.js index 1259cf83dbb..17833d8e0e3 100644 --- a/lib/l10n/ka_GE.js +++ b/lib/l10n/ka_GE.js @@ -26,6 +26,7 @@ OC.L10N.register( "Set an admin username." : "დააყენეთ ადმინისტრატორის სახელი.", "Set an admin password." : "დააყენეთ ადმინისტრატორის პაროლი.", "Could not find category \"%s\"" : "\"%s\" კატეგორიის მოძებნა ვერ მოხერხდა", + "Apps" : "აპლიკაციები", "A valid username must be provided" : "უნდა მიუთითოთ არსებული მომხმარებლის სახელი", "A valid password must be provided" : "უნდა მიუთითოთ არსებული პაროლი" }, diff --git a/lib/l10n/ka_GE.json b/lib/l10n/ka_GE.json index d32642f460b..3a776d12a8c 100644 --- a/lib/l10n/ka_GE.json +++ b/lib/l10n/ka_GE.json @@ -24,6 +24,7 @@ "Set an admin username." : "დააყენეთ ადმინისტრატორის სახელი.", "Set an admin password." : "დააყენეთ ადმინისტრატორის პაროლი.", "Could not find category \"%s\"" : "\"%s\" კატეგორიის მოძებნა ვერ მოხერხდა", + "Apps" : "აპლიკაციები", "A valid username must be provided" : "უნდა მიუთითოთ არსებული მომხმარებლის სახელი", "A valid password must be provided" : "უნდა მიუთითოთ არსებული პაროლი" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/lib/l10n/km.js b/lib/l10n/km.js index ad68233cf62..f6ba8acf62e 100644 --- a/lib/l10n/km.js +++ b/lib/l10n/km.js @@ -31,6 +31,7 @@ OC.L10N.register( "Set an admin username." : "កំណត់ឈ្មោះអ្នកគ្រប់គ្រង។", "Set an admin password." : "កំណត់ពាក្យសម្ងាត់អ្នកគ្រប់គ្រង។", "Could not find category \"%s\"" : "រកមិនឃើញចំណាត់ក្រុម \"%s\"", + "Apps" : "កម្មវិធី", "A valid username must be provided" : "ត្រូវផ្ដល់ឈ្មោះអ្នកប្រើឲ្យបានត្រឹមត្រូវ", "A valid password must be provided" : "ត្រូវផ្ដល់ពាក្យសម្ងាត់ឲ្យបានត្រឹមត្រូវ" }, diff --git a/lib/l10n/km.json b/lib/l10n/km.json index 9133d012c1e..b5cbf81af33 100644 --- a/lib/l10n/km.json +++ b/lib/l10n/km.json @@ -29,6 +29,7 @@ "Set an admin username." : "កំណត់ឈ្មោះអ្នកគ្រប់គ្រង។", "Set an admin password." : "កំណត់ពាក្យសម្ងាត់អ្នកគ្រប់គ្រង។", "Could not find category \"%s\"" : "រកមិនឃើញចំណាត់ក្រុម \"%s\"", + "Apps" : "កម្មវិធី", "A valid username must be provided" : "ត្រូវផ្ដល់ឈ្មោះអ្នកប្រើឲ្យបានត្រឹមត្រូវ", "A valid password must be provided" : "ត្រូវផ្ដល់ពាក្យសម្ងាត់ឲ្យបានត្រឹមត្រូវ" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/lib/l10n/kn.js b/lib/l10n/kn.js index 45814e840b7..52e00891931 100644 --- a/lib/l10n/kn.js +++ b/lib/l10n/kn.js @@ -9,6 +9,7 @@ OC.L10N.register( "Unknown filetype" : "ಅಪರಿಚಿತ ಕಡತ ಮಾದರಿ", "Invalid image" : "ಅಸಾಮರ್ಥ್ಯ ಚಿತ್ರ", "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", + "Apps" : "ಕಾರ್ಯಕ್ರಮಗಳು", "A valid username must be provided" : "ಮಾನ್ಯ ಬಳಕೆದಾರ ಹೆಸರು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ", "A valid password must be provided" : "ಸರಿಯಾದ ಬಳಕೆದಾರ ಗುಪ್ತಪದ ಒದಗಿಸಬೇಕಾಗಿದೆ" }, diff --git a/lib/l10n/kn.json b/lib/l10n/kn.json index b7e51f7911b..9260fa8731b 100644 --- a/lib/l10n/kn.json +++ b/lib/l10n/kn.json @@ -7,6 +7,7 @@ "Unknown filetype" : "ಅಪರಿಚಿತ ಕಡತ ಮಾದರಿ", "Invalid image" : "ಅಸಾಮರ್ಥ್ಯ ಚಿತ್ರ", "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", + "Apps" : "ಕಾರ್ಯಕ್ರಮಗಳು", "A valid username must be provided" : "ಮಾನ್ಯ ಬಳಕೆದಾರ ಹೆಸರು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ", "A valid password must be provided" : "ಸರಿಯಾದ ಬಳಕೆದಾರ ಗುಪ್ತಪದ ಒದಗಿಸಬೇಕಾಗಿದೆ" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js index bb143bdd527..a956996d139 100644 --- a/lib/l10n/ko.js +++ b/lib/l10n/ko.js @@ -82,12 +82,12 @@ OC.L10N.register( "Set an admin password." : "관리자의 암호를 설정합니다.", "Can't create or write into the data directory %s" : "데이터 디렉터리 %s을(를) 만들거나 기록할 수 없음", "Invalid Federated Cloud ID" : "잘못된 연합 클라우드 ID", - "%s shared »%s« with you" : "%s 님이 %s을(를) 공유하였습니다", + "%s shared »%s« with you" : "%s 님이 %s을(를) 공유했습니다", "%s via %s" : "%s(%s 경유)", "Sharing %s failed, because the backend does not allow shares from type %i" : "%s을(를) 공유할 수 없습니다. 백엔드에서 %i 형식의 공유를 허용하지 않습니다", "Sharing %s failed, because the file does not exist" : "%s을(를) 공유할 수 없습니다. 파일이 존재하지 않습니다", "You are not allowed to share %s" : "%s을(를) 공유할 수 있는 권한이 없습니다", - "Sharing %s failed, because the user %s is the item owner" : "%s을(를) 공유할 수 없습니다. %s 님이 항목을 소유하고 있습니다", + "Sharing %s failed, because you can not share with yourself" : "%s을(를) 공유할 수 없습니다. 자기 자신과 공유할 수 없습니다", "Sharing %s failed, because the user %s does not exist" : "%s을(를) 공유할 수 없습니다. 사용자 %s이(가) 존재하지 않습니다", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s을(를) 공유할 수 없습니다. 사용자 %s 님은 %s 님이 회원인 어떠한 그룹에도 속해 있지 않습니다", "Sharing %s failed, because this item is already shared with %s" : "%s을(를) 공유할 수 없습니다. 이미 %s 님과 공유되어 있습니다", @@ -106,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "공유 백엔드 %s에서 OCP\\Share_Backend 인터페이스를 구현해야 함", "Sharing backend %s not found" : "공유 백엔드 %s을(를) 찾을 수 없음", "Sharing backend for %s not found" : "%s의 공유 백엔드를 찾을 수 없음", - "Sharing %s failed, because the user %s is the original sharer" : "%s을(를) 공유할 수 없습니다. %s 님이 원래 공유한 사람입니다", + "Sharing failed, because the user %s is the original sharer" : "공유할 수 없습니다. 사용자 %s이(가) 원 공유자입니다", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s을(를) 공유할 수 없습니다. %s 님에게 허용된 것 이상의 권한을 필요로 합니다", "Sharing %s failed, because resharing is not allowed" : "%s을(를) 공유할 수 없습니다. 다시 공유할 수 없습니다", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s을(를) 공유할 수 없습니다. %s의 공유 백엔드에서 원본 파일을 찾을 수 없습니다", "Sharing %s failed, because the file could not be found in the file cache" : "%s을(를) 공유할 수 없습니다. 파일 캐시에서 찾을 수 없습니다", "Could not find category \"%s\"" : "분류 \"%s\"을(를) 찾을 수 없습니다.", + "Apps" : "앱", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "사용자 이름에는 다음과 같은 문자만 사용할 수 있습니다: \"a-z\", \"A-Z\", \"0-9\", \"_.@-\"", "A valid username must be provided" : "올바른 사용자 이름을 입력해야 합니다", "A valid password must be provided" : "올바른 암호를 입력해야 합니다", @@ -139,7 +140,7 @@ OC.L10N.register( "Please ask your server administrator to restart the web server." : "서버 관리자에게 웹 서버 재시작을 요청하십시오.", "PostgreSQL >= 9 required" : "PostgreSQL 버전 9 이상이 필요합니다", "Please upgrade your database version" : "데이터베이스 버전을 업그레이드 하십시오", - "Error occurred while checking PostgreSQL version" : "PostgreSQL 버전을 확인하는 중 오류가 발생하였습니다", + "Error occurred while checking PostgreSQL version" : "PostgreSQL 버전을 확인하는 중 오류가 발생했습니다", "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "PostgreSQL 버전 9 이상이 있는지 확인하시고, 자세한 정보는 로그를 확인하십시오", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "권한을 0770으로 변경하여 다른 사용자가 읽을 수 없도록 하십시오.", "Data directory (%s) is readable by other users" : "데이터 디렉터리(%s)를 다른 사용자가 읽을 수 있음", diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json index 8fea07402ca..c629d90e47b 100644 --- a/lib/l10n/ko.json +++ b/lib/l10n/ko.json @@ -80,12 +80,12 @@ "Set an admin password." : "관리자의 암호를 설정합니다.", "Can't create or write into the data directory %s" : "데이터 디렉터리 %s을(를) 만들거나 기록할 수 없음", "Invalid Federated Cloud ID" : "잘못된 연합 클라우드 ID", - "%s shared »%s« with you" : "%s 님이 %s을(를) 공유하였습니다", + "%s shared »%s« with you" : "%s 님이 %s을(를) 공유했습니다", "%s via %s" : "%s(%s 경유)", "Sharing %s failed, because the backend does not allow shares from type %i" : "%s을(를) 공유할 수 없습니다. 백엔드에서 %i 형식의 공유를 허용하지 않습니다", "Sharing %s failed, because the file does not exist" : "%s을(를) 공유할 수 없습니다. 파일이 존재하지 않습니다", "You are not allowed to share %s" : "%s을(를) 공유할 수 있는 권한이 없습니다", - "Sharing %s failed, because the user %s is the item owner" : "%s을(를) 공유할 수 없습니다. %s 님이 항목을 소유하고 있습니다", + "Sharing %s failed, because you can not share with yourself" : "%s을(를) 공유할 수 없습니다. 자기 자신과 공유할 수 없습니다", "Sharing %s failed, because the user %s does not exist" : "%s을(를) 공유할 수 없습니다. 사용자 %s이(가) 존재하지 않습니다", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s을(를) 공유할 수 없습니다. 사용자 %s 님은 %s 님이 회원인 어떠한 그룹에도 속해 있지 않습니다", "Sharing %s failed, because this item is already shared with %s" : "%s을(를) 공유할 수 없습니다. 이미 %s 님과 공유되어 있습니다", @@ -104,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "공유 백엔드 %s에서 OCP\\Share_Backend 인터페이스를 구현해야 함", "Sharing backend %s not found" : "공유 백엔드 %s을(를) 찾을 수 없음", "Sharing backend for %s not found" : "%s의 공유 백엔드를 찾을 수 없음", - "Sharing %s failed, because the user %s is the original sharer" : "%s을(를) 공유할 수 없습니다. %s 님이 원래 공유한 사람입니다", + "Sharing failed, because the user %s is the original sharer" : "공유할 수 없습니다. 사용자 %s이(가) 원 공유자입니다", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s을(를) 공유할 수 없습니다. %s 님에게 허용된 것 이상의 권한을 필요로 합니다", "Sharing %s failed, because resharing is not allowed" : "%s을(를) 공유할 수 없습니다. 다시 공유할 수 없습니다", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s을(를) 공유할 수 없습니다. %s의 공유 백엔드에서 원본 파일을 찾을 수 없습니다", "Sharing %s failed, because the file could not be found in the file cache" : "%s을(를) 공유할 수 없습니다. 파일 캐시에서 찾을 수 없습니다", "Could not find category \"%s\"" : "분류 \"%s\"을(를) 찾을 수 없습니다.", + "Apps" : "앱", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "사용자 이름에는 다음과 같은 문자만 사용할 수 있습니다: \"a-z\", \"A-Z\", \"0-9\", \"_.@-\"", "A valid username must be provided" : "올바른 사용자 이름을 입력해야 합니다", "A valid password must be provided" : "올바른 암호를 입력해야 합니다", @@ -137,7 +138,7 @@ "Please ask your server administrator to restart the web server." : "서버 관리자에게 웹 서버 재시작을 요청하십시오.", "PostgreSQL >= 9 required" : "PostgreSQL 버전 9 이상이 필요합니다", "Please upgrade your database version" : "데이터베이스 버전을 업그레이드 하십시오", - "Error occurred while checking PostgreSQL version" : "PostgreSQL 버전을 확인하는 중 오류가 발생하였습니다", + "Error occurred while checking PostgreSQL version" : "PostgreSQL 버전을 확인하는 중 오류가 발생했습니다", "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "PostgreSQL 버전 9 이상이 있는지 확인하시고, 자세한 정보는 로그를 확인하십시오", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "권한을 0770으로 변경하여 다른 사용자가 읽을 수 없도록 하십시오.", "Data directory (%s) is readable by other users" : "데이터 디렉터리(%s)를 다른 사용자가 읽을 수 있음", diff --git a/lib/l10n/ku_IQ.js b/lib/l10n/ku_IQ.js index b4c0566c13f..74bda86a316 100644 --- a/lib/l10n/ku_IQ.js +++ b/lib/l10n/ku_IQ.js @@ -4,6 +4,7 @@ OC.L10N.register( "Help" : "یارمەتی", "Users" : "بهكارهێنهر", "Admin" : "بهڕێوهبهری سهرهكی", - "web services under your control" : "ڕاژهی وێب لهژێر چاودێریت دایه" + "web services under your control" : "ڕاژهی وێب لهژێر چاودێریت دایه", + "Apps" : "بهرنامهكان" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ku_IQ.json b/lib/l10n/ku_IQ.json index 119c33253f5..456018c1e54 100644 --- a/lib/l10n/ku_IQ.json +++ b/lib/l10n/ku_IQ.json @@ -2,6 +2,7 @@ "Help" : "یارمەتی", "Users" : "بهكارهێنهر", "Admin" : "بهڕێوهبهری سهرهكی", - "web services under your control" : "ڕاژهی وێب لهژێر چاودێریت دایه" + "web services under your control" : "ڕاژهی وێب لهژێر چاودێریت دایه", + "Apps" : "بهرنامهكان" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/lb.js b/lib/l10n/lb.js index 0c884f98eea..3d7ae1a5aff 100644 --- a/lib/l10n/lb.js +++ b/lib/l10n/lb.js @@ -24,6 +24,7 @@ OC.L10N.register( "web services under your control" : "Web-Servicer ënnert denger Kontroll", "Authentication error" : "Authentifikatioun's Fehler", "%s shared »%s« with you" : "Den/D' %s huet »%s« mat dir gedeelt", + "Apps" : "Applikatiounen", "Data directory (%s) is invalid" : "Daten-Dossier (%s) ass ongëlteg" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/lb.json b/lib/l10n/lb.json index 08057c7de24..8cd223acd9b 100644 --- a/lib/l10n/lb.json +++ b/lib/l10n/lb.json @@ -22,6 +22,7 @@ "web services under your control" : "Web-Servicer ënnert denger Kontroll", "Authentication error" : "Authentifikatioun's Fehler", "%s shared »%s« with you" : "Den/D' %s huet »%s« mat dir gedeelt", + "Apps" : "Applikatiounen", "Data directory (%s) is invalid" : "Daten-Dossier (%s) ass ongëlteg" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/lt_LT.js b/lib/l10n/lt_LT.js index e37141e9bef..b379bdb2443 100644 --- a/lib/l10n/lt_LT.js +++ b/lib/l10n/lt_LT.js @@ -17,6 +17,7 @@ OC.L10N.register( "_%n minute ago_::_%n minutes ago_" : ["prieš %n min.","Prieš % minutes","Prieš %n minučių"], "seconds ago" : "prieš sekundę", "web services under your control" : "jūsų valdomos web paslaugos", + "File name contains at least one invalid character" : "Failo vardas sudarytas iš neleistinų simbolių", "App directory already exists" : "Programos aplankas jau egzistuoja", "Can't create app folder. Please fix permissions. %s" : "Nepavyksta sukurti aplanko. Prašome pataisyti leidimus. %s", "No source specified when installing app" : "Nenurodytas šaltinis diegiant programą", @@ -46,6 +47,7 @@ OC.L10N.register( "Set an admin password." : "Nustatyti administratoriaus slaptažodį.", "%s shared »%s« with you" : "%s pasidalino »%s« su tavimi", "Could not find category \"%s\"" : "Nepavyko rasti kategorijos „%s“", + "Apps" : "Programos", "A valid username must be provided" : "Vartotojo vardas turi būti tinkamas", "A valid password must be provided" : "Slaptažodis turi būti tinkamas" }, diff --git a/lib/l10n/lt_LT.json b/lib/l10n/lt_LT.json index c823af258cd..9ef545b9ebb 100644 --- a/lib/l10n/lt_LT.json +++ b/lib/l10n/lt_LT.json @@ -15,6 +15,7 @@ "_%n minute ago_::_%n minutes ago_" : ["prieš %n min.","Prieš % minutes","Prieš %n minučių"], "seconds ago" : "prieš sekundę", "web services under your control" : "jūsų valdomos web paslaugos", + "File name contains at least one invalid character" : "Failo vardas sudarytas iš neleistinų simbolių", "App directory already exists" : "Programos aplankas jau egzistuoja", "Can't create app folder. Please fix permissions. %s" : "Nepavyksta sukurti aplanko. Prašome pataisyti leidimus. %s", "No source specified when installing app" : "Nenurodytas šaltinis diegiant programą", @@ -44,6 +45,7 @@ "Set an admin password." : "Nustatyti administratoriaus slaptažodį.", "%s shared »%s« with you" : "%s pasidalino »%s« su tavimi", "Could not find category \"%s\"" : "Nepavyko rasti kategorijos „%s“", + "Apps" : "Programos", "A valid username must be provided" : "Vartotojo vardas turi būti tinkamas", "A valid password must be provided" : "Slaptažodis turi būti tinkamas" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" diff --git a/lib/l10n/lv.js b/lib/l10n/lv.js index 5505d0cd7cc..df984f830a8 100644 --- a/lib/l10n/lv.js +++ b/lib/l10n/lv.js @@ -31,6 +31,7 @@ OC.L10N.register( "Set an admin password." : "Iestatiet administratora paroli.", "%s shared »%s« with you" : "%s kopīgots »%s« ar jums", "Could not find category \"%s\"" : "Nevarēja atrast kategoriju “%s”", + "Apps" : "Lietotnes", "A valid username must be provided" : "Jānorāda derīgs lietotājvārds", "A valid password must be provided" : "Jānorāda derīga parole", "The username is already being used" : "Šāds lietotājvārds jau tiek izmantots" diff --git a/lib/l10n/lv.json b/lib/l10n/lv.json index 13b38a73a2c..0e0f2b072f1 100644 --- a/lib/l10n/lv.json +++ b/lib/l10n/lv.json @@ -29,6 +29,7 @@ "Set an admin password." : "Iestatiet administratora paroli.", "%s shared »%s« with you" : "%s kopīgots »%s« ar jums", "Could not find category \"%s\"" : "Nevarēja atrast kategoriju “%s”", + "Apps" : "Lietotnes", "A valid username must be provided" : "Jānorāda derīgs lietotājvārds", "A valid password must be provided" : "Jānorāda derīga parole", "The username is already being used" : "Šāds lietotājvārds jau tiek izmantots" diff --git a/lib/l10n/mk.js b/lib/l10n/mk.js index 197a25c2172..881388b4eac 100644 --- a/lib/l10n/mk.js +++ b/lib/l10n/mk.js @@ -29,6 +29,7 @@ OC.L10N.register( "Set an admin password." : "Постави администраторска лозинка.", "%s shared »%s« with you" : "%s споделено »%s« со вас", "Could not find category \"%s\"" : "Не можам да најдам категорија „%s“", + "Apps" : "Аппликации", "A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ", "A valid password must be provided" : "Мора да се обезбеди валидна лозинка", "The username is already being used" : "Корисничкото име е веќе во употреба" diff --git a/lib/l10n/mk.json b/lib/l10n/mk.json index 2b396044a21..7dbfab7f01f 100644 --- a/lib/l10n/mk.json +++ b/lib/l10n/mk.json @@ -27,6 +27,7 @@ "Set an admin password." : "Постави администраторска лозинка.", "%s shared »%s« with you" : "%s споделено »%s« со вас", "Could not find category \"%s\"" : "Не можам да најдам категорија „%s“", + "Apps" : "Аппликации", "A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ", "A valid password must be provided" : "Мора да се обезбеди валидна лозинка", "The username is already being used" : "Корисничкото име е веќе во употреба" diff --git a/lib/l10n/ms_MY.js b/lib/l10n/ms_MY.js index e6a3fbb1edc..8f73b0f78ab 100644 --- a/lib/l10n/ms_MY.js +++ b/lib/l10n/ms_MY.js @@ -6,6 +6,7 @@ OC.L10N.register( "Users" : "Pengguna", "Admin" : "Admin", "web services under your control" : "Perkhidmatan web di bawah kawalan anda", - "Authentication error" : "Ralat pengesahan" + "Authentication error" : "Ralat pengesahan", + "Apps" : "Aplikasi" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/ms_MY.json b/lib/l10n/ms_MY.json index 6abf66423ee..f0c3fc7f936 100644 --- a/lib/l10n/ms_MY.json +++ b/lib/l10n/ms_MY.json @@ -4,6 +4,7 @@ "Users" : "Pengguna", "Admin" : "Admin", "web services under your control" : "Perkhidmatan web di bawah kawalan anda", - "Authentication error" : "Ralat pengesahan" + "Authentication error" : "Ralat pengesahan", + "Apps" : "Aplikasi" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/l10n/my_MM.js b/lib/l10n/my_MM.js index b20399c6d56..02dbac8d038 100644 --- a/lib/l10n/my_MM.js +++ b/lib/l10n/my_MM.js @@ -11,6 +11,7 @@ OC.L10N.register( "seconds ago" : "စက္ကန့်အနည်းငယ်က", "web services under your control" : "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services", "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", - "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ" + "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ", + "Apps" : "Apps" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/my_MM.json b/lib/l10n/my_MM.json index 0a4d0370a36..c04d1b0f0a6 100644 --- a/lib/l10n/my_MM.json +++ b/lib/l10n/my_MM.json @@ -9,6 +9,7 @@ "seconds ago" : "စက္ကန့်အနည်းငယ်က", "web services under your control" : "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services", "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", - "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ" + "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ", + "Apps" : "Apps" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js index af629c5ef34..7b80c23ec01 100644 --- a/lib/l10n/nb_NO.js +++ b/lib/l10n/nb_NO.js @@ -87,7 +87,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Deling av %s feilet, fordi serveren ikke tillater delinger fra type %i", "Sharing %s failed, because the file does not exist" : "Deling av %s feilet, fordi filen ikke eksisterer", "You are not allowed to share %s" : "Du har ikke lov til å dele %s", - "Sharing %s failed, because the user %s is the item owner" : "Deling av %s feilet, fordi brukeren %s er eier av elementet", "Sharing %s failed, because the user %s does not exist" : "Deling av %s feilet, fordi brukeren %s ikke finnes", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Deling av %s feilet, fordi brukeren %s ikke er medlem av noen grupper som %s er medlem av", "Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s", @@ -106,12 +105,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-server %s må implementere grensesnittet OCP\\Share_Backend", "Sharing backend %s not found" : "Delings-server %s ikke funnet", "Sharing backend for %s not found" : "Delings-server for %s ikke funnet", - "Sharing %s failed, because the user %s is the original sharer" : "Deling av %s feilet, fordi brukeren %s er den opprinnelige eieren", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Deling av %s feilet, fordi tillatelsene går utover tillatelsene som er gitt til %s", "Sharing %s failed, because resharing is not allowed" : "Deling av %s feilet, fordi videre-deling ikke er tillatt", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling av %s feilet, fordi delings-serveren for %s ikke kunne finne kilden", "Sharing %s failed, because the file could not be found in the file cache" : "Deling av %s feilet, fordi filen ikke ble funnet i fil-mellomlageret", "Could not find category \"%s\"" : "Kunne ikke finne kategori \"%s\"", + "Apps" : "Apper", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bare disse tegnene tillates i et brukernavn: \"a-z\", \"A-Z\", \"0-9\" og \"_.@-\"", "A valid username must be provided" : "Oppgi et gyldig brukernavn", "A valid password must be provided" : "Oppgi et gyldig passord", diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json index 29f9e7f1365..04cb7e47e82 100644 --- a/lib/l10n/nb_NO.json +++ b/lib/l10n/nb_NO.json @@ -85,7 +85,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Deling av %s feilet, fordi serveren ikke tillater delinger fra type %i", "Sharing %s failed, because the file does not exist" : "Deling av %s feilet, fordi filen ikke eksisterer", "You are not allowed to share %s" : "Du har ikke lov til å dele %s", - "Sharing %s failed, because the user %s is the item owner" : "Deling av %s feilet, fordi brukeren %s er eier av elementet", "Sharing %s failed, because the user %s does not exist" : "Deling av %s feilet, fordi brukeren %s ikke finnes", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Deling av %s feilet, fordi brukeren %s ikke er medlem av noen grupper som %s er medlem av", "Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s", @@ -104,12 +103,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-server %s må implementere grensesnittet OCP\\Share_Backend", "Sharing backend %s not found" : "Delings-server %s ikke funnet", "Sharing backend for %s not found" : "Delings-server for %s ikke funnet", - "Sharing %s failed, because the user %s is the original sharer" : "Deling av %s feilet, fordi brukeren %s er den opprinnelige eieren", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Deling av %s feilet, fordi tillatelsene går utover tillatelsene som er gitt til %s", "Sharing %s failed, because resharing is not allowed" : "Deling av %s feilet, fordi videre-deling ikke er tillatt", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling av %s feilet, fordi delings-serveren for %s ikke kunne finne kilden", "Sharing %s failed, because the file could not be found in the file cache" : "Deling av %s feilet, fordi filen ikke ble funnet i fil-mellomlageret", "Could not find category \"%s\"" : "Kunne ikke finne kategori \"%s\"", + "Apps" : "Apper", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bare disse tegnene tillates i et brukernavn: \"a-z\", \"A-Z\", \"0-9\" og \"_.@-\"", "A valid username must be provided" : "Oppgi et gyldig brukernavn", "A valid password must be provided" : "Oppgi et gyldig passord", diff --git a/lib/l10n/nds.js b/lib/l10n/nds.js index a12702211c2..04b6bdf25a8 100644 --- a/lib/l10n/nds.js +++ b/lib/l10n/nds.js @@ -1,10 +1,9 @@ OC.L10N.register( "lib", { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] + "Personal" : "Persönlich", + "Unknown filetype" : "Unbekannter Dateityp", + "Invalid image" : "Ungültiges Bild", + "seconds ago" : "vor wenigen Sekunden" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/nds.json b/lib/l10n/nds.json index b994fa289eb..1c9232d838a 100644 --- a/lib/l10n/nds.json +++ b/lib/l10n/nds.json @@ -1,8 +1,7 @@ { "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] + "Personal" : "Persönlich", + "Unknown filetype" : "Unbekannter Dateityp", + "Invalid image" : "Ungültiges Bild", + "seconds ago" : "vor wenigen Sekunden" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js index 5abae786d34..9c168b385c0 100644 --- a/lib/l10n/nl.js +++ b/lib/l10n/nl.js @@ -87,7 +87,7 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Delen van %s is mislukt, omdat de share-backend niet toestaat om type %i te delen", "Sharing %s failed, because the file does not exist" : "Delen van %s is mislukt, omdat het bestand niet bestaat", "You are not allowed to share %s" : "U bent niet bevoegd om %s te delen", - "Sharing %s failed, because the user %s is the item owner" : "Delen van %s is mislukt, omdat de gebruiker %s de eigenaar is", + "Sharing %s failed, because you can not share with yourself" : "Delen van %s is mislukt, omdat iemand niet met zichzelf kan delen", "Sharing %s failed, because the user %s does not exist" : "Delen van %s is mislukt, omdat gebruiker %s niet bestaat", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delen van %s is mislukt, omdat gebruiker %s geen lid is van een groep waar %s lid van is", "Sharing %s failed, because this item is already shared with %s" : "Delen van %s is mislukt, omdat het object al wordt gedeeld met %s", @@ -106,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Het share-backend %s moet de OCP\\Share_Backend interface implementeren", "Sharing backend %s not found" : "Het share-backend %s is niet gevonden", "Sharing backend for %s not found" : "Het share-backend voor %s is niet gevonden", - "Sharing %s failed, because the user %s is the original sharer" : "Delen van %s is mislukt, omdat gebruiker %s de originele deler is", + "Sharing failed, because the user %s is the original sharer" : "Delen mislukt, omdat gebruiker %s de originele deler is", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delen van %s is mislukt, omdat de rechten de aan %s toegekende autorisaties overschrijden", "Sharing %s failed, because resharing is not allowed" : "Delen van %s is mislukt, omdat her-delen niet is toegestaan", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delen van %s is mislukt, omdat de share-backend voor %s de bron niet kon vinden", "Sharing %s failed, because the file could not be found in the file cache" : "Delen van %s is mislukt, omdat het bestand niet in de bestandscache kon worden gevonden", "Could not find category \"%s\"" : "Kon categorie \"%s\" niet vinden", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven", "A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven", diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json index 4e4eaf8b52a..6c6beaa3b29 100644 --- a/lib/l10n/nl.json +++ b/lib/l10n/nl.json @@ -85,7 +85,7 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Delen van %s is mislukt, omdat de share-backend niet toestaat om type %i te delen", "Sharing %s failed, because the file does not exist" : "Delen van %s is mislukt, omdat het bestand niet bestaat", "You are not allowed to share %s" : "U bent niet bevoegd om %s te delen", - "Sharing %s failed, because the user %s is the item owner" : "Delen van %s is mislukt, omdat de gebruiker %s de eigenaar is", + "Sharing %s failed, because you can not share with yourself" : "Delen van %s is mislukt, omdat iemand niet met zichzelf kan delen", "Sharing %s failed, because the user %s does not exist" : "Delen van %s is mislukt, omdat gebruiker %s niet bestaat", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delen van %s is mislukt, omdat gebruiker %s geen lid is van een groep waar %s lid van is", "Sharing %s failed, because this item is already shared with %s" : "Delen van %s is mislukt, omdat het object al wordt gedeeld met %s", @@ -104,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Het share-backend %s moet de OCP\\Share_Backend interface implementeren", "Sharing backend %s not found" : "Het share-backend %s is niet gevonden", "Sharing backend for %s not found" : "Het share-backend voor %s is niet gevonden", - "Sharing %s failed, because the user %s is the original sharer" : "Delen van %s is mislukt, omdat gebruiker %s de originele deler is", + "Sharing failed, because the user %s is the original sharer" : "Delen mislukt, omdat gebruiker %s de originele deler is", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delen van %s is mislukt, omdat de rechten de aan %s toegekende autorisaties overschrijden", "Sharing %s failed, because resharing is not allowed" : "Delen van %s is mislukt, omdat her-delen niet is toegestaan", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delen van %s is mislukt, omdat de share-backend voor %s de bron niet kon vinden", "Sharing %s failed, because the file could not be found in the file cache" : "Delen van %s is mislukt, omdat het bestand niet in de bestandscache kon worden gevonden", "Could not find category \"%s\"" : "Kon categorie \"%s\" niet vinden", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven", "A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven", diff --git a/lib/l10n/nn_NO.js b/lib/l10n/nn_NO.js index 9761935c435..c0675f2574a 100644 --- a/lib/l10n/nn_NO.js +++ b/lib/l10n/nn_NO.js @@ -15,6 +15,7 @@ OC.L10N.register( "web services under your control" : "Vev tjenester under din kontroll", "Authentication error" : "Feil i autentisering", "%s shared »%s« with you" : "%s delte «%s» med deg", + "Apps" : "Program", "A valid username must be provided" : "Du må oppgje eit gyldig brukarnamn", "A valid password must be provided" : "Du må oppgje eit gyldig passord" }, diff --git a/lib/l10n/nn_NO.json b/lib/l10n/nn_NO.json index f1186cb1056..52b7dd52041 100644 --- a/lib/l10n/nn_NO.json +++ b/lib/l10n/nn_NO.json @@ -13,6 +13,7 @@ "web services under your control" : "Vev tjenester under din kontroll", "Authentication error" : "Feil i autentisering", "%s shared »%s« with you" : "%s delte «%s» med deg", + "Apps" : "Program", "A valid username must be provided" : "Du må oppgje eit gyldig brukarnamn", "A valid password must be provided" : "Du må oppgje eit gyldig passord" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/lib/l10n/oc.js b/lib/l10n/oc.js index 871b25ebfe5..a4cdce5a417 100644 --- a/lib/l10n/oc.js +++ b/lib/l10n/oc.js @@ -1,21 +1,150 @@ OC.L10N.register( "lib", { + "Cannot write into \"config\" directory!" : "Impossible d’escriure dins lo repertòri « config » !", + "This can usually be fixed by giving the webserver write access to the config directory" : "Aqueste problèma es generalament resolgut en donant al servidor web un accès en escritura al repertòri \"config\"", + "See %s" : "Veire %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Aqueste problèma es generalament resolgut %sen donant al servidor web un accès en escritura al repertòri de configuracion%s.", + "Sample configuration detected" : "Configuracion d'exemple detectada", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es estat detectat que la configuracion donada a títol d'exemple es estada copiada. Aquò pòt rendre vòstra installacion inoperanta e es pas pres en carga. Legissètz la documentacion abans d'efectuar de modifications dins config.php", + "PHP %s or higher is required." : "PHP %s o superior es requesit.", + "PHP with a version lower than %s is required." : "PHP amb una version anteriora a %s es requesit.", + "Following databases are supported: %s" : "Les bases de donadas seguentas son suportadas : %s", + "The command line tool %s could not be found" : "La comanda %s es introbabla", + "The library %s is not available." : "La bibliotèca %s es pas disponibla.", + "Library %s with a version higher than %s is required - available version %s." : "La bibliotèca %s deu èsser al mens a la version %s. Version disponibla : %s.", + "Library %s with a version lower than %s is required - available version %s." : "La bibliotèca %s deu aver una version anteriora a %s. Version disponibla : %s.", + "Following platforms are supported: %s" : "Las plataformas seguentas son presas en carga : %s", + "ownCloud %s or higher is required." : "ownCloud %s o superior es requesit.", + "ownCloud %s or lower is required." : "ownCloud %s o inferior es requesit.", "Help" : "Ajuda", "Personal" : "Personal", - "Users" : "Usancièrs", - "Admin" : "Admin", + "Users" : "Utilizaires", + "Admin" : "Administracion", + "Recommended" : "Recomandada", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "L'aplicacion \"%s\" pòt pas èsser installada perque es pas compatibla amb aquesta version d'ownCloud.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "L'aplicacion \"%s\" pòt pas èsser installada a causa de las dependéncias seguentas pas satisfachas : %s", + "No app name specified" : "Cap de nom d'aplicacion pas especificat", "Unknown filetype" : "Tipe de fichièr desconegut", "Invalid image" : "Imatge pas valable", "today" : "uèi", "yesterday" : "ièr", - "last month" : "mes passat", - "last year" : "an passat", - "seconds ago" : "segonda a", - "web services under your control" : "Services web jos ton contraròtle", + "_%n day ago_::_%n days ago_" : ["i a %n jorn","i a %n jorns"], + "last month" : "lo mes passat", + "_%n month ago_::_%n months ago_" : ["I a %n mes","I a %n meses"], + "last year" : "l'an passat", + "_%n year ago_::_%n years ago_" : ["i a %n an","i a %n ans"], + "_%n minute ago_::_%n minutes ago_" : ["i a %n minuta","i a %n minutas"], + "seconds ago" : "i a qualques segondas", + "web services under your control" : "servicis web jos vòstre contraròtle", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Lo modul amb l'id: %s existís pas. Mercé de l'activar dins los paramètres d'aplicacions o de contactar vòstre administrator.", + "Empty filename is not allowed" : "Lo nom de fichièr pòt pas èsser void", + "Dot files are not allowed" : "Lo nom de fichièr pòt pas començar per un punt", + "4-byte characters are not supported in file names" : "Los caractèrs sus 4 octets son pas preses en carga dins los noms de fichièrs", + "File name is a reserved word" : "Aqueste nom de fichièr es un mot reservat", + "File name contains at least one invalid character" : "Lo nom de fichièr conten un (de) caractèr(s) invalid(s)", + "File name is too long" : "Nom de fichièr tròp long", + "File is currently busy, please try again later" : "Lo fichièr es actualament utilizat, tornatz ensajar pus tard", + "Can't read file" : "Impossible de legir lo fichièr", + "App directory already exists" : "Lo dorsièr de l'aplicacion existís ja", + "Can't create app folder. Please fix permissions. %s" : "Impossible de crear lo dorsièr de l'aplicacion. Corregissètz los dreches d'accès. %s", + "Archive does not contain a directory named %s" : "Lo fichièr archiu conten pas de repertòri %s", + "No source specified when installing app" : "Cap de font pas especificada per installar l'aplicacion", + "No href specified when installing app from http" : "Cap de href pas especificat per installar l'aplicacion per http", + "No path specified when installing app from local file" : "Cap de camin pas especificat per installar l'aplicacion dempuèi un fichièr local", + "Archives of type %s are not supported" : "Los archius de tipe %s son pas preses en carga", + "Failed to open archive when installing app" : "Fracàs de la dobertura de l'archiu al moment de l'installacion de l'aplicacion", + "App does not provide an info.xml file" : "L'aplicacion provesís pas cap de fichièr info.xml", + "App can't be installed because of not allowed code in the App" : "L'aplicacion pòt pas èsser installada perque conten de còde pas autorizat", + "App can't be installed because it is not compatible with this version of ownCloud" : "L'aplicacion pòt pas èsser installada perque es pas compatibla amb aquesta version d'ownCloud", + "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'aplicacion pòt pas èsser installada perque conten la balisa <shipped>true</shipped> qu'es pas autorizada per las aplicacions non inclusas per defaut", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'aplicacion pòt pas èsser installada perque la version dins info.xml/version es pas identica a la qu'es indicada sus l'app store", + "Application is not enabled" : "L'aplicacion es pas activada", "Authentication error" : "Error d'autentificacion", - "A valid username must be provided" : "Un nom d'utilizaire valid deu èsser picat", - "A valid password must be provided" : "Un senhal valid deu èsser picat", - "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La rason es probablament l'utilizacion d'un escondedor / accelerador tal coma Zend OPcache o eAccelerator." + "Token expired. Please reload page." : "La session a expirat. Recargatz la pagina.", + "Unknown user" : "Utilizaire desconegut", + "%s enter the database username." : "%s entratz lo nom d'utilizaire de la banca de donadas.", + "%s enter the database name." : "%s entratz lo nom de la banca de donadas.", + "%s you may not use dots in the database name" : "%s podètz pas utilizar de punts dins lo nom de la banca de donadas", + "Oracle connection could not be established" : "La connexion Oracle pòt pas èsser establida", + "Oracle username and/or password not valid" : "Nom d'utilizaire e/o senhal de la basa Oracle invalid(s)", + "DB Error: \"%s\"" : "Error de la banca de donadas : \"%s\"", + "Offending command was: \"%s\"" : "La requèsta en causa es : \"%s\"", + "You need to enter either an existing account or the administrator." : "Vos cal especificar lo nom d'un compte existent, o lo de l'administrator.", + "Offending command was: \"%s\", name: %s, password: %s" : "La requèsta en causa es : \"%s\", nom : %s, senhal : %s", + "PostgreSQL username and/or password not valid" : "Nom d'utilizaire e/o senhal de la base PostgreSQL invalid(s)", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X es pas pres en carga e %s foncionarà pas corrèctament sus aquesta plataforma. Son utilizacion es jos vòstra responsabilitat !", + "For the best results, please consider using a GNU/Linux server instead." : "Per obténer los melhors resultats, vos caldriá utilizar un servidor GNU/Linux.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Sembla qu'aquesta instància %s fonciona sus un environament PHP 32-bit e open_basedir es estat configurat dins php.ini. Aquò engendre de problèmas amb los fichièrs de talha superiora a 4 Go e es doncas fòrtament desconselhat.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Suprimissètz la configuracion open_basedir de vòstre php.ini o utilizar una version PHP 64-bit.", + "Set an admin username." : "Especificatz un nom d'utilizaire per l'administrator.", + "Set an admin password." : "Especificatz un senhal per l'administrator.", + "Can't create or write into the data directory %s" : "Impossible de crear, o d'escriure dedins, lo repertòri de las donadas %s", + "Invalid Federated Cloud ID" : "ID Federated Cloud incorrècte", + "%s shared »%s« with you" : "%s a partejat «%s» amb vos", + "%s via %s" : "%s via %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Lo partiment de %s a fracassat perque l’infrastructura autoriza pas los partiments de tipe %i", + "Sharing %s failed, because the file does not exist" : "Lo partiment de %s a fracassat perque lo fichièr existís pas", + "You are not allowed to share %s" : "Sètz pas autorizat a partejar %s", + "Sharing %s failed, because the user %s does not exist" : "Lo partiment de %s a fracassat perque l'utilizaire %s existís pas", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Lo partiment de %s a fracassat perque l'utilizaire %s es pas membre de cap de grop al qual %s aparten", + "Sharing %s failed, because this item is already shared with %s" : "Lo partiment de %s a fracassat perque aqueste objècte es ja partejat amb %s", + "Sharing %s failed, because this item is already shared with user %s" : "Lo partiment de %s a fracassat perque aqueste element es ja partejat amb l'utilizaire %s", + "Sharing %s failed, because the group %s does not exist" : "Lo partiment de %s a fracassat perque lo grop %s existís pas", + "Sharing %s failed, because %s is not a member of the group %s" : "Lo partiment de %s a fracassat perque %s es pas membre del grop %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Vos cal provesir un senhal per crear un ligam public, sols los ligams protegits son autorizats.", + "Sharing %s failed, because sharing with links is not allowed" : "Lo partiment de %s a fracassat perque lo partiment per ligam es pas permés", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable.", + "Share type %s is not valid for %s" : "Lo tipe de partiment %s es pas valid per %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Lo reglatge de las permissions per %s a fracassat perque las permissions depassan las que son acordadas a %s", + "Setting permissions for %s failed, because the item was not found" : "Lo reglatge de las permissions per %s a fracassat perque l'objècte es pas estat trobat", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Impossible de configurar la data d'expiracion. Un partiment pòt pas expirar mai de %s aprèp sa creacion", + "Cannot set expiration date. Expiration date is in the past" : "Impossible de configurar la data d'expiracion : es dins lo passat.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Impossible de suprimir la data d'expiracion. Los partiments devon aver una data d'expiracion.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Lo servici de partiment %s deu implementar l'interfàcia OCP\\Share_Backend", + "Sharing backend %s not found" : "Servici de partiment %s pas trobat", + "Sharing backend for %s not found" : "Lo servici de partiment per %s es introbable", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Lo partiment de %s a fracassat perque las permissions depassan las que son acordadas a %s", + "Sharing %s failed, because resharing is not allowed" : "Lo partiment de %s a fracassat perque lo repartatge es pas autorizat", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Lo partiment de %s a fracassat perque la font es pas estada trobada pel partiment %s.", + "Sharing %s failed, because the file could not be found in the file cache" : "Lo partiment de %s a fracassat perque lo fichièr es pas estat trobat dins los fichièrs meses en escondedor.", + "Could not find category \"%s\"" : "Impossible de trobar la categoria \"%s\"", + "Apps" : "Aplicacions", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Sols los caractèrs seguents son autorizats dins un nom d'utilizaire : \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", + "A valid username must be provided" : "Un nom d'utilizaire valid deu èsser sasit", + "A valid password must be provided" : "Un senhal valid deu èsser sasit", + "The username is already being used" : "Aqueste nom d'utilizaire es ja utilizat", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Cap de pilòt de banca de donadas es pas installat (sqlite, mysql o postgresql).", + "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows es pas presa en carga.", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Executar un servidor ownCloud sus una plataforma Microsoft Windows es pas pres en carga. Se avètz pas la possibilitat de migrar vòstre servidor, vos suggerissèm d'utilizar un servidor Linux dins una maquina virtuala. Los paquets Linux necessaris amai los imatges virtuals de bon desplegar se tròban sus <a href=\"%s\">%s</a>. Per migrar d'installacions existentas cap a Linux, trobaretz de conselhs e d'escripts de migracion dins <a href=\"%s\">nòstra documentacion</a>.", + "Cannot write into \"config\" directory" : "Impossible d’escriure dins lo repertòri \"config\"", + "Cannot write into \"apps\" directory" : "Impossible d’escriure dins lo repertòri \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Aqueste problèma es generalament resolgut %sen donant al servidor web un accès en escritura al repertòri apps%s o en desactivant l'appstore dins lo fichièr de configuracion.", + "Cannot create \"data\" directory (%s)" : "Impossible de crear lo repertòri \"data\" (%s)", + "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Aqueste problèma es generalament resolgut <a href=\"%s\" target=\"_blank\">en donant al servidor web un accès en escritura al repertòri raiç</a>.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Lo problèma de permissions pòt generalament èsser resolgut %sen donant al servidor web un accès en escritura al repertòri raiç%s", + "Setting locale to %s failed" : "Fracàs de l'especificacion dels paramètres regionals a %s", + "Please install one of these locales on your system and restart your webserver." : "Installatz un d'aqueles paramètres regionals sus vòstre sistèma e reaviatz vòstre servidor web.", + "Please ask your server administrator to install the module." : "Demandatz a vòstre administrator d’installar lo modul.", + "PHP module %s not installed." : "Lo modul PHP %s es pas installat.", + "PHP setting \"%s\" is not set to \"%s\"." : "Lo paramètre PHP \"%s\" es pas \"%s\".", + "Adjusting this setting in php.ini will make ownCloud run again" : "Ajustar aqueste paramètre dins php.ini permetrà a ownCloud de foncionar tornamai", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload es a \"%s\" mentre que la valor \"0\" es esperada", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Per corregir aqueste problèma metètz <code>mbstring.func_overload</code> a <code>0</code> dins vòstre php.ini", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP sembla configurat de manièra a suprimir los blòts PHPdoc del còde. Aquò rendrà mantuna aplicacion de basa inaccessiblas.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La rason es probablament l'utilizacion d'un escondedor / accelerator tal coma Zend OPcache o eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "Los moduls PHP son estats installats mas son totjorn indicats coma mancants ?", + "Please ask your server administrator to restart the web server." : "Demandatz a vòstre administrator servidor que reavie lo servidor web.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 requesit", + "Please upgrade your database version" : "Metètz a jorn vòstre gestionari de banca de donadas", + "Error occurred while checking PostgreSQL version" : "Una error s’es produsida pendent la recuperacion del numèro de version de PostgreSQL", + "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Verificatz qu'utilizatz PostgreSQL >= 9 , o agachatz dins lo jornal d’error per mai d’informacions sus aqueste problèma", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Cambiatz las permissions del repertòri en mòde 0770 per fin que son contengut pòsca èsser listat pels autres utilizaires.", + "Data directory (%s) is readable by other users" : "Lo repertòri de donadas (%s) es legible pels autres utilizaires", + "Data directory (%s) must be an absolute path" : "Lo camin del dorsièr de donadas (%s) deu èsser absolut", + "Check the value of \"datadirectory\" in your configuration" : "Verificatz la valor de \"datadirectory\" dins vòstra configuracion", + "Data directory (%s) is invalid" : "Lo repertòri (%s) es pas valid", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Verificatz que lo repertòri de donadas conten un fichièr \".ocdata\" a sa raiç.", + "Could not obtain lock type %d on \"%s\"." : "Impossible d'obténer lo varrolhatge de tipe %d sus \"%s\"." }, "nplurals=2; plural=(n > 1);"); diff --git a/lib/l10n/oc.json b/lib/l10n/oc.json index b892cf9c38a..253a1552079 100644 --- a/lib/l10n/oc.json +++ b/lib/l10n/oc.json @@ -1,19 +1,148 @@ { "translations": { + "Cannot write into \"config\" directory!" : "Impossible d’escriure dins lo repertòri « config » !", + "This can usually be fixed by giving the webserver write access to the config directory" : "Aqueste problèma es generalament resolgut en donant al servidor web un accès en escritura al repertòri \"config\"", + "See %s" : "Veire %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Aqueste problèma es generalament resolgut %sen donant al servidor web un accès en escritura al repertòri de configuracion%s.", + "Sample configuration detected" : "Configuracion d'exemple detectada", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es estat detectat que la configuracion donada a títol d'exemple es estada copiada. Aquò pòt rendre vòstra installacion inoperanta e es pas pres en carga. Legissètz la documentacion abans d'efectuar de modifications dins config.php", + "PHP %s or higher is required." : "PHP %s o superior es requesit.", + "PHP with a version lower than %s is required." : "PHP amb una version anteriora a %s es requesit.", + "Following databases are supported: %s" : "Les bases de donadas seguentas son suportadas : %s", + "The command line tool %s could not be found" : "La comanda %s es introbabla", + "The library %s is not available." : "La bibliotèca %s es pas disponibla.", + "Library %s with a version higher than %s is required - available version %s." : "La bibliotèca %s deu èsser al mens a la version %s. Version disponibla : %s.", + "Library %s with a version lower than %s is required - available version %s." : "La bibliotèca %s deu aver una version anteriora a %s. Version disponibla : %s.", + "Following platforms are supported: %s" : "Las plataformas seguentas son presas en carga : %s", + "ownCloud %s or higher is required." : "ownCloud %s o superior es requesit.", + "ownCloud %s or lower is required." : "ownCloud %s o inferior es requesit.", "Help" : "Ajuda", "Personal" : "Personal", - "Users" : "Usancièrs", - "Admin" : "Admin", + "Users" : "Utilizaires", + "Admin" : "Administracion", + "Recommended" : "Recomandada", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "L'aplicacion \"%s\" pòt pas èsser installada perque es pas compatibla amb aquesta version d'ownCloud.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "L'aplicacion \"%s\" pòt pas èsser installada a causa de las dependéncias seguentas pas satisfachas : %s", + "No app name specified" : "Cap de nom d'aplicacion pas especificat", "Unknown filetype" : "Tipe de fichièr desconegut", "Invalid image" : "Imatge pas valable", "today" : "uèi", "yesterday" : "ièr", - "last month" : "mes passat", - "last year" : "an passat", - "seconds ago" : "segonda a", - "web services under your control" : "Services web jos ton contraròtle", + "_%n day ago_::_%n days ago_" : ["i a %n jorn","i a %n jorns"], + "last month" : "lo mes passat", + "_%n month ago_::_%n months ago_" : ["I a %n mes","I a %n meses"], + "last year" : "l'an passat", + "_%n year ago_::_%n years ago_" : ["i a %n an","i a %n ans"], + "_%n minute ago_::_%n minutes ago_" : ["i a %n minuta","i a %n minutas"], + "seconds ago" : "i a qualques segondas", + "web services under your control" : "servicis web jos vòstre contraròtle", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Lo modul amb l'id: %s existís pas. Mercé de l'activar dins los paramètres d'aplicacions o de contactar vòstre administrator.", + "Empty filename is not allowed" : "Lo nom de fichièr pòt pas èsser void", + "Dot files are not allowed" : "Lo nom de fichièr pòt pas començar per un punt", + "4-byte characters are not supported in file names" : "Los caractèrs sus 4 octets son pas preses en carga dins los noms de fichièrs", + "File name is a reserved word" : "Aqueste nom de fichièr es un mot reservat", + "File name contains at least one invalid character" : "Lo nom de fichièr conten un (de) caractèr(s) invalid(s)", + "File name is too long" : "Nom de fichièr tròp long", + "File is currently busy, please try again later" : "Lo fichièr es actualament utilizat, tornatz ensajar pus tard", + "Can't read file" : "Impossible de legir lo fichièr", + "App directory already exists" : "Lo dorsièr de l'aplicacion existís ja", + "Can't create app folder. Please fix permissions. %s" : "Impossible de crear lo dorsièr de l'aplicacion. Corregissètz los dreches d'accès. %s", + "Archive does not contain a directory named %s" : "Lo fichièr archiu conten pas de repertòri %s", + "No source specified when installing app" : "Cap de font pas especificada per installar l'aplicacion", + "No href specified when installing app from http" : "Cap de href pas especificat per installar l'aplicacion per http", + "No path specified when installing app from local file" : "Cap de camin pas especificat per installar l'aplicacion dempuèi un fichièr local", + "Archives of type %s are not supported" : "Los archius de tipe %s son pas preses en carga", + "Failed to open archive when installing app" : "Fracàs de la dobertura de l'archiu al moment de l'installacion de l'aplicacion", + "App does not provide an info.xml file" : "L'aplicacion provesís pas cap de fichièr info.xml", + "App can't be installed because of not allowed code in the App" : "L'aplicacion pòt pas èsser installada perque conten de còde pas autorizat", + "App can't be installed because it is not compatible with this version of ownCloud" : "L'aplicacion pòt pas èsser installada perque es pas compatibla amb aquesta version d'ownCloud", + "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'aplicacion pòt pas èsser installada perque conten la balisa <shipped>true</shipped> qu'es pas autorizada per las aplicacions non inclusas per defaut", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'aplicacion pòt pas èsser installada perque la version dins info.xml/version es pas identica a la qu'es indicada sus l'app store", + "Application is not enabled" : "L'aplicacion es pas activada", "Authentication error" : "Error d'autentificacion", - "A valid username must be provided" : "Un nom d'utilizaire valid deu èsser picat", - "A valid password must be provided" : "Un senhal valid deu èsser picat", - "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La rason es probablament l'utilizacion d'un escondedor / accelerador tal coma Zend OPcache o eAccelerator." + "Token expired. Please reload page." : "La session a expirat. Recargatz la pagina.", + "Unknown user" : "Utilizaire desconegut", + "%s enter the database username." : "%s entratz lo nom d'utilizaire de la banca de donadas.", + "%s enter the database name." : "%s entratz lo nom de la banca de donadas.", + "%s you may not use dots in the database name" : "%s podètz pas utilizar de punts dins lo nom de la banca de donadas", + "Oracle connection could not be established" : "La connexion Oracle pòt pas èsser establida", + "Oracle username and/or password not valid" : "Nom d'utilizaire e/o senhal de la basa Oracle invalid(s)", + "DB Error: \"%s\"" : "Error de la banca de donadas : \"%s\"", + "Offending command was: \"%s\"" : "La requèsta en causa es : \"%s\"", + "You need to enter either an existing account or the administrator." : "Vos cal especificar lo nom d'un compte existent, o lo de l'administrator.", + "Offending command was: \"%s\", name: %s, password: %s" : "La requèsta en causa es : \"%s\", nom : %s, senhal : %s", + "PostgreSQL username and/or password not valid" : "Nom d'utilizaire e/o senhal de la base PostgreSQL invalid(s)", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X es pas pres en carga e %s foncionarà pas corrèctament sus aquesta plataforma. Son utilizacion es jos vòstra responsabilitat !", + "For the best results, please consider using a GNU/Linux server instead." : "Per obténer los melhors resultats, vos caldriá utilizar un servidor GNU/Linux.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Sembla qu'aquesta instància %s fonciona sus un environament PHP 32-bit e open_basedir es estat configurat dins php.ini. Aquò engendre de problèmas amb los fichièrs de talha superiora a 4 Go e es doncas fòrtament desconselhat.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Suprimissètz la configuracion open_basedir de vòstre php.ini o utilizar una version PHP 64-bit.", + "Set an admin username." : "Especificatz un nom d'utilizaire per l'administrator.", + "Set an admin password." : "Especificatz un senhal per l'administrator.", + "Can't create or write into the data directory %s" : "Impossible de crear, o d'escriure dedins, lo repertòri de las donadas %s", + "Invalid Federated Cloud ID" : "ID Federated Cloud incorrècte", + "%s shared »%s« with you" : "%s a partejat «%s» amb vos", + "%s via %s" : "%s via %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Lo partiment de %s a fracassat perque l’infrastructura autoriza pas los partiments de tipe %i", + "Sharing %s failed, because the file does not exist" : "Lo partiment de %s a fracassat perque lo fichièr existís pas", + "You are not allowed to share %s" : "Sètz pas autorizat a partejar %s", + "Sharing %s failed, because the user %s does not exist" : "Lo partiment de %s a fracassat perque l'utilizaire %s existís pas", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Lo partiment de %s a fracassat perque l'utilizaire %s es pas membre de cap de grop al qual %s aparten", + "Sharing %s failed, because this item is already shared with %s" : "Lo partiment de %s a fracassat perque aqueste objècte es ja partejat amb %s", + "Sharing %s failed, because this item is already shared with user %s" : "Lo partiment de %s a fracassat perque aqueste element es ja partejat amb l'utilizaire %s", + "Sharing %s failed, because the group %s does not exist" : "Lo partiment de %s a fracassat perque lo grop %s existís pas", + "Sharing %s failed, because %s is not a member of the group %s" : "Lo partiment de %s a fracassat perque %s es pas membre del grop %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Vos cal provesir un senhal per crear un ligam public, sols los ligams protegits son autorizats.", + "Sharing %s failed, because sharing with links is not allowed" : "Lo partiment de %s a fracassat perque lo partiment per ligam es pas permés", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable.", + "Share type %s is not valid for %s" : "Lo tipe de partiment %s es pas valid per %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Lo reglatge de las permissions per %s a fracassat perque las permissions depassan las que son acordadas a %s", + "Setting permissions for %s failed, because the item was not found" : "Lo reglatge de las permissions per %s a fracassat perque l'objècte es pas estat trobat", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Impossible de configurar la data d'expiracion. Un partiment pòt pas expirar mai de %s aprèp sa creacion", + "Cannot set expiration date. Expiration date is in the past" : "Impossible de configurar la data d'expiracion : es dins lo passat.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Impossible de suprimir la data d'expiracion. Los partiments devon aver una data d'expiracion.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Lo servici de partiment %s deu implementar l'interfàcia OCP\\Share_Backend", + "Sharing backend %s not found" : "Servici de partiment %s pas trobat", + "Sharing backend for %s not found" : "Lo servici de partiment per %s es introbable", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Lo partiment de %s a fracassat perque las permissions depassan las que son acordadas a %s", + "Sharing %s failed, because resharing is not allowed" : "Lo partiment de %s a fracassat perque lo repartatge es pas autorizat", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Lo partiment de %s a fracassat perque la font es pas estada trobada pel partiment %s.", + "Sharing %s failed, because the file could not be found in the file cache" : "Lo partiment de %s a fracassat perque lo fichièr es pas estat trobat dins los fichièrs meses en escondedor.", + "Could not find category \"%s\"" : "Impossible de trobar la categoria \"%s\"", + "Apps" : "Aplicacions", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Sols los caractèrs seguents son autorizats dins un nom d'utilizaire : \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", + "A valid username must be provided" : "Un nom d'utilizaire valid deu èsser sasit", + "A valid password must be provided" : "Un senhal valid deu èsser sasit", + "The username is already being used" : "Aqueste nom d'utilizaire es ja utilizat", + "No database drivers (sqlite, mysql, or postgresql) installed." : "Cap de pilòt de banca de donadas es pas installat (sqlite, mysql o postgresql).", + "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows es pas presa en carga.", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Executar un servidor ownCloud sus una plataforma Microsoft Windows es pas pres en carga. Se avètz pas la possibilitat de migrar vòstre servidor, vos suggerissèm d'utilizar un servidor Linux dins una maquina virtuala. Los paquets Linux necessaris amai los imatges virtuals de bon desplegar se tròban sus <a href=\"%s\">%s</a>. Per migrar d'installacions existentas cap a Linux, trobaretz de conselhs e d'escripts de migracion dins <a href=\"%s\">nòstra documentacion</a>.", + "Cannot write into \"config\" directory" : "Impossible d’escriure dins lo repertòri \"config\"", + "Cannot write into \"apps\" directory" : "Impossible d’escriure dins lo repertòri \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Aqueste problèma es generalament resolgut %sen donant al servidor web un accès en escritura al repertòri apps%s o en desactivant l'appstore dins lo fichièr de configuracion.", + "Cannot create \"data\" directory (%s)" : "Impossible de crear lo repertòri \"data\" (%s)", + "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Aqueste problèma es generalament resolgut <a href=\"%s\" target=\"_blank\">en donant al servidor web un accès en escritura al repertòri raiç</a>.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Lo problèma de permissions pòt generalament èsser resolgut %sen donant al servidor web un accès en escritura al repertòri raiç%s", + "Setting locale to %s failed" : "Fracàs de l'especificacion dels paramètres regionals a %s", + "Please install one of these locales on your system and restart your webserver." : "Installatz un d'aqueles paramètres regionals sus vòstre sistèma e reaviatz vòstre servidor web.", + "Please ask your server administrator to install the module." : "Demandatz a vòstre administrator d’installar lo modul.", + "PHP module %s not installed." : "Lo modul PHP %s es pas installat.", + "PHP setting \"%s\" is not set to \"%s\"." : "Lo paramètre PHP \"%s\" es pas \"%s\".", + "Adjusting this setting in php.ini will make ownCloud run again" : "Ajustar aqueste paramètre dins php.ini permetrà a ownCloud de foncionar tornamai", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload es a \"%s\" mentre que la valor \"0\" es esperada", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Per corregir aqueste problèma metètz <code>mbstring.func_overload</code> a <code>0</code> dins vòstre php.ini", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP sembla configurat de manièra a suprimir los blòts PHPdoc del còde. Aquò rendrà mantuna aplicacion de basa inaccessiblas.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La rason es probablament l'utilizacion d'un escondedor / accelerator tal coma Zend OPcache o eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "Los moduls PHP son estats installats mas son totjorn indicats coma mancants ?", + "Please ask your server administrator to restart the web server." : "Demandatz a vòstre administrator servidor que reavie lo servidor web.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 requesit", + "Please upgrade your database version" : "Metètz a jorn vòstre gestionari de banca de donadas", + "Error occurred while checking PostgreSQL version" : "Una error s’es produsida pendent la recuperacion del numèro de version de PostgreSQL", + "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Verificatz qu'utilizatz PostgreSQL >= 9 , o agachatz dins lo jornal d’error per mai d’informacions sus aqueste problèma", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Cambiatz las permissions del repertòri en mòde 0770 per fin que son contengut pòsca èsser listat pels autres utilizaires.", + "Data directory (%s) is readable by other users" : "Lo repertòri de donadas (%s) es legible pels autres utilizaires", + "Data directory (%s) must be an absolute path" : "Lo camin del dorsièr de donadas (%s) deu èsser absolut", + "Check the value of \"datadirectory\" in your configuration" : "Verificatz la valor de \"datadirectory\" dins vòstra configuracion", + "Data directory (%s) is invalid" : "Lo repertòri (%s) es pas valid", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Verificatz que lo repertòri de donadas conten un fichièr \".ocdata\" a sa raiç.", + "Could not obtain lock type %d on \"%s\"." : "Impossible d'obténer lo varrolhatge de tipe %d sus \"%s\"." },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js index 611a0b4c6f1..c698fa0cdb2 100644 --- a/lib/l10n/pl.js +++ b/lib/l10n/pl.js @@ -69,7 +69,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s Współdzielone »%s« z tobą", "Sharing %s failed, because the file does not exist" : "Wspóldzielenie %s nie powiodło się. ponieważ plik nie istnieje", "You are not allowed to share %s" : "Nie masz uprawnień aby udostępnić %s", - "Sharing %s failed, because the user %s is the item owner" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s jest właścicielem elementu", "Sharing %s failed, because the user %s does not exist" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s nie istnieje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s nie jest członkiem żadnej grupy której członkiem jest %s", "Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s", @@ -85,12 +84,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Zaplecze do współdzielenia %s musi implementować interfejs OCP\\Share_Backend", "Sharing backend %s not found" : "Zaplecze %s do współdzielenia nie zostało znalezione", "Sharing backend for %s not found" : "Zaplecze do współdzielenia %s nie zostało znalezione", - "Sharing %s failed, because the user %s is the original sharer" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s jest udostępniającym", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Współdzielenie %s nie powiodło się, ponieważ uprawnienia przekraczają te udzielone %s", "Sharing %s failed, because resharing is not allowed" : "Współdzielenie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła", "Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików", "Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"", + "Apps" : "Aplikacje", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "W nazwach użytkowników dozwolone są wyłącznie następujące znaki: \"a-z\", \"A-Z\", \"0-9\", oraz \"_.@-\"", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", "A valid password must be provided" : "Należy podać prawidłowe hasło", diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json index 2e96f414a66..82b29c67e60 100644 --- a/lib/l10n/pl.json +++ b/lib/l10n/pl.json @@ -67,7 +67,6 @@ "%s shared »%s« with you" : "%s Współdzielone »%s« z tobą", "Sharing %s failed, because the file does not exist" : "Wspóldzielenie %s nie powiodło się. ponieważ plik nie istnieje", "You are not allowed to share %s" : "Nie masz uprawnień aby udostępnić %s", - "Sharing %s failed, because the user %s is the item owner" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s jest właścicielem elementu", "Sharing %s failed, because the user %s does not exist" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s nie istnieje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s nie jest członkiem żadnej grupy której członkiem jest %s", "Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s", @@ -83,12 +82,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Zaplecze do współdzielenia %s musi implementować interfejs OCP\\Share_Backend", "Sharing backend %s not found" : "Zaplecze %s do współdzielenia nie zostało znalezione", "Sharing backend for %s not found" : "Zaplecze do współdzielenia %s nie zostało znalezione", - "Sharing %s failed, because the user %s is the original sharer" : "Współdzielenie %s nie powiodło się, ponieważ użytkownik %s jest udostępniającym", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Współdzielenie %s nie powiodło się, ponieważ uprawnienia przekraczają te udzielone %s", "Sharing %s failed, because resharing is not allowed" : "Współdzielenie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła", "Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików", "Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"", + "Apps" : "Aplikacje", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "W nazwach użytkowników dozwolone są wyłącznie następujące znaki: \"a-z\", \"A-Z\", \"0-9\", oraz \"_.@-\"", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", "A valid password must be provided" : "Należy podać prawidłowe hasło", diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js index 402a7cbc51a..3f33b01057a 100644 --- a/lib/l10n/pt_BR.js +++ b/lib/l10n/pt_BR.js @@ -87,7 +87,7 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "O compartilhamento %s falhou, porque o processo interno não permite ações de tipo %i", "Sharing %s failed, because the file does not exist" : "Compartilhamento %s falhou, porque o arquivo não existe", "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s", - "Sharing %s failed, because the user %s is the item owner" : "Compartilhamento %s falhou, porque o usuário %s é o proprietário do item", + "Sharing %s failed, because you can not share with yourself" : "O compartilhamento %s falhou, porque você não pode compartilhar com você mesmo", "Sharing %s failed, because the user %s does not exist" : "Compartilhamento %s falhou, porque o usuário %s não existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Compartilhamento %s falhou, porque o usuário %s não é membro de nenhum grupo que o usuário %s pertença", "Sharing %s failed, because this item is already shared with %s" : "Compartilhamento %s falhou, porque este ítem já está compartilhado com %s", @@ -106,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Compartilhando backend %s deve implementar a interface OCP\\Share_Backend", "Sharing backend %s not found" : "Compartilhamento backend %s não encontrado", "Sharing backend for %s not found" : "Compartilhamento backend para %s não encontrado", - "Sharing %s failed, because the user %s is the original sharer" : "Compartilhando %s falhou, porque o usuário %s é o compartilhador original", + "Sharing failed, because the user %s is the original sharer" : "O compartilhamento falhou, porque o usuário %s é o compartilhador original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartilhamento %s falhou, porque as permissões excedem as permissões concedidas a %s", "Sharing %s failed, because resharing is not allowed" : "Compartilhamento %s falhou, porque recompartilhamentos não são permitidos", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartilhamento %s falhou, porque a infra-estrutura de compartilhamento para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "Compartilhamento %s falhou, porque o arquivo não pôde ser encontrado no cache de arquivos", "Could not find category \"%s\"" : "Impossível localizar categoria \"%s\"", + "Apps" : "Aplicações", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Somente os seguintes caracteres são permitidos no nome do usuário: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" : "Forneça um nome de usuário válido", "A valid password must be provided" : "Forneça uma senha válida", diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json index 255272b8cb8..7be0c4279d2 100644 --- a/lib/l10n/pt_BR.json +++ b/lib/l10n/pt_BR.json @@ -85,7 +85,7 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "O compartilhamento %s falhou, porque o processo interno não permite ações de tipo %i", "Sharing %s failed, because the file does not exist" : "Compartilhamento %s falhou, porque o arquivo não existe", "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s", - "Sharing %s failed, because the user %s is the item owner" : "Compartilhamento %s falhou, porque o usuário %s é o proprietário do item", + "Sharing %s failed, because you can not share with yourself" : "O compartilhamento %s falhou, porque você não pode compartilhar com você mesmo", "Sharing %s failed, because the user %s does not exist" : "Compartilhamento %s falhou, porque o usuário %s não existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Compartilhamento %s falhou, porque o usuário %s não é membro de nenhum grupo que o usuário %s pertença", "Sharing %s failed, because this item is already shared with %s" : "Compartilhamento %s falhou, porque este ítem já está compartilhado com %s", @@ -104,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Compartilhando backend %s deve implementar a interface OCP\\Share_Backend", "Sharing backend %s not found" : "Compartilhamento backend %s não encontrado", "Sharing backend for %s not found" : "Compartilhamento backend para %s não encontrado", - "Sharing %s failed, because the user %s is the original sharer" : "Compartilhando %s falhou, porque o usuário %s é o compartilhador original", + "Sharing failed, because the user %s is the original sharer" : "O compartilhamento falhou, porque o usuário %s é o compartilhador original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartilhamento %s falhou, porque as permissões excedem as permissões concedidas a %s", "Sharing %s failed, because resharing is not allowed" : "Compartilhamento %s falhou, porque recompartilhamentos não são permitidos", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartilhamento %s falhou, porque a infra-estrutura de compartilhamento para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "Compartilhamento %s falhou, porque o arquivo não pôde ser encontrado no cache de arquivos", "Could not find category \"%s\"" : "Impossível localizar categoria \"%s\"", + "Apps" : "Aplicações", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Somente os seguintes caracteres são permitidos no nome do usuário: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" : "Forneça um nome de usuário válido", "A valid password must be provided" : "Forneça uma senha válida", diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js index 0f0e116128c..1dc20a9123d 100644 --- a/lib/l10n/pt_PT.js +++ b/lib/l10n/pt_PT.js @@ -83,7 +83,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "A partilha de %s falhou porque a interface não permite as partilhas do tipo %i", "Sharing %s failed, because the file does not exist" : "A partilha de %s falhou, porque o ficheiro não existe", "You are not allowed to share %s" : "Não está autorizado a partilhar %s", - "Sharing %s failed, because the user %s is the item owner" : "A partilha %s falhou, porque o utilizador %s é o proprietário", "Sharing %s failed, because the user %s does not exist" : "A partilha %s falhou, porque o utilizador %s nao existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "A partilha %s falhou, porque o utilizador %s não pertence a nenhum dos grupos que %s é membro de", "Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque o item já está a ser partilhado com %s", @@ -101,12 +100,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Ao partilhar a interface %s deve implementar a interface OCP\\Share_Backend", "Sharing backend %s not found" : "Não foi encontrada a partilha da interface %s", "Sharing backend for %s not found" : "Não foi encontrada a partilha da interface para %s", - "Sharing %s failed, because the user %s is the original sharer" : "A partilha %s falhou, porque o utilizador %s é o proprietário original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Definir permissões para %s falhou, porque as permissões excedem as permissões concedidas a %s", "Sharing %s failed, because resharing is not allowed" : "A partilha %s falhou, porque repartilhar não é permitido", "Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros", "Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido", "A valid password must be provided" : "Uma password válida deve ser fornecida", diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json index 9c00021b599..f6ba69b0f25 100644 --- a/lib/l10n/pt_PT.json +++ b/lib/l10n/pt_PT.json @@ -81,7 +81,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "A partilha de %s falhou porque a interface não permite as partilhas do tipo %i", "Sharing %s failed, because the file does not exist" : "A partilha de %s falhou, porque o ficheiro não existe", "You are not allowed to share %s" : "Não está autorizado a partilhar %s", - "Sharing %s failed, because the user %s is the item owner" : "A partilha %s falhou, porque o utilizador %s é o proprietário", "Sharing %s failed, because the user %s does not exist" : "A partilha %s falhou, porque o utilizador %s nao existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "A partilha %s falhou, porque o utilizador %s não pertence a nenhum dos grupos que %s é membro de", "Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque o item já está a ser partilhado com %s", @@ -99,12 +98,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Ao partilhar a interface %s deve implementar a interface OCP\\Share_Backend", "Sharing backend %s not found" : "Não foi encontrada a partilha da interface %s", "Sharing backend for %s not found" : "Não foi encontrada a partilha da interface para %s", - "Sharing %s failed, because the user %s is the original sharer" : "A partilha %s falhou, porque o utilizador %s é o proprietário original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Definir permissões para %s falhou, porque as permissões excedem as permissões concedidas a %s", "Sharing %s failed, because resharing is not allowed" : "A partilha %s falhou, porque repartilhar não é permitido", "Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros", "Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"", + "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido", "A valid password must be provided" : "Uma password válida deve ser fornecida", diff --git a/lib/l10n/ro.js b/lib/l10n/ro.js index ba7d11cdfb1..1c4b407a4ca 100644 --- a/lib/l10n/ro.js +++ b/lib/l10n/ro.js @@ -41,6 +41,7 @@ OC.L10N.register( "You are not allowed to share %s" : "Nu există permisiunea de partajare %s", "Share type %s is not valid for %s" : "Tipul partajării %s nu este valid pentru %s", "Could not find category \"%s\"" : "Cloud nu a gasit categoria \"%s\"", + "Apps" : "Aplicații", "A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid", "A valid password must be provided" : "Trebuie să furnizaţi o parolă validă", "The username is already being used" : "Numele de utilizator este deja folosit", diff --git a/lib/l10n/ro.json b/lib/l10n/ro.json index 8e85455c50c..bafd2a85598 100644 --- a/lib/l10n/ro.json +++ b/lib/l10n/ro.json @@ -39,6 +39,7 @@ "You are not allowed to share %s" : "Nu există permisiunea de partajare %s", "Share type %s is not valid for %s" : "Tipul partajării %s nu este valid pentru %s", "Could not find category \"%s\"" : "Cloud nu a gasit categoria \"%s\"", + "Apps" : "Aplicații", "A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid", "A valid password must be provided" : "Trebuie să furnizaţi o parolă validă", "The username is already being used" : "Numele de utilizator este deja folosit", diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js index 16331c5cd76..073506c2453 100644 --- a/lib/l10n/ru.js +++ b/lib/l10n/ru.js @@ -49,6 +49,7 @@ OC.L10N.register( "Can't read file" : "Не удается прочитать файл", "App directory already exists" : "Каталог приложения уже существует", "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог. Исправьте права доступа. %s", + "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s", "No source specified when installing app" : "Не указан источник при установке приложения", "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http", "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла", @@ -86,10 +87,11 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Не удалось поделиться %s, общий доступ не допускает публикации из элементов типа %i", "Sharing %s failed, because the file does not exist" : "Не удалось поделиться %s, файл не существует", "You are not allowed to share %s" : "Вам запрещено делиться %s", - "Sharing %s failed, because the user %s is the item owner" : "Не удалось поделиться %s, пользователь %s владелец этого элемента", + "Sharing %s failed, because you can not share with yourself" : "Не удалось поделиться %s. Вы не можете поделиться с самим собой.", "Sharing %s failed, because the user %s does not exist" : "Не удалось поделиться %s, пользователь %s не существует.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Не удалось поделиться %s, пользователь %s не состоит в какой-либо группе в которой состоит %s", "Sharing %s failed, because this item is already shared with %s" : "Не удалось поделиться %s, пользователь %s уже имеет доступ к этому элементу", + "Sharing %s failed, because this item is already shared with user %s" : "Не удалось поделиться %s, так как элемент находится в общем доступе у %s", "Sharing %s failed, because the group %s does not exist" : "Не удалось поделиться %s, группа %s не существует", "Sharing %s failed, because %s is not a member of the group %s" : "Не удалось поделиться %s, пользователь %s не является членом группы %s", "You need to provide a password to create a public link, only protected links are allowed" : "Вам нужно задать пароль для создания публичной ссылки. Разрешены только защищённые ссылки", @@ -104,12 +106,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Бэкенд общего доступа %s должен реализовывать интерфейс OCP\\Share_Backend", "Sharing backend %s not found" : "Бэкенд общего доступа %s не найден", "Sharing backend for %s not found" : "Бэкенд общего доступа для %s не найден", - "Sharing %s failed, because the user %s is the original sharer" : "Не удалось поделиться %s, первоначально элементом поделился %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Не удалось поделиться %s, права превышают предоставленные права доступа %s", "Sharing %s failed, because resharing is not allowed" : "Не удалось поделиться %s, повторное открытие доступа запрещено", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Не удалось поделиться %s, бэкенд общего доступа не нашел путь до %s", "Sharing %s failed, because the file could not be found in the file cache" : "Не удалось поделиться %s, элемент не найден в файловом кеше.", "Could not find category \"%s\"" : "Категория \"%s\" не найдена", + "Apps" : "Приложения", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Только следующие символы допускаются в имени пользователя: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\"", "A valid username must be provided" : "Укажите правильное имя пользователя", "A valid password must be provided" : "Укажите правильный пароль", diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json index c295748adab..732be6644ff 100644 --- a/lib/l10n/ru.json +++ b/lib/l10n/ru.json @@ -47,6 +47,7 @@ "Can't read file" : "Не удается прочитать файл", "App directory already exists" : "Каталог приложения уже существует", "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог. Исправьте права доступа. %s", + "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s", "No source specified when installing app" : "Не указан источник при установке приложения", "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http", "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла", @@ -84,10 +85,11 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Не удалось поделиться %s, общий доступ не допускает публикации из элементов типа %i", "Sharing %s failed, because the file does not exist" : "Не удалось поделиться %s, файл не существует", "You are not allowed to share %s" : "Вам запрещено делиться %s", - "Sharing %s failed, because the user %s is the item owner" : "Не удалось поделиться %s, пользователь %s владелец этого элемента", + "Sharing %s failed, because you can not share with yourself" : "Не удалось поделиться %s. Вы не можете поделиться с самим собой.", "Sharing %s failed, because the user %s does not exist" : "Не удалось поделиться %s, пользователь %s не существует.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Не удалось поделиться %s, пользователь %s не состоит в какой-либо группе в которой состоит %s", "Sharing %s failed, because this item is already shared with %s" : "Не удалось поделиться %s, пользователь %s уже имеет доступ к этому элементу", + "Sharing %s failed, because this item is already shared with user %s" : "Не удалось поделиться %s, так как элемент находится в общем доступе у %s", "Sharing %s failed, because the group %s does not exist" : "Не удалось поделиться %s, группа %s не существует", "Sharing %s failed, because %s is not a member of the group %s" : "Не удалось поделиться %s, пользователь %s не является членом группы %s", "You need to provide a password to create a public link, only protected links are allowed" : "Вам нужно задать пароль для создания публичной ссылки. Разрешены только защищённые ссылки", @@ -102,12 +104,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Бэкенд общего доступа %s должен реализовывать интерфейс OCP\\Share_Backend", "Sharing backend %s not found" : "Бэкенд общего доступа %s не найден", "Sharing backend for %s not found" : "Бэкенд общего доступа для %s не найден", - "Sharing %s failed, because the user %s is the original sharer" : "Не удалось поделиться %s, первоначально элементом поделился %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Не удалось поделиться %s, права превышают предоставленные права доступа %s", "Sharing %s failed, because resharing is not allowed" : "Не удалось поделиться %s, повторное открытие доступа запрещено", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Не удалось поделиться %s, бэкенд общего доступа не нашел путь до %s", "Sharing %s failed, because the file could not be found in the file cache" : "Не удалось поделиться %s, элемент не найден в файловом кеше.", "Could not find category \"%s\"" : "Категория \"%s\" не найдена", + "Apps" : "Приложения", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Только следующие символы допускаются в имени пользователя: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\"", "A valid username must be provided" : "Укажите правильное имя пользователя", "A valid password must be provided" : "Укажите правильный пароль", diff --git a/lib/l10n/si_LK.js b/lib/l10n/si_LK.js index abdce2df7c4..09ee34c2e5d 100644 --- a/lib/l10n/si_LK.js +++ b/lib/l10n/si_LK.js @@ -13,6 +13,7 @@ OC.L10N.register( "web services under your control" : "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්", "Application is not enabled" : "යෙදුම සක්රිය කර නොමැත", "Authentication error" : "සත්යාපන දෝෂයක්", - "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න" + "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න", + "Apps" : "යෙදුම්" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/si_LK.json b/lib/l10n/si_LK.json index 5a201d40e95..d34a5216d8f 100644 --- a/lib/l10n/si_LK.json +++ b/lib/l10n/si_LK.json @@ -11,6 +11,7 @@ "web services under your control" : "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්", "Application is not enabled" : "යෙදුම සක්රිය කර නොමැත", "Authentication error" : "සත්යාපන දෝෂයක්", - "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න" + "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න", + "Apps" : "යෙදුම්" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js index 49fabed436f..5650ebf433f 100644 --- a/lib/l10n/sk_SK.js +++ b/lib/l10n/sk_SK.js @@ -16,11 +16,14 @@ OC.L10N.register( "Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.", "Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s", "ownCloud %s or higher is required." : "Požadovaná verzia ownCloudu %s alebo vyššia.", + "ownCloud %s or lower is required." : "Požadovaná verzia ownCloudu %s alebo nižšia.", "Help" : "Pomoc", "Personal" : "Osobné", "Users" : "Používatelia", "Admin" : "Administrátor", "Recommended" : "Odporúčané", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie je kompatibilná s touto verziou ownCloudu.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s", "No app name specified" : "Nešpecifikované meno aplikácie", "Unknown filetype" : "Neznámy typ súboru", "Invalid image" : "Chybný obrázok", @@ -35,12 +38,18 @@ OC.L10N.register( "_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"], "seconds ago" : "pred sekundami", "web services under your control" : "webové služby pod Vašou kontrolou", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.", "Empty filename is not allowed" : "Prázdny názov súboru nie je povolený", + "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.", + "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.", + "File name is a reserved word" : "Názov súboru je rezervované slovo.", "File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.", "File name is too long" : "Meno súboru je veľmi dlhé.", + "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr", "Can't read file" : "Nemožno čítať súbor.", "App directory already exists" : "Aplikačný priečinok už existuje", "Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s", + "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s", "No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie", "No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"", "No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru", @@ -78,10 +87,10 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Zdieľanie %s zlyhalo, pretože backend nepodporuje typ zdieľania %i", "Sharing %s failed, because the file does not exist" : "Zdieľanie %s zlyhalo, pretože súbor neexistuje", "You are not allowed to share %s" : "Nemôžete zdieľať %s", - "Sharing %s failed, because the user %s is the item owner" : "Zdieľanie %s zlyhalo, pretože používateľ %s je vlastníkom položky", "Sharing %s failed, because the user %s does not exist" : "Zdieľanie %s zlyhalo, pretože používateľ %s neexistuje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Zdieľanie %s zlyhalo, pretože používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s", "Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s", + "Sharing %s failed, because this item is already shared with user %s" : "Zdieľanie %s zlyhalo, položka je už zdieľaná s používateľom %s", "Sharing %s failed, because the group %s does not exist" : "Zdieľanie %s zlyhalo, pretože skupina %s neexistuje", "Sharing %s failed, because %s is not a member of the group %s" : "Zdieľanie %s zlyhalo, pretože %s nie je členom skupiny %s", "You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené", @@ -92,21 +101,23 @@ OC.L10N.register( "Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nie je možné nastaviť dátum konca platnosti. Zdieľania nemôžu skončiť neskôr ako %s po zdieľaní.", "Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri zdieľaní je čas expirácie vyžadovaný.", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend zdieľania %s musí implementovať rozhranie OCP\\Share_Backend", "Sharing backend %s not found" : "Backend zdieľania %s nebol nájdený", "Sharing backend for %s not found" : "Backend zdieľania pre %s nebol nájdený", - "Sharing %s failed, because the user %s is the original sharer" : "Zdieľanie %s zlyhalo, pretože používateľ %s je pôvodcom zdieľania", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Zdieľanie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s", "Sharing %s failed, because resharing is not allowed" : "Zdieľanie %s zlyhalo, pretože zdieľanie ďalším nie je povolené", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Zdieľanie %s zlyhalo, backend zdieľania nenašiel zdrojový %s", "Sharing %s failed, because the file could not be found in the file cache" : "Zdieľanie %s zlyhalo, pretože súbor sa nenašiel vo vyrovnávacej pamäti súborov", "Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"", + "Apps" : "Aplikácie", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V mene používateľa sú povolené len nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Musíte zadať platné používateľské meno", "A valid password must be provided" : "Musíte zadať platné heslo", "The username is already being used" : "Meno používateľa je už použité", "No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.", "Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Beh ownCloud servera na platforme Microsoft Windows nie je podporovaný. Navrhujeme použitie Linux server na virtuálnom počítači, pokiaľ nie je k dispozícii priamo server. Linux distribúcie a tiež aj ľahko použiteľné obrazy (image) virtuálnych počítačov nájdete na <a href=\"%s\">%s</a>. Pár tipov pre migráciu existujúcich inštalácii na Linux a migračné skripty nájdete v <a href=\"%s\">našej dokumentácii</a>.", "Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"", "Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.", @@ -119,6 +130,9 @@ OC.L10N.register( "PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.", "PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.", "Adjusting this setting in php.ini will make ownCloud run again" : "Zmenou tejto voľby v php.ini znovu uvediete váš ownCloud do prevádzky", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Oprava problému spočíva v nastavení <code>mbstring.func_overload</code> na <code>0</code> vo vašom php.ini", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.", "PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?", "Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.", @@ -128,6 +142,8 @@ OC.L10N.register( "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Prosím, uistite sa, že máte PostgreSQL >= 9 alebo sa pozrite do protokolu, kde nájdete podrobnejšie informácie o chybe", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.", "Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom", + "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta", + "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii", "Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný", "Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".", "Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“." diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json index 4eea36cda2f..365dc602437 100644 --- a/lib/l10n/sk_SK.json +++ b/lib/l10n/sk_SK.json @@ -14,11 +14,14 @@ "Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.", "Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s", "ownCloud %s or higher is required." : "Požadovaná verzia ownCloudu %s alebo vyššia.", + "ownCloud %s or lower is required." : "Požadovaná verzia ownCloudu %s alebo nižšia.", "Help" : "Pomoc", "Personal" : "Osobné", "Users" : "Používatelia", "Admin" : "Administrátor", "Recommended" : "Odporúčané", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie je kompatibilná s touto verziou ownCloudu.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s", "No app name specified" : "Nešpecifikované meno aplikácie", "Unknown filetype" : "Neznámy typ súboru", "Invalid image" : "Chybný obrázok", @@ -33,12 +36,18 @@ "_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"], "seconds ago" : "pred sekundami", "web services under your control" : "webové služby pod Vašou kontrolou", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.", "Empty filename is not allowed" : "Prázdny názov súboru nie je povolený", + "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.", + "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.", + "File name is a reserved word" : "Názov súboru je rezervované slovo.", "File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.", "File name is too long" : "Meno súboru je veľmi dlhé.", + "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr", "Can't read file" : "Nemožno čítať súbor.", "App directory already exists" : "Aplikačný priečinok už existuje", "Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s", + "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s", "No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie", "No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"", "No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru", @@ -76,10 +85,10 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Zdieľanie %s zlyhalo, pretože backend nepodporuje typ zdieľania %i", "Sharing %s failed, because the file does not exist" : "Zdieľanie %s zlyhalo, pretože súbor neexistuje", "You are not allowed to share %s" : "Nemôžete zdieľať %s", - "Sharing %s failed, because the user %s is the item owner" : "Zdieľanie %s zlyhalo, pretože používateľ %s je vlastníkom položky", "Sharing %s failed, because the user %s does not exist" : "Zdieľanie %s zlyhalo, pretože používateľ %s neexistuje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Zdieľanie %s zlyhalo, pretože používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s", "Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s", + "Sharing %s failed, because this item is already shared with user %s" : "Zdieľanie %s zlyhalo, položka je už zdieľaná s používateľom %s", "Sharing %s failed, because the group %s does not exist" : "Zdieľanie %s zlyhalo, pretože skupina %s neexistuje", "Sharing %s failed, because %s is not a member of the group %s" : "Zdieľanie %s zlyhalo, pretože %s nie je členom skupiny %s", "You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené", @@ -90,21 +99,23 @@ "Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nie je možné nastaviť dátum konca platnosti. Zdieľania nemôžu skončiť neskôr ako %s po zdieľaní.", "Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri zdieľaní je čas expirácie vyžadovaný.", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend zdieľania %s musí implementovať rozhranie OCP\\Share_Backend", "Sharing backend %s not found" : "Backend zdieľania %s nebol nájdený", "Sharing backend for %s not found" : "Backend zdieľania pre %s nebol nájdený", - "Sharing %s failed, because the user %s is the original sharer" : "Zdieľanie %s zlyhalo, pretože používateľ %s je pôvodcom zdieľania", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Zdieľanie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s", "Sharing %s failed, because resharing is not allowed" : "Zdieľanie %s zlyhalo, pretože zdieľanie ďalším nie je povolené", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Zdieľanie %s zlyhalo, backend zdieľania nenašiel zdrojový %s", "Sharing %s failed, because the file could not be found in the file cache" : "Zdieľanie %s zlyhalo, pretože súbor sa nenašiel vo vyrovnávacej pamäti súborov", "Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"", + "Apps" : "Aplikácie", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V mene používateľa sú povolené len nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Musíte zadať platné používateľské meno", "A valid password must be provided" : "Musíte zadať platné heslo", "The username is already being used" : "Meno používateľa je už použité", "No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.", "Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Beh ownCloud servera na platforme Microsoft Windows nie je podporovaný. Navrhujeme použitie Linux server na virtuálnom počítači, pokiaľ nie je k dispozícii priamo server. Linux distribúcie a tiež aj ľahko použiteľné obrazy (image) virtuálnych počítačov nájdete na <a href=\"%s\">%s</a>. Pár tipov pre migráciu existujúcich inštalácii na Linux a migračné skripty nájdete v <a href=\"%s\">našej dokumentácii</a>.", "Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"", "Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.", @@ -117,6 +128,9 @@ "PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.", "PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.", "Adjusting this setting in php.ini will make ownCloud run again" : "Zmenou tejto voľby v php.ini znovu uvediete váš ownCloud do prevádzky", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Oprava problému spočíva v nastavení <code>mbstring.func_overload</code> na <code>0</code> vo vašom php.ini", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.", "PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?", "Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.", @@ -126,6 +140,8 @@ "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Prosím, uistite sa, že máte PostgreSQL >= 9 alebo sa pozrite do protokolu, kde nájdete podrobnejšie informácie o chybe", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.", "Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom", + "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta", + "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii", "Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný", "Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".", "Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“." diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js index 48df48d71c6..a703f68263c 100644 --- a/lib/l10n/sl.js +++ b/lib/l10n/sl.js @@ -77,7 +77,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Omogočanje souporabe %s je spodletelo, ker ozadnji program ne dopušča souporabe vrste %i.", "Sharing %s failed, because the file does not exist" : "Souporaba %s je spodletela, ker ta datoteka ne obstaja", "You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.", - "Sharing %s failed, because the user %s is the item owner" : "Nastavljanje souporabe %s je spodletelo, ker je uporabnik %s lastnik predmeta.", "Sharing %s failed, because the user %s does not exist" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ne obstaja.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član nobene skupine, v kateri je tudi uporabnik %s.", "Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletela, ker je ima uporabnik %s predmet že v souporabi.", @@ -94,12 +93,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Souporaba ozadnjega programa %s mora vsebovati tudi vmesnik OCP\\Share_Backend", "Sharing backend %s not found" : "Ozadnjega programa %s za souporabo ni mogoče najti", "Sharing backend for %s not found" : "Ozadnjega programa za souporabo za %s ni mogoče najti", - "Sharing %s failed, because the user %s is the original sharer" : "Nastavljanje souporabe %s je spodletelo, ker je uporabnik %s omogočil souporabo predmeta.", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Nastavljanje souporabe %s je spodletelo, ker zahteve presegajo dodeljena dovoljenja za %s.", "Sharing %s failed, because resharing is not allowed" : "Nastavljanje souporabe %s je spodletelo, ker nadaljnje omogočanje souporabe ni dovoljeno.", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Nastavljanje souporabe %s je spodletelo, ker ozadnji program %s ne upravlja z viri.", "Sharing %s failed, because the file could not be found in the file cache" : "Nastavljanje souporabe %s je spodletelo, ker v predpomnilniku zahtevana datoteka ne obstaja.", "Could not find category \"%s\"" : "Kategorije \"%s\" ni mogoče najti.", + "Apps" : "Programi", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V uporabniškem imenu je dovoljeno uporabiti le znake: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Navedeno mora biti veljavno uporabniško ime", "A valid password must be provided" : "Navedeno mora biti veljavno geslo", diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json index 8507e1194d9..f60b1b29e11 100644 --- a/lib/l10n/sl.json +++ b/lib/l10n/sl.json @@ -75,7 +75,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Omogočanje souporabe %s je spodletelo, ker ozadnji program ne dopušča souporabe vrste %i.", "Sharing %s failed, because the file does not exist" : "Souporaba %s je spodletela, ker ta datoteka ne obstaja", "You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.", - "Sharing %s failed, because the user %s is the item owner" : "Nastavljanje souporabe %s je spodletelo, ker je uporabnik %s lastnik predmeta.", "Sharing %s failed, because the user %s does not exist" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ne obstaja.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član nobene skupine, v kateri je tudi uporabnik %s.", "Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletela, ker je ima uporabnik %s predmet že v souporabi.", @@ -92,12 +91,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Souporaba ozadnjega programa %s mora vsebovati tudi vmesnik OCP\\Share_Backend", "Sharing backend %s not found" : "Ozadnjega programa %s za souporabo ni mogoče najti", "Sharing backend for %s not found" : "Ozadnjega programa za souporabo za %s ni mogoče najti", - "Sharing %s failed, because the user %s is the original sharer" : "Nastavljanje souporabe %s je spodletelo, ker je uporabnik %s omogočil souporabo predmeta.", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Nastavljanje souporabe %s je spodletelo, ker zahteve presegajo dodeljena dovoljenja za %s.", "Sharing %s failed, because resharing is not allowed" : "Nastavljanje souporabe %s je spodletelo, ker nadaljnje omogočanje souporabe ni dovoljeno.", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Nastavljanje souporabe %s je spodletelo, ker ozadnji program %s ne upravlja z viri.", "Sharing %s failed, because the file could not be found in the file cache" : "Nastavljanje souporabe %s je spodletelo, ker v predpomnilniku zahtevana datoteka ne obstaja.", "Could not find category \"%s\"" : "Kategorije \"%s\" ni mogoče najti.", + "Apps" : "Programi", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V uporabniškem imenu je dovoljeno uporabiti le znake: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" : "Navedeno mora biti veljavno uporabniško ime", "A valid password must be provided" : "Navedeno mora biti veljavno geslo", diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js index fbf1b58beee..34399fe01cf 100644 --- a/lib/l10n/sq.js +++ b/lib/l10n/sq.js @@ -1,38 +1,152 @@ OC.L10N.register( "lib", { + "Cannot write into \"config\" directory!" : "S’shkruhet dot te drejtori \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve", + "See %s" : "Shihni %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.", + "Sample configuration detected" : "U gjet formësim shembull", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php", + "PHP %s or higher is required." : "Lypse PHP %s ose më sipër.", + "PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.", + "Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s", + "The command line tool %s could not be found" : "Mjeti rresht urdhrash %s s’u gjet dot", + "The library %s is not available." : "Libraria %s s’është e passhme.", + "Library %s with a version higher than %s is required - available version %s." : "Lypset librari %s me një version më të madh se %s - version gati %s.", + "Library %s with a version lower than %s is required - available version %s." : "Lypset librari %s me një version më të vogël se %s - version gati %s.", + "Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s", + "ownCloud %s or higher is required." : "Lypset ownCloud %s ose më sipër.", + "ownCloud %s or lower is required." : "Lypset ownCloud %s ose më poshtë.", "Help" : "Ndihmë", "Personal" : "Personale", - "Users" : "Përdoruesit", + "Users" : "Përdorues", "Admin" : "Admin", "Recommended" : "E rekomanduar", - "Unknown filetype" : "Tip i panjohur skedari", - "Invalid image" : "Imazh i pavlefshëm", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’është i përputhshëm me këtë version të ownCloud-it.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’plotësohen varësitë vijuese: %s.", + "No app name specified" : "S’u dha emër aplikacioni", + "Unknown filetype" : "Lloj i panjohur kartele", + "Invalid image" : "Figurë e pavlefshme", "today" : "sot", "yesterday" : "dje", + "_%n day ago_::_%n days ago_" : ["%n ditë më parë","%n ditë më parë"], "last month" : "muajin e shkuar", + "_%n month ago_::_%n months ago_" : ["%n muaj më parë","%n muaj më parë"], "last year" : "vitin e shkuar", + "_%n year ago_::_%n years ago_" : ["%n vit më parë","%n vjet më parë"], + "_%n hour ago_::_%n hours ago_" : ["%n orë më parë","%n orë më parë"], + "_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"], "seconds ago" : "sekonda më parë", - "web services under your control" : "shërbime web nën kontrollin tënd", - "Application is not enabled" : "Programi nuk është i aktivizuar.", - "Authentication error" : "Veprim i gabuar gjatë vërtetimit të identitetit", - "Token expired. Please reload page." : "Përmbajtja ka skaduar. Ju lutemi ringarkoni faqen.", - "%s enter the database username." : "% shkruani përdoruesin e database-it.", - "%s enter the database name." : "%s shkruani emrin e database-it.", - "%s you may not use dots in the database name" : "%s nuk mund të përdorni pikat tek emri i database-it", - "Oracle username and/or password not valid" : "Përdoruesi dhe/apo kodi i Oracle-it i pavlefshëm", - "DB Error: \"%s\"" : "Veprim i gabuar i DB-it: \"%s\"", - "Offending command was: \"%s\"" : "Komanda e gabuar ishte: \"%s\"", - "You need to enter either an existing account or the administrator." : "Duhet të përdorni një llogari ekzistuese ose llogarinë e administratorit.", - "Offending command was: \"%s\", name: %s, password: %s" : "Komanda e gabuar ishte: \"%s\", përdoruesi: %s, kodi: %s", - "PostgreSQL username and/or password not valid" : "Përdoruesi dhe/apo kodi i PostgreSQL i pavlefshëm", - "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk është i mbështetur dhe %s nuk do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj!", - "For the best results, please consider using a GNU/Linux server instead." : "Për të arritur rezultatet më të mira të mundshme, ju lutem më mirë konsideroni përdorimin e një serveri GNU/Linux.", - "Set an admin username." : "Cakto emrin e administratorit.", - "Set an admin password." : "Cakto kodin e administratorit.", - "%s shared »%s« with you" : "%s ndau »%s« me ju", - "Could not find category \"%s\"" : "Kategoria \"%s\" nuk u gjet", - "A valid username must be provided" : "Duhet të jepni një emër të vlefshëm përdoruesi", - "A valid password must be provided" : "Duhet të jepni një fjalëkalim te vlefshëm" + "web services under your control" : "shërbime web nën kontrollin tuaj", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.", + "Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash", + "Dot files are not allowed" : "Nuk lejohen kartela të fshehura", + "4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash", + "File name is a reserved word" : "Emri i kartelës është një emër i rezervuar", + "File name contains at least one invalid character" : "Emri i kartelës përmban të paktën një shenjë të pavlefshme", + "File name is too long" : "Emri i kartelës është shumë i gjatë", + "File is currently busy, please try again later" : "Kartela tani është e zënë, ju lutemi, riprovoni më vonë.", + "Can't read file" : "S'lexohet dot kartela", + "App directory already exists" : "Drejtoria e aplikacionit ekziston tashmë", + "Can't create app folder. Please fix permissions. %s" : "S’krijohet dot dosje aplikacioni. Ju lutemi, ndreqni lejet. %s", + "Archive does not contain a directory named %s" : "Arkivi s’përmban një drejtori të quajtur %s", + "No source specified when installing app" : "S’u dha burim gjatë instalimit të aplikacionit", + "No href specified when installing app from http" : "S’u tregua href gjatë instalimit të aplikacionit nga http", + "No path specified when installing app from local file" : "S’u caktua shteg gjatë instalimit të aplikacionit prej kartele vendore", + "Archives of type %s are not supported" : "Nuk mbulohen arkivat e llojit %s", + "Failed to open archive when installing app" : "Dështoi në hapje arkivi teksa instalohej aplikacioni", + "App does not provide an info.xml file" : "Aplikacioni s’ofron kartele të vlefshme .xml", + "App can't be installed because of not allowed code in the App" : "Aplikacioni s’mund të instalohet, për shkak kodi të palejuar te Aplikacioni", + "App can't be installed because it is not compatible with this version of ownCloud" : "Aplikacioni s’mund të instalohet, ngaqë s’është i përputhshëm me këtë version të ownCloud-it", + "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacioni s’mund të instalohet, ngaqë përmban etiketën <shipped>true</shipped> e cila nuk lejohet për aplikacione që s’janë hedhur në qarkullim", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Aplikacioni s’mund të instalohet, ngaqë versioni te info.xml/version s’është i njëjti me versionin e treguar nga shitorja e aplikacioneve", + "Application is not enabled" : "Aplikacioni s’është aktivizuar", + "Authentication error" : "Gabim mirëfilltësimi", + "Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.", + "Unknown user" : "Përdorues i panjohur", + "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.", + "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.", + "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave", + "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle", + "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm", + "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"", + "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"", + "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.", + "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s", + "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ", + "For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ju lutemi, hiqeni rregullimin open_basedir nga php.ini juaj ose hidhuni te PHP për 64-bit.", + "Set an admin username." : "Caktoni një emër përdoruesi për përgjegjësin.", + "Set an admin password." : "Caktoni një fjalëkalim për përgjegjësin.", + "Can't create or write into the data directory %s" : "S’e krijon ose s’shkruan dot te drejtoria e të dhënave %s", + "Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme", + "%s shared »%s« with you" : "%s ndau me ju »%s«", + "%s via %s" : "%s përmes %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %i", + "Sharing %s failed, because the file does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’ekziston", + "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët", + "Sharing %s failed, because you can not share with yourself" : "Ndarja e %s dështoi, ngaqë s’mund të ndani gjëra me vetveten", + "Sharing %s failed, because the user %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë përdoruesi %s nuk ekziston", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ndarja për %s dështoi, ngaqë përdoruesi %s s’është anëtar i ndonjë grupi ku %s është anëtar", + "Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s", + "Sharing %s failed, because this item is already shared with user %s" : "Ndarja e %s me të tjerët dështoi, ngaqë ky objekt është ndarë tashmë me përdoruesin %s", + "Sharing %s failed, because the group %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë grupi %s nuk ekziston", + "Sharing %s failed, because %s is not a member of the group %s" : "Ndarja e %s me të tjerët dështoi, ngaqë %s s’është anëtar i grupit %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Lypset të jepni një fjalëkalim që të krijoni një lidhje publike, lejohen vetëm lidhje të mbrojtura", + "Sharing %s failed, because sharing with links is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohet ndarja me lidhje", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.", + "Share type %s is not valid for %s" : "Lloji i ndarjes %s s’është i vlefshëm për %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Caktimi i lejeve për %s dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Setting permissions for %s failed, because the item was not found" : "Caktimi i lejeve për %s dështoi, ngaqë s’u gjet objekti", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "S’caktohet dot data e skadimit. Ndarjet s’mund të skadojnë më vonë se %s pasi të jenë ofruar", + "Cannot set expiration date. Expiration date is in the past" : "S’caktohet dot data e skadimit. Data e skadimit bie në të kaluarën", + "Cannot clear expiration date. Shares are required to have an expiration date." : "S’hiqet dot data e skadimit. Ndarjet lypse të kenë një datë skadimi.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Mekanizmi i shërbimit për ndarje %s duhet të sendërtojë ndërfaqen OCP\\Share_Backend", + "Sharing backend %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje %s", + "Sharing backend for %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje për %s", + "Sharing failed, because the user %s is the original sharer" : "Ndarja dështoi, ngaqë përdoruesi %s është ai që e ndau fillimisht", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ndarja e %s me të tjerët dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Sharing %s failed, because resharing is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohen rindarje", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ndarja e %s dështoi, ngaqë mekanizmi i shërbimit për ndarje për %s s’gjeti dot burimin për të", + "Sharing %s failed, because the file could not be found in the file cache" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’u gjet dot te fshehtina e kartelave", + "Could not find category \"%s\"" : "S’u gjet kategori \"%s\"", + "Apps" : "Aplikacione", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"", + "A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi", + "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", + "The username is already being used" : "Emri i përdoruesit është tashmë i përdorur", + "No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.", + "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nuk mbulohet", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Xhirimi i shërbyesit ownCloud në platformën Microsoft Windows nuk mbulohet. Nëse nuk mundeni të migroni vetë shërbyesin, këshillojmë të përdorni një shërbyes Linux në një makinë virtuale. Gjeni paketa Linux, si dhe paketa makinash virtuale të lehta për t’u vënë në punë, te <a href=\"%s\">%s</a>. Rreth migrimit në Linux të instalimeve ekzistuese mund të gjeni disa këshilla dhe një programth migrimi te <a href=\"%s\">dokumentimi ynë</a>.", + "Cannot write into \"config\" directory" : "S’shkruhet dot te drejtoria \"config\"", + "Cannot write into \"apps\" directory" : "S’shkruhet dot te drejtoria \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e aplikacionit%s ose duke e çaktivizuar appstore-in te kartela e formësimit.", + "Cannot create \"data\" directory (%s)" : "S’krijohet dot drejtoria \"data\" (%s)", + "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Zakonisht kjo mund të ndreqet duke <a href=\"%s\" target=\"_blank\">i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë</a>.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Zakonisht lejet mund të ndreqen duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë%s.", + "Setting locale to %s failed" : "Caktimi i gjuhës si %s dështoi", + "Please install one of these locales on your system and restart your webserver." : "Ju lutemi, instaloni te sistemi juaj një prej këtyre vendoreve dhe rinisni shërbyesin tuaj web.", + "Please ask your server administrator to install the module." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit ta instalojë modulin.", + "PHP module %s not installed." : "Moduli PHP %s s’është i instaluar.", + "PHP setting \"%s\" is not set to \"%s\"." : "Rregullimi PHP \"%s\" s’është vënë si \"%s\".", + "Adjusting this setting in php.ini will make ownCloud run again" : "Saktësimi i këtij rregullimi te php.ini do të bëjë që ownCloud-i të punojë sërish", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload është caktuar si \"%s\", në vend të vlerës së pritshme \"0\"", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Për ta ndrequr këtë problem, caktoni për <code>mbstring.func_overload</code> vlerën <code>0</code> te php.ini juaj", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Me sa duket, PHP-ja është rregulluar që të heqë blloqe të brendshëm dokumentimi. Kjo do t’i nxjerrë nga funksionimi disa aplikacione bazë.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "Modulet PHP janë instaluar, por tregohen ende sikur mungojnë?", + "Please ask your server administrator to restart the web server." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj të rinisë shërbyesin web.", + "PostgreSQL >= 9 required" : "Lypset PostgreSQL >= 9", + "Please upgrade your database version" : "Ju lutemi, përmirësoni bazën tuaj të të dhënave me një version më të ri.", + "Error occurred while checking PostgreSQL version" : "Ndodhi një gabim teksa kontrollohej versioni i PostgreSQL-së", + "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Ju lutemi, sigurohuni që keni PostgreSQL >= 9 ose kontrolloni regjistrat për më tepër të dhëna rreth gabimit", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Ju lutemi, kalojani lejet në 0770, që kështu atë drejtori të mos mund ta shfaqin përdorues të tjerë.", + "Data directory (%s) is readable by other users" : "Drejtoria e të dhënave (%s) është e lexueshme nga përdorues të tjerë", + "Data directory (%s) must be an absolute path" : "Drejtoria e të dhënave (%s) duhet të jepë një shteg absolut", + "Check the value of \"datadirectory\" in your configuration" : "Kontrolloni vlerën e \"datadirectory\" te formësimi juaj", + "Data directory (%s) is invalid" : "Drejtoria e të dhënave (%s) është e pavlefshme", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Ju lutemi, kontrolloni që drejtoria e të dhënave përmban në rrënjën e saj një kartelë \".ocdata\"." }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json index b0a23493d40..b6077a5bfb4 100644 --- a/lib/l10n/sq.json +++ b/lib/l10n/sq.json @@ -1,36 +1,150 @@ { "translations": { + "Cannot write into \"config\" directory!" : "S’shkruhet dot te drejtori \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve", + "See %s" : "Shihni %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.", + "Sample configuration detected" : "U gjet formësim shembull", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php", + "PHP %s or higher is required." : "Lypse PHP %s ose më sipër.", + "PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.", + "Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s", + "The command line tool %s could not be found" : "Mjeti rresht urdhrash %s s’u gjet dot", + "The library %s is not available." : "Libraria %s s’është e passhme.", + "Library %s with a version higher than %s is required - available version %s." : "Lypset librari %s me një version më të madh se %s - version gati %s.", + "Library %s with a version lower than %s is required - available version %s." : "Lypset librari %s me një version më të vogël se %s - version gati %s.", + "Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s", + "ownCloud %s or higher is required." : "Lypset ownCloud %s ose më sipër.", + "ownCloud %s or lower is required." : "Lypset ownCloud %s ose më poshtë.", "Help" : "Ndihmë", "Personal" : "Personale", - "Users" : "Përdoruesit", + "Users" : "Përdorues", "Admin" : "Admin", "Recommended" : "E rekomanduar", - "Unknown filetype" : "Tip i panjohur skedari", - "Invalid image" : "Imazh i pavlefshëm", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’është i përputhshëm me këtë version të ownCloud-it.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’plotësohen varësitë vijuese: %s.", + "No app name specified" : "S’u dha emër aplikacioni", + "Unknown filetype" : "Lloj i panjohur kartele", + "Invalid image" : "Figurë e pavlefshme", "today" : "sot", "yesterday" : "dje", + "_%n day ago_::_%n days ago_" : ["%n ditë më parë","%n ditë më parë"], "last month" : "muajin e shkuar", + "_%n month ago_::_%n months ago_" : ["%n muaj më parë","%n muaj më parë"], "last year" : "vitin e shkuar", + "_%n year ago_::_%n years ago_" : ["%n vit më parë","%n vjet më parë"], + "_%n hour ago_::_%n hours ago_" : ["%n orë më parë","%n orë më parë"], + "_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"], "seconds ago" : "sekonda më parë", - "web services under your control" : "shërbime web nën kontrollin tënd", - "Application is not enabled" : "Programi nuk është i aktivizuar.", - "Authentication error" : "Veprim i gabuar gjatë vërtetimit të identitetit", - "Token expired. Please reload page." : "Përmbajtja ka skaduar. Ju lutemi ringarkoni faqen.", - "%s enter the database username." : "% shkruani përdoruesin e database-it.", - "%s enter the database name." : "%s shkruani emrin e database-it.", - "%s you may not use dots in the database name" : "%s nuk mund të përdorni pikat tek emri i database-it", - "Oracle username and/or password not valid" : "Përdoruesi dhe/apo kodi i Oracle-it i pavlefshëm", - "DB Error: \"%s\"" : "Veprim i gabuar i DB-it: \"%s\"", - "Offending command was: \"%s\"" : "Komanda e gabuar ishte: \"%s\"", - "You need to enter either an existing account or the administrator." : "Duhet të përdorni një llogari ekzistuese ose llogarinë e administratorit.", - "Offending command was: \"%s\", name: %s, password: %s" : "Komanda e gabuar ishte: \"%s\", përdoruesi: %s, kodi: %s", - "PostgreSQL username and/or password not valid" : "Përdoruesi dhe/apo kodi i PostgreSQL i pavlefshëm", - "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk është i mbështetur dhe %s nuk do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj!", - "For the best results, please consider using a GNU/Linux server instead." : "Për të arritur rezultatet më të mira të mundshme, ju lutem më mirë konsideroni përdorimin e një serveri GNU/Linux.", - "Set an admin username." : "Cakto emrin e administratorit.", - "Set an admin password." : "Cakto kodin e administratorit.", - "%s shared »%s« with you" : "%s ndau »%s« me ju", - "Could not find category \"%s\"" : "Kategoria \"%s\" nuk u gjet", - "A valid username must be provided" : "Duhet të jepni një emër të vlefshëm përdoruesi", - "A valid password must be provided" : "Duhet të jepni një fjalëkalim te vlefshëm" + "web services under your control" : "shërbime web nën kontrollin tuaj", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.", + "Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash", + "Dot files are not allowed" : "Nuk lejohen kartela të fshehura", + "4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash", + "File name is a reserved word" : "Emri i kartelës është një emër i rezervuar", + "File name contains at least one invalid character" : "Emri i kartelës përmban të paktën një shenjë të pavlefshme", + "File name is too long" : "Emri i kartelës është shumë i gjatë", + "File is currently busy, please try again later" : "Kartela tani është e zënë, ju lutemi, riprovoni më vonë.", + "Can't read file" : "S'lexohet dot kartela", + "App directory already exists" : "Drejtoria e aplikacionit ekziston tashmë", + "Can't create app folder. Please fix permissions. %s" : "S’krijohet dot dosje aplikacioni. Ju lutemi, ndreqni lejet. %s", + "Archive does not contain a directory named %s" : "Arkivi s’përmban një drejtori të quajtur %s", + "No source specified when installing app" : "S’u dha burim gjatë instalimit të aplikacionit", + "No href specified when installing app from http" : "S’u tregua href gjatë instalimit të aplikacionit nga http", + "No path specified when installing app from local file" : "S’u caktua shteg gjatë instalimit të aplikacionit prej kartele vendore", + "Archives of type %s are not supported" : "Nuk mbulohen arkivat e llojit %s", + "Failed to open archive when installing app" : "Dështoi në hapje arkivi teksa instalohej aplikacioni", + "App does not provide an info.xml file" : "Aplikacioni s’ofron kartele të vlefshme .xml", + "App can't be installed because of not allowed code in the App" : "Aplikacioni s’mund të instalohet, për shkak kodi të palejuar te Aplikacioni", + "App can't be installed because it is not compatible with this version of ownCloud" : "Aplikacioni s’mund të instalohet, ngaqë s’është i përputhshëm me këtë version të ownCloud-it", + "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacioni s’mund të instalohet, ngaqë përmban etiketën <shipped>true</shipped> e cila nuk lejohet për aplikacione që s’janë hedhur në qarkullim", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Aplikacioni s’mund të instalohet, ngaqë versioni te info.xml/version s’është i njëjti me versionin e treguar nga shitorja e aplikacioneve", + "Application is not enabled" : "Aplikacioni s’është aktivizuar", + "Authentication error" : "Gabim mirëfilltësimi", + "Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.", + "Unknown user" : "Përdorues i panjohur", + "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.", + "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.", + "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave", + "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle", + "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm", + "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"", + "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"", + "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.", + "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s", + "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm", + "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ", + "For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ju lutemi, hiqeni rregullimin open_basedir nga php.ini juaj ose hidhuni te PHP për 64-bit.", + "Set an admin username." : "Caktoni një emër përdoruesi për përgjegjësin.", + "Set an admin password." : "Caktoni një fjalëkalim për përgjegjësin.", + "Can't create or write into the data directory %s" : "S’e krijon ose s’shkruan dot te drejtoria e të dhënave %s", + "Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme", + "%s shared »%s« with you" : "%s ndau me ju »%s«", + "%s via %s" : "%s përmes %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %i", + "Sharing %s failed, because the file does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’ekziston", + "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët", + "Sharing %s failed, because you can not share with yourself" : "Ndarja e %s dështoi, ngaqë s’mund të ndani gjëra me vetveten", + "Sharing %s failed, because the user %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë përdoruesi %s nuk ekziston", + "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ndarja për %s dështoi, ngaqë përdoruesi %s s’është anëtar i ndonjë grupi ku %s është anëtar", + "Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s", + "Sharing %s failed, because this item is already shared with user %s" : "Ndarja e %s me të tjerët dështoi, ngaqë ky objekt është ndarë tashmë me përdoruesin %s", + "Sharing %s failed, because the group %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë grupi %s nuk ekziston", + "Sharing %s failed, because %s is not a member of the group %s" : "Ndarja e %s me të tjerët dështoi, ngaqë %s s’është anëtar i grupit %s", + "You need to provide a password to create a public link, only protected links are allowed" : "Lypset të jepni një fjalëkalim që të krijoni një lidhje publike, lejohen vetëm lidhje të mbrojtura", + "Sharing %s failed, because sharing with links is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohet ndarja me lidhje", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.", + "Share type %s is not valid for %s" : "Lloji i ndarjes %s s’është i vlefshëm për %s", + "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Caktimi i lejeve për %s dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Setting permissions for %s failed, because the item was not found" : "Caktimi i lejeve për %s dështoi, ngaqë s’u gjet objekti", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "S’caktohet dot data e skadimit. Ndarjet s’mund të skadojnë më vonë se %s pasi të jenë ofruar", + "Cannot set expiration date. Expiration date is in the past" : "S’caktohet dot data e skadimit. Data e skadimit bie në të kaluarën", + "Cannot clear expiration date. Shares are required to have an expiration date." : "S’hiqet dot data e skadimit. Ndarjet lypse të kenë një datë skadimi.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Mekanizmi i shërbimit për ndarje %s duhet të sendërtojë ndërfaqen OCP\\Share_Backend", + "Sharing backend %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje %s", + "Sharing backend for %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje për %s", + "Sharing failed, because the user %s is the original sharer" : "Ndarja dështoi, ngaqë përdoruesi %s është ai që e ndau fillimisht", + "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ndarja e %s me të tjerët dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s", + "Sharing %s failed, because resharing is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohen rindarje", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ndarja e %s dështoi, ngaqë mekanizmi i shërbimit për ndarje për %s s’gjeti dot burimin për të", + "Sharing %s failed, because the file could not be found in the file cache" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’u gjet dot te fshehtina e kartelave", + "Could not find category \"%s\"" : "S’u gjet kategori \"%s\"", + "Apps" : "Aplikacione", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"", + "A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi", + "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", + "The username is already being used" : "Emri i përdoruesit është tashmë i përdorur", + "No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.", + "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nuk mbulohet", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Xhirimi i shërbyesit ownCloud në platformën Microsoft Windows nuk mbulohet. Nëse nuk mundeni të migroni vetë shërbyesin, këshillojmë të përdorni një shërbyes Linux në një makinë virtuale. Gjeni paketa Linux, si dhe paketa makinash virtuale të lehta për t’u vënë në punë, te <a href=\"%s\">%s</a>. Rreth migrimit në Linux të instalimeve ekzistuese mund të gjeni disa këshilla dhe një programth migrimi te <a href=\"%s\">dokumentimi ynë</a>.", + "Cannot write into \"config\" directory" : "S’shkruhet dot te drejtoria \"config\"", + "Cannot write into \"apps\" directory" : "S’shkruhet dot te drejtoria \"apps\"", + "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e aplikacionit%s ose duke e çaktivizuar appstore-in te kartela e formësimit.", + "Cannot create \"data\" directory (%s)" : "S’krijohet dot drejtoria \"data\" (%s)", + "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Zakonisht kjo mund të ndreqet duke <a href=\"%s\" target=\"_blank\">i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë</a>.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Zakonisht lejet mund të ndreqen duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë%s.", + "Setting locale to %s failed" : "Caktimi i gjuhës si %s dështoi", + "Please install one of these locales on your system and restart your webserver." : "Ju lutemi, instaloni te sistemi juaj një prej këtyre vendoreve dhe rinisni shërbyesin tuaj web.", + "Please ask your server administrator to install the module." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit ta instalojë modulin.", + "PHP module %s not installed." : "Moduli PHP %s s’është i instaluar.", + "PHP setting \"%s\" is not set to \"%s\"." : "Rregullimi PHP \"%s\" s’është vënë si \"%s\".", + "Adjusting this setting in php.ini will make ownCloud run again" : "Saktësimi i këtij rregullimi te php.ini do të bëjë që ownCloud-i të punojë sërish", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload është caktuar si \"%s\", në vend të vlerës së pritshme \"0\"", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Për ta ndrequr këtë problem, caktoni për <code>mbstring.func_overload</code> vlerën <code>0</code> te php.ini juaj", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Me sa duket, PHP-ja është rregulluar që të heqë blloqe të brendshëm dokumentimi. Kjo do t’i nxjerrë nga funksionimi disa aplikacione bazë.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "PHP modules have been installed, but they are still listed as missing?" : "Modulet PHP janë instaluar, por tregohen ende sikur mungojnë?", + "Please ask your server administrator to restart the web server." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj të rinisë shërbyesin web.", + "PostgreSQL >= 9 required" : "Lypset PostgreSQL >= 9", + "Please upgrade your database version" : "Ju lutemi, përmirësoni bazën tuaj të të dhënave me një version më të ri.", + "Error occurred while checking PostgreSQL version" : "Ndodhi një gabim teksa kontrollohej versioni i PostgreSQL-së", + "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Ju lutemi, sigurohuni që keni PostgreSQL >= 9 ose kontrolloni regjistrat për më tepër të dhëna rreth gabimit", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Ju lutemi, kalojani lejet në 0770, që kështu atë drejtori të mos mund ta shfaqin përdorues të tjerë.", + "Data directory (%s) is readable by other users" : "Drejtoria e të dhënave (%s) është e lexueshme nga përdorues të tjerë", + "Data directory (%s) must be an absolute path" : "Drejtoria e të dhënave (%s) duhet të jepë një shteg absolut", + "Check the value of \"datadirectory\" in your configuration" : "Kontrolloni vlerën e \"datadirectory\" te formësimi juaj", + "Data directory (%s) is invalid" : "Drejtoria e të dhënave (%s) është e pavlefshme", + "Please check that the data directory contains a file \".ocdata\" in its root." : "Ju lutemi, kontrolloni që drejtoria e të dhënave përmban në rrënjën e saj një kartelë \".ocdata\"." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js index 286856622c7..1748a9983d3 100644 --- a/lib/l10n/sr.js +++ b/lib/l10n/sr.js @@ -49,6 +49,7 @@ OC.L10N.register( "Can't read file" : "Не могу да читам фајл", "App directory already exists" : "Директоријум апликација већ постоји", "Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s", + "Archive does not contain a directory named %s" : "Архива не садржи директоријум назива %s", "No source specified when installing app" : "Није наведен извор за инсталирање апликације", "No href specified when installing app from http" : "Није наведена адреса за инсталирање апликације преко http", "No path specified when installing app from local file" : "Није наведена путања за инсталирање апликације са локалног фајла", @@ -86,10 +87,10 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i", "Sharing %s failed, because the file does not exist" : "Дељење %s није успело зато што фајл не постоји", "You are not allowed to share %s" : "Није вам дозвољено да делите %s", - "Sharing %s failed, because the user %s is the item owner" : "Дељење %s није успело зато што је корисник %s власник дељене ставке", "Sharing %s failed, because the user %s does not exist" : "Дељење %s није успело зато што не постоји корисник %s", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Дељење %s није успело зато што корисник %s није члан групе која је %s члан ", "Sharing %s failed, because this item is already shared with %s" : "Дељење %s није успело зато што се ова ставка већ дели са %s", + "Sharing %s failed, because this item is already shared with user %s" : "Дељење %s није успело зато што се ова ставка већ дели са корисником %s", "Sharing %s failed, because the group %s does not exist" : "Дељење %s није успело зато што непостоји група %s", "Sharing %s failed, because %s is not a member of the group %s" : "Дељење %s није успело зато што %s није члан групе %s", "You need to provide a password to create a public link, only protected links are allowed" : "Морате да обезбедите лозинку за креирање јавне везе, дозвољене су само заштићене везе", @@ -104,12 +105,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Позадина дељења %s мора користити корисничко окружење OCP\\Share_Backend", "Sharing backend %s not found" : "Позадина за дељење %s није пронађена", "Sharing backend for %s not found" : "Позадина за дељење за %s није пронађена", - "Sharing %s failed, because the user %s is the original sharer" : "Дељење %s није успело зато што је корисник %s изворни делилац", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Дељење %s није успело зато што дозволе превазилазе дозволе гарантоване за %s", "Sharing %s failed, because resharing is not allowed" : "Дељење %s није успело зато што даље дељење није дозвољено", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Дељење %s није успело зато што позадина дељења за %s није могла да нађе извор", "Sharing %s failed, because the file could not be found in the file cache" : "Дељење %s није успело зато што фајл није нађен у кешу фајлова", "Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.", + "Apps" : "Апликације", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“", "A valid username must be provided" : "Морате унети исправно корисничко име", "A valid password must be provided" : "Морате унети исправну лозинку", diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json index 2e76f5e9000..bc8932d6aaf 100644 --- a/lib/l10n/sr.json +++ b/lib/l10n/sr.json @@ -47,6 +47,7 @@ "Can't read file" : "Не могу да читам фајл", "App directory already exists" : "Директоријум апликација већ постоји", "Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s", + "Archive does not contain a directory named %s" : "Архива не садржи директоријум назива %s", "No source specified when installing app" : "Није наведен извор за инсталирање апликације", "No href specified when installing app from http" : "Није наведена адреса за инсталирање апликације преко http", "No path specified when installing app from local file" : "Није наведена путања за инсталирање апликације са локалног фајла", @@ -84,10 +85,10 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i", "Sharing %s failed, because the file does not exist" : "Дељење %s није успело зато што фајл не постоји", "You are not allowed to share %s" : "Није вам дозвољено да делите %s", - "Sharing %s failed, because the user %s is the item owner" : "Дељење %s није успело зато што је корисник %s власник дељене ставке", "Sharing %s failed, because the user %s does not exist" : "Дељење %s није успело зато што не постоји корисник %s", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Дељење %s није успело зато што корисник %s није члан групе која је %s члан ", "Sharing %s failed, because this item is already shared with %s" : "Дељење %s није успело зато што се ова ставка већ дели са %s", + "Sharing %s failed, because this item is already shared with user %s" : "Дељење %s није успело зато што се ова ставка већ дели са корисником %s", "Sharing %s failed, because the group %s does not exist" : "Дељење %s није успело зато што непостоји група %s", "Sharing %s failed, because %s is not a member of the group %s" : "Дељење %s није успело зато што %s није члан групе %s", "You need to provide a password to create a public link, only protected links are allowed" : "Морате да обезбедите лозинку за креирање јавне везе, дозвољене су само заштићене везе", @@ -102,12 +103,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Позадина дељења %s мора користити корисничко окружење OCP\\Share_Backend", "Sharing backend %s not found" : "Позадина за дељење %s није пронађена", "Sharing backend for %s not found" : "Позадина за дељење за %s није пронађена", - "Sharing %s failed, because the user %s is the original sharer" : "Дељење %s није успело зато што је корисник %s изворни делилац", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Дељење %s није успело зато што дозволе превазилазе дозволе гарантоване за %s", "Sharing %s failed, because resharing is not allowed" : "Дељење %s није успело зато што даље дељење није дозвољено", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Дељење %s није успело зато што позадина дељења за %s није могла да нађе извор", "Sharing %s failed, because the file could not be found in the file cache" : "Дељење %s није успело зато што фајл није нађен у кешу фајлова", "Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.", + "Apps" : "Апликације", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“", "A valid username must be provided" : "Морате унети исправно корисничко име", "A valid password must be provided" : "Морате унети исправну лозинку", diff --git a/lib/l10n/sr@latin.js b/lib/l10n/sr@latin.js index e677404bf23..a8c4c261a09 100644 --- a/lib/l10n/sr@latin.js +++ b/lib/l10n/sr@latin.js @@ -14,6 +14,7 @@ OC.L10N.register( "seconds ago" : "Pre par sekundi", "Authentication error" : "Greška pri autentifikaciji", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s neće raditi kako treba na ovoj platformi. Koristite na sopstvenu odgovornost.", - "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera." + "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera.", + "Apps" : "Programi" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/lib/l10n/sr@latin.json b/lib/l10n/sr@latin.json index 3e2d9659ef5..a85ebf5d92c 100644 --- a/lib/l10n/sr@latin.json +++ b/lib/l10n/sr@latin.json @@ -12,6 +12,7 @@ "seconds ago" : "Pre par sekundi", "Authentication error" : "Greška pri autentifikaciji", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s neće raditi kako treba na ovoj platformi. Koristite na sopstvenu odgovornost.", - "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera." + "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera.", + "Apps" : "Programi" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js index c3b2d0655df..1ef22d855cb 100644 --- a/lib/l10n/sv.js +++ b/lib/l10n/sv.js @@ -70,7 +70,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Misslyckades dela ut %s då backend inte tillåter delningar från typ %i", "Sharing %s failed, because the file does not exist" : "Delning av %s misslyckades på grund av att filen inte existerar", "You are not allowed to share %s" : "Du har inte rätt att dela %s", - "Sharing %s failed, because the user %s is the item owner" : "Delning %s misslyckades därför att användaren %s är den som äger objektet", "Sharing %s failed, because the user %s does not exist" : "Delning %s misslyckades därför att användaren %s inte existerar", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i", "Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s", @@ -87,12 +86,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delningsgränssnittet %s måste implementera gränssnittet OCP\\Share_Backend", "Sharing backend %s not found" : "Delningsgränssnittet %s hittades inte", "Sharing backend for %s not found" : "Delningsgränssnittet för %s hittades inte", - "Sharing %s failed, because the user %s is the original sharer" : "Delning %s misslyckades därför att användaren %s är den som delade objektet först", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delning %s misslyckades därför att rättigheterna överskrider de rättigheter som är tillåtna för %s", "Sharing %s failed, because resharing is not allowed" : "Delning %s misslyckades därför att vidaredelning inte är tillåten", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa", "Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen", "Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"", + "Apps" : "Program", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Endast följande tecken är tillåtna i ett användarnamn: \"az\", \"AZ\", \"0-9\", och \"_ @ -.\"", "A valid username must be provided" : "Ett giltigt användarnamn måste anges", "A valid password must be provided" : "Ett giltigt lösenord måste anges", diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json index 5b53e335a79..f58f61b78bd 100644 --- a/lib/l10n/sv.json +++ b/lib/l10n/sv.json @@ -68,7 +68,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Misslyckades dela ut %s då backend inte tillåter delningar från typ %i", "Sharing %s failed, because the file does not exist" : "Delning av %s misslyckades på grund av att filen inte existerar", "You are not allowed to share %s" : "Du har inte rätt att dela %s", - "Sharing %s failed, because the user %s is the item owner" : "Delning %s misslyckades därför att användaren %s är den som äger objektet", "Sharing %s failed, because the user %s does not exist" : "Delning %s misslyckades därför att användaren %s inte existerar", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i", "Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s", @@ -85,12 +84,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delningsgränssnittet %s måste implementera gränssnittet OCP\\Share_Backend", "Sharing backend %s not found" : "Delningsgränssnittet %s hittades inte", "Sharing backend for %s not found" : "Delningsgränssnittet för %s hittades inte", - "Sharing %s failed, because the user %s is the original sharer" : "Delning %s misslyckades därför att användaren %s är den som delade objektet först", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delning %s misslyckades därför att rättigheterna överskrider de rättigheter som är tillåtna för %s", "Sharing %s failed, because resharing is not allowed" : "Delning %s misslyckades därför att vidaredelning inte är tillåten", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa", "Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen", "Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"", + "Apps" : "Program", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Endast följande tecken är tillåtna i ett användarnamn: \"az\", \"AZ\", \"0-9\", och \"_ @ -.\"", "A valid username must be provided" : "Ett giltigt användarnamn måste anges", "A valid password must be provided" : "Ett giltigt lösenord måste anges", diff --git a/lib/l10n/ta_LK.js b/lib/l10n/ta_LK.js index e318c7b9f67..2cbe4d00305 100644 --- a/lib/l10n/ta_LK.js +++ b/lib/l10n/ta_LK.js @@ -14,6 +14,7 @@ OC.L10N.register( "Application is not enabled" : "செயலி இயலுமைப்படுத்தப்படவில்லை", "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Token expired. Please reload page." : "அடையாளவில்லை காலாவதியாகிவிட்டது. தயவுசெய்து பக்கத்தை மீள் ஏற்றுக.", - "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை" + "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை", + "Apps" : "செயலிகள்" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ta_LK.json b/lib/l10n/ta_LK.json index 70bd5c7f965..25e06c38de8 100644 --- a/lib/l10n/ta_LK.json +++ b/lib/l10n/ta_LK.json @@ -12,6 +12,7 @@ "Application is not enabled" : "செயலி இயலுமைப்படுத்தப்படவில்லை", "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Token expired. Please reload page." : "அடையாளவில்லை காலாவதியாகிவிட்டது. தயவுசெய்து பக்கத்தை மீள் ஏற்றுக.", - "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை" + "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை", + "Apps" : "செயலிகள்" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js index 6092f348cb5..e70fcafe0e5 100644 --- a/lib/l10n/th_TH.js +++ b/lib/l10n/th_TH.js @@ -87,7 +87,7 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "การแชร์ %s ล้มเหลวเพราะแบ็กเอนด์ไม่อนุญาตให้แชร์จากไฟล์ประเภท %i", "Sharing %s failed, because the file does not exist" : "การแชร์ %s ล้มเหลวเพราะไม่มีไฟล์นี้อยู่", "You are not allowed to share %s" : "คุณยังไม่ได้รับอนุญาตให้แชร์ %s", - "Sharing %s failed, because the user %s is the item owner" : "การแชร์ %s ล้มเหลวเนื่องจากผู้ใช้ %s เป็นเจ้าของรายการ", + "Sharing %s failed, because you can not share with yourself" : "การแขร์ %s ล้มเหลวเพราะคุณไม่สามารถแชร์ให้กับตัวเอง", "Sharing %s failed, because the user %s does not exist" : "การแชร์ %s ล้มเหลวเนื่องจากไม่ได้มีผู้ใช้ %s อยู่", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "การแชร์ %s ล้มเหลวเนื่องจากผู้ใช้ %s ไม่ได้เป็นสมาชิกของกลุ่มใดๆ %s เป็นสมาชิกของ", "Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s", @@ -106,12 +106,13 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "การแชร์แบ็กเอนด์ %s ต้องใช้อินเตอร์เฟซ OCP\\Share_Backend", "Sharing backend %s not found" : "ไม่พบการแชร์แบ็กเอนด์ %s", "Sharing backend for %s not found" : "ไม่พบการแชร์แบ็กเอนด์สำหรับ %s", - "Sharing %s failed, because the user %s is the original sharer" : "การแชร์ %s ล้มเหลวเนื่องจากผู้ใช้ %s เป็นผู้เริ่มต้นแชร์", + "Sharing failed, because the user %s is the original sharer" : "การแชร์ล้มเหลวเพราะผู้ใช้ %s เป็นต้นฉบับการแชร์นี้", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "การแชร์ %s ล้มเหลวเพราะใช้สิทธิ์เกินที่อนุญาตให้ %s", "Sharing %s failed, because resharing is not allowed" : "การแชร์ %s ล้มเหลวเพราะการแชร์ต่อไม่ได้รับอนุญาต", "Sharing %s failed, because the sharing backend for %s could not find its source" : "การแชร์ %s ล้มเหลวเพราะการแชร์แบ็กเอนด์สำหรับ %s ไม่สามารถหาแหล่งที่มา", "Sharing %s failed, because the file could not be found in the file cache" : "การแชร์ %s ล้มเหลวเพราะไม่พบไฟล์ในแคชไฟล์", "Could not find category \"%s\"" : "ไม่พบหมวดหมู่ \"%s\"", + "Apps" : "แอปฯ", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ตัวอักษรที่อนุญาตให้ใช้ในชื่อผู้ใช้: \"a-z\", \"A-Z\", \"0-9\" และ \"_.@-\"", "A valid username must be provided" : "จะต้องระบุชื่อผู้ใช้ที่ถูกต้อง", "A valid password must be provided" : "รหัสผ่านที่ถูกต้องจะต้องให้", diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json index a872236a70d..e7b727f0b3a 100644 --- a/lib/l10n/th_TH.json +++ b/lib/l10n/th_TH.json @@ -85,7 +85,7 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "การแชร์ %s ล้มเหลวเพราะแบ็กเอนด์ไม่อนุญาตให้แชร์จากไฟล์ประเภท %i", "Sharing %s failed, because the file does not exist" : "การแชร์ %s ล้มเหลวเพราะไม่มีไฟล์นี้อยู่", "You are not allowed to share %s" : "คุณยังไม่ได้รับอนุญาตให้แชร์ %s", - "Sharing %s failed, because the user %s is the item owner" : "การแชร์ %s ล้มเหลวเนื่องจากผู้ใช้ %s เป็นเจ้าของรายการ", + "Sharing %s failed, because you can not share with yourself" : "การแขร์ %s ล้มเหลวเพราะคุณไม่สามารถแชร์ให้กับตัวเอง", "Sharing %s failed, because the user %s does not exist" : "การแชร์ %s ล้มเหลวเนื่องจากไม่ได้มีผู้ใช้ %s อยู่", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "การแชร์ %s ล้มเหลวเนื่องจากผู้ใช้ %s ไม่ได้เป็นสมาชิกของกลุ่มใดๆ %s เป็นสมาชิกของ", "Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s", @@ -104,12 +104,13 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "การแชร์แบ็กเอนด์ %s ต้องใช้อินเตอร์เฟซ OCP\\Share_Backend", "Sharing backend %s not found" : "ไม่พบการแชร์แบ็กเอนด์ %s", "Sharing backend for %s not found" : "ไม่พบการแชร์แบ็กเอนด์สำหรับ %s", - "Sharing %s failed, because the user %s is the original sharer" : "การแชร์ %s ล้มเหลวเนื่องจากผู้ใช้ %s เป็นผู้เริ่มต้นแชร์", + "Sharing failed, because the user %s is the original sharer" : "การแชร์ล้มเหลวเพราะผู้ใช้ %s เป็นต้นฉบับการแชร์นี้", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "การแชร์ %s ล้มเหลวเพราะใช้สิทธิ์เกินที่อนุญาตให้ %s", "Sharing %s failed, because resharing is not allowed" : "การแชร์ %s ล้มเหลวเพราะการแชร์ต่อไม่ได้รับอนุญาต", "Sharing %s failed, because the sharing backend for %s could not find its source" : "การแชร์ %s ล้มเหลวเพราะการแชร์แบ็กเอนด์สำหรับ %s ไม่สามารถหาแหล่งที่มา", "Sharing %s failed, because the file could not be found in the file cache" : "การแชร์ %s ล้มเหลวเพราะไม่พบไฟล์ในแคชไฟล์", "Could not find category \"%s\"" : "ไม่พบหมวดหมู่ \"%s\"", + "Apps" : "แอปฯ", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ตัวอักษรที่อนุญาตให้ใช้ในชื่อผู้ใช้: \"a-z\", \"A-Z\", \"0-9\" และ \"_.@-\"", "A valid username must be provided" : "จะต้องระบุชื่อผู้ใช้ที่ถูกต้อง", "A valid password must be provided" : "รหัสผ่านที่ถูกต้องจะต้องให้", diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js index 93f2908a69f..2a3e139d892 100644 --- a/lib/l10n/tr.js +++ b/lib/l10n/tr.js @@ -87,7 +87,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Arka uç %i türündeki paylaşımlara izin vermediğinden %s paylaşımı başarısız", "Sharing %s failed, because the file does not exist" : "%s paylaşımı, dosya mevcut olmadığından başarısız oldu", "You are not allowed to share %s" : "%s paylaşımını yapma izniniz yok", - "Sharing %s failed, because the user %s is the item owner" : "%s paylaşımı, %s öge sahibi olduğundan başarısız oldu", "Sharing %s failed, because the user %s does not exist" : "%s paylaşımı, %s kullanıcısı mevcut olmadığından başarısız oldu", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s paylaşımı, %s kullanıcısının %s üyeliklerinden birine sahip olmadığından başarısız oldu", "Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu", @@ -106,12 +105,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Paylaşma arka ucu %s OCP\\Share_Backend arayüzünü desteklemeli", "Sharing backend %s not found" : "Paylaşım arka ucu %s bulunamadı", "Sharing backend for %s not found" : "%s için paylaşım arka ucu bulunamadı", - "Sharing %s failed, because the user %s is the original sharer" : "%s paylaşımı, %s kullanıcısı özgün paylaşan kişi olduğundan başarısız oldu", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s paylaşımı, izinler %s için verilen izinleri aştığından dolayı başarısız oldu", "Sharing %s failed, because resharing is not allowed" : "%s paylaşımı, tekrar paylaşımın izin verilmemesinden dolayı başarısız oldu", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s paylaşımı, %s için arka ucun kaynağını bulamamasından dolayı başarısız oldu", "Sharing %s failed, because the file could not be found in the file cache" : "%s paylaşımı, dosyanın dosya önbelleğinde bulunamamasınndan dolayı başarısız oldu", "Could not find category \"%s\"" : "\"%s\" kategorisi bulunamadı", + "Apps" : "Uygulamalar", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kullanıcı adında sadece bu karakterlere izin verilmektedir: \"a-z\", \"A-Z\", \"0-9\", ve \"_.@-\"", "A valid username must be provided" : "Geçerli bir kullanıcı adı mutlaka sağlanmalı", "A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı", diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json index bb3cd291e64..1c808ab231b 100644 --- a/lib/l10n/tr.json +++ b/lib/l10n/tr.json @@ -85,7 +85,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Arka uç %i türündeki paylaşımlara izin vermediğinden %s paylaşımı başarısız", "Sharing %s failed, because the file does not exist" : "%s paylaşımı, dosya mevcut olmadığından başarısız oldu", "You are not allowed to share %s" : "%s paylaşımını yapma izniniz yok", - "Sharing %s failed, because the user %s is the item owner" : "%s paylaşımı, %s öge sahibi olduğundan başarısız oldu", "Sharing %s failed, because the user %s does not exist" : "%s paylaşımı, %s kullanıcısı mevcut olmadığından başarısız oldu", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "%s paylaşımı, %s kullanıcısının %s üyeliklerinden birine sahip olmadığından başarısız oldu", "Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu", @@ -104,12 +103,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Paylaşma arka ucu %s OCP\\Share_Backend arayüzünü desteklemeli", "Sharing backend %s not found" : "Paylaşım arka ucu %s bulunamadı", "Sharing backend for %s not found" : "%s için paylaşım arka ucu bulunamadı", - "Sharing %s failed, because the user %s is the original sharer" : "%s paylaşımı, %s kullanıcısı özgün paylaşan kişi olduğundan başarısız oldu", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s paylaşımı, izinler %s için verilen izinleri aştığından dolayı başarısız oldu", "Sharing %s failed, because resharing is not allowed" : "%s paylaşımı, tekrar paylaşımın izin verilmemesinden dolayı başarısız oldu", "Sharing %s failed, because the sharing backend for %s could not find its source" : "%s paylaşımı, %s için arka ucun kaynağını bulamamasından dolayı başarısız oldu", "Sharing %s failed, because the file could not be found in the file cache" : "%s paylaşımı, dosyanın dosya önbelleğinde bulunamamasınndan dolayı başarısız oldu", "Could not find category \"%s\"" : "\"%s\" kategorisi bulunamadı", + "Apps" : "Uygulamalar", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kullanıcı adında sadece bu karakterlere izin verilmektedir: \"a-z\", \"A-Z\", \"0-9\", ve \"_.@-\"", "A valid username must be provided" : "Geçerli bir kullanıcı adı mutlaka sağlanmalı", "A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı", diff --git a/lib/l10n/ug.js b/lib/l10n/ug.js index aaa90377419..f497ed3fbb9 100644 --- a/lib/l10n/ug.js +++ b/lib/l10n/ug.js @@ -7,6 +7,7 @@ OC.L10N.register( "today" : "بۈگۈن", "yesterday" : "تۈنۈگۈن", "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", + "Apps" : "ئەپلەر", "A valid username must be provided" : "چوقۇم ئىناۋەتلىك ئىشلەتكۈچى ئىسمىدىن بىرنى تەمىنلەش كېرەك", "A valid password must be provided" : "چوقۇم ئىناۋەتلىك ئىم تەمىنلەش كېرەك" }, diff --git a/lib/l10n/ug.json b/lib/l10n/ug.json index 4521f615d62..b847810b2c4 100644 --- a/lib/l10n/ug.json +++ b/lib/l10n/ug.json @@ -5,6 +5,7 @@ "today" : "بۈگۈن", "yesterday" : "تۈنۈگۈن", "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", + "Apps" : "ئەپلەر", "A valid username must be provided" : "چوقۇم ئىناۋەتلىك ئىشلەتكۈچى ئىسمىدىن بىرنى تەمىنلەش كېرەك", "A valid password must be provided" : "چوقۇم ئىناۋەتلىك ئىم تەمىنلەش كېرەك" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js index 7c90934c71f..05816691ed9 100644 --- a/lib/l10n/uk.js +++ b/lib/l10n/uk.js @@ -79,7 +79,6 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "Не вдалося поділитися %s, загальний доступ не допускає публікації з елементів типу %i", "Sharing %s failed, because the file does not exist" : "Не вдалося поділитися %s, оскільки файл не існує", "You are not allowed to share %s" : "Вам заборонено поширювати %s", - "Sharing %s failed, because the user %s is the item owner" : "Не вдалося поділитися з %s, оскільки %s вже є володарем", "Sharing %s failed, because the user %s does not exist" : "Не вдалося поділитися з %s, оскільки користувач %s не існує", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Не вдалося поділитися %s, оскільки користувач %s не є членом будь-якої групи в яку входить %s", "Sharing %s failed, because this item is already shared with %s" : "Не вдалося поділитися %s, оскільки файл вже в загальному доступі з %s", @@ -97,12 +96,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend загального доступу %s повинен реалізовувати інтерфейс OCP\\Share_Backend", "Sharing backend %s not found" : "Backend загального доступу %s не знайдено", "Sharing backend for %s not found" : "Бекенд загального доступу для %s не знайдено", - "Sharing %s failed, because the user %s is the original sharer" : "Не вдалося поділитися %s, спочатку елементом поділився %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Не вдалося поділитися %s, права перевищують надані права доступу %s", "Sharing %s failed, because resharing is not allowed" : "Не вдалося поділитися %s, перевідкриття доступу заборонено", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Не вдалося поділитися %s, backend загального доступу не знайшов шлях до %s", "Sharing %s failed, because the file could not be found in the file cache" : "Не вдалося поділитися %s, елемент не знайдено у файловому кеші.", "Could not find category \"%s\"" : "Не вдалося знайти категорію \"%s\"", + "Apps" : "Додатки", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Тільки такі символи допускаються в імені користувача: \"az\", \"AZ\", \"0-9\", і \"_.@ -\"", "A valid username must be provided" : "Потрібно задати вірне ім'я користувача", "A valid password must be provided" : "Потрібно задати вірний пароль", diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json index f0ca3a30641..267c0f39bde 100644 --- a/lib/l10n/uk.json +++ b/lib/l10n/uk.json @@ -77,7 +77,6 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "Не вдалося поділитися %s, загальний доступ не допускає публікації з елементів типу %i", "Sharing %s failed, because the file does not exist" : "Не вдалося поділитися %s, оскільки файл не існує", "You are not allowed to share %s" : "Вам заборонено поширювати %s", - "Sharing %s failed, because the user %s is the item owner" : "Не вдалося поділитися з %s, оскільки %s вже є володарем", "Sharing %s failed, because the user %s does not exist" : "Не вдалося поділитися з %s, оскільки користувач %s не існує", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Не вдалося поділитися %s, оскільки користувач %s не є членом будь-якої групи в яку входить %s", "Sharing %s failed, because this item is already shared with %s" : "Не вдалося поділитися %s, оскільки файл вже в загальному доступі з %s", @@ -95,12 +94,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend загального доступу %s повинен реалізовувати інтерфейс OCP\\Share_Backend", "Sharing backend %s not found" : "Backend загального доступу %s не знайдено", "Sharing backend for %s not found" : "Бекенд загального доступу для %s не знайдено", - "Sharing %s failed, because the user %s is the original sharer" : "Не вдалося поділитися %s, спочатку елементом поділився %s", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Не вдалося поділитися %s, права перевищують надані права доступу %s", "Sharing %s failed, because resharing is not allowed" : "Не вдалося поділитися %s, перевідкриття доступу заборонено", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Не вдалося поділитися %s, backend загального доступу не знайшов шлях до %s", "Sharing %s failed, because the file could not be found in the file cache" : "Не вдалося поділитися %s, елемент не знайдено у файловому кеші.", "Could not find category \"%s\"" : "Не вдалося знайти категорію \"%s\"", + "Apps" : "Додатки", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Тільки такі символи допускаються в імені користувача: \"az\", \"AZ\", \"0-9\", і \"_.@ -\"", "A valid username must be provided" : "Потрібно задати вірне ім'я користувача", "A valid password must be provided" : "Потрібно задати вірний пароль", diff --git a/lib/l10n/ur_PK.js b/lib/l10n/ur_PK.js index ab5a44ff204..ddf4e058521 100644 --- a/lib/l10n/ur_PK.js +++ b/lib/l10n/ur_PK.js @@ -12,6 +12,7 @@ OC.L10N.register( "last month" : "پچھلے مہنیے", "last year" : "پچھلے سال", "seconds ago" : "سیکنڈز پہلے", - "web services under your control" : "آپ کے اختیار میں ویب سروسیز" + "web services under your control" : "آپ کے اختیار میں ویب سروسیز", + "Apps" : "ایپز" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ur_PK.json b/lib/l10n/ur_PK.json index f81ea27ae01..424c62aed86 100644 --- a/lib/l10n/ur_PK.json +++ b/lib/l10n/ur_PK.json @@ -10,6 +10,7 @@ "last month" : "پچھلے مہنیے", "last year" : "پچھلے سال", "seconds ago" : "سیکنڈز پہلے", - "web services under your control" : "آپ کے اختیار میں ویب سروسیز" + "web services under your control" : "آپ کے اختیار میں ویب سروسیز", + "Apps" : "ایپز" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/vi.js b/lib/l10n/vi.js index e467f4383c4..7f53b88bade 100644 --- a/lib/l10n/vi.js +++ b/lib/l10n/vi.js @@ -22,6 +22,7 @@ OC.L10N.register( "Authentication error" : "Lỗi xác thực", "Token expired. Please reload page." : "Mã Token đã hết hạn. Hãy tải lại trang.", "%s shared »%s« with you" : "%s đã chia sẻ »%s« với bạn", - "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\"" + "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\"", + "Apps" : "Ứng dụng" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/vi.json b/lib/l10n/vi.json index f3dd43a290a..bcff243c440 100644 --- a/lib/l10n/vi.json +++ b/lib/l10n/vi.json @@ -20,6 +20,7 @@ "Authentication error" : "Lỗi xác thực", "Token expired. Please reload page." : "Mã Token đã hết hạn. Hãy tải lại trang.", "%s shared »%s« with you" : "%s đã chia sẻ »%s« với bạn", - "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\"" + "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\"", + "Apps" : "Ứng dụng" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js index 4e4ad0478c1..f1caa61b46d 100644 --- a/lib/l10n/zh_CN.js +++ b/lib/l10n/zh_CN.js @@ -54,7 +54,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s 向您分享了 »%s«", "Sharing %s failed, because the file does not exist" : "共享 %s 失败,因为文件不存在。", "You are not allowed to share %s" : "您无权分享 %s", - "Sharing %s failed, because the user %s is the item owner" : "共享 %s 失败,因为用户 %s 是对象的拥有者", "Sharing %s failed, because the user %s does not exist" : "共享 %s 失败,因为用户 %s 不存在", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "共享 %s 失败,因为用户 %s 不是 %s 所属的任何组的用户", "Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为它已经共享给 %s", @@ -67,12 +66,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "共享后端 %s 必须实现 OCP\\Share_Backend 接口", "Sharing backend %s not found" : "未找到共享后端 %s", "Sharing backend for %s not found" : "%s 的共享后端未找到", - "Sharing %s failed, because the user %s is the original sharer" : "共享 %s 失败,因为用户 %s 不是原始共享者", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "共享 %s 失败,因为权限超过了 %s 已有权限", "Sharing %s failed, because resharing is not allowed" : "共享 %s 失败,因为不允许二次共享", "Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败,因为 %s 使用的共享后端未找到它的来源", "Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败,因为未在文件缓存中找到文件。", "Could not find category \"%s\"" : "无法找到分类 \"%s\"", + "Apps" : "应用", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "用户名只允许使用以下字符:“a-z”,“A-Z”,“0-9”,和“_.@-”", "A valid username must be provided" : "必须提供合法的用户名", "A valid password must be provided" : "必须提供合法的密码", diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json index 097f7d4d54a..9e410e64a71 100644 --- a/lib/l10n/zh_CN.json +++ b/lib/l10n/zh_CN.json @@ -52,7 +52,6 @@ "%s shared »%s« with you" : "%s 向您分享了 »%s«", "Sharing %s failed, because the file does not exist" : "共享 %s 失败,因为文件不存在。", "You are not allowed to share %s" : "您无权分享 %s", - "Sharing %s failed, because the user %s is the item owner" : "共享 %s 失败,因为用户 %s 是对象的拥有者", "Sharing %s failed, because the user %s does not exist" : "共享 %s 失败,因为用户 %s 不存在", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "共享 %s 失败,因为用户 %s 不是 %s 所属的任何组的用户", "Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为它已经共享给 %s", @@ -65,12 +64,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "共享后端 %s 必须实现 OCP\\Share_Backend 接口", "Sharing backend %s not found" : "未找到共享后端 %s", "Sharing backend for %s not found" : "%s 的共享后端未找到", - "Sharing %s failed, because the user %s is the original sharer" : "共享 %s 失败,因为用户 %s 不是原始共享者", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "共享 %s 失败,因为权限超过了 %s 已有权限", "Sharing %s failed, because resharing is not allowed" : "共享 %s 失败,因为不允许二次共享", "Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败,因为 %s 使用的共享后端未找到它的来源", "Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败,因为未在文件缓存中找到文件。", "Could not find category \"%s\"" : "无法找到分类 \"%s\"", + "Apps" : "应用", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "用户名只允许使用以下字符:“a-z”,“A-Z”,“0-9”,和“_.@-”", "A valid username must be provided" : "必须提供合法的用户名", "A valid password must be provided" : "必须提供合法的密码", diff --git a/lib/l10n/zh_HK.js b/lib/l10n/zh_HK.js index f1a4857e44d..be7b201b756 100644 --- a/lib/l10n/zh_HK.js +++ b/lib/l10n/zh_HK.js @@ -13,6 +13,7 @@ OC.L10N.register( "last year" : "上年", "_%n hour ago_::_%n hours ago_" : ["%n 小時前"], "_%n minute ago_::_%n minutes ago_" : ["%n 分鐘前"], - "seconds ago" : "秒前" + "seconds ago" : "秒前", + "Apps" : "軟件" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/zh_HK.json b/lib/l10n/zh_HK.json index e355ca30a41..dbd3df86703 100644 --- a/lib/l10n/zh_HK.json +++ b/lib/l10n/zh_HK.json @@ -11,6 +11,7 @@ "last year" : "上年", "_%n hour ago_::_%n hours ago_" : ["%n 小時前"], "_%n minute ago_::_%n minutes ago_" : ["%n 分鐘前"], - "seconds ago" : "秒前" + "seconds ago" : "秒前", + "Apps" : "軟件" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js index 3e761604d77..c379659e05f 100644 --- a/lib/l10n/zh_TW.js +++ b/lib/l10n/zh_TW.js @@ -60,7 +60,6 @@ OC.L10N.register( "%s shared »%s« with you" : "%s 與您分享了 %s", "Sharing %s failed, because the file does not exist" : "分享 %s 失敗,因為檔案不存在", "You are not allowed to share %s" : "你不被允許分享 %s", - "Sharing %s failed, because the user %s is the item owner" : "分享 %s 失敗,因為 %s 才是此項目的擁有者", "Sharing %s failed, because the user %s does not exist" : "分享 %s 失敗,因為使用者 %s 不存在", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "分享 %s 失敗,使用者 %s 並不屬於該項目擁有者 %s 所隸屬的任何一個群組", "Sharing %s failed, because this item is already shared with %s" : "分享 %s 失敗,因為此項目目前已經與 %s 分享", @@ -76,12 +75,12 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享後端 %s 必須實作 OCP\\Share_Backend interface", "Sharing backend %s not found" : "找不到分享後端 %s", "Sharing backend for %s not found" : "找不到 %s 的分享後端", - "Sharing %s failed, because the user %s is the original sharer" : "分享 %s 失敗,因為使用者 %s 即是原本的分享者", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "分享 %s 失敗,因為權限設定超出了授權給 %s 的範圍", "Sharing %s failed, because resharing is not allowed" : "分享 %s 失敗,不允許重複分享", "Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失敗,因為 %s 的分享後端找不到它的來源", "Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失敗,因為在快取中找不到該檔案", "Could not find category \"%s\"" : "找不到分類:\"%s\"", + "Apps" : "應用程式", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-\"", "A valid username must be provided" : "必須提供一個有效的用戶名", "A valid password must be provided" : "一定要提供一個有效的密碼", diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json index 2e0de903735..3b76e8a8638 100644 --- a/lib/l10n/zh_TW.json +++ b/lib/l10n/zh_TW.json @@ -58,7 +58,6 @@ "%s shared »%s« with you" : "%s 與您分享了 %s", "Sharing %s failed, because the file does not exist" : "分享 %s 失敗,因為檔案不存在", "You are not allowed to share %s" : "你不被允許分享 %s", - "Sharing %s failed, because the user %s is the item owner" : "分享 %s 失敗,因為 %s 才是此項目的擁有者", "Sharing %s failed, because the user %s does not exist" : "分享 %s 失敗,因為使用者 %s 不存在", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "分享 %s 失敗,使用者 %s 並不屬於該項目擁有者 %s 所隸屬的任何一個群組", "Sharing %s failed, because this item is already shared with %s" : "分享 %s 失敗,因為此項目目前已經與 %s 分享", @@ -74,12 +73,12 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享後端 %s 必須實作 OCP\\Share_Backend interface", "Sharing backend %s not found" : "找不到分享後端 %s", "Sharing backend for %s not found" : "找不到 %s 的分享後端", - "Sharing %s failed, because the user %s is the original sharer" : "分享 %s 失敗,因為使用者 %s 即是原本的分享者", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "分享 %s 失敗,因為權限設定超出了授權給 %s 的範圍", "Sharing %s failed, because resharing is not allowed" : "分享 %s 失敗,不允許重複分享", "Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失敗,因為 %s 的分享後端找不到它的來源", "Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失敗,因為在快取中找不到該檔案", "Could not find category \"%s\"" : "找不到分類:\"%s\"", + "Apps" : "應用程式", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-\"", "A valid username must be provided" : "必須提供一個有效的用戶名", "A valid password must be provided" : "一定要提供一個有效的密碼", diff --git a/lib/private/activity/event.php b/lib/private/activity/event.php index fe6fc485b7b..413ff613186 100644 --- a/lib/private/activity/event.php +++ b/lib/private/activity/event.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Phil Davis <phil.davis@inf.org> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -90,7 +91,7 @@ class Event implements IEvent { } /** - * Set the author of the activity + * Set the timestamp of the activity * * @param int $timestamp * @return IEvent diff --git a/lib/private/activitymanager.php b/lib/private/activitymanager.php index fc250173536..fadfedf277f 100644 --- a/lib/private/activitymanager.php +++ b/lib/private/activitymanager.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Lukas Reschke <lukas@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -44,6 +43,12 @@ class ActivityManager implements IManager { /** @var IConfig */ protected $config; + /** @var string */ + protected $formattingObjectType; + + /** @var int */ + protected $formattingObjectId; + /** * constructor of the controller * @@ -304,6 +309,24 @@ class ActivityManager implements IManager { } /** + * @param string $type + * @param int $id + */ + public function setFormattingObject($type, $id) { + $this->formattingObjectType = $type; + $this->formattingObjectId = $id; + } + + /** + * @return bool + */ + public function isFormattingFilteredObject() { + return 'filter' === $this->request->getParam('filter') + && $this->formattingObjectType === $this->request->getParam('objecttype') + && $this->formattingObjectId === $this->request->getParam('objectid'); + } + + /** * @param string $app * @param string $text * @param array $params diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index 63cc92601bb..7c2037e8048 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -119,6 +119,17 @@ class AllConfig implements \OCP\IConfig { } /** + * Looks up a system wide defined value and filters out sensitive data + * + * @param string $key the key of the value, under which it was saved + * @param mixed $default the default value to be returned if the value isn't set + * @return mixed the value or $default + */ + public function getFilteredSystemValue($key, $default = '') { + return $this->systemConfig->getFilteredValue($key, $default); + } + + /** * Delete a system wide defined value * * @param string $key the key of the value, under which it was saved diff --git a/lib/private/api.php b/lib/private/api.php index fde2020bcfa..6d7354c7193 100644 --- a/lib/private/api.php +++ b/lib/private/api.php @@ -1,4 +1,34 @@ <?php +/** + * @author Bart Visscher <bartv@thisnet.nl> + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @author Björn Schießle <schiessle@owncloud.com> + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> + * @author Michael Gapczynski <GapczynskiM@gmail.com> + * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Tom Needham <tom@owncloud.com> + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ use OCP\API; use OCP\AppFramework\Http; @@ -360,7 +390,7 @@ class OC_API { $meta = $result->getMeta(); $data = $result->getData(); - if (self::isV2()) { + if (self::isV2(\OC::$server->getRequest())) { $statusCode = self::mapStatusCodes($result->getStatusCode()); if (!is_null($statusCode)) { $meta['statuscode'] = $statusCode; @@ -423,13 +453,13 @@ class OC_API { } /** - * @return boolean + * @param \OCP\IRequest $request + * @return bool */ - private static function isV2() { - $request = \OC::$server->getRequest(); + protected static function isV2(\OCP\IRequest $request) { $script = $request->getScriptName(); - return $script === '/ocs/v2.php'; + return substr($script, -11) === '/ocs/v2.php'; } /** diff --git a/lib/private/app.php b/lib/private/app.php index 6c9f7615228..718adcd25c1 100644 --- a/lib/private/app.php +++ b/lib/private/app.php @@ -18,6 +18,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Markus Goetz <markus@woboq.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author RealRancor <Fisch.666@gmx.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Sam Tuke <mail@samtuke.com> @@ -411,7 +412,7 @@ class OC_App { /** * Returns the Settings Navigation * - * @return string + * @return string[] * * This function returns an array containing all settings pages added. The * entries are sorted by the key 'order' ascending. @@ -837,7 +838,7 @@ class OC_App { $info['active'] = $active; - if (isset($info['shipped']) and ($info['shipped'] == 'true')) { + if (self::isShipped($app)) { $info['internal'] = true; $info['level'] = self::officialApp; $info['removable'] = false; diff --git a/lib/private/app/appmanager.php b/lib/private/app/appmanager.php index 75b1c0a7865..8fb197e73ff 100644 --- a/lib/private/app/appmanager.php +++ b/lib/private/app/appmanager.php @@ -4,6 +4,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/app/codechecker/deprecationcheck.php b/lib/private/app/codechecker/deprecationcheck.php index 3b6dc968bb5..1d287edc858 100644 --- a/lib/private/app/codechecker/deprecationcheck.php +++ b/lib/private/app/codechecker/deprecationcheck.php @@ -34,6 +34,8 @@ class DeprecationCheck extends AbstractCheck implements ICheck { */ protected function getLocalClasses() { return [ + 'OC_JSON' => '8.2.0', + 'OCP\Config' => '8.0.0', 'OCP\Contacts' => '8.1.0', 'OCP\DB' => '8.1.0', @@ -49,6 +51,15 @@ class DeprecationCheck extends AbstractCheck implements ICheck { */ protected function getLocalConstants() { return [ + 'OC_API::GUEST_AUTH' => '8.2.0', + 'OC_API::USER_AUTH' => '8.2.0', + 'OC_API::SUBADMIN_AUTH' => '8.2.0', + 'OC_API::ADMIN_AUTH' => '8.2.0', + 'OC_API::RESPOND_UNAUTHORISED' => '8.2.0', + 'OC_API::RESPOND_SERVER_ERROR' => '8.2.0', + 'OC_API::RESPOND_NOT_FOUND' => '8.2.0', + 'OC_API::RESPOND_UNKNOWN_ERROR' => '8.2.0', + 'OCP::PERMISSION_CREATE' => '8.0.0', 'OCP::PERMISSION_READ' => '8.0.0', 'OCP::PERMISSION_UPDATE' => '8.0.0', @@ -80,8 +91,13 @@ class DeprecationCheck extends AbstractCheck implements ICheck { */ protected function getLocalMethods() { return [ + 'OC_L10N::get' => '8.2.0', + + 'OCP\Activity\IManager::publishActivity' => '8.2.0', + 'OCP\App::register' => '8.1.0', 'OCP\App::addNavigationEntry' => '8.1.0', + 'OCP\App::getActiveNavigationEntry' => '8.2.0', 'OCP\App::setActiveNavigationEntry' => '8.1.0', 'OCP\AppFramework\Controller::params' => '7.0.0', @@ -115,8 +131,12 @@ class DeprecationCheck extends AbstractCheck implements ICheck { 'OCP\IAppConfig::setValue' => '8.0.0', 'OCP\IAppConfig::deleteApp' => '8.0.0', + 'OCP\IDBConnection::createQueryBuilder' => '8.2.0', + 'OCP\IDBConnection::getExpressionBuilder' => '8.2.0', + 'OCP\ISearch::search' => '8.0.0', + 'OCP\IServerContainer::getCache' => '8.2.0', 'OCP\IServerContainer::getDb' => '8.1.0', 'OCP\IServerContainer::getHTTPHelper' => '8.1.0', @@ -128,20 +148,21 @@ class DeprecationCheck extends AbstractCheck implements ICheck { 'OCP\User::logout' => '8.1.0', 'OCP\User::checkPassword' => '8.1.0', - 'OCP\Util::sendMail' => '8.1.0', - 'OCP\Util::formatDate' => '8.0.0', 'OCP\Util::encryptedFiles' => '8.1.0', - 'OCP\Util::linkToRoute' => '8.1.0', - 'OCP\Util::linkTo' => '8.1.0', + 'OCP\Util::formatDate' => '8.0.0', + 'OCP\Util::generateRandomBytes' => '8.1.0', 'OCP\Util::getServerHost' => '8.1.0', 'OCP\Util::getServerProtocol' => '8.1.0', 'OCP\Util::getRequestUri' => '8.1.0', 'OCP\Util::getScriptName' => '8.1.0', 'OCP\Util::imagePath' => '8.1.0', 'OCP\Util::isValidFileName' => '8.1.0', - 'OCP\Util::generateRandomBytes' => '8.1.0', + 'OCP\Util::linkToRoute' => '8.1.0', + 'OCP\Util::linkTo' => '8.1.0', + 'OCP\Util::logException' => '8.2.0', 'OCP\Util::mb_str_replace' => '8.2.0', 'OCP\Util::mb_substr_replace' => '8.2.0', + 'OCP\Util::sendMail' => '8.1.0', ]; } } diff --git a/lib/private/app/codechecker/infochecker.php b/lib/private/app/codechecker/infochecker.php new file mode 100644 index 00000000000..91580bde07d --- /dev/null +++ b/lib/private/app/codechecker/infochecker.php @@ -0,0 +1,146 @@ +<?php +/** + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC\App\CodeChecker; + +use OC\App\InfoParser; +use OC\Hooks\BasicEmitter; + +class InfoChecker extends BasicEmitter { + + /** @var InfoParser */ + private $infoParser; + + private $mandatoryFields = [ + 'author', + 'description', + 'id', + 'licence', + 'name', + ]; + private $optionalFields = [ + 'bugs', + 'category', + 'default_enable', + 'dependencies', + 'documentation', + 'namespace', + 'ocsid', + 'public', + 'remote', + 'repository', + 'require', + 'requiremin', + 'types', + 'version', + 'website', + ]; + private $deprecatedFields = [ + 'info', + 'shipped', + 'standalone', + ]; + + public function __construct(InfoParser $infoParser) { + $this->infoParser = $infoParser; + } + + /** + * @param string $appId + * @return array + */ + public function analyse($appId) { + $appPath = \OC_App::getAppPath($appId); + if ($appPath === false) { + throw new \RuntimeException("No app with given id <$appId> known."); + } + + $errors = []; + + $info = $this->infoParser->parse($appPath . '/appinfo/info.xml'); + + foreach ($info as $key => $value) { + if(is_array($value)) { + $value = json_encode($value); + } + if (in_array($key, $this->mandatoryFields)) { + $this->emit('InfoChecker', 'mandatoryFieldFound', [$key, $value]); + continue; + } + + if (in_array($key, $this->optionalFields)) { + $this->emit('InfoChecker', 'optionalFieldFound', [$key, $value]); + continue; + } + + if (in_array($key, $this->deprecatedFields)) { + // skip empty arrays - empty arrays for remote and public are always added + if($value === '[]' && in_array($key, ['public', 'remote', 'info'])) { + continue; + } + $this->emit('InfoChecker', 'deprecatedFieldFound', [$key, $value]); + continue; + } + + $this->emit('InfoChecker', 'unusedFieldFound', [$key, $value]); + } + + foreach ($this->mandatoryFields as $key) { + if(!isset($info[$key])) { + $this->emit('InfoChecker', 'mandatoryFieldMissing', [$key]); + $errors[] = [ + 'type' => 'mandatoryFieldMissing', + 'field' => $key, + ]; + } + } + + $versionFile = $appPath . '/appinfo/version'; + if (is_file($versionFile)) { + $version = trim(file_get_contents($versionFile)); + if(isset($info['version'])) { + if($info['version'] !== $version) { + $this->emit('InfoChecker', 'differentVersions', + [$version, $info['version']]); + $errors[] = [ + 'type' => 'differentVersions', + 'message' => 'appinfo/version: ' . $version . + ' - appinfo/info.xml: ' . $info['version'], + ]; + } else { + $this->emit('InfoChecker', 'sameVersions', [$versionFile]); + } + } else { + $this->emit('InfoChecker', 'migrateVersion', [$version]); + } + } else { + if(!isset($info['version'])) { + $this->emit('InfoChecker', 'mandatoryFieldMissing', ['version']); + $errors[] = [ + 'type' => 'mandatoryFieldMissing', + 'field' => 'version', + ]; + } + } + + return $errors; + } +} diff --git a/lib/private/app/codechecker/nodevisitor.php b/lib/private/app/codechecker/nodevisitor.php index a22f852f36a..cf850147fd8 100644 --- a/lib/private/app/codechecker/nodevisitor.php +++ b/lib/private/app/codechecker/nodevisitor.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * @@ -166,9 +167,9 @@ class NodeVisitor extends NodeVisitorAbstract { * $c = "OC_API"; * $n = $i::ADMIN_AUTH; */ + } else { + $this->checkBlackListConstant($node->class->toString(), $node->name, $node); } - - $this->checkBlackListConstant($node->class->toString(), $node->name, $node); } } if ($node instanceof Node\Expr\New_) { diff --git a/lib/private/app/codechecker/privatecheck.php b/lib/private/app/codechecker/privatecheck.php index d6f4eb06981..bafcfd1d03e 100644 --- a/lib/private/app/codechecker/privatecheck.php +++ b/lib/private/app/codechecker/privatecheck.php @@ -1,8 +1,6 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/app/codechecker/strongcomparisoncheck.php b/lib/private/app/codechecker/strongcomparisoncheck.php index 7de0fe3e5c3..3072027b258 100644 --- a/lib/private/app/codechecker/strongcomparisoncheck.php +++ b/lib/private/app/codechecker/strongcomparisoncheck.php @@ -1,8 +1,6 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/app/dependencyanalyzer.php b/lib/private/app/dependencyanalyzer.php index dd40e4052a7..5d86368ea83 100644 --- a/lib/private/app/dependencyanalyzer.php +++ b/lib/private/app/dependencyanalyzer.php @@ -2,6 +2,7 @@ /** * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php index cf2a057f224..d1c1e4bfc45 100644 --- a/lib/private/appconfig.php +++ b/lib/private/appconfig.php @@ -5,12 +5,10 @@ * @author Jakob Sack <mail@jakobsack.de> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php index 544da74a010..651b268a35e 100644 --- a/lib/private/appframework/dependencyinjection/dicontainer.php +++ b/lib/private/appframework/dependencyinjection/dicontainer.php @@ -5,6 +5,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> * @@ -78,7 +79,7 @@ class DIContainer extends SimpleContainer implements IAppContainer { }); $this->registerService('OCP\\AppFramework\\Http\\IOutput', function($c){ - return new Output(); + return new Output($this->getServer()->getWebRoot()); }); $this->registerService('OCP\\IAvatarManager', function($c) { diff --git a/lib/private/appframework/http.php b/lib/private/appframework/http.php index dee9818f4bc..f892ee7e5e3 100644 --- a/lib/private/appframework/http.php +++ b/lib/private/appframework/http.php @@ -3,6 +3,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> * diff --git a/lib/private/appframework/http/output.php b/lib/private/appframework/http/output.php index f04157665f8..01636d397b2 100644 --- a/lib/private/appframework/http/output.php +++ b/lib/private/appframework/http/output.php @@ -27,6 +27,15 @@ use OCP\AppFramework\Http\IOutput; * Very thin wrapper class to make output testable */ class Output implements IOutput { + /** @var string */ + private $webRoot; + + /** + * @param $webRoot + */ + public function __construct($webRoot) { + $this->webRoot = $webRoot; + } /** * @param string $out @@ -72,10 +81,11 @@ class Output implements IOutput { * @param string $path * @param string $domain * @param bool $secure - * @param bool $httponly + * @param bool $httpOnly */ - public function setCookie($name, $value, $expire, $path, $domain, $secure, $httponly) { - setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); + public function setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly) { + $path = $this->webRoot ? : '/'; + setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly); } } diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php index b430673f9a9..77785135162 100644 --- a/lib/private/appframework/http/request.php +++ b/lib/private/appframework/http/request.php @@ -6,10 +6,10 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> * @author Vincent Petry <pvince81@owncloud.com> - * @author Robin McCorkell <rmccorkell@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -43,6 +43,7 @@ use OCP\Security\ISecureRandom; class Request implements \ArrayAccess, \Countable, IRequest { const USER_AGENT_IE = '/MSIE/'; + const USER_AGENT_IE_8 = '/MSIE 8.0/'; // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#'; const USER_AGENT_FREEBOX = '#^Mozilla/5\.0$#'; @@ -410,7 +411,9 @@ class Request implements \ArrayAccess, \Countable, IRequest { } } - $this->items['parameters'] = array_merge($this->items['parameters'], $params); + if (is_array($params)) { + $this->items['parameters'] = array_merge($this->items['parameters'], $params); + } $this->contentDecoded = true; } @@ -553,6 +556,27 @@ class Request implements \ArrayAccess, \Countable, IRequest { } /** + * Returns the used HTTP protocol. + * + * @return string HTTP protocol. HTTP/2, HTTP/1.1 or HTTP/1.0. + */ + public function getHttpProtocol() { + $claimedProtocol = strtoupper($this->server['SERVER_PROTOCOL']); + + $validProtocols = [ + 'HTTP/1.0', + 'HTTP/1.1', + 'HTTP/2', + ]; + + if(in_array($claimedProtocol, $validProtocols, true)) { + return $claimedProtocol; + } + + return 'HTTP/1.1'; + } + + /** * Returns the request uri, even if the website uses one or more * reverse proxies * @return string @@ -603,7 +627,7 @@ class Request implements \ArrayAccess, \Countable, IRequest { if (strpos($pathInfo, $name) === 0) { $pathInfo = substr($pathInfo, strlen($name)); } - if($pathInfo === '/'){ + if($pathInfo === false || $pathInfo === '/'){ return ''; } else { return $pathInfo; diff --git a/lib/private/appframework/middleware/security/corsmiddleware.php b/lib/private/appframework/middleware/security/corsmiddleware.php index d7c42cd9b13..74b0dd09974 100644 --- a/lib/private/appframework/middleware/security/corsmiddleware.php +++ b/lib/private/appframework/middleware/security/corsmiddleware.php @@ -1,8 +1,8 @@ <?php /** * @author Bernhard Posselt <dev@bernhard-posselt.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Lukas Reschke <lukas@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/appframework/utility/simplecontainer.php b/lib/private/appframework/utility/simplecontainer.php index 5d7ea48752b..bcae351e023 100644 --- a/lib/private/appframework/utility/simplecontainer.php +++ b/lib/private/appframework/utility/simplecontainer.php @@ -2,9 +2,9 @@ /** * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -45,7 +45,7 @@ class SimpleContainer extends Container implements IContainer { /** * @param ReflectionClass $class the class to instantiate - * @return stdClass the created class + * @return \stdClass the created class */ private function buildClass(ReflectionClass $class) { $constructor = $class->getConstructor(); @@ -74,7 +74,7 @@ class SimpleContainer extends Container implements IContainer { * If a parameter is not registered in the container try to instantiate it * by using reflection to find out how to build the class * @param string $name the class name to resolve - * @return stdClass + * @return \stdClass * @throws QueryException if the class could not be found or instantiated */ public function resolve($name) { diff --git a/lib/private/arrayparser.php b/lib/private/arrayparser.php deleted file mode 100644 index ab94c69cc1f..00000000000 --- a/lib/private/arrayparser.php +++ /dev/null @@ -1,238 +0,0 @@ -<?php -/** - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <icewind@owncloud.com> - * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -namespace OC; - -/** - * Class ArrayParser - * - * @package OC - */ -class ArrayParser { - const TYPE_NUM = 1; - const TYPE_BOOL = 2; - const TYPE_STRING = 3; - const TYPE_ARRAY = 4; - - /** - * @param string $string - * @return array|bool|int|null|string - */ - public function parsePHP($string) { - $string = $this->stripPHPTags($string); - $string = $this->stripAssignAndReturn($string); - return $this->parse($string); - } - - /** - * @param string $string - * @return string - */ - private function stripPHPTags($string) { - $string = trim($string); - if (substr($string, 0, 5) === '<?php') { - $string = substr($string, 5); - } - if (substr($string, -2) === '?>') { - $string = substr($string, 0, -2); - } - return $string; - } - - /** - * @param string $string - * @return string - */ - private function stripAssignAndReturn($string) { - $string = trim($string); - if (substr($string, 0, 6) === 'return') { - $string = substr($string, 6); - } - if (substr($string, 0, 1) === '$') { - list(, $string) = explode('=', $string, 2); - } - return $string; - } - - /** - * @param string $string - * @return array|bool|int|null|string - */ - private function parse($string) { - $string = trim($string); - $string = trim($string, ';'); - switch ($this->getType($string)) { - case self::TYPE_NUM: - return $this->parseNum($string); - case self::TYPE_BOOL: - return $this->parseBool($string); - case self::TYPE_STRING: - return $this->parseString($string); - case self::TYPE_ARRAY: - return $this->parseArray($string); - } - return null; - } - - /** - * @param string $string - * @return int - */ - private function getType($string) { - $string = strtolower($string); - $first = substr($string, 0, 1); - $last = substr($string, -1, 1); - $arrayFirst = substr($string, 0, 5); - if (($first === '"' or $first === "'") and ($last === '"' or $last === "'")) { - return self::TYPE_STRING; - } elseif ($string === 'false' or $string === 'true') { - return self::TYPE_BOOL; - } elseif ($arrayFirst === 'array' and $last === ')') { - return self::TYPE_ARRAY; - } else { - return self::TYPE_NUM; - } - } - - /** - * @param string $string - * @return string - */ - private function parseString($string) { - return substr($string, 1, -1); - } - - /** - * @param string $string - * @return int - */ - private function parseNum($string) { - return intval($string); - } - - /** - * @param string $string - * @return bool - */ - private function parseBool($string) { - $string = strtolower($string); - return $string === 'true'; - } - - /** - * @param string $string - * @return array - */ - private function parseArray($string) { - $body = substr($string, 5); - $body = trim($body); - $body = substr($body, 1, -1); - $items = $this->splitArray($body); - $result = []; - $lastKey = -1; - foreach ($items as $item) { - $item = trim($item); - if ($item) { - if (strpos($item, '=>')) { - list($key, $value) = explode('=>', $item, 2); - $key = $this->parse($key); - $value = $this->parse($value); - } else { - $key = ++$lastKey; - $value = $item; - } - - if (is_numeric($key)) { - $lastKey = $key; - } - $result[$key] = $value; - } - } - return $result; - } - - /** - * @param string $body - * @return array - * @throws \UnexpectedValueException - */ - private function splitArray($body) { - $inSingleQuote = false; //keep track if we are inside quotes - $inDoubleQuote = false; - $bracketDepth = 0; //keep track if we are inside brackets - $parts = []; - $start = 0; - $escaped = false; //keep track if we are after an escape character - $skips = []; //keep track of the escape characters we need to remove from the result - if (substr($body, -1, 1) !== ',') { - $body .= ','; - } - - $bodyLength = strlen($body); - for ($i = 0; $i < $bodyLength; $i++) { - $char = substr($body, $i, 1); - if ($char === '\\') { - if ($escaped) { - array_unshift($skips, $i - 1); - } - $escaped = !$escaped; - } else { - if ($char === '"' and !$inSingleQuote) { - if ($escaped) { - array_unshift($skips, $i - 1); - } else { - $inDoubleQuote = !$inDoubleQuote; - } - } elseif ($char === "'" and !$inDoubleQuote) { - if ($escaped) { - array_unshift($skips, $i - 1); - } else { - $inSingleQuote = !$inSingleQuote; - } - } elseif (!$inDoubleQuote and !$inSingleQuote) { - if ($char === '(') { - $bracketDepth++; - } elseif ($char === ')') { - if ($bracketDepth <= 0) { - throw new \UnexpectedValueException(); - } else { - $bracketDepth--; - } - } elseif ($bracketDepth === 0 and $char === ',') { - $part = substr($body, $start, $i - $start); - foreach ($skips as $skip) { - $part = substr($part, 0, $skip - $start) . substr($part, $skip - $start + 1); - } - $parts[] = $part; - $start = $i + 1; - $skips = []; - } - } - $escaped = false; - } - } - return $parts; - } -} diff --git a/lib/private/assetic/separatorfilter.php b/lib/private/assetic/separatorfilter.php deleted file mode 100644 index ee6d5c11c20..00000000000 --- a/lib/private/assetic/separatorfilter.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -/** - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -namespace OC\Assetic; - -use Assetic\Filter\FilterInterface; -use Assetic\Asset\AssetInterface; - -/** - * Inserts a separator between assets to prevent merge failures - * e.g. missing semicolon at the end of a JS file - */ -class SeparatorFilter implements FilterInterface -{ - /** - * @var string - */ - private $separator; - - /** - * Constructor. - * - * @param string $separator Separator to use between assets - */ - public function __construct($separator = ';') - { - $this->separator = $separator; - } - - public function filterLoad(AssetInterface $asset) - { - } - - public function filterDump(AssetInterface $asset) - { - $asset->setContent($asset->getContent() . $this->separator); - } -} diff --git a/lib/private/backgroundjob/joblist.php b/lib/private/backgroundjob/joblist.php index deadadfb77e..03c9180ddb0 100644 --- a/lib/private/backgroundjob/joblist.php +++ b/lib/private/backgroundjob/joblist.php @@ -4,7 +4,6 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/cache/file.php b/lib/private/cache/file.php index a433b84d7bf..1cda05f28e5 100644 --- a/lib/private/cache/file.php +++ b/lib/private/cache/file.php @@ -1,8 +1,8 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/console/application.php b/lib/private/console/application.php index edfb45c8577..92d787f3d8a 100644 --- a/lib/private/console/application.php +++ b/lib/private/console/application.php @@ -1,6 +1,7 @@ <?php /** * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -64,6 +65,7 @@ class Application { } } else { $output->writeln("ownCloud or one of the apps require upgrade - only a limited number of commands are available"); + $output->writeln("You may use your browser or the occ upgrade command to do the upgrade"); } } else { $output->writeln("ownCloud is not installed - only a limited number of commands are available"); diff --git a/lib/private/db/ocsqliteplatform.php b/lib/private/db/ocsqliteplatform.php index 543f58b90ec..2456d262fe3 100644 --- a/lib/private/db/ocsqliteplatform.php +++ b/lib/private/db/ocsqliteplatform.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/db/querybuilder/quotehelper.php b/lib/private/db/querybuilder/quotehelper.php index 0735f313abc..4b62fee6a6c 100644 --- a/lib/private/db/querybuilder/quotehelper.php +++ b/lib/private/db/querybuilder/quotehelper.php @@ -52,7 +52,7 @@ class QuoteHelper { return (string) $string; } - if ($string === null || $string === '*') { + if ($string === null || $string === 'null' || $string === '*') { return $string; } diff --git a/lib/private/encryption/decryptall.php b/lib/private/encryption/decryptall.php index e59be17886d..e19ee6b745f 100644 --- a/lib/private/encryption/decryptall.php +++ b/lib/private/encryption/decryptall.php @@ -80,6 +80,11 @@ class DecryptAll { $this->input = $input; $this->output = $output; + if (!empty($user) && $this->userManager->userExists($user) === false) { + $this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again'); + return false; + } + $this->output->writeln('prepare encryption modules...'); if ($this->prepareEncryptionModules($user) === false) { return false; @@ -114,6 +119,9 @@ class DecryptAll { foreach ($encryptionModules as $moduleDesc) { /** @var IEncryptionModule $module */ $module = call_user_func($moduleDesc['callback']); + $this->output->writeln(''); + $this->output->writeln('Prepare "' . $module->getDisplayName() . '"'); + $this->output->writeln(''); if ($module->prepareDecryptAll($this->input, $this->output, $user) === false) { $this->output->writeln('Module "' . $moduleDesc['displayName'] . '" does not support the functionality to decrypt all files again or the initialization of the module failed!'); return false; diff --git a/lib/private/encryption/hookmanager.php b/lib/private/encryption/hookmanager.php index d096b7ff3ad..8969379c957 100644 --- a/lib/private/encryption/hookmanager.php +++ b/lib/private/encryption/hookmanager.php @@ -1,7 +1,6 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/encryption/keys/storage.php b/lib/private/encryption/keys/storage.php index d0c094538b0..e21fd62e366 100644 --- a/lib/private/encryption/keys/storage.php +++ b/lib/private/encryption/keys/storage.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/encryption/manager.php b/lib/private/encryption/manager.php index c004dfda0d9..d38ec6684a6 100644 --- a/lib/private/encryption/manager.php +++ b/lib/private/encryption/manager.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Jan-Christoph Borchardt <hey@jancborchardt.net> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/encryption/update.php b/lib/private/encryption/update.php index 125946ab266..64cccc16ed8 100644 --- a/lib/private/encryption/update.php +++ b/lib/private/encryption/update.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php index 90ae8259972..ef500883865 100644 --- a/lib/private/encryption/util.php +++ b/lib/private/encryption/util.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Jan-Christoph Borchardt <hey@jancborchardt.net> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/eventsource.php b/lib/private/eventsource.php index e2be808e726..c076b87ddd9 100644 --- a/lib/private/eventsource.php +++ b/lib/private/eventsource.php @@ -2,6 +2,7 @@ /** * @author Bart Visscher <bartv@thisnet.nl> * @author Felix Moeller <mail@felixmoeller.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> diff --git a/lib/private/files.php b/lib/private/files.php index 658e708e5de..919ca4ba71c 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -1,27 +1,22 @@ <?php /** - * @author Andreas Fischer <bantu@owncloud.com> * @author Arthur Schiwon <blizzz@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Björn Schießle <schiessle@owncloud.com> - * @author dratini0 <dratini0@gmail.com> * @author Frank Karlitschek <frank@owncloud.org> * @author Jakob Sack <mail@jakobsack.de> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author mvn23 <schopdiedwaas@gmail.com> * @author Nicolai Ehemann <en@enlightened.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @author Thibaut GRIDEL <tgridel@free.fr> * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Valerio Ponte <valerio.ponte@gmail.com> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -40,7 +35,8 @@ * */ -use OC\Lock\NoopLockingProvider; +use OC\Files\View; +use OC\Streamer; use OCP\Lock\ILockingProvider; /** @@ -57,20 +53,16 @@ class OC_Files { /** * @param string $filename * @param string $name - * @param bool $zip */ - private static function sendHeaders($filename, $name, $zip = false) { + private static function sendHeaders($filename, $name) { OC_Response::setContentDispositionHeader($name, 'attachment'); header('Content-Transfer-Encoding: binary'); OC_Response::disableCaching(); - if ($zip) { - header('Content-Type: application/zip'); - } else { - $filesize = \OC\Files\Filesystem::filesize($filename); - header('Content-Type: '.\OC_Helper::getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename))); - if ($filesize > -1) { - OC_Response::setContentLengthHeader($filesize); - } + $fileSize = \OC\Files\Filesystem::filesize($filename); + $type = \OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename)); + header('Content-Type: '.$type); + if ($fileSize > -1) { + OC_Response::setContentLengthHeader($fileSize); } } @@ -79,98 +71,81 @@ class OC_Files { * * @param string $dir * @param string $files ; separated list of files to download - * @param boolean $only_header ; boolean to only send header of the request + * @param boolean $onlyHeader ; boolean to only send header of the request */ - public static function get($dir, $files, $only_header = false) { + public static function get($dir, $files, $onlyHeader = false) { + $view = \OC\Files\Filesystem::getView(); + $getType = self::FILE; + $filename = $dir; + try { - if (is_array($files) && count($files) === 1) { - $files = $files[0]; - } + if (is_array($files) && count($files) === 1) { + $files = $files[0]; + } - if (is_array($files)) { - $get_type = self::ZIP_FILES; - $basename = basename($dir); - if ($basename) { - $name = $basename . '.zip'; - } else { - $name = 'download.zip'; + if (!is_array($files)) { + $filename = $dir . '/' . $files; + if (!$view->is_dir($filename)) { + self::getSingleFile($view, $dir, $files, $onlyHeader); + return; + } } - $filename = $dir . '/' . $name; - } else { - $filename = $dir . '/' . $files; - if (\OC\Files\Filesystem::is_dir($dir . '/' . $files)) { - $get_type = self::ZIP_DIR; - // downloading root ? - if ($files === '') { - $name = 'download.zip'; - } else { - $name = $files . '.zip'; + $name = 'download'; + if (is_array($files)) { + $getType = self::ZIP_FILES; + $basename = basename($dir); + if ($basename) { + $name = $basename; } + $filename = $dir . '/' . $name; } else { - $get_type = self::FILE; - $name = $files; + $filename = $dir . '/' . $files; + $getType = self::ZIP_DIR; + // downloading root ? + if ($files !== '') { + $name = $files; + } } - } - if ($get_type === self::FILE) { - $zip = false; - } else { - $zip = new ZipStreamer\ZipStreamer(); - } - OC_Util::obEnd(); + $streamer = new Streamer(); + OC_Util::obEnd(); - try { - if ($get_type === self::FILE) { - $view->lockFile($filename, ILockingProvider::LOCK_SHARED); - } - if ($zip or \OC\Files\Filesystem::isReadable($filename)) { - self::sendHeaders($filename, $name, $zip); - } elseif (!\OC\Files\Filesystem::file_exists($filename)) { - header("HTTP/1.0 404 Not Found"); - $tmpl = new OC_Template('', '404', 'guest'); - $tmpl->printPage(); - exit(); - } else { - header("HTTP/1.0 403 Forbidden"); - die('403 Forbidden'); - } - if ($only_header) { - return; - } - if ($zip) { - $executionTime = intval(ini_get('max_execution_time')); - set_time_limit(0); - if ($get_type === self::ZIP_FILES) { - foreach ($files as $file) { - $file = $dir . '/' . $file; - if (\OC\Files\Filesystem::is_file($file)) { - $fh = \OC\Files\Filesystem::fopen($file, 'r'); - $zip->addFileFromStream($fh, basename($file)); - fclose($fh); - } elseif (\OC\Files\Filesystem::is_dir($file)) { - self::zipAddDir($file, $zip); - } + self::lockFiles($view, $dir, $files); + + $streamer->sendHeaders($name); + $executionTime = intval(ini_get('max_execution_time')); + set_time_limit(0); + if ($getType === self::ZIP_FILES) { + foreach ($files as $file) { + $file = $dir . '/' . $file; + if (\OC\Files\Filesystem::is_file($file)) { + $fileSize = \OC\Files\Filesystem::filesize($file); + $fh = \OC\Files\Filesystem::fopen($file, 'r'); + $streamer->addFileFromStream($fh, basename($file), $fileSize); + fclose($fh); + } elseif (\OC\Files\Filesystem::is_dir($file)) { + $streamer->addDirRecursive($file); } - } elseif ($get_type === self::ZIP_DIR) { - $file = $dir . '/' . $files; - self::zipAddDir($file, $zip); } - $zip->finalize(); - set_time_limit($executionTime); - } else { - \OC\Files\Filesystem::readfile($filename); - } - if ($get_type === self::FILE) { - $view->unlockFile($filename, ILockingProvider::LOCK_SHARED); + } elseif ($getType === self::ZIP_DIR) { + $file = $dir . '/' . $files; + $streamer->addDirRecursive($file); } + $streamer->finalize(); + set_time_limit($executionTime); + self::unlockAllTheFiles($dir, $files, $getType, $view, $filename); } catch (\OCP\Lock\LockedException $ex) { + self::unlockAllTheFiles($dir, $files, $getType, $view, $filename); + OC::$server->getLogger()->logException($ex); $l = \OC::$server->getL10N('core'); $hint = method_exists($ex, 'getHint') ? $ex->getHint() : ''; \OC_Template::printErrorPage($l->t('File is currently busy, please try again later'), $hint); } catch (\Exception $ex) { + self::unlockAllTheFiles($dir, $files, $getType, $view, $filename); + OC::$server->getLogger()->logException($ex); $l = \OC::$server->getL10N('core'); $hint = method_exists($ex, 'getHint') ? $ex->getHint() : ''; \OC_Template::printErrorPage($l->t('Can\'t read file'), $hint); @@ -178,30 +153,51 @@ class OC_Files { } /** - * @param string $dir - * @param ZipStreamer $zip - * @param string $internalDir + * @param View $view + * @param string $name */ - public static function zipAddDir($dir, ZipStreamer $zip, $internalDir='') { - $dirname=basename($dir); - $rootDir = $internalDir.$dirname; - if (!empty($rootDir)) { - $zip->addEmptyDir($rootDir); + private static function getSingleFile($view, $dir, $name, $onlyHeader) { + $filename = $dir . '/' . $name; + OC_Util::obEnd(); + $view->lockFile($filename, ILockingProvider::LOCK_SHARED); + + if (\OC\Files\Filesystem::isReadable($filename)) { + self::sendHeaders($filename, $name); + } elseif (!\OC\Files\Filesystem::file_exists($filename)) { + header("HTTP/1.0 404 Not Found"); + $tmpl = new OC_Template('', '404', 'guest'); + $tmpl->printPage(); + exit(); + } else { + header("HTTP/1.0 403 Forbidden"); + die('403 Forbidden'); + } + if ($onlyHeader) { + return; } - $internalDir.=$dirname.='/'; - // prevent absolute dirs - $internalDir = ltrim($internalDir, '/'); + $view->readfile($filename); + } - $files=\OC\Files\Filesystem::getDirectoryContent($dir); - foreach($files as $file) { - $filename=$file['name']; - $file=$dir.'/'.$filename; - if(\OC\Files\Filesystem::is_file($file)) { - $fh = \OC\Files\Filesystem::fopen($file, 'r'); - $zip->addFileFromStream($fh, $internalDir.$filename); - fclose($fh); - }elseif(\OC\Files\Filesystem::is_dir($file)) { - self::zipAddDir($file, $zip, $internalDir); + /** + * @param View $view + * @param $dir + * @param string[]|string $files + */ + public static function lockFiles($view, $dir, $files) { + if (!is_array($files)) { + $file = $dir . '/' . $files; + $files = [$file]; + } + foreach ($files as $file) { + $file = $dir . '/' . $file; + $view->lockFile($file, ILockingProvider::LOCK_SHARED); + if ($view->is_dir($file)) { + $contents = $view->getDirectoryContent($file); + $contents = array_map(function($fileInfo) use ($file) { + /** @var \OCP\Files\FileInfo $fileInfo */ + return $file . '/' . $fileInfo->getName(); + }, $contents); + self::lockFiles($view, $dir, $contents); } } } @@ -287,4 +283,28 @@ class OC_Files { } return false; } + + /** + * @param $dir + * @param $files + * @param $getType + * @param View $view + * @param $filename + */ + private static function unlockAllTheFiles($dir, $files, $getType, $view, $filename) { + if ($getType === self::FILE) { + $view->unlockFile($filename, ILockingProvider::LOCK_SHARED); + } + if ($getType === self::ZIP_FILES) { + foreach ($files as $file) { + $file = $dir . '/' . $file; + $view->unlockFile($file, ILockingProvider::LOCK_SHARED); + } + } + if ($getType === self::ZIP_DIR) { + $file = $dir . '/' . $files; + $view->unlockFile($file, ILockingProvider::LOCK_SHARED); + } + } + } diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 5c04da1f0d5..f3e22701f40 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -13,7 +13,6 @@ * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author TheSFReader <TheSFReader@gmail.com> * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php index fb60ee5aa53..b0890dcdc00 100644 --- a/lib/private/files/cache/scanner.php +++ b/lib/private/files/cache/scanner.php @@ -6,6 +6,7 @@ * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Olivier Paroz <github@oparoz.com> * @author Owen Winkler <a_github@midnightcircus.com> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> @@ -186,9 +187,9 @@ class Scanner extends BasicEmitter { } if (!empty($newData)) { $data['fileid'] = $this->addToCache($file, $newData, $fileId); - $this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId)); - \OC_Hook::emit('\OC\Files\Cache\Scanner', 'post_scan_file', array('path' => $file, 'storage' => $this->storageId)); } + $this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId)); + \OC_Hook::emit('\OC\Files\Cache\Scanner', 'post_scan_file', array('path' => $file, 'storage' => $this->storageId)); } else { $this->removeFromCache($file); } @@ -407,6 +408,10 @@ class Scanner extends BasicEmitter { if (pathinfo($file, PATHINFO_EXTENSION) === 'part') { return true; } + if (strpos($file, '.part/') !== false) { + return true; + } + return false; } diff --git a/lib/private/files/cache/storage.php b/lib/private/files/cache/storage.php index 88ceb287fb9..cee69194095 100644 --- a/lib/private/files/cache/storage.php +++ b/lib/private/files/cache/storage.php @@ -4,6 +4,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php index 1e180e7993a..2de0c8fe067 100644 --- a/lib/private/files/cache/updater.php +++ b/lib/private/files/cache/updater.php @@ -171,13 +171,15 @@ class Updater { if ($sourceStorage && $targetStorage) { $targetCache = $targetStorage->getCache($sourceInternalPath); - if ($targetCache->inCache($targetInternalPath)) { - $targetCache->remove($targetInternalPath); - } - if ($sourceStorage === $targetStorage) { - $targetCache->move($sourceInternalPath, $targetInternalPath); - } else { - $targetCache->moveFromCache($sourceStorage->getCache(), $sourceInternalPath, $targetInternalPath); + if ($sourceStorage->getCache($sourceInternalPath)->inCache($sourceInternalPath)) { + if ($targetCache->inCache($targetInternalPath)) { + $targetCache->remove($targetInternalPath); + } + if ($sourceStorage === $targetStorage) { + $targetCache->move($sourceInternalPath, $targetInternalPath); + } else { + $targetCache->moveFromCache($sourceStorage->getCache(), $sourceInternalPath, $targetInternalPath); + } } if (pathinfo($sourceInternalPath, PATHINFO_EXTENSION) !== pathinfo($targetInternalPath, PATHINFO_EXTENSION)) { diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index b333844f8c8..cf9524241dd 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -6,6 +6,7 @@ * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> + * @author tbartenstein <tbartenstein@users.noreply.github.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/files/mount/mountpoint.php b/lib/private/files/mount/mountpoint.php index 2871bbd9083..fad8678aae1 100644 --- a/lib/private/files/mount/mountpoint.php +++ b/lib/private/files/mount/mountpoint.php @@ -5,6 +5,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/files/node/folder.php b/lib/private/files/node/folder.php index 23004fc3527..9032c2bfb9d 100644 --- a/lib/private/files/node/folder.php +++ b/lib/private/files/node/folder.php @@ -215,7 +215,10 @@ class Folder extends Node implements \OCP\Files\Folder { * @var \OC\Files\Storage\Storage $storage */ list($storage, $internalPath) = $this->view->resolvePath($this->path); - $internalPath = rtrim($internalPath, '/') . '/'; + $internalPath = rtrim($internalPath, '/'); + if ($internalPath !== '') { + $internalPath = $internalPath . '/'; + } $internalRootLength = strlen($internalPath); $cache = $storage->getCache(''); diff --git a/lib/private/files/node/hookconnector.php b/lib/private/files/node/hookconnector.php new file mode 100644 index 00000000000..c42a329d319 --- /dev/null +++ b/lib/private/files/node/hookconnector.php @@ -0,0 +1,151 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Files\Node; + +use OC\Files\Filesystem; +use OC\Files\View; +use OCP\Files\FileInfo; +use OCP\Util; + +class HookConnector { + /** + * @var Root + */ + private $root; + + /** + * @var View + */ + private $view; + + /** + * HookConnector constructor. + * + * @param Root $root + * @param View $view + */ + public function __construct(Root $root, View $view) { + $this->root = $root; + $this->view = $view; + } + + public function viewToNode() { + Util::connectHook('OC_Filesystem', 'write', $this, 'write'); + Util::connectHook('OC_Filesystem', 'post_write', $this, 'postWrite'); + + Util::connectHook('OC_Filesystem', 'create', $this, 'create'); + Util::connectHook('OC_Filesystem', 'post_create', $this, 'postCreate'); + + Util::connectHook('OC_Filesystem', 'delete', $this, 'delete'); + Util::connectHook('OC_Filesystem', 'post_delete', $this, 'postDelete'); + + Util::connectHook('OC_Filesystem', 'rename', $this, 'rename'); + Util::connectHook('OC_Filesystem', 'post_rename', $this, 'postRename'); + + Util::connectHook('OC_Filesystem', 'copy', $this, 'copy'); + Util::connectHook('OC_Filesystem', 'post_copy', $this, 'postCopy'); + + Util::connectHook('OC_Filesystem', 'touch', $this, 'touch'); + Util::connectHook('OC_Filesystem', 'post_touch', $this, 'postTouch'); + } + + public function write($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'preWrite', [$node]); + } + + public function postWrite($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'postWrite', [$node]); + } + + public function create($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'preCreate', [$node]); + } + + public function postCreate($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'postCreate', [$node]); + } + + public function delete($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'preDelete', [$node]); + } + + public function postDelete($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'postDelete', [$node]); + } + + public function touch($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'preTouch', [$node]); + } + + public function postTouch($arguments) { + $node = $this->getNodeForPath($arguments['path']); + $this->root->emit('\OC\Files', 'postTouch', [$node]); + } + + public function rename($arguments) { + $source = $this->getNodeForPath($arguments['oldpath']); + $target = $this->getNodeForPath($arguments['newpath']); + $this->root->emit('\OC\Files', 'preRename', [$source, $target]); + } + + public function postRename($arguments) { + $source = $this->getNodeForPath($arguments['oldpath']); + $target = $this->getNodeForPath($arguments['newpath']); + $this->root->emit('\OC\Files', 'postRename', [$source, $target]); + } + + public function copy($arguments) { + $source = $this->getNodeForPath($arguments['oldpath']); + $target = $this->getNodeForPath($arguments['newpath']); + $this->root->emit('\OC\Files', 'preCopy', [$source, $target]); + } + + public function postCopy($arguments) { + $source = $this->getNodeForPath($arguments['oldpath']); + $target = $this->getNodeForPath($arguments['newpath']); + $this->root->emit('\OC\Files', 'postCopy', [$source, $target]); + } + + private function getNodeForPath($path) { + $info = Filesystem::getView()->getFileInfo($path); + if (!$info) { + $fullPath = Filesystem::getView()->getAbsolutePath($path); + if (Filesystem::is_dir($path)) { + return new NonExistingFolder($this->root, $this->view, $fullPath); + } else { + return new NonExistingFile($this->root, $this->view, $fullPath); + } + } + if ($info->getType() === FileInfo::TYPE_FILE) { + return new File($this->root, $this->view, $info->getPath(), $info); + } else { + return new Folder($this->root, $this->view, $info->getPath(), $info); + } + } +} diff --git a/lib/private/files/objectstore/objectstorestorage.php b/lib/private/files/objectstore/objectstorestorage.php index a85553186ae..e108d7662d4 100644 --- a/lib/private/files/objectstore/objectstorestorage.php +++ b/lib/private/files/objectstore/objectstorestorage.php @@ -62,41 +62,44 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { public function mkdir($path) { $path = $this->normalizePath($path); - if ($this->is_dir($path)) { + if ($this->file_exists($path)) { return false; } - $dirName = $this->normalizePath(dirname($path)); - $parentExists = $this->is_dir($dirName); - $mTime = time(); - - $data = array( + $data = [ 'mimetype' => 'httpd/unix-directory', 'size' => 0, 'mtime' => $mTime, 'storage_mtime' => $mTime, 'permissions' => \OCP\Constants::PERMISSION_ALL, - ); - - if ($dirName === '' && !$parentExists) { + ]; + if ($path === '') { //create root on the fly $data['etag'] = $this->getETag(''); $this->getCache()->put('', $data); - $parentExists = true; - - // we are done when the root folder was meant to be created - if ($dirName === $path) { - return true; + return true; + } else { + // if parent does not exist, create it + $parent = $this->normalizePath(dirname($path)); + $parentType = $this->filetype($parent); + if ($parentType === false) { + if (!$this->mkdir($parent)) { + // something went wrong + return false; + } + } else if ($parentType === 'file') { + // parent is a file + return false; } - } - - if ($parentExists) { + // finally create the new dir + $mTime = time(); // update mtime + $data['mtime'] = $mTime; + $data['storage_mtime'] = $mTime; $data['etag'] = $this->getETag($path); $this->getCache()->put($path, $data); return true; } - return false; } /** @@ -334,7 +337,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { 'size' => 0, 'mtime' => $mtime, 'storage_mtime' => $mtime, - 'permissions' => \OCP\Constants::PERMISSION_ALL, + 'permissions' => \OCP\Constants::PERMISSION_ALL - \OCP\Constants::PERMISSION_CREATE, ); $fileId = $this->getCache()->put($path, $stat); try { @@ -359,7 +362,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { if (empty($stat)) { // create new file $stat = array( - 'permissions' => \OCP\Constants::PERMISSION_ALL, + 'permissions' => \OCP\Constants::PERMISSION_ALL - \OCP\Constants::PERMISSION_CREATE, ); } // update stat with new data diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index a5ed5fd3996..77a70226b37 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -7,6 +7,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> @@ -260,7 +261,7 @@ abstract class Common implements Storage { $dh = $this->opendir($path); if (is_resource($dh)) { while (($file = readdir($dh)) !== false) { - if ($file !== '.' and $file !== '..') { + if (!\OC\Files\Filesystem::isIgnoredDir($file)) { if ($this->is_dir($path . '/' . $file)) { mkdir($target . '/' . $file); $this->addLocalFolder($path . '/' . $file, $target . '/' . $file); @@ -283,7 +284,7 @@ abstract class Common implements Storage { $dh = $this->opendir($dir); if (is_resource($dh)) { while (($item = readdir($dh)) !== false) { - if ($item == '.' || $item == '..') continue; + if (\OC\Files\Filesystem::isIgnoredDir($item)) continue; if (strstr(strtolower($item), strtolower($query)) !== false) { $files[] = $dir . '/' . $item; } @@ -371,13 +372,7 @@ abstract class Common implements Storage { * @return string|false */ public function getETag($path) { - $ETagFunction = \OC\Connector\Sabre\Node::$ETagFunction; - if ($ETagFunction) { - $hash = call_user_func($ETagFunction, $path); - return $hash; - } else { - return uniqid(); - } + return uniqid(); } /** diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php index c1cf17abdee..dcde7b8029b 100644 --- a/lib/private/files/storage/dav.php +++ b/lib/private/files/storage/dav.php @@ -1,6 +1,5 @@ <?php /** - * @author Alexander Bogdanov <syn@li.ru> * @author Bart Visscher <bartv@thisnet.nl> * @author Björn Schießle <schiessle@owncloud.com> * @author Carlos Cerrillo <ccerrillo@gmail.com> @@ -9,7 +8,6 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> - * @author Philippe Kueck <pk@plusline.de> * @author Philipp Kapfer <philipp.kapfer@gmx.at> * @author Robin Appelman <icewind@owncloud.com> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> @@ -370,6 +368,7 @@ class DAV extends Common { case 'c': case 'c+': //emulate these + $tempManager = \OC::$server->getTempManager(); if (strrpos($path, '.') !== false) { $ext = substr($path, strrpos($path, '.')); } else { @@ -379,12 +378,16 @@ class DAV extends Common { if (!$this->isUpdatable($path)) { return false; } - $tmpFile = $this->getCachedFile($path); + if ($mode === 'w' or $mode === 'w+') { + $tmpFile = $tempManager->getTemporaryFile($ext); + } else { + $tmpFile = $this->getCachedFile($path); + } } else { if (!$this->isCreatable(dirname($path))) { return false; } - $tmpFile = Files::tmpFile($ext); + $tmpFile = $tempManager->getTemporaryFile($ext); } Close::registerCallback($tmpFile, array($this, 'writeBack')); self::$tempFiles[$tmpFile] = $path; diff --git a/lib/private/files/storage/flysystem.php b/lib/private/files/storage/flysystem.php index 6d8dee10622..3ad2b8adc4c 100644 --- a/lib/private/files/storage/flysystem.php +++ b/lib/private/files/storage/flysystem.php @@ -1,9 +1,22 @@ <?php /** - * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * */ namespace OC\Files\Storage; diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php index 3676fe69131..2b2a433c013 100644 --- a/lib/private/files/storage/local.php +++ b/lib/private/files/storage/local.php @@ -1,17 +1,14 @@ <?php /** - * @author Andreas Fischer <bantu@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Brice Maron <brice@bmaron.net> * @author Jakob Sack <mail@jakobsack.de> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Klaas Freitag <freitag@owncloud.com> - * @author Lukas Reschke <lukas@owncloud.com> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Sjors van der Pluijm <sjors@desjors.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Tigran Mkrtchyan <tigran.mkrtchyan@desy.de> @@ -283,7 +280,7 @@ class Local extends \OC\Files\Storage\Common { $files = array(); $physicalDir = $this->getSourcePath($dir); foreach (scandir($physicalDir) as $item) { - if ($item == '.' || $item == '..') + if (\OC\Files\Filesystem::isIgnoredDir($item)) continue; $physicalItem = $physicalDir . '/' . $item; diff --git a/lib/private/files/storage/localtempfiletrait.php b/lib/private/files/storage/localtempfiletrait.php index 86c8b5c8377..84331f49b19 100644 --- a/lib/private/files/storage/localtempfiletrait.php +++ b/lib/private/files/storage/localtempfiletrait.php @@ -1,7 +1,6 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/files/storage/polyfill/copydirectory.php b/lib/private/files/storage/polyfill/copydirectory.php index 1b4873a3a76..df4f5c27dcf 100644 --- a/lib/private/files/storage/polyfill/copydirectory.php +++ b/lib/private/files/storage/polyfill/copydirectory.php @@ -1,9 +1,23 @@ <?php /** - * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. + * @author Martin Mattel <martin.mattel@diemattels.at> + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * */ namespace OC\Files\Storage\PolyFill; @@ -72,7 +86,7 @@ trait CopyDirectory { $dh = $this->opendir($source); $result = true; while ($file = readdir($dh)) { - if ($file !== '.' and $file !== '..') { + if (!\OC\Files\Filesystem::isIgnoredDir($file)) { if ($this->is_dir($source . '/' . $file)) { $this->mkdir($target . '/' . $file); $result = $this->copyRecursive($source . '/' . $file, $target . '/' . $file); diff --git a/lib/private/files/storage/temporary.php b/lib/private/files/storage/temporary.php index ca348313e45..c8b99a55637 100644 --- a/lib/private/files/storage/temporary.php +++ b/lib/private/files/storage/temporary.php @@ -3,6 +3,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php index 805a2bc1ad0..2f0c1e35b04 100644 --- a/lib/private/files/storage/wrapper/encryption.php +++ b/lib/private/files/storage/wrapper/encryption.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -196,9 +195,13 @@ class Encryption extends Wrapper { public function file_put_contents($path, $data) { // file put content will always be translated to a stream write $handle = $this->fopen($path, 'w'); - $written = fwrite($handle, $data); - fclose($handle); - return $written; + if (is_resource($handle)) { + $written = fwrite($handle, $data); + fclose($handle); + return $written; + } + + return false; } /** @@ -232,7 +235,11 @@ class Encryption extends Wrapper { $result = $this->storage->rename($path1, $path2); - if ($result && $this->encryptionManager->isEnabled()) { + if ($result && + // versions always use the keys from the original file, so we can skip + // this step for versions + $this->isVersion($path2) === false && + $this->encryptionManager->isEnabled()) { $source = $this->getFullPath($path1); if (!$this->util->isExcluded($source)) { $target = $this->getFullPath($path2); @@ -317,7 +324,7 @@ class Encryption extends Wrapper { * * @param string $path * @param string $mode - * @return resource + * @return resource|bool * @throws GenericEncryptionException * @throws ModuleDoesNotExistsException */ @@ -401,6 +408,9 @@ class Encryption extends Wrapper { if ($shouldEncrypt === true && $encryptionModule !== null) { $headerSize = $this->getHeaderSize($path); $source = $this->storage->fopen($path, $mode); + if (!is_resource($source)) { + return false; + } $handle = \OC\Files\Stream\Encryption::wrap($source, $path, $fullPath, $header, $this->uid, $encryptionModule, $this->storage, $this, $this->util, $this->fileHelper, $mode, $size, $unencryptedSize, $headerSize); @@ -420,6 +430,9 @@ class Encryption extends Wrapper { * @return bool */ public function moveFromStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = true) { + if ($sourceStorage === $this) { + return $this->rename($sourceInternalPath, $targetInternalPath); + } // TODO clean this up once the underlying moveFromStorage in OC\Files\Storage\Wrapper\Common is fixed: // - call $this->storage->moveFromStorage() instead of $this->copyBetweenStorage @@ -449,7 +462,7 @@ class Encryption extends Wrapper { public function copyFromStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false) { // TODO clean this up once the underlying moveFromStorage in OC\Files\Storage\Wrapper\Common is fixed: - // - call $this->storage->moveFromStorage() instead of $this->copyBetweenStorage + // - call $this->storage->copyFromStorage() instead of $this->copyBetweenStorage // - copy the file cache update from $this->copyBetweenStorage to this method // - copy the copyKeys() call from $this->copyBetweenStorage to this method // - remove $this->copyBetweenStorage @@ -469,6 +482,13 @@ class Encryption extends Wrapper { */ private function copyBetweenStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime, $isRename) { + // for versions we have nothing to do, because versions should always use the + // key from the original file. Just create a 1:1 copy and done + if ($this->isVersion($targetInternalPath) || + $this->isVersion($sourceInternalPath)) { + return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); + } + // first copy the keys that we reuse the existing file key on the target location // and don't create a new one which would break versions for example. $mount = $this->mountManager->findByStorageId($sourceStorage->getId()); @@ -741,4 +761,15 @@ class Encryption extends Wrapper { return false; } + /** + * check if path points to a files version + * + * @param $path + * @return bool + */ + protected function isVersion($path) { + $normalized = Filesystem::normalizePath($path); + return substr($normalized, 0, strlen('/files_versions/')) === '/files_versions/'; + } + } diff --git a/lib/private/files/storage/wrapper/permissionsmask.php b/lib/private/files/storage/wrapper/permissionsmask.php index 50c3f2a6268..e1822905692 100644 --- a/lib/private/files/storage/wrapper/permissionsmask.php +++ b/lib/private/files/storage/wrapper/permissionsmask.php @@ -1,7 +1,9 @@ <?php /** + * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -66,7 +68,7 @@ class PermissionsMask extends Wrapper { } public function isSharable($path) { - return $this->checkMask(Constants::PERMISSION_SHARE) and parent::isSharable($parm); + return $this->checkMask(Constants::PERMISSION_SHARE) and parent::isSharable($path); } public function getPermissions($path) { diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php index b43dd4fe142..048738170db 100644 --- a/lib/private/files/storage/wrapper/wrapper.php +++ b/lib/private/files/storage/wrapper/wrapper.php @@ -2,6 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/lib/private/files/stream/encryption.php b/lib/private/files/stream/encryption.php index 1cef37baf9f..e0d263d80b1 100644 --- a/lib/private/files/stream/encryption.php +++ b/lib/private/files/stream/encryption.php @@ -2,7 +2,6 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author jknockaert <jasper@knockaert.nl> - * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/lib/private/files/type/detection.php b/lib/private/files/type/detection.php index 3dc3975fb2a..fd27d88eae6 100644 --- a/lib/private/files/type/detection.php +++ b/lib/private/files/type/detection.php @@ -2,11 +2,12 @@ /** * @author Andreas Fischer <bantu@owncloud.com> * @author Jens-Christian Fischer <jens-christian.fischer@switch.ch> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Tanghus <thomas@tanghus.net> - * @author Robin McCorkell <rmccorkell@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -49,15 +50,22 @@ class Detection implements IMimeTypeDetector { private $urlGenerator; /** @var string */ - private $configDir; + private $customConfigDir; + + /** @var string */ + private $defaultConfigDir; /** * @param IURLGenerator $urlGenerator - * @param string $configDir + * @param string $customConfigDir + * @param string $defaultConfigDir */ - public function __construct(IURLGenerator $urlGenerator, $configDir) { + public function __construct(IURLGenerator $urlGenerator, + $customConfigDir, + $defaultConfigDir) { $this->urlGenerator = $urlGenerator; - $this->configDir = $configDir; + $this->customConfigDir = $customConfigDir; + $this->defaultConfigDir = $defaultConfigDir; } /** @@ -71,7 +79,9 @@ class Detection implements IMimeTypeDetector { * @param string $mimetype * @param string|null $secureMimeType */ - public function registerType($extension, $mimetype, $secureMimeType = null) { + public function registerType($extension, + $mimetype, + $secureMimeType = null) { $this->mimetypes[$extension] = array($mimetype, $secureMimeType); $this->secureMimeTypes[$mimetype] = $secureMimeType ?: $mimetype; } @@ -102,10 +112,10 @@ class Detection implements IMimeTypeDetector { return; } - $this->mimeTypeAlias = json_decode(file_get_contents($this->configDir . '/mimetypealiases.dist.json'), true); + $this->mimeTypeAlias = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypealiases.dist.json'), true); - if (file_exists($this->configDir . '/mimetypealiases.json')) { - $custom = json_decode(file_get_contents($this->configDir . '/mimetypealiases.json'), true); + if (file_exists($this->customConfigDir . '/mimetypealiases.json')) { + $custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypealiases.json'), true); $this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom); } } @@ -126,15 +136,15 @@ class Detection implements IMimeTypeDetector { return; } - $mimetypemapping = json_decode(file_get_contents($this->configDir . '/mimetypemapping.dist.json'), true); + $mimetypeMapping = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypemapping.dist.json'), true); //Check if need to load custom mappings - if (file_exists($this->configDir . '/mimetypemapping.json')) { - $custom = json_decode(file_get_contents($this->configDir . '/mimetypemapping.json'), true); - $mimetypemapping = array_merge($mimetypemapping, $custom); + if (file_exists($this->customConfigDir . '/mimetypemapping.json')) { + $custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypemapping.json'), true); + $mimetypeMapping = array_merge($mimetypeMapping, $custom); } - $this->registerTypeArray($mimetypemapping); + $this->registerTypeArray($mimetypeMapping); } /** @@ -260,7 +270,7 @@ class Detection implements IMimeTypeDetector { public function mimeTypeIcon($mimetype) { $this->loadAliases(); - if (isset($this->mimeTypeAlias[$mimetype])) { + while (isset($this->mimeTypeAlias[$mimetype])) { $mimetype = $this->mimeTypeAlias[$mimetype]; } if (isset($this->mimetypeIcons[$mimetype])) { diff --git a/lib/private/files/type/loader.php b/lib/private/files/type/loader.php index 78bfcf60bff..55dc09ab9b8 100644 --- a/lib/private/files/type/loader.php +++ b/lib/private/files/type/loader.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php index c70f4beb31d..460c8007bf4 100644 --- a/lib/private/files/utils/scanner.php +++ b/lib/private/files/utils/scanner.php @@ -2,6 +2,7 @@ /** * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> + * @author Olivier Paroz <github@oparoz.com> * @author Robin Appelman <icewind@owncloud.com> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -30,6 +31,7 @@ use OC\Files\Cache\ChangePropagator; use OC\Files\Filesystem; use OC\ForbiddenException; use OC\Hooks\PublicEmitter; +use OC\Lock\DBLockingProvider; /** * Class Scanner @@ -99,7 +101,12 @@ class Scanner extends PublicEmitter { $scanner->listen('\OC\Files\Cache\Scanner', 'scanFolder', function ($path) use ($mount, $emitter) { $emitter->emit('\OC\Files\Utils\Scanner', 'scanFolder', array($mount->getMountPoint() . $path)); }); - + $scanner->listen('\OC\Files\Cache\Scanner', 'postScanFile', function ($path) use ($mount, $emitter) { + $emitter->emit('\OC\Files\Utils\Scanner', 'postScanFile', array($mount->getMountPoint() . $path)); + }); + $scanner->listen('\OC\Files\Cache\Scanner', 'postScanFolder', function ($path) use ($mount, $emitter) { + $emitter->emit('\OC\Files\Utils\Scanner', 'postScanFolder', array($mount->getMountPoint() . $path)); + }); // propagate etag and mtimes when files are changed or removed $propagator = $this->propagator; $propagatorListener = function ($path) use ($mount, $propagator) { @@ -150,9 +157,14 @@ class Scanner extends PublicEmitter { $scanner = $storage->getScanner(); $scanner->setUseTransactions(false); $this->attachListener($mount); - $this->db->beginTransaction(); + $isDbLocking = \OC::$server->getLockingProvider() instanceof DBLockingProvider; + if (!$isDbLocking) { + $this->db->beginTransaction(); + } $scanner->scan($relativePath, \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE); - $this->db->commit(); + if (!$isDbLocking) { + $this->db->commit(); + } } $this->propagator->propagateChanges(time()); } diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 9afa9d40b20..04932d69384 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -11,6 +11,7 @@ * @author Klaas Freitag <freitag@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Luke Policinski <lpolicinski@gmail.com> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> @@ -153,7 +154,10 @@ class View { return '/'; } - if (strpos($path, $this->fakeRoot) !== 0) { + // missing slashes can cause wrong matches! + $root = rtrim($this->fakeRoot, '/') . '/'; + + if (strpos($path, $root) !== 0) { return null; } else { $path = substr($path, strlen($this->fakeRoot)); @@ -286,7 +290,7 @@ class View { $absolutePath = $this->getAbsolutePath($path); $mount = Filesystem::getMountManager()->find($absolutePath); if ($mount->getInternalPath($absolutePath) === '') { - return $this->removeMount($mount, $path); + return $this->removeMount($mount, $absolutePath); } if ($this->is_dir($path)) { return $this->basicOperation('rmdir', $path, array('delete')); @@ -759,59 +763,72 @@ class View { $this->lockFile($path2, ILockingProvider::LOCK_SHARED); $this->lockFile($path1, ILockingProvider::LOCK_SHARED); + $lockTypePath1 = ILockingProvider::LOCK_SHARED; + $lockTypePath2 = ILockingProvider::LOCK_SHARED; - $exists = $this->file_exists($path2); - if ($this->shouldEmitHooks()) { - \OC_Hook::emit( - Filesystem::CLASSNAME, - Filesystem::signal_copy, - array( - Filesystem::signal_param_oldpath => $this->getHookPath($path1), - Filesystem::signal_param_newpath => $this->getHookPath($path2), - Filesystem::signal_param_run => &$run - ) - ); - $this->emit_file_hooks_pre($exists, $path2, $run); - } - if ($run) { - $mount1 = $this->getMount($path1); - $mount2 = $this->getMount($path2); - $storage1 = $mount1->getStorage(); - $internalPath1 = $mount1->getInternalPath($absolutePath1); - $storage2 = $mount2->getStorage(); - $internalPath2 = $mount2->getInternalPath($absolutePath2); - - $this->changeLock($path2, ILockingProvider::LOCK_EXCLUSIVE); - - if ($mount1->getMountPoint() == $mount2->getMountPoint()) { - if ($storage1) { - $result = $storage1->copy($internalPath1, $internalPath2); - } else { - $result = false; - } - } else { - $result = $storage2->copyFromStorage($storage1, $internalPath1, $internalPath2); - } - - $this->updater->update($path2); - - $this->changeLock($path2, ILockingProvider::LOCK_SHARED); + try { - if ($this->shouldEmitHooks() && $result !== false) { + $exists = $this->file_exists($path2); + if ($this->shouldEmitHooks()) { \OC_Hook::emit( Filesystem::CLASSNAME, - Filesystem::signal_post_copy, + Filesystem::signal_copy, array( Filesystem::signal_param_oldpath => $this->getHookPath($path1), - Filesystem::signal_param_newpath => $this->getHookPath($path2) + Filesystem::signal_param_newpath => $this->getHookPath($path2), + Filesystem::signal_param_run => &$run ) ); - $this->emit_file_hooks_post($exists, $path2); + $this->emit_file_hooks_pre($exists, $path2, $run); } + if ($run) { + $mount1 = $this->getMount($path1); + $mount2 = $this->getMount($path2); + $storage1 = $mount1->getStorage(); + $internalPath1 = $mount1->getInternalPath($absolutePath1); + $storage2 = $mount2->getStorage(); + $internalPath2 = $mount2->getInternalPath($absolutePath2); + + $this->changeLock($path2, ILockingProvider::LOCK_EXCLUSIVE); + $lockTypePath2 = ILockingProvider::LOCK_EXCLUSIVE; + + if ($mount1->getMountPoint() == $mount2->getMountPoint()) { + if ($storage1) { + $result = $storage1->copy($internalPath1, $internalPath2); + } else { + $result = false; + } + } else { + $result = $storage2->copyFromStorage($storage1, $internalPath1, $internalPath2); + } - $this->unlockFile($path2, ILockingProvider::LOCK_SHARED); - $this->unlockFile($path1, ILockingProvider::LOCK_SHARED); + $this->updater->update($path2); + + $this->changeLock($path2, ILockingProvider::LOCK_SHARED); + $lockTypePath2 = ILockingProvider::LOCK_SHARED; + + if ($this->shouldEmitHooks() && $result !== false) { + \OC_Hook::emit( + Filesystem::CLASSNAME, + Filesystem::signal_post_copy, + array( + Filesystem::signal_param_oldpath => $this->getHookPath($path1), + Filesystem::signal_param_newpath => $this->getHookPath($path2) + ) + ); + $this->emit_file_hooks_post($exists, $path2); + } + + } + } catch (\Exception $e) { + $this->unlockFile($path2, $lockTypePath2); + $this->unlockFile($path1, $lockTypePath1); + throw $e; } + + $this->unlockFile($path2, $lockTypePath2); + $this->unlockFile($path1, $lockTypePath1); + } return $result; } @@ -1586,25 +1603,46 @@ class View { /** * check if it is allowed to move a mount point to a given target. - * It is not allowed to move a mount point into a different mount point + * It is not allowed to move a mount point into a different mount point or + * into an already shared folder * * @param string $target path * @return boolean */ private function isTargetAllowed($target) { - $result = false; - - list($targetStorage,) = \OC\Files\Filesystem::resolvePath($target); - if ($targetStorage->instanceOfStorage('\OCP\Files\IHomeStorage')) { - $result = true; - } else { + list($targetStorage, $targetInternalPath) = \OC\Files\Filesystem::resolvePath($target); + if (!$targetStorage->instanceOfStorage('\OCP\Files\IHomeStorage')) { \OCP\Util::writeLog('files', 'It is not allowed to move one mount point into another one', \OCP\Util::DEBUG); + return false; } - return $result; + // note: cannot use the view because the target is already locked + $fileId = (int)$targetStorage->getCache()->getId($targetInternalPath); + if ($fileId === -1) { + // target might not exist, need to check parent instead + $fileId = (int)$targetStorage->getCache()->getId(dirname($targetInternalPath)); + } + + // check if any of the parents were shared by the current owner (include collections) + $shares = \OCP\Share::getItemShared( + 'folder', + $fileId, + \OCP\Share::FORMAT_NONE, + null, + true + ); + + if (count($shares) > 0) { + \OCP\Util::writeLog('files', + 'It is not allowed to move one mount point into a shared folder', + \OCP\Util::DEBUG); + return false; + } + + return true; } /** @@ -1656,7 +1694,7 @@ class View { if ($trimmed === '') { throw new InvalidPathException($l10n->t('Empty filename is not allowed')); } - if ($trimmed === '.' || $trimmed === '..') { + if (\OC\Files\Filesystem::isIgnoredDir($trimmed)) { throw new InvalidPathException($l10n->t('Dot files are not allowed')); } diff --git a/lib/private/group.php b/lib/private/group.php index 87e85a539ff..4eed2a85450 100644 --- a/lib/private/group.php +++ b/lib/private/group.php @@ -36,6 +36,7 @@ /** * This class provides all methods needed for managing groups. * + * Note that &run is deprecated and won't work anymore. * Hooks provided: * pre_createGroup(&run, gid) * post_createGroup(gid) diff --git a/lib/private/helper.php b/lib/private/helper.php index b8e4b451835..ac91164dfb0 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -16,6 +16,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Nicolas Grekas <nicolas.grekas@gmail.com> * @author Olivier Paroz <github@oparoz.com> * @author Owen Winkler <a_github@midnightcircus.com> * @author Pellaeon Lin <nfsmwlin@gmail.com> @@ -193,11 +194,11 @@ class OC_Helper { * Returns the path to the preview of the file. */ public static function previewIcon($path) { - return self::linkToRoute( 'core_ajax_preview', array('x' => 36, 'y' => 36, 'file' => $path )); + return self::linkToRoute( 'core_ajax_preview', array('x' => 32, 'y' => 32, 'file' => $path )); } public static function publicPreviewIcon( $path, $token ) { - return self::linkToRoute( 'core_ajax_public_preview', array('x' => 36, 'y' => 36, 'file' => $path, 't' => $token)); + return self::linkToRoute( 'core_ajax_public_preview', array('x' => 32, 'y' => 32, 'file' => $path, 't' => $token)); } /** @@ -274,7 +275,7 @@ class OC_Helper { /** * Make a computer file size * @param string $str file size in human readable format - * @return int a file size in bytes + * @return float a file size in bytes * * Makes 2kB to 2048. * @@ -283,7 +284,7 @@ class OC_Helper { public static function computerFileSize($str) { $str = strtolower($str); if (is_numeric($str)) { - return $str; + return floatval($str); } $bytes_array = array( @@ -742,7 +743,7 @@ class OC_Helper { $freeSpace = max($freeSpace, 0); return $freeSpace; } else { - return INF; + return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188 } } diff --git a/lib/private/http/client/client.php b/lib/private/http/client/client.php index b0aff10a413..5f298e1acd7 100644 --- a/lib/private/http/client/client.php +++ b/lib/private/http/client/client.php @@ -1,6 +1,7 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> + * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -62,7 +63,7 @@ class Client implements IClient { $dataDir = $this->config->getSystemValue('datadirectory'); $this->client->setDefaultOption('verify', $dataDir.'/'.$this->certificateManager->getCertificateBundle()); } else { - $this->client->setDefaultOption('verify', \OC::$SERVERROOT . '/config/ca-bundle.crt'); + $this->client->setDefaultOption('verify', \OC::$SERVERROOT . '/resources/config/ca-bundle.crt'); } $this->client->setDefaultOption('headers/User-Agent', 'ownCloud Server Crawler'); diff --git a/lib/private/http/client/response.php b/lib/private/http/client/response.php index 558482491d1..b3429f36d04 100644 --- a/lib/private/http/client/response.php +++ b/lib/private/http/client/response.php @@ -1,6 +1,7 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> + * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/installer.php b/lib/private/installer.php index 392dc1c0817..b5ccc02abf3 100644 --- a/lib/private/installer.php +++ b/lib/private/installer.php @@ -12,6 +12,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Kamil Domanski <kdomanski@kdemail.net> * @author Lukas Reschke <lukas@owncloud.com> + * @author michag86 <micha_g@arcor.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> @@ -501,7 +502,7 @@ class OC_Installer{ if($dir = opendir( $app_dir['path'] )) { while( false !== ( $filename = readdir( $dir ))) { if( substr( $filename, 0, 1 ) != '.' and is_dir($app_dir['path']."/$filename") ) { - if( file_exists( $app_dir['path']."/$filename/appinfo/app.php" )) { + if( file_exists( $app_dir['path']."/$filename/appinfo/info.xml" )) { if(!OC_Installer::isInstalled($filename)) { $info=OC_App::getAppInfo($filename); $enabled = isset($info['default_enable']); diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 168011cfcec..5816e20b104 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -4,7 +4,6 @@ * @author Andreas Fischer <bantu@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Bernhard Posselt <dev@bernhard-posselt.com> - * @author Christopher Schäpers <kondou@ts.unde.re> * @author Felix Moeller <mail@felixmoeller.de> * @author Jakob Sack <mail@jakobsack.de> * @author Jan-Christoph Borchardt <hey@jancborchardt.net> @@ -102,16 +101,11 @@ class OC_L10N implements \OCP\IL10N { } /** - * @param $app * @return string */ - public static function setLanguageFromRequest($app = null) { + public static function setLanguageFromRequest() { if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - if (is_array($app)) { - $available = $app; - } else { - $available = self::findAvailableLanguages($app); - } + $available = self::findAvailableLanguages(); // E.g. make sure that 'de' is before 'de_DE'. sort($available); @@ -122,17 +116,13 @@ class OC_L10N implements \OCP\IL10N { $preferred_language = str_replace('-', '_', $preferred_language); foreach ($available as $available_language) { if ($preferred_language === strtolower($available_language)) { - if (!is_array($app)) { - self::$language = $available_language; - } + self::$language = $available_language; return $available_language; } } foreach ($available as $available_language) { if (substr($preferred_language, 0, 2) === $available_language) { - if (!is_array($app)) { - self::$language = $available_language; - } + self::$language = $available_language; return $available_language; } } @@ -399,29 +389,6 @@ class OC_L10N implements \OCP\IL10N { } /** - * Choose a language - * @param array $text Associative Array with possible strings - * @return String - * - * $text is an array 'de' => 'hallo welt', 'en' => 'hello world', ... - * - * This function is useful to avoid loading thousands of files if only one - * simple string is needed, for example in appinfo.php - */ - public static function selectLanguage($text) { - $lang = self::findLanguage(array_keys($text)); - return $text[$lang]; - } - - /** - * The given language is forced to be used while executing the current request - * @param string $lang - */ - public static function forceLanguage($lang) { - self::$language = $lang; - } - - /** * The code (en, de, ...) of the language that is used for this OC_L10N object * * @return string language @@ -432,17 +399,13 @@ class OC_L10N implements \OCP\IL10N { /** * find the best language - * @param array|string $app details below + * @param string $app * @return string language * - * If $app is an array, ownCloud assumes that these are the available - * languages. Otherwise ownCloud tries to find the files in the l10n - * folder. - * * If nothing works it returns 'en' */ public static function findLanguage($app = null) { - if(!is_array($app) && self::$language != '') { + if(self::$language != '') { return self::$language; } @@ -452,13 +415,7 @@ class OC_L10N implements \OCP\IL10N { if($userId && $config->getUserValue($userId, 'core', 'lang')) { $lang = $config->getUserValue($userId, 'core', 'lang'); self::$language = $lang; - if(is_array($app)) { - $available = $app; - $lang_exists = array_search($lang, $available) !== false; - } else { - $lang_exists = self::languageExists($app, $lang); - } - if($lang_exists) { + if(self::languageExists($app, $lang)) { return $lang; } } @@ -469,7 +426,7 @@ class OC_L10N implements \OCP\IL10N { return $default_language; } - $lang = self::setLanguageFromRequest($app); + $lang = self::setLanguageFromRequest(); if($userId && !$config->getUserValue($userId, 'core', 'lang')) { $config->setUserValue($userId, 'core', 'lang', $lang); } @@ -503,8 +460,9 @@ class OC_L10N implements \OCP\IL10N { * @return array an array of available languages */ public static function findAvailableLanguages($app=null) { - if(!empty(self::$availableLanguages)) { - return self::$availableLanguages; + // also works with null as key + if(isset(self::$availableLanguages[$app]) && !empty(self::$availableLanguages[$app])) { + return self::$availableLanguages[$app]; } $available=array('en');//english is always available $dir = self::findI18nDir($app); @@ -518,7 +476,7 @@ class OC_L10N implements \OCP\IL10N { } } - self::$availableLanguages = $available; + self::$availableLanguages[$app] = $available; return $available; } diff --git a/lib/private/l10n/factory.php b/lib/private/l10n/factory.php index a9ac4da42a2..b92c21b2d5d 100644 --- a/lib/private/l10n/factory.php +++ b/lib/private/l10n/factory.php @@ -1,10 +1,10 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/lock/dblockingprovider.php b/lib/private/lock/dblockingprovider.php index bfa86a6920e..450a0a27ab0 100644 --- a/lib/private/lock/dblockingprovider.php +++ b/lib/private/lock/dblockingprovider.php @@ -1,5 +1,6 @@ <?php /** + * @author Individual IT Services <info@individual-it.net> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -58,9 +59,17 @@ class DBLockingProvider extends AbstractLockingProvider { $this->timeFactory = $timeFactory; } - protected function initLockField($path) { + /** + * Insert a file locking row if it does not exists. + * + * @param string $path + * @param int $lock + * @return int number of inserted rows + */ + + protected function initLockField($path, $lock = 0) { $expire = $this->getExpireTime(); - $this->connection->insertIfNotExist('*PREFIX*file_locks', ['key' => $path, 'lock' => 0, 'ttl' => $expire], ['key']); + return $this->connection->insertIfNotExist('*PREFIX*file_locks', ['key' => $path, 'lock' => $lock, 'ttl' => $expire], ['key']); } /** @@ -94,22 +103,23 @@ class DBLockingProvider extends AbstractLockingProvider { * @throws \OCP\Lock\LockedException */ public function acquireLock($path, $type) { - if ($this->connection->inTransaction()) { - $this->logger->warning("Trying to acquire a lock for '$path' while inside a transition"); - } - - $this->initLockField($path); $expire = $this->getExpireTime(); if ($type === self::LOCK_SHARED) { - $result = $this->connection->executeUpdate( - 'UPDATE `*PREFIX*file_locks` SET `lock` = `lock` + 1, `ttl` = ? WHERE `key` = ? AND `lock` >= 0', - [$expire, $path] - ); + $result = $this->initLockField($path,1); + if ($result <= 0) { + $result = $this->connection->executeUpdate ( + 'UPDATE `*PREFIX*file_locks` SET `lock` = `lock` + 1, `ttl` = ? WHERE `key` = ? AND `lock` >= 0', + [$expire, $path] + ); + } } else { - $result = $this->connection->executeUpdate( - 'UPDATE `*PREFIX*file_locks` SET `lock` = -1, `ttl` = ? WHERE `key` = ? AND `lock` = 0', - [$expire, $path] - ); + $result = $this->initLockField($path,-1); + if ($result <= 0) { + $result = $this->connection->executeUpdate( + 'UPDATE `*PREFIX*file_locks` SET `lock` = -1, `ttl` = ? WHERE `key` = ? AND `lock` = 0', + [$expire, $path] + ); + } } if ($result !== 1) { throw new LockedException($path); @@ -122,7 +132,6 @@ class DBLockingProvider extends AbstractLockingProvider { * @param int $type self::LOCK_SHARED or self::LOCK_EXCLUSIVE */ public function releaseLock($path, $type) { - $this->initLockField($path); if ($type === self::LOCK_SHARED) { $this->connection->executeUpdate( 'UPDATE `*PREFIX*file_locks` SET `lock` = `lock` - 1 WHERE `key` = ? AND `lock` > 0', @@ -176,6 +185,13 @@ class DBLockingProvider extends AbstractLockingProvider { } public function __destruct() { - $this->cleanEmptyLocks(); + try { + $this->cleanEmptyLocks(); + } catch (\Exception $e) { + // If the table is missing, the clean up was successful + if ($this->connection->tableExists('file_locks')) { + throw $e; + } + } } } diff --git a/lib/private/lock/memcachelockingprovider.php b/lib/private/lock/memcachelockingprovider.php index 871572f7e3e..e4158dcdfdf 100644 --- a/lib/private/lock/memcachelockingprovider.php +++ b/lib/private/lock/memcachelockingprovider.php @@ -1,8 +1,6 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/lock/nooplockingprovider.php b/lib/private/lock/nooplockingprovider.php index a8571f2aec4..9f88e6148f8 100644 --- a/lib/private/lock/nooplockingprovider.php +++ b/lib/private/lock/nooplockingprovider.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/lib/private/log.php b/lib/private/log.php index 3c0e7b45d1b..ee5d61e98df 100644 --- a/lib/private/log.php +++ b/lib/private/log.php @@ -3,6 +3,7 @@ * @author Bart Visscher <bartv@thisnet.nl> * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Olivier Paroz <github@oparoz.com> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Victor Dubiniuk <dubiniuk@owncloud.com> @@ -26,6 +27,8 @@ namespace OC; +use InterfaSys\LogNormalizer\Normalizer; + use \OCP\ILogger; use OCP\Security\StringUtils; @@ -48,12 +51,15 @@ class Log implements ILogger { /** @var boolean|null cache the result of the log condition check for the request */ private $logConditionSatisfied = null; + /** @var Normalizer */ + private $normalizer; /** * @param string $logger The logger that should be used * @param SystemConfig $config the system config object + * @param null $normalizer */ - public function __construct($logger=null, SystemConfig $config=null) { + public function __construct($logger=null, SystemConfig $config=null, $normalizer = null) { // FIXME: Add this for backwards compatibility, should be fixed at some point probably if($config === null) { $config = \OC::$server->getSystemConfig(); @@ -68,6 +74,11 @@ class Log implements ILogger { } else { $this->logger = $logger; } + if ($normalizer === null) { + $this->normalizer = new Normalizer(); + } else { + $this->normalizer = $normalizer; + } } @@ -175,6 +186,8 @@ class Log implements ILogger { $minLevel = min($this->config->getValue('loglevel', \OCP\Util::WARN), \OCP\Util::ERROR); $logCondition = $this->config->getValue('log.condition', []); + array_walk($context, [$this->normalizer, 'format']); + if (isset($context['app'])) { $app = $context['app']; @@ -241,4 +254,25 @@ class Log implements ILogger { call_user_func(array($logger, 'write'), $app, $message, $level); } } + + /** + * Logs an exception very detailed + * + * @param \Exception $exception + * @param array $context + * @return void + * @since 8.2.0 + */ + public function logException(\Exception $exception, array $context = array()) { + $exception = array( + 'Exception' => get_class($exception), + 'Message' => $exception->getMessage(), + 'Code' => $exception->getCode(), + 'Trace' => $exception->getTraceAsString(), + 'File' => $exception->getFile(), + 'Line' => $exception->getLine(), + ); + $exception['Trace'] = preg_replace('!(login|checkPassword)\(.*\)!', '$1(*** username and password replaced ***)', $exception['Trace']); + $this->error('Exception: ' . json_encode($exception), $context); + } } diff --git a/lib/private/log/rotate.php b/lib/private/log/rotate.php index 4572a9904d2..27731c07db2 100644 --- a/lib/private/log/rotate.php +++ b/lib/private/log/rotate.php @@ -2,6 +2,7 @@ /** * @author Bart Visscher <bartv@thisnet.nl> * @author Morris Jobke <hey@morrisjobke.de> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/mail/mailer.php b/lib/private/mail/mailer.php index d083b992326..bd93f3e3d58 100644 --- a/lib/private/mail/mailer.php +++ b/lib/private/mail/mailer.php @@ -157,7 +157,10 @@ class Mailer implements IMailer { $this->instance = $this->getSMTPInstance(); break; case 'sendmail': - $this->instance = $this->getSendMailInstance(); + // FIXME: Move into the return statement but requires proper testing + // for SMTP and mail as well. Thus not really doable for a + // minor release. + $this->instance = \Swift_Mailer::newInstance($this->getSendMailInstance()); break; default: $this->instance = $this->getMailInstance(); diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php index e99303ecc15..ce7c6fa9577 100644 --- a/lib/private/memcache/memcached.php +++ b/lib/private/memcache/memcached.php @@ -4,6 +4,7 @@ * @author Bart Visscher <bartv@thisnet.nl> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/naturalsort.php b/lib/private/naturalsort.php index 26b9cec6cf1..2071ede43e0 100644 --- a/lib/private/naturalsort.php +++ b/lib/private/naturalsort.php @@ -4,6 +4,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/ocs.php b/lib/private/ocs.php index c5133bf9ee8..7b474fa439f 100644 --- a/lib/private/ocs.php +++ b/lib/private/ocs.php @@ -1,15 +1,10 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> - * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Frank Karlitschek <frank@owncloud.org> - * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> - * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/ocs/cloud.php b/lib/private/ocs/cloud.php index 8f4f1769e9c..441e53400a3 100644 --- a/lib/private/ocs/cloud.php +++ b/lib/private/ocs/cloud.php @@ -42,52 +42,6 @@ class OC_OCS_Cloud { return new OC_OCS_Result($result); } - /** - * gets user info - * - * exposes the quota of an user: - * <data> - * <quota> - * <free>1234</free> - * <used>4321</used> - * <total>5555</total> - * <ralative>0.78</ralative> - * </quota> - * </data> - * - * @param array $parameters should contain parameter 'userid' which identifies - * the user from whom the information will be returned - */ - public static function getUser($parameters) { - $return = array(); - // Check if they are viewing information on themselves - if($parameters['userid'] === OC_User::getUser()) { - // Self lookup - $storage = OC_Helper::getStorageInfo('/'); - $return['quota'] = array( - 'free' => $storage['free'], - 'used' => $storage['used'], - 'total' => $storage['total'], - 'relative' => $storage['relative'], - ); - } - if(OC_User::isAdminUser(OC_User::getUser()) - || OC_Subadmin::isUserAccessible(OC_User::getUser(), $parameters['userid'])) { - if(OC_User::userExists($parameters['userid'])) { - // Is an admin/subadmin so can see display name - $return['displayname'] = OC_User::getDisplayName($parameters['userid']); - } else { - return new OC_OCS_Result(null, 101); - } - } - if(count($return)) { - return new OC_OCS_Result($return); - } else { - // No permission to view this user data - return new OC_OCS_Result(null, 997); - } - } - public static function getCurrentUser() { $email=\OC::$server->getConfig()->getUserValue(OC_User::getUser(), 'settings', 'email', ''); $data = array( diff --git a/lib/private/ocs/privatedata.php b/lib/private/ocs/privatedata.php index 249c17b3792..92f029aa12a 100644 --- a/lib/private/ocs/privatedata.php +++ b/lib/private/ocs/privatedata.php @@ -3,6 +3,7 @@ * @author Andreas Fischer <bantu@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Frank Karlitschek <frank@owncloud.org> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Tom Needham <tom@owncloud.com> diff --git a/lib/private/ocs/result.php b/lib/private/ocs/result.php index e8ef253ee65..2c3f676510c 100644 --- a/lib/private/ocs/result.php +++ b/lib/private/ocs/result.php @@ -6,6 +6,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Tom Needham <tom@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/ocsclient.php b/lib/private/ocsclient.php index 78df3b79bb6..e2973f82605 100644 --- a/lib/private/ocsclient.php +++ b/lib/private/ocsclient.php @@ -4,10 +4,10 @@ * @author Brice Maron <brice@bmaron.net> * @author Felix Moeller <mail@felixmoeller.de> * @author Frank Karlitschek <frank@owncloud.org> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Kamil Domanski <kdomanski@kdemail.net> * @author Lukas Reschke <lukas@owncloud.com> - * @author Martin Mattel <martin.mattel@diemattels.at> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Sam Tuke <mail@samtuke.com> @@ -68,7 +68,13 @@ class OCSClient { * @return bool */ public function isAppStoreEnabled() { - return $this->config->getSystemValue('appstoreenabled', true) === true; + // For a regular edition default to true, all others default to false + $default = false; + if (\OC_Util::getEditionString() === '') { + $default = true; + } + + return $this->config->getSystemValue('appstoreenabled', $default) === true; } /** diff --git a/lib/private/preview.php b/lib/private/preview.php index db2a56f9fa5..b2accdfd00f 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -252,12 +252,13 @@ class Preview { * Sets the path of the file you want a preview of * * @param string $file + * @param \OCP\Files\FileInfo|null $info * * @return \OC\Preview */ - public function setFile($file) { + public function setFile($file, $info = null) { $this->file = $file; - $this->info = null; + $this->info = $info; if ($file !== '') { $this->getFileInfo(); @@ -374,7 +375,7 @@ class Preview { return false; } - if (!$this->fileView->file_exists($file)) { + if (!$this->getFileInfo() instanceof FileInfo) { \OCP\Util::writeLog('core', 'File:"' . $file . '" not found', \OCP\Util::DEBUG); return false; @@ -478,7 +479,7 @@ class Preview { $preview = $this->buildCachePath($fileId, $previewWidth, $previewHeight); // This checks if we have a preview of those exact dimensions in the cache - if ($this->userView->file_exists($preview)) { + if ($this->thumbnailSizeExists($allThumbnails, basename($preview))) { return $preview; } @@ -524,6 +525,24 @@ class Preview { } /** + * Check if a specific thumbnail size is cached + * + * @param FileInfo[] $allThumbnails the list of all our cached thumbnails + * @param string $name + * @return bool + */ + private function thumbnailSizeExists(array $allThumbnails, $name) { + + foreach ($allThumbnails as $thumbnail) { + if ($name === $thumbnail->getName()) { + return true; + } + } + + return false; + } + + /** * Determines the size of the preview we should be looking for in the cache * * @return int[] @@ -772,12 +791,6 @@ class Preview { throw new NotFoundException('File not found.'); } - if ($cachedPath = $this->isCached($this->info->getId())) { - header('Content-Type: ' . $this->info->getMimetype()); - $this->userView->readfile($cachedPath); - return; - } - if (is_null($this->preview)) { $this->getPreview(); } @@ -843,6 +856,11 @@ class Preview { $askedWidth = $this->getMaxX(); $askedHeight = $this->getMaxY(); + if ($this->mode === self::MODE_COVER) { + list($askedWidth, $askedHeight) = + $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight); + } + /** * Phase 1: If required, adjust boundaries to keep aspect ratio */ @@ -851,20 +869,12 @@ class Preview { $this->applyAspectRatio($askedWidth, $askedHeight, $previewWidth, $previewHeight); } - if ($this->mode === self::MODE_COVER) { - list($scaleWidth, $scaleHeight) = - $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight); - } else { - $scaleWidth = $askedWidth; - $scaleHeight = $askedHeight; - } - /** * Phase 2: Resizes preview to try and match requirements. * Takes the scaling ratio into consideration */ list($newPreviewWidth, $newPreviewHeight) = $this->scale( - $image, $scaleWidth, $scaleHeight, $previewWidth, $previewHeight + $image, $askedWidth, $askedHeight, $previewWidth, $previewHeight ); // The preview has been resized and should now have the asked dimensions @@ -896,6 +906,7 @@ class Preview { return; } + // The preview is smaller, but we can't touch it $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight); } @@ -1302,6 +1313,13 @@ class Preview { /** * @param array $args + */ + public static function post_delete_versions($args) { + self::post_delete($args, 'files/'); + } + + /** + * @param array $args * @param string $prefix */ public static function post_delete($args, $prefix = '') { diff --git a/lib/private/preview/bitmap.php b/lib/private/preview/bitmap.php index 065425c9a1d..ad0ef000510 100644 --- a/lib/private/preview/bitmap.php +++ b/lib/private/preview/bitmap.php @@ -3,6 +3,7 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/preview/bmp.php b/lib/private/preview/bmp.php index 2a24a783d52..36439626f08 100644 --- a/lib/private/preview/bmp.php +++ b/lib/private/preview/bmp.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/preview/gif.php b/lib/private/preview/gif.php index 08f6c41d98c..a3b57484999 100644 --- a/lib/private/preview/gif.php +++ b/lib/private/preview/gif.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/preview/image.php b/lib/private/preview/image.php index f9c27e690f6..9287d9c888b 100644 --- a/lib/private/preview/image.php +++ b/lib/private/preview/image.php @@ -2,8 +2,8 @@ /** * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> + * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> * @@ -46,12 +46,16 @@ abstract class Image extends Provider { $image = new \OC_Image(); - if ($fileInfo['encrypted'] === true) { + $useTempFile = $fileInfo->isEncrypted() || !$fileInfo->getStorage()->isLocal(); + if ($useTempFile) { $fileName = $fileview->toTmpFile($path); } else { $fileName = $fileview->getLocalFile($path); } $image->loadFromFile($fileName); + if ($useTempFile) { + unlink($fileName); + } $image->fixOrientation(); if ($image->valid()) { $image->scaleDownToFit($maxX, $maxY); diff --git a/lib/private/preview/jpeg.php b/lib/private/preview/jpeg.php index 86e447d3406..96f89f4d57e 100644 --- a/lib/private/preview/jpeg.php +++ b/lib/private/preview/jpeg.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/preview/movie.php b/lib/private/preview/movie.php index a687fefff65..f71eaaf3eb2 100644 --- a/lib/private/preview/movie.php +++ b/lib/private/preview/movie.php @@ -2,7 +2,6 @@ /** * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * diff --git a/lib/private/preview/mp3.php b/lib/private/preview/mp3.php index 25fe6566e44..ffe596db71b 100644 --- a/lib/private/preview/mp3.php +++ b/lib/private/preview/mp3.php @@ -2,7 +2,6 @@ /** * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * @author Thomas Tanghus <thomas@tanghus.net> * diff --git a/lib/private/preview/office.php b/lib/private/preview/office.php index ac6b4afa0cc..415220ed4af 100644 --- a/lib/private/preview/office.php +++ b/lib/private/preview/office.php @@ -1,8 +1,9 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/preview/png.php b/lib/private/preview/png.php index a6755671326..bab63c16ada 100644 --- a/lib/private/preview/png.php +++ b/lib/private/preview/png.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index d9b80939246..8f4a9f9fc3f 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -3,7 +3,6 @@ * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * @author Robin Appelman <icewind@owncloud.com> * diff --git a/lib/private/preview/svg.php b/lib/private/preview/svg.php index f8318e9a69a..26ce0fa9411 100644 --- a/lib/private/preview/svg.php +++ b/lib/private/preview/svg.php @@ -2,8 +2,8 @@ /** * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/preview/txt.php b/lib/private/preview/txt.php index 0bba570a8c9..b6c21b7c1b1 100644 --- a/lib/private/preview/txt.php +++ b/lib/private/preview/txt.php @@ -2,6 +2,7 @@ /** * @author Georg Ehrke <georg@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * @author Nmz <nemesiz@nmz.lt> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -53,7 +54,7 @@ class TXT extends Provider { $lines = preg_split("/\r\n|\n|\r/", $content); - $fontSize = ($maxX) ? (int) ((5 / 36) * $maxX) : 5; //5px + $fontSize = ($maxX) ? (int) ((5 / 32) * $maxX) : 5; //5px $lineSize = ceil($fontSize * 1.25); $image = imagecreate($maxX, $maxY); diff --git a/lib/private/preview/xbitmap.php b/lib/private/preview/xbitmap.php index 8001f21684a..7887f2b73f5 100644 --- a/lib/private/preview/xbitmap.php +++ b/lib/private/preview/xbitmap.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/private/repair.php b/lib/private/repair.php index 533bf05b54c..20219e313fd 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -44,6 +44,7 @@ use OC\Repair\RepairLegacyStorages; use OC\Repair\RepairMimeTypes; use OC\Repair\SearchLuceneTables; use OC\Repair\UpdateOutdatedOcsIds; +use OC\Repair\RepairInvalidShares; class Repair extends BasicEmitter { /** @@ -103,7 +104,7 @@ class Repair extends BasicEmitter { */ public static function getRepairSteps() { return [ - new RepairMimeTypes(), + new RepairMimeTypes(\OC::$server->getConfig()), new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), new RepairConfig(), new AssetCache(), @@ -113,6 +114,7 @@ class Repair extends BasicEmitter { new DropOldJobs(\OC::$server->getJobList()), new RemoveGetETagEntries(\OC::$server->getDatabaseConnection()), new UpdateOutdatedOcsIds(\OC::$server->getConfig()), + new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), ]; } diff --git a/lib/private/response.php b/lib/private/response.php index f1a429463f2..2cd1d990e51 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -247,7 +247,7 @@ class OC_Response { . 'script-src \'self\' \'unsafe-eval\'; ' . 'style-src \'self\' \'unsafe-inline\'; ' . 'frame-src *; ' - . 'img-src *; ' + . 'img-src * data: blob:; ' . 'font-src \'self\' data:; ' . 'media-src *; ' . 'connect-src *'; diff --git a/lib/private/route/router.php b/lib/private/route/router.php index 7b7849a6da0..f4abfae0f43 100644 --- a/lib/private/route/router.php +++ b/lib/private/route/router.php @@ -7,6 +7,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * diff --git a/lib/private/security/certificatemanager.php b/lib/private/security/certificatemanager.php index 4d470f69a66..ded81863a73 100644 --- a/lib/private/security/certificatemanager.php +++ b/lib/private/security/certificatemanager.php @@ -110,7 +110,7 @@ class CertificateManager implements ICertificateManager { } // Append the default certificates - $defaultCertificates = file_get_contents(\OC::$SERVERROOT . '/config/ca-bundle.crt'); + $defaultCertificates = file_get_contents(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt'); fwrite($fh_certs, $defaultCertificates); fclose($fh_certs); } diff --git a/lib/private/security/crypto.php b/lib/private/security/crypto.php index 9bae1d6992c..0bd34df3f36 100644 --- a/lib/private/security/crypto.php +++ b/lib/private/security/crypto.php @@ -1,5 +1,6 @@ <?php /** + * @author Andreas Fischer <bantu@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * diff --git a/lib/private/server.php b/lib/private/server.php index d5f4f532c1c..14fa323f74d 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -6,6 +6,7 @@ * @author Bernhard Reiter <ockham@raz.or.at> * @author Björn Schießle <schiessle@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> + * @author Individual IT Services <info@individual-it.net> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> @@ -46,6 +47,7 @@ use OC\Diagnostics\EventLogger; use OC\Diagnostics\NullEventLogger; use OC\Diagnostics\NullQueryLogger; use OC\Diagnostics\QueryLogger; +use OC\Files\Node\HookConnector; use OC\Files\Node\Root; use OC\Files\View; use OC\Http\Client\ClientService; @@ -144,7 +146,10 @@ class Server extends SimpleContainer implements IServerContainer { $user = $userManager->get($user); $manager = \OC\Files\Filesystem::getMountManager(); $view = new View(); - return new Root($manager, $view, $user); + $root = new Root($manager, $view, $user); + $connector = new HookConnector($root, $view); + $connector->viewToNode(); + return $root; }); $this->registerService('UserManager', function (Server $c) { $config = $c->getConfig(); @@ -470,7 +475,9 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('MimeTypeDetector', function(Server $c) { return new \OC\Files\Type\Detection( $c->getURLGenerator(), - \OC::$configDir); + \OC::$SERVERROOT . '/config/', + \OC::$SERVERROOT . '/resources/config/' + ); }); $this->registerService('MimeTypeLoader', function(Server $c) { return new \OC\Files\Type\Loader( @@ -1096,4 +1103,5 @@ class Server extends SimpleContainer implements IServerContainer { public function getUserStoragesService() { return \OC_Mount_Config::$app->getContainer()->query('OCA\\Files_External\\Service\\UserStoragesService'); } + } diff --git a/lib/private/session/cryptosessiondata.php b/lib/private/session/cryptosessiondata.php index 6826ede5e33..dcae1648fe1 100644 --- a/lib/private/session/cryptosessiondata.php +++ b/lib/private/session/cryptosessiondata.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/session/cryptowrapper.php b/lib/private/session/cryptowrapper.php index 261514d683e..c79778587e0 100644 --- a/lib/private/session/cryptowrapper.php +++ b/lib/private/session/cryptowrapper.php @@ -1,6 +1,8 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> + * @author Phil Davis <phil.davis@inf.org> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -39,7 +41,7 @@ use OCP\Security\ISecureRandom; * it as an additional small security obfuscation layer to comply with compliance * guidelines. * - * TODO: Remove this in a future relase with an approach such as + * TODO: Remove this in a future release with an approach such as * https://github.com/owncloud/core/pull/17866 * * @package OC\Session diff --git a/lib/private/session/internal.php b/lib/private/session/internal.php index 8ee21272104..0b6152acf12 100644 --- a/lib/private/session/internal.php +++ b/lib/private/session/internal.php @@ -1,7 +1,9 @@ <?php /** * @author cetra3 <peter@parashift.com.au> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Phil Davis <phil.davis@inf.org> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @@ -39,7 +41,11 @@ class Internal extends Session { public function __construct($name) { session_name($name); set_error_handler(array($this, 'trapError')); - session_start(); + try { + session_start(); + } catch (\Exception $e) { + setcookie(session_name(), null, -1, \OC::$WEBROOT ? : '/'); + } restore_error_handler(); if (!isset($_SESSION)) { throw new \Exception('Failed to start session'); @@ -106,7 +112,7 @@ class Internal extends Session { private function validateSession() { if ($this->sessionClosed) { - throw new \Exception('Session has been closed - no further changes to the session as allowed'); + throw new \Exception('Session has been closed - no further changes to the session are allowed'); } } } diff --git a/lib/private/session/memory.php b/lib/private/session/memory.php index 1cae62e44d3..ff95efc5345 100644 --- a/lib/private/session/memory.php +++ b/lib/private/session/memory.php @@ -2,6 +2,7 @@ /** * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> + * @author Phil Davis <phil.davis@inf.org> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @@ -93,7 +94,7 @@ class Memory extends Session { */ private function validateSession() { if ($this->sessionClosed) { - throw new \Exception('Session has been closed - no further changes to the session as allowed'); + throw new \Exception('Session has been closed - no further changes to the session are allowed'); } } } diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php index 5597592f21e..f2d2b15cd90 100644 --- a/lib/private/setup/mysql.php +++ b/lib/private/setup/mysql.php @@ -3,7 +3,7 @@ * @author Bart Visscher <bartv@thisnet.nl> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Michael Göhler <somebody.here@gmx.de> - * @author Robin Appelman <icewind@owncloud.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/setup/oci.php b/lib/private/setup/oci.php index 1e1eb1ff54e..c3f03567165 100644 --- a/lib/private/setup/oci.php +++ b/lib/private/setup/oci.php @@ -40,7 +40,7 @@ class OCI extends AbstractDatabase { // allow empty hostname for oracle $this->dbHost = $config['dbhost']; - \OC_Config::setValues([ + $this->config->setSystemValues([ 'dbhost' => $this->dbHost, 'dbtablespace' => $this->dbtablespace, ]); @@ -66,7 +66,7 @@ class OCI extends AbstractDatabase { } else { $easy_connect_string = '//'.$e_host.'/'.$e_dbname; } - \OCP\Util::writeLog('setup oracle', 'connect string: ' . $easy_connect_string, \OCP\Util::DEBUG); + $this->logger->debug('connect string: ' . $easy_connect_string, ['app' => 'setup.oci']); $connection = @oci_connect($this->dbUser, $this->dbPassword, $easy_connect_string); if(!$connection) { $errorMessage = $this->getLastError(); @@ -93,7 +93,7 @@ class OCI extends AbstractDatabase { if (!$stmt) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } $result = oci_execute($stmt); if($result) { @@ -116,7 +116,7 @@ class OCI extends AbstractDatabase { } } - \OC_Config::setValues([ + $this->config->setSystemValues([ 'dbuser' => $this->dbUser, 'dbname' => $this->dbName, 'dbpassword' => $this->dbPassword, @@ -131,9 +131,9 @@ class OCI extends AbstractDatabase { oci_close($connection); // connect to the oracle database (schema=$this->dbuser) an check if the schema needs to be filled - $this->dbUser = \OC_Config::getValue('dbuser'); + $this->dbUser = $this->config->getSystemValue('dbuser'); //$this->dbname = \OC_Config::getValue('dbname'); - $this->dbPassword = \OC_Config::getValue('dbpassword'); + $this->dbPassword = $this->config->getSystemValue('dbpassword'); $e_host = addslashes($this->dbHost); $e_dbname = addslashes($this->dbName); @@ -155,7 +155,7 @@ class OCI extends AbstractDatabase { if (!$stmt) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning( $entry, ['app' => 'setup.oci']); } $result = oci_execute($stmt); @@ -178,14 +178,14 @@ class OCI extends AbstractDatabase { if (!$stmt) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } oci_bind_by_name($stmt, ':un', $name); $result = oci_execute($stmt); if(!$result) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } if(! oci_fetch_row($stmt)) { @@ -196,7 +196,8 @@ class OCI extends AbstractDatabase { if (!$stmt) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); + } //oci_bind_by_name($stmt, ':un', $name); $result = oci_execute($stmt); @@ -204,7 +205,8 @@ class OCI extends AbstractDatabase { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s", name: %s, password: %s', array($query, $name, $password)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); + } } else { // change password of the existing role $query = "ALTER USER :un IDENTIFIED BY :pw"; @@ -212,7 +214,7 @@ class OCI extends AbstractDatabase { if (!$stmt) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } oci_bind_by_name($stmt, ':un', $name); oci_bind_by_name($stmt, ':pw', $password); @@ -220,7 +222,7 @@ class OCI extends AbstractDatabase { if(!$result) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } } // grant necessary roles @@ -229,14 +231,14 @@ class OCI extends AbstractDatabase { if (!$stmt) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } $result = oci_execute($stmt); if(!$result) { $entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />'; $entry .= $this->trans->t('Offending command was: "%s", name: %s, password: %s', array($query, $name, $password)) . '<br />'; - \OCP\Util::writeLog('setup.oci', $entry, \OCP\Util::WARN); + $this->logger->warning($entry, ['app' => 'setup.oci']); } } diff --git a/lib/private/setup/postgresql.php b/lib/private/setup/postgresql.php index 319b6676ef8..0a559e7a589 100644 --- a/lib/private/setup/postgresql.php +++ b/lib/private/setup/postgresql.php @@ -1,9 +1,9 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> - * @author Christopher Schäpers <kondou@ts.unde.re> * @author eduardo <eduardo@vnexu.net> * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 07c7f31a853..b015d7738b5 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -1,5 +1,6 @@ <?php /** + * @author Arthur Schiwon <blizzz@owncloud.com> * @author Bart Visscher <bartv@thisnet.nl> * @author Bernhard Reiter <ockham@raz.or.at> * @author Björn Schießle <schiessle@owncloud.com> @@ -618,10 +619,13 @@ class Share extends Constants { if (is_null($itemSourceName)) { $itemSourceName = $itemSource; } + $itemName = $itemSourceName; // check if file can be shared if ($itemType === 'file' or $itemType === 'folder') { $path = \OC\Files\Filesystem::getPath($itemSource); + $itemName = $path; + // verify that the file exists before we try to share it if (!$path) { $message = 'Sharing %s failed, because the file does not exist'; @@ -632,8 +636,8 @@ class Share extends Constants { // verify that the user has share permission if (!\OC\Files\Filesystem::isSharable($path)) { $message = 'You are not allowed to share %s'; - $message_t = $l->t('You are not allowed to share %s', array($itemSourceName)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::DEBUG); + $message_t = $l->t('You are not allowed to share %s', [$path]); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $path), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -676,9 +680,9 @@ class Share extends Constants { // Verify share type and sharing conditions are met if ($shareType === self::SHARE_TYPE_USER) { if ($shareWith == $uidOwner) { - $message = 'Sharing %s failed, because the user %s is the item owner'; - $message_t = $l->t('Sharing %s failed, because the user %s is the item owner', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); + $message = 'Sharing %s failed, because you can not share with yourself'; + $message_t = $l->t('Sharing %s failed, because you can not share with yourself', [$itemName]); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::DEBUG); throw new \Exception($message_t); } if (!\OC_User::userExists($shareWith)) { @@ -718,7 +722,7 @@ class Share extends Constants { if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) { $message = 'Sharing %s failed, because this item is already shared with user %s'; $message_t = $l->t('Sharing %s failed, because this item is already shared with user %s', array($itemSourceName, $shareWith)); - \OC_Log::write('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OC_Log::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); throw new \Exception($message_t); } } @@ -1098,6 +1102,7 @@ class Share extends Constants { 'uidOwner' => \OC_User::getUser(), 'permissions' => $permissions, 'path' => $item['path'], + 'share' => $item )); } // Check if permissions were removed @@ -1108,16 +1113,18 @@ class Share extends Constants { Helper::delete($item['id'], true, null, null, true); } else { $ids = array(); + $items = []; $parents = array($item['id']); while (!empty($parents)) { $parents = "'".implode("','", $parents)."'"; - $query = \OC_DB::prepare('SELECT `id`, `permissions` FROM `*PREFIX*share`' + $query = \OC_DB::prepare('SELECT `id`, `permissions`, `item_type` FROM `*PREFIX*share`' .' WHERE `parent` IN ('.$parents.')'); $result = $query->execute(); // Reset parents array, only go through loop again if // items are found that need permissions removed $parents = array(); while ($item = $result->fetchRow()) { + $items[] = $item; // Check if permissions need to be removed if ($item['permissions'] & ~$permissions) { // Add to list of items that need permissions removed @@ -1139,8 +1146,13 @@ class Share extends Constants { .' WHERE `id` IN ('.$ids.')'); $query->execute(array($permissions)); } + + foreach ($items as $item) { + \OC_Hook::emit('OCP\Share', 'post_update_permissions', ['share' => $item]); + } } } + return true; } $message = 'Setting permissions for %s failed, because the item was not found'; @@ -1905,9 +1917,16 @@ class Share extends Constants { } } if (!empty($collectionItems)) { + $collectionItems = array_unique($collectionItems, SORT_REGULAR); $items = array_merge($items, $collectionItems); } + // filter out invalid items, these can appear when subshare entries exist + // for a group in which the requested user isn't a member any more + $items = array_filter($items, function($item) { + return $item['share_type'] !== self::$shareTypeGroupUserUnique; + }); + return self::formatResult($items, $column, $backend, $format, $parameters); } elseif ($includeCollections && $collectionTypes && in_array('folder', $collectionTypes)) { // FIXME: Thats a dirty hack to improve file sharing performance, @@ -1989,6 +2008,8 @@ class Share extends Constants { $queriesToExecute = array(); $suggestedItemTarget = null; + $groupFileTarget = $fileTarget = $suggestedFileTarget = $filePath = ''; + $groupItemTarget = $itemTarget = $fileSource = $parent = 0; $result = self::checkReshare($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $itemSourceName, $expirationDate); if(!empty($result)) { @@ -1998,7 +2019,6 @@ class Share extends Constants { $suggestedItemTarget = $result['suggestedItemTarget']; $suggestedFileTarget = $result['suggestedFileTarget']; $filePath = $result['filePath']; - $expirationDate = $result['expirationDate']; } $isGroupShare = false; @@ -2071,7 +2091,7 @@ class Share extends Constants { $userShareType = ($isGroupShare) ? self::$shareTypeGroupUserUnique : $shareType; - if ($sourceExists) { + if ($sourceExists && $sourceExists['item_source'] === $itemSource) { $fileTarget = $sourceExists['file_target']; $itemTarget = $sourceExists['item_target']; @@ -2192,7 +2212,7 @@ class Share extends Constants { // Check if attempting to share back to owner if ($checkReshare['uid_owner'] == $shareWith && $shareType == self::SHARE_TYPE_USER) { $message = 'Sharing %s failed, because the user %s is the original sharer'; - $message_t = $l->t('Sharing %s failed, because the user %s is the original sharer', array($itemSourceName, $shareWith)); + $message_t = $l->t('Sharing failed, because the user %s is the original sharer', [$shareWith]); \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); @@ -2616,7 +2636,9 @@ class Share extends Constants { */ private static function isFileReachable($path, $ownerStorageId) { // if outside the home storage, file is always considered reachable - if (!(substr($ownerStorageId, 0, 6) === 'home::')) { + if (!(substr($ownerStorageId, 0, 6) === 'home::' || + substr($ownerStorageId, 0, 13) === 'object::user:' + )) { return true; } diff --git a/lib/private/streamer.php b/lib/private/streamer.php new file mode 100644 index 00000000000..a08c8444f02 --- /dev/null +++ b/lib/private/streamer.php @@ -0,0 +1,125 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Victor Dubiniuk <dubiniuk@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC; + +use ownCloud\TarStreamer\TarStreamer; +use ZipStreamer\ZipStreamer; + +class Streamer { + // array of regexp. Matching user agents will get tar instead of zip + private $preferTarFor = [ '/macintosh|mac os x/i' ]; + + // streamer instance + private $streamerInstance; + + public function __construct(){ + /** @var \OCP\IRequest */ + $request = \OC::$server->getRequest(); + + if ($request->isUserAgent($this->preferTarFor)) { + $this->streamerInstance = new TarStreamer(); + } else { + $this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]); + } + } + + /** + * Send HTTP headers + * @param string $name + */ + public function sendHeaders($name){ + $extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar'; + $fullName = $name . $extension; + // ZipStreamer does not escape name in Content-Disposition atm + if ($this->streamerInstance instanceof ZipStreamer) { + $fullName = rawurlencode($fullName); + } + $this->streamerInstance->sendHeaders($fullName); + } + + /** + * Stream directory recursively + * @param string $dir + * @param string $internalDir + */ + public function addDirRecursive($dir, $internalDir='') { + $dirname = basename($dir); + $rootDir = $internalDir . $dirname; + if (!empty($rootDir)) { + $this->streamerInstance->addEmptyDir($rootDir); + } + $internalDir .= $dirname . '/'; + // prevent absolute dirs + $internalDir = ltrim($internalDir, '/'); + + $files= \OC\Files\Filesystem::getDirectoryContent($dir); + foreach($files as $file) { + $filename = $file['name']; + $file = $dir . '/' . $filename; + if(\OC\Files\Filesystem::is_file($file)) { + $filesize = \OC\Files\Filesystem::filesize($file); + $fh = \OC\Files\Filesystem::fopen($file, 'r'); + $this->addFileFromStream($fh, $internalDir . $filename, $filesize); + fclose($fh); + }elseif(\OC\Files\Filesystem::is_dir($file)) { + $this->addDirRecursive($file, $internalDir); + } + } + } + + /** + * Add a file to the archive at the specified location and file name. + * + * @param string $stream Stream to read data from + * @param string $internalName Filepath and name to be used in the archive. + * @param int $size Filesize + * @return bool $success + */ + public function addFileFromStream($stream, $internalName, $size){ + if ($this->streamerInstance instanceof ZipStreamer) { + return $this->streamerInstance->addFileFromStream($stream, $internalName); + } else { + return $this->streamerInstance->addFileFromStream($stream, $internalName, $size); + } + } + + /** + * Add an empty directory entry to the archive. + * + * @param string $dirName Directory Path and name to be added to the archive. + * @return bool $success + */ + public function addEmptyDir($dirName){ + return $this->streamerInstance->addEmptyDir($dirName); + } + + /** + * Close the archive. + * A closed archive can no longer have new files added to it. After + * closing, the file is completely written to the output stream. + * @return bool $success + */ + public function finalize(){ + return $this->streamerInstance->finalize(); + } +} diff --git a/lib/private/systemconfig.php b/lib/private/systemconfig.php index 13b0959768a..94b815aebd7 100644 --- a/lib/private/systemconfig.php +++ b/lib/private/systemconfig.php @@ -22,12 +22,28 @@ namespace OC; + +use OCP\IConfig; + /** * Class which provides access to the system config values stored in config.php * Internal class for bootstrap only. * fixes cyclic DI: AllConfig needs AppConfig needs Database needs AllConfig */ class SystemConfig { + + /** @var array */ + protected $sensitiveValues = [ + 'dbpassword' => true, + 'dbuser' => true, + 'mail_smtpname' => true, + 'mail_smtppassword' => true, + 'passwordsalt' => true, + 'secret' => true, + 'ldap_agent_password' => true, + 'objectstore' => ['arguments' => ['password' => true]], + ]; + /** * Lists all available config keys * @return array an array of key names @@ -68,6 +84,23 @@ class SystemConfig { } /** + * Looks up a system wide defined value and filters out sensitive data + * + * @param string $key the key of the value, under which it was saved + * @param mixed $default the default value to be returned if the value isn't set + * @return mixed the value or $default + */ + public function getFilteredValue($key, $default = '') { + $value = $this->getValue($key, $default); + + if (isset($this->sensitiveValues[$key])) { + $value = $this->removeSensitiveValue($this->sensitiveValues[$key], $value); + } + + return $value; + } + + /** * Delete a system wide defined value * * @param string $key the key of the value, under which it was saved @@ -75,4 +108,25 @@ class SystemConfig { public function deleteValue($key) { \OC_Config::deleteKey($key); } + + /** + * @param bool|array $keysToRemove + * @param mixed $value + * @return mixed + */ + protected function removeSensitiveValue($keysToRemove, $value) { + if ($keysToRemove === true) { + return IConfig::SENSITIVE_VALUE; + } + + if (is_array($value)) { + foreach ($keysToRemove as $keyToRemove => $valueToRemove) { + if (isset($value[$keyToRemove])) { + $value[$keyToRemove] = $this->removeSensitiveValue($valueToRemove, $value[$keyToRemove]); + } + } + } + + return $value; + } } diff --git a/lib/private/template.php b/lib/private/template.php index 920be71abbf..0deb26d8f19 100644 --- a/lib/private/template.php +++ b/lib/private/template.php @@ -6,6 +6,7 @@ * @author Brice Maron <brice@bmaron.net> * @author drarko <drarko@users.noreply.github.com> * @author Frank Karlitschek <frank@owncloud.org> + * @author Individual IT Services <info@individual-it.net> * @author Jakob Sack <mail@jakobsack.de> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> @@ -37,27 +38,40 @@ require_once __DIR__.'/template/functions.php'; * This class provides the templates for ownCloud. */ class OC_Template extends \OC\Template\Base { - private $renderas; // Create a full page? + + /** @var string */ + private $renderAs; // Create a full page? + + /** @var string */ private $path; // The path to the template + + /** @var array */ private $headers = array(); //custom headers + + /** @var string */ protected $app; // app id /** * Constructor * @param string $app app providing the template * @param string $name of the template file (without suffix) - * @param string $renderas = ""; produce a full page + * @param string $renderAs = ""; produce a full page * @param bool $registerCall = true * @return OC_Template object * * This function creates an OC_Template object. * - * If $renderas is set, OC_Template will try to produce a full page in the - * according layout. For now, renderas can be set to "guest", "user" or + * If $renderAs is set, OC_Template will try to produce a full page in the + * according layout. For now, $renderAs can be set to "guest", "user" or * "admin". */ - public function __construct( $app, $name, $renderas = "", $registerCall = true ) { + + protected static $initTemplateEngineFirstRun = true; + + public function __construct( $app, $name, $renderAs = "", $registerCall = true ) { // Read the selected theme from the config file + self::initTemplateEngine($renderAs); + $theme = OC_Util::getTheme(); $requesttoken = (OC::$server->getSession() and $registerCall) ? OC_Util::callRegister() : ''; @@ -69,13 +83,85 @@ class OC_Template extends \OC\Template\Base { list($path, $template) = $this->findTemplate($theme, $app, $name); // Set the private data - $this->renderas = $renderas; + $this->renderAs = $renderAs; $this->path = $path; $this->app = $app; parent::__construct($template, $requesttoken, $l10n, $themeDefaults); } + public static function initTemplateEngine($renderAs) { + if (self::$initTemplateEngineFirstRun){ + + //apps that started before the template initialization can load their own scripts/styles + //so to make sure this scripts/styles here are loaded first we use OC_Util::addScript() with $prepend=true + //meaning the last script/style in this list will be loaded first + if (\OC::$server->getSystemConfig()->getValue ('installed', false) && $renderAs !== 'error' && !\OCP\Util::needUpgrade()) { + if (\OC::$server->getConfig ()->getAppValue ( 'core', 'backgroundjobs_mode', 'ajax' ) == 'ajax') { + OC_Util::addScript ( 'backgroundjobs', null, true ); + } + } + + OC_Util::addStyle("tooltip",null,true); + OC_Util::addStyle('jquery-ui-fixes',null,true); + OC_Util::addVendorStyle('jquery-ui/themes/base/jquery-ui',null,true); + OC_Util::addStyle("multiselect",null,true); + OC_Util::addStyle("fixes",null,true); + OC_Util::addStyle("apps",null,true); + OC_Util::addStyle("fonts",null,true); + OC_Util::addStyle("icons",null,true); + OC_Util::addStyle("mobile",null,true); + OC_Util::addStyle("header",null,true); + OC_Util::addStyle("styles",null,true); + + // avatars + if (\OC::$server->getSystemConfig()->getValue('enable_avatars', true) === true) { + \OC_Util::addScript('avatar', null, true); + \OC_Util::addScript('jquery.avatar', null, true); + \OC_Util::addScript('placeholder', null, true); + } + + OC_Util::addScript('oc-backbone', null, true); + OC_Util::addVendorScript('core', 'backbone/backbone', true); + OC_Util::addVendorScript('snapjs/dist/latest/snap', null, true); + OC_Util::addScript('mimetypelist', null, true); + OC_Util::addScript('mimetype', null, true); + OC_Util::addScript("apps", null, true); + OC_Util::addScript("oc-requesttoken", null, true); + OC_Util::addScript('search', 'search', true); + OC_Util::addScript("config", null, true); + OC_Util::addScript("eventsource", null, true); + OC_Util::addScript("octemplate", null, true); + OC_Util::addTranslations("core", null, true); + OC_Util::addScript("l10n", null, true); + OC_Util::addScript("js", null, true); + OC_Util::addScript("oc-dialogs", null, true); + OC_Util::addScript("jquery.ocdialog", null, true); + OC_Util::addStyle("jquery.ocdialog"); + OC_Util::addScript("compatibility", null, true); + OC_Util::addScript("placeholders", null, true); + + // Add the stuff we need always + // following logic will import all vendor libraries that are + // specified in core/js/core.json + $fileContent = file_get_contents(OC::$SERVERROOT . '/core/js/core.json'); + if($fileContent !== false) { + $coreDependencies = json_decode($fileContent, true); + foreach(array_reverse($coreDependencies['vendor']) as $vendorLibrary) { + // remove trailing ".js" as addVendorScript will append it + OC_Util::addVendorScript( + substr($vendorLibrary, 0, strlen($vendorLibrary) - 3),null,true); + } + } else { + throw new \Exception('Cannot read core/js/core.json'); + } + + self::$initTemplateEngineFirstRun = false; + } + + } + + /** * find the template with the given name * @param string $name of the template file (without suffix) @@ -118,14 +204,14 @@ class OC_Template extends \OC\Template\Base { * Process the template * @return boolean|string * - * This function process the template. If $this->renderas is set, it + * This function process the template. If $this->renderAs is set, it * will produce a full page. */ public function fetchPage() { $data = parent::fetchPage(); - if( $this->renderas ) { - $page = new OC_TemplateLayout($this->renderas, $this->app); + if( $this->renderAs ) { + $page = new OC_TemplateLayout($this->renderAs, $this->app); // Add custom headers $headers = ''; @@ -141,18 +227,20 @@ class OC_Template extends \OC\Template\Base { } } - $page->assign('headers', $headers, false); + $page->assign('headers', $headers); - $page->assign('content', $data, false ); + $page->assign('content', $data); return $page->fetchPage(); } - else{ - return $data; - } + + return $data; } /** * Include template + * + * @param string $file + * @param array|null $additionalParams * @return string returns content of included template * * Includes another template. use <?php echo $this->inc('template'); ?> to @@ -213,34 +301,79 @@ class OC_Template extends \OC\Template\Base { * @param string $hint An optional hint message - needs to be properly escaped */ public static function printErrorPage( $error_msg, $hint = '' ) { - $content = new \OC_Template( '', 'error', 'error', false ); - $errors = array(array('error' => $error_msg, 'hint' => $hint)); - $content->assign( 'errors', $errors ); - $content->printPage(); + try { + $content = new \OC_Template( '', 'error', 'error', false ); + $errors = array(array('error' => $error_msg, 'hint' => $hint)); + $content->assign( 'errors', $errors ); + $content->printPage(); + } catch (\Exception $e) { + $logger = \OC::$server->getLogger(); + $logger->error("$error_msg $hint", ['app' => 'core']); + $logger->logException($e, ['app' => 'core']); + + header(self::getHttpProtocol() . ' 500 Internal Server Error'); + header('Content-Type: text/plain; charset=utf-8'); + print("$error_msg $hint"); + } die(); } /** * print error page using Exception details - * @param Exception|Error $exception + * @param Exception $exception */ public static function printExceptionErrorPage($exception) { - $request = \OC::$server->getRequest(); - $content = new \OC_Template('', 'exception', 'error', false); - $content->assign('errorClass', get_class($exception)); - $content->assign('errorMsg', $exception->getMessage()); - $content->assign('errorCode', $exception->getCode()); - $content->assign('file', $exception->getFile()); - $content->assign('line', $exception->getLine()); - $content->assign('trace', $exception->getTraceAsString()); - $content->assign('debugMode', \OC::$server->getSystemConfig()->getValue('debug', false)); - $content->assign('remoteAddr', $request->getRemoteAddress()); - $content->assign('requestID', $request->getId()); - $content->printPage(); + try { + $request = \OC::$server->getRequest(); + $content = new \OC_Template('', 'exception', 'error', false); + $content->assign('errorClass', get_class($exception)); + $content->assign('errorMsg', $exception->getMessage()); + $content->assign('errorCode', $exception->getCode()); + $content->assign('file', $exception->getFile()); + $content->assign('line', $exception->getLine()); + $content->assign('trace', $exception->getTraceAsString()); + $content->assign('debugMode', \OC::$server->getSystemConfig()->getValue('debug', false)); + $content->assign('remoteAddr', $request->getRemoteAddress()); + $content->assign('requestID', $request->getId()); + $content->printPage(); + } catch (\Exception $e) { + $logger = \OC::$server->getLogger(); + $logger->logException($exception, ['app' => 'core']); + $logger->logException($e, ['app' => 'core']); + + header(self::getHttpProtocol() . ' 500 Internal Server Error'); + header('Content-Type: text/plain; charset=utf-8'); + print("Internal Server Error\n\n"); + print("The server encountered an internal error and was unable to complete your request.\n"); + print("Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.\n"); + print("More details can be found in the server log.\n"); + } die(); } /** + * This is only here to reduce the dependencies in case of an exception to + * still be able to print a plain error message. + * + * Returns the used HTTP protocol. + * + * @return string HTTP protocol. HTTP/2, HTTP/1.1 or HTTP/1.0. + * @internal Don't use this - use AppFramework\Http\Request->getHttpProtocol instead + */ + protected static function getHttpProtocol() { + $claimedProtocol = strtoupper($_SERVER['SERVER_PROTOCOL']); + $validProtocols = [ + 'HTTP/1.0', + 'HTTP/1.1', + 'HTTP/2', + ]; + if(in_array($claimedProtocol, $validProtocols, true)) { + return $claimedProtocol; + } + return 'HTTP/1.1'; + } + + /** * @return bool */ public static function isAssetPipelineEnabled() { diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php index 93bf6cbd307..7d16823d2a8 100644 --- a/lib/private/templatelayout.php +++ b/lib/private/templatelayout.php @@ -38,8 +38,8 @@ use Assetic\AssetWriter; use Assetic\Filter\CssImportFilter; use Assetic\Filter\CssMinFilter; use Assetic\Filter\CssRewriteFilter; -use Assetic\Filter\JSMinFilter; -use OC\Assetic\SeparatorFilter; // waiting on upstream +use Assetic\Filter\JSqueezeFilter; +use Assetic\Filter\SeparatorFilter; /** * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> @@ -79,7 +79,7 @@ class OC_TemplateLayout extends OC_Template { if($this->config->getSystemValue('updatechecker', true) === true && OC_User::isAdminUser(OC_User::getUser())) { $updater = new \OC\Updater(\OC::$server->getHTTPHelper(), - \OC::$server->getConfig()); + \OC::$server->getConfig(), \OC::$server->getLogger()); $data = $updater->check(); if(isset($data['version']) && $data['version'] != '' and $data['version'] !== Array()) { @@ -116,9 +116,14 @@ class OC_TemplateLayout extends OC_Template { } } $userDisplayName = OC_User::getDisplayName(); + $appsMgmtActive = strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')) === 0; + if ($appsMgmtActive) { + $l = \OC::$server->getL10N('lib'); + $this->assign('application', $l->t('Apps')); + } $this->assign('user_displayname', $userDisplayName); $this->assign('user_uid', OC_User::getUser()); - $this->assign('appsmanagement_active', strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')) === 0 ); + $this->assign('appsmanagement_active', $appsMgmtActive); $this->assign('enableAvatars', $this->config->getSystemValue('enable_avatars', true)); $this->assign('userAvatarSet', \OC_Helper::userAvatarSet(OC_User::getUser())); } else if ($renderAs == 'error') { @@ -148,7 +153,7 @@ class OC_TemplateLayout extends OC_Template { } else { // Add the js files $jsFiles = self::findJavascriptFiles(OC_Util::$scripts); - $this->assign('jsfiles', array(), false); + $this->assign('jsfiles', array()); if ($this->config->getSystemValue('installed', false) && $renderAs != 'error') { $this->append( 'jsfiles', OC_Helper::linkToRoute('js_config', array('v' => self::$versionHash))); } @@ -220,7 +225,7 @@ class OC_TemplateLayout extends OC_Template { ), $root, $file); } return new FileAsset($root . '/' . $file, array( - new JSMinFilter(), + new JSqueezeFilter(), new SeparatorFilter(';') ), $root, $file); }, $jsFiles); diff --git a/lib/private/tempmanager.php b/lib/private/tempmanager.php index cc7c51d8568..365d639389f 100644 --- a/lib/private/tempmanager.php +++ b/lib/private/tempmanager.php @@ -1,9 +1,11 @@ <?php /** * @author Lukas Reschke <lukas@owncloud.com> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Morris Jobke <hey@morrisjobke.de> * @author Olivier Paroz <github@oparoz.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/updater.php b/lib/private/updater.php index 71e9732c307..70d68863788 100644 --- a/lib/private/updater.php +++ b/lib/private/updater.php @@ -69,6 +69,14 @@ class Updater extends BasicEmitter { /** @var bool */ private $skip3rdPartyAppsDisable; + private $logLevelNames = [ + 0 => 'Debug', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Error', + 4 => 'Fatal', + ]; + /** * @param HTTPHelper $httpHelper * @param IConfig $config @@ -177,6 +185,10 @@ class Updater extends BasicEmitter { * @return bool true if the operation succeeded, false otherwise */ public function upgrade() { + $logLevel = $this->config->getSystemValue('loglevel', \OCP\Util::WARN); + $this->emit('\OC\Updater', 'setDebugLogLevel', [ $logLevel, $this->logLevelNames[$logLevel] ]); + $this->config->setSystemValue('loglevel', \OCP\Util::DEBUG); + $wasMaintenanceModeEnabled = $this->config->getSystemValue('maintenance', false); if(!$wasMaintenanceModeEnabled) { @@ -186,15 +198,13 @@ class Updater extends BasicEmitter { $installedVersion = $this->config->getSystemValue('version', '0.0.0'); $currentVersion = implode('.', \OC_Util::getVersion()); - if ($this->log) { - $this->log->debug('starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, array('app' => 'core')); - } + $this->log->debug('starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, array('app' => 'core')); $success = true; try { $this->doUpgrade($currentVersion, $installedVersion); } catch (\Exception $exception) { - \OCP\Util::logException('update', $exception); + $this->log->logException($exception, ['app' => 'core']); $this->emit('\OC\Updater', 'failure', array(get_class($exception) . ': ' .$exception->getMessage())); $success = false; } @@ -208,6 +218,9 @@ class Updater extends BasicEmitter { $this->emit('\OC\Updater', 'maintenanceActive'); } + $this->emit('\OC\Updater', 'resetLogLevel', [ $logLevel, $this->logLevelNames[$logLevel] ]); + $this->config->setSystemValue('loglevel', $logLevel); + return $success; } @@ -219,6 +232,7 @@ class Updater extends BasicEmitter { private function getAllowedPreviousVersion() { // this should really be a JSON file require \OC::$SERVERROOT . '/version.php'; + /** @var array $OC_VersionCanBeUpgradedFrom */ return implode('.', $OC_VersionCanBeUpgradedFrom); } @@ -279,13 +293,6 @@ class Updater extends BasicEmitter { throw new \Exception($e->getMessage()); } - // FIXME: Some users do not upload the new ca-bundle.crt, let's catch this - // in the update. For a newer release we shall use an integrity check after - // the update. - if(!file_exists(\OC::$configDir .'/ca-bundle.crt')) { - throw new \Exception('Please upload the ca-bundle.crt file into the \'config\' directory.'); - } - // create empty file in data dir, so we can later find // out that this is indeed an ownCloud data directory // (in case it didn't exist before) @@ -488,11 +495,15 @@ class Updater extends BasicEmitter { */ private function upgradeAppStoreApps(array $disabledApps) { foreach($disabledApps as $app) { - if (OC_Installer::isUpdateAvailable($app)) { - $ocsId = \OC::$server->getConfig()->getAppValue($app, 'ocsid', ''); + try { + if (OC_Installer::isUpdateAvailable($app)) { + $ocsId = \OC::$server->getConfig()->getAppValue($app, 'ocsid', ''); - $this->emit('\OC\Updater', 'upgradeAppStoreApp', array($app)); - OC_Installer::updateAppByOCSId($ocsId); + $this->emit('\OC\Updater', 'upgradeAppStoreApp', array($app)); + OC_Installer::updateAppByOCSId($ocsId); + } + } catch (\Exception $ex) { + $this->log->logException($ex, ['app' => 'core']); } } } diff --git a/lib/private/user.php b/lib/private/user.php index 92807246144..86b1385f15d 100644 --- a/lib/private/user.php +++ b/lib/private/user.php @@ -44,6 +44,8 @@ * supported. User management operations are delegated to the configured backend for * execution. * + * Note that &run is deprecated and won't work anymore. + * * Hooks provided: * pre_createUser(&run, uid, password) * post_createUser(uid, password) @@ -146,6 +148,10 @@ class OC_User { self::$_usedBackends[$backend] = new OC_User_Database(); self::getManager()->registerBackend(self::$_usedBackends[$backend]); break; + case 'dummy': + self::$_usedBackends[$backend] = new \Test\Util\User\Dummy(); + self::getManager()->registerBackend(self::$_usedBackends[$backend]); + break; default: \OCP\Util::writeLog('core', 'Adding default user backend ' . $backend . '.', \OCP\Util::DEBUG); $className = 'OC_USER_' . strToUpper($backend); @@ -277,11 +283,13 @@ class OC_User { OC_Hook::emit("OC_User", "pre_login", array("run" => &$run, "uid" => $uid)); if ($uid) { - self::setUserId($uid); - self::setDisplayName($uid); - self::getUserSession()->setLoginName($uid); + if (self::getUser() !== $uid) { + self::setUserId($uid); + self::setDisplayName($uid); + self::getUserSession()->setLoginName($uid); - OC_Hook::emit("OC_User", "post_login", array("uid" => $uid, 'password' => '')); + OC_Hook::emit("OC_User", "post_login", array("uid" => $uid, 'password' => '')); + } return true; } return false; diff --git a/lib/private/user/backend.php b/lib/private/user/backend.php index 10bf3e28085..cda91398a84 100644 --- a/lib/private/user/backend.php +++ b/lib/private/user/backend.php @@ -9,9 +9,9 @@ * @author Jakob Sack <mail@jakobsack.de> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> - * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Sam Tuke <mail@samtuke.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Tigran Mkrtchyan <tigran.mkrtchyan@desy.de> diff --git a/lib/private/user/database.php b/lib/private/user/database.php index 081066398c0..3969b446071 100644 --- a/lib/private/user/database.php +++ b/lib/private/user/database.php @@ -295,6 +295,20 @@ class OC_User_Database extends OC_User_Backend implements \OCP\IUserBackend { } /** + * returns the username for the given login name in the correct casing + * + * @param string $loginName + * @return string|false + */ + public function loginName2UserName($loginName) { + if ($this->userExists($loginName)) { + return $this->cache[$loginName]['uid']; + } + + return false; + } + + /** * Backend name to be shown in user management * @return string the name of the backend to be shown */ @@ -302,4 +316,22 @@ class OC_User_Database extends OC_User_Backend implements \OCP\IUserBackend { return 'Database'; } + public static function preLoginNameUsedAsUserName($param) { + if(!isset($param['uid'])) { + throw new \Exception('key uid is expected to be set in $param'); + } + + $backends = \OC::$server->getUserManager()->getBackends(); + foreach ($backends as $backend) { + if ($backend instanceof \OC_User_Database) { + /** @var \OC_User_Database $backend */ + $uid = $backend->loginName2UserName($param['uid']); + if ($uid !== false) { + $param['uid'] = $uid; + return; + } + } + } + + } } diff --git a/lib/private/user/interface.php b/lib/private/user/interface.php index 1ccda618e10..0b36340c4f9 100644 --- a/lib/private/user/interface.php +++ b/lib/private/user/interface.php @@ -2,8 +2,8 @@ /** * @author Arthur Schiwon <blizzz@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 6a57aa3f7ae..109f08f47a0 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -5,6 +5,7 @@ * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author RealRancor <Fisch.666@gmx.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Volkan Gezer <volkangezer@gmail.com> diff --git a/lib/private/user/nouserexception.php b/lib/private/user/nouserexception.php index 0a077d960bd..09874887469 100644 --- a/lib/private/user/nouserexception.php +++ b/lib/private/user/nouserexception.php @@ -1,7 +1,6 @@ <?php /** * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/private/util.php b/lib/private/util.php index eb1de5be5a4..05f10aef1e0 100644 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -16,17 +16,20 @@ * @author Frank Karlitschek <frank@owncloud.org> * @author Georg Ehrke <georg@owncloud.com> * @author helix84 <helix84@centrum.sk> + * @author Individual IT Services <info@individual-it.net> * @author Jakob Sack <mail@jakobsack.de> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Markus Goetz <markus@woboq.com> + * @author Martin Mattel <martin.mattel@diemattels.at> * @author Marvin Thomas Rabe <mrabe@marvinrabe.de> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Michael Göhler <somebody.here@gmx.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com> * @author Stefan Rado <owncloud@sradonia.net> * @author Thomas Müller <thomas.mueller@tmit.eu> @@ -223,7 +226,12 @@ class OC_Util { if (\OC::$server->getAppConfig()->getValue('core', 'shareapi_exclude_groups', 'no') === 'yes') { $user = \OCP\User::getUser(); $groupsList = \OC::$server->getAppConfig()->getValue('core', 'shareapi_exclude_groups_list', ''); - $excludedGroups = explode(',', $groupsList); + $excludedGroups = json_decode($groupsList); + if (is_null($excludedGroups)) { + $excludedGroups = explode(',', $groupsList); + $newValue = json_encode($excludedGroups); + \OC::$server->getAppConfig()->setValue('core', 'shareapi_exclude_groups_list', $newValue); + } $usersGroups = \OC_Group::getUserGroups($user); if (!empty($usersGroups)) { $remainingGroups = array_diff($usersGroups, $excludedGroups); @@ -439,16 +447,23 @@ class OC_Util { * * @param string $application application id * @param string|null $file filename + * @param bool $prepend prepend the Script to the beginning of the list * @return void */ - public static function addScript($application, $file = null) { + public static function addScript($application, $file = null, $prepend = false) { $path = OC_Util::generatePath($application, 'js', $file); + //TODO eliminate double code if (!in_array($path, self::$scripts)) { // core js files need separate handling if ($application !== 'core' && $file !== null) { self::addTranslations($application); } - self::$scripts[] = $path; + if ($prepend===true) { + array_unshift(self::$scripts, $path); + } + else { + self::$scripts[] = $path; + } } } @@ -457,12 +472,18 @@ class OC_Util { * * @param string $application application id * @param string|null $file filename + * @param bool $prepend prepend the Script to the beginning of the list * @return void */ - public static function addVendorScript($application, $file = null) { + public static function addVendorScript($application, $file = null, $prepend = false) { $path = OC_Util::generatePath($application, 'vendor', $file); - if (!in_array($path, self::$scripts)) { - self::$scripts[] = $path; + //TODO eliminate double code + if (! in_array ( $path, self::$scripts )) { + if ($prepend === true) { + array_unshift ( self::$scripts, $path ); + } else { + self::$scripts [] = $path; + } } } @@ -471,8 +492,9 @@ class OC_Util { * * @param string $application application id * @param string $languageCode language code, defaults to the current language + * @param bool $prepend prepend the Script to the beginning of the list */ - public static function addTranslations($application, $languageCode = null) { + public static function addTranslations($application, $languageCode = null, $prepend = false) { if (is_null($languageCode)) { $languageCode = \OC_L10N::findLanguage($application); } @@ -481,8 +503,13 @@ class OC_Util { } else { $path = "l10n/$languageCode"; } + //TODO eliminate double code if (!in_array($path, self::$scripts)) { - self::$scripts[] = $path; + if ($prepend === true) { + array_unshift ( self::$scripts, $path ); + } else { + self::$scripts [] = $path; + } } } @@ -491,12 +518,18 @@ class OC_Util { * * @param string $application application id * @param string|null $file filename + * @param bool $prepend prepend the Style to the beginning of the list * @return void */ - public static function addStyle($application, $file = null) { + public static function addStyle($application, $file = null, $prepend = false) { $path = OC_Util::generatePath($application, 'css', $file); + //TODO eliminate double code if (!in_array($path, self::$styles)) { - self::$styles[] = $path; + if ($prepend === true) { + array_unshift ( self::$styles, $path ); + } else { + self::$styles[] = $path; + } } } @@ -505,12 +538,18 @@ class OC_Util { * * @param string $application application id * @param string|null $file filename + * @param bool $prepend prepend the Style to the beginning of the list * @return void */ - public static function addVendorStyle($application, $file = null) { + public static function addVendorStyle($application, $file = null, $prepend = false) { $path = OC_Util::generatePath($application, 'vendor', $file); + //TODO eliminate double code if (!in_array($path, self::$styles)) { - self::$styles[] = $path; + if ($prepend === true) { + array_unshift ( self::$styles, $path ); + } else { + self::$styles[] = $path; + } } } @@ -1261,12 +1300,11 @@ class OC_Util { /** * Get URL content * @param string $url Url to get content - * @deprecated Use \OC::$server->getHTTPHelper()->getUrlContent($url); * @throws Exception If the URL does not start with http:// or https:// * @return string of the response or false on error * This function get the content of a page via curl, if curl is enabled. * If not, file_get_contents is used. - * @deprecated Use \OCP\Http\Client\IClientService + * @deprecated Use \OC::$server->getHTTPClientService()->newClient()->get($url); */ public static function getUrlContent($url) { try { @@ -1433,7 +1471,7 @@ class OC_Util { if ($trimmed === '') { return false; } - if ($trimmed === '.' || $trimmed === '..') { + if (\OC\Files\Filesystem::isIgnoredDir($trimmed)) { return false; } foreach (str_split($trimmed) as $char) { diff --git a/lib/public/activity/iconsumer.php b/lib/public/activity/iconsumer.php index e74884d76c5..796bf1d8884 100644 --- a/lib/public/activity/iconsumer.php +++ b/lib/public/activity/iconsumer.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * diff --git a/lib/public/activity/imanager.php b/lib/public/activity/imanager.php index b3a4969fb06..280babb7fa9 100644 --- a/lib/public/activity/imanager.php +++ b/lib/public/activity/imanager.php @@ -138,6 +138,19 @@ interface IManager { public function getTypeIcon($type); /** + * @param string $type + * @param int $id + * @since 8.2.0 + */ + public function setFormattingObject($type, $id); + + /** + * @return bool + * @since 8.2.0 + */ + public function isFormattingFilteredObject(); + + /** * @param string $app * @param string $text * @param array $params diff --git a/lib/public/appframework/controller.php b/lib/public/appframework/controller.php index b8986c0b772..5c7292cd130 100644 --- a/lib/public/appframework/controller.php +++ b/lib/public/appframework/controller.php @@ -83,7 +83,13 @@ abstract class Controller { $data->getData(), $data->getStatus() ); - $response->setHeaders(array_merge($data->getHeaders(), $response->getHeaders())); + $dataHeaders = $data->getHeaders(); + $headers = $response->getHeaders(); + // do not overwrite Content-Type if it already exists + if (isset($dataHeaders['Content-Type'])) { + unset($headers['Content-Type']); + } + $response->setHeaders(array_merge($dataHeaders, $headers)); return $response; } else { return new JSONResponse($data); diff --git a/lib/public/appframework/http/contentsecuritypolicy.php b/lib/public/appframework/http/contentsecuritypolicy.php index ee36f7aac17..5371d76ff22 100644 --- a/lib/public/appframework/http/contentsecuritypolicy.php +++ b/lib/public/appframework/http/contentsecuritypolicy.php @@ -2,6 +2,7 @@ /** * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author sualko <klaus@jsxc.org> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -64,6 +65,7 @@ class ContentSecurityPolicy { private $allowedImageDomains = [ '\'self\'', 'data:', + 'blob:', ]; /** @var array Domains to which connections can be done */ private $allowedConnectDomains = [ diff --git a/lib/public/appframework/http/ioutput.php b/lib/public/appframework/http/ioutput.php index ba4c031001b..185bc589f22 100644 --- a/lib/public/appframework/http/ioutput.php +++ b/lib/public/appframework/http/ioutput.php @@ -68,9 +68,9 @@ interface IOutput { * @param string $path * @param string $domain * @param bool $secure - * @param bool $httponly + * @param bool $httpOnly * @since 8.1.0 */ - public function setCookie($name, $value, $expire, $path, $domain, $secure, $httponly); + public function setCookie($name, $value, $expire, $path, $domain, $secure, $httpOnly); } diff --git a/lib/public/appframework/http/jsonresponse.php b/lib/public/appframework/http/jsonresponse.php index 1a509200dd7..306c70327b1 100644 --- a/lib/public/appframework/http/jsonresponse.php +++ b/lib/public/appframework/http/jsonresponse.php @@ -1,6 +1,7 @@ <?php /** * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> diff --git a/lib/public/appframework/http/ocsresponse.php b/lib/public/appframework/http/ocsresponse.php index 37af07b70c8..f26d219e581 100644 --- a/lib/public/appframework/http/ocsresponse.php +++ b/lib/public/appframework/http/ocsresponse.php @@ -2,6 +2,7 @@ /** * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/appframework/iappcontainer.php b/lib/public/appframework/iappcontainer.php index 7338dbd858d..c92146124e2 100644 --- a/lib/public/appframework/iappcontainer.php +++ b/lib/public/appframework/iappcontainer.php @@ -3,6 +3,7 @@ * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Morris Jobke <hey@morrisjobke.de> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/public/appframework/ocscontroller.php b/lib/public/appframework/ocscontroller.php index 55ba518020a..8b04d65d8c3 100644 --- a/lib/public/appframework/ocscontroller.php +++ b/lib/public/appframework/ocscontroller.php @@ -2,6 +2,7 @@ /** * @author Bernhard Posselt <dev@bernhard-posselt.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/autoloadnotallowedexception.php b/lib/public/autoloadnotallowedexception.php index edb7121c065..2e6556c4a7b 100644 --- a/lib/public/autoloadnotallowedexception.php +++ b/lib/public/autoloadnotallowedexception.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -16,6 +16,7 @@ * * You should have received a copy of the GNU Affero General Public License, version 3, * along with this program. If not, see <http://www.gnu.org/licenses/> + * */ namespace OCP; diff --git a/lib/public/db/querybuilder/iliteral.php b/lib/public/db/querybuilder/iliteral.php index f5db1ce0456..a2665e47a7d 100644 --- a/lib/public/db/querybuilder/iliteral.php +++ b/lib/public/db/querybuilder/iliteral.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/db/querybuilder/iparameter.php b/lib/public/db/querybuilder/iparameter.php index f597163ba00..ef822a9c97f 100644 --- a/lib/public/db/querybuilder/iparameter.php +++ b/lib/public/db/querybuilder/iparameter.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/db/querybuilder/iqueryfunction.php b/lib/public/db/querybuilder/iqueryfunction.php index 4e8c163f777..7051f2f38a3 100644 --- a/lib/public/db/querybuilder/iqueryfunction.php +++ b/lib/public/db/querybuilder/iqueryfunction.php @@ -1,6 +1,7 @@ <?php /** * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/encryption/iencryptionmodule.php b/lib/public/encryption/iencryptionmodule.php index 66cf1a80e0d..bb4dfdcdda8 100644 --- a/lib/public/encryption/iencryptionmodule.php +++ b/lib/public/encryption/iencryptionmodule.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/encryption/imanager.php b/lib/public/encryption/imanager.php index 07e2925b76c..c963c19e660 100644 --- a/lib/public/encryption/imanager.php +++ b/lib/public/encryption/imanager.php @@ -3,7 +3,6 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/files/imimetypeloader.php b/lib/public/files/imimetypeloader.php index 6d00c4a0b31..1ff8bc1b6c1 100644 --- a/lib/public/files/imimetypeloader.php +++ b/lib/public/files/imimetypeloader.php @@ -1,6 +1,6 @@ <?php /** - * @author Robin McCorkell <rmccorkell@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/files/mount/imountmanager.php b/lib/public/files/mount/imountmanager.php index 1eb9b66dad8..9a0362b12fb 100644 --- a/lib/public/files/mount/imountmanager.php +++ b/lib/public/files/mount/imountmanager.php @@ -1,5 +1,6 @@ <?php /** + * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/public/files/storage.php b/lib/public/files/storage.php index ac3603e48d4..7931a683ae1 100644 --- a/lib/public/files/storage.php +++ b/lib/public/files/storage.php @@ -1,5 +1,6 @@ <?php /** + * @author Michael Roth <michael.roth@rz.uni-augsburg.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> @@ -61,6 +62,7 @@ interface Storage { /** * see http://php.net/manual/en/function.mkdir.php + * implementations need to implement a recursive mkdir * * @param string $path * @return bool diff --git a/lib/public/http/client/iresponse.php b/lib/public/http/client/iresponse.php index 92bb7af82dd..18371ddbbe6 100644 --- a/lib/public/http/client/iresponse.php +++ b/lib/public/http/client/iresponse.php @@ -2,6 +2,7 @@ /** * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php index ff0b6c6a5b0..933eef97ae1 100644 --- a/lib/public/iconfig.php +++ b/lib/public/iconfig.php @@ -41,6 +41,11 @@ namespace OCP; */ interface IConfig { /** + * @since 8.2.0 + */ + const SENSITIVE_VALUE = '***REMOVED SENSITIVE VALUE***'; + + /** * Sets and deletes system wide values * * @param array $configs Associative array with `key => value` pairs @@ -69,6 +74,16 @@ interface IConfig { public function getSystemValue($key, $default = ''); /** + * Looks up a system wide defined value and filters out sensitive data + * + * @param string $key the key of the value, under which it was saved + * @param mixed $default the default value to be returned if the value isn't set + * @return mixed the value or $default + * @since 8.2.0 + */ + public function getFilteredSystemValue($key, $default = ''); + + /** * Delete a system wide defined value * * @param string $key the key of the value, under which it was saved diff --git a/lib/public/icontainer.php b/lib/public/icontainer.php index ffd1d16c97e..23c75aeaaf8 100644 --- a/lib/public/icontainer.php +++ b/lib/public/icontainer.php @@ -1,5 +1,7 @@ <?php /** + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * @@ -31,6 +33,7 @@ namespace OCP; use Closure; +use OCP\AppFramework\QueryException; /** diff --git a/lib/public/ilogger.php b/lib/public/ilogger.php index 43b1ef70e5b..27a5d63dfdb 100644 --- a/lib/public/ilogger.php +++ b/lib/public/ilogger.php @@ -122,4 +122,14 @@ interface ILogger { * @since 7.0.0 */ public function log($level, $message, array $context = array()); + + /** + * Logs an exception very detailed + * + * @param \Exception $exception + * @param array $context + * @return void + * @since 8.2.0 + */ + public function logException(\Exception $exception, array $context = array()); } diff --git a/lib/public/irequest.php b/lib/public/irequest.php index 20fa543dd69..acfc4f3f1d0 100644 --- a/lib/public/irequest.php +++ b/lib/public/irequest.php @@ -168,6 +168,14 @@ interface IRequest { public function getServerProtocol(); /** + * Returns the used HTTP protocol. + * + * @return string HTTP protocol. HTTP/2, HTTP/1.1 or HTTP/1.0. + * @since 8.2.0 + */ + public function getHttpProtocol(); + + /** * Returns the request uri, even if the website uses one or more * reverse proxies * @return string diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 8be23dff214..56afae95a40 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -9,6 +9,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> @@ -194,6 +195,12 @@ interface IServerContainer { public function getAppConfig(); /** + * @return \OCP\L10N\IFactory + * @since 8.2.0 + */ + public function getL10NFactory(); + + /** * get an L10N instance * @param string $app appid * @param string $lang diff --git a/lib/public/itempmanager.php b/lib/public/itempmanager.php index 6364fa71913..73e21dd0aeb 100644 --- a/lib/public/itempmanager.php +++ b/lib/public/itempmanager.php @@ -2,6 +2,7 @@ /** * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/lib/public/sabrepluginevent.php b/lib/public/sabrepluginevent.php new file mode 100644 index 00000000000..fed3237166d --- /dev/null +++ b/lib/public/sabrepluginevent.php @@ -0,0 +1,82 @@ +<?php +/** + * @author Joas Schilling <nickvergessen@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCP; + + +use OCP\AppFramework\Http; +use Symfony\Component\EventDispatcher\Event; + +/** + * @since 8.2.0 + */ +class SabrePluginEvent extends Event { + + /** @var int */ + protected $statusCode; + + /** @var string */ + protected $message; + + /** + * @since 8.2.0 + */ + public function __construct() { + $this->message = ''; + $this->statusCode = Http::STATUS_OK; + } + + /** + * @param int $statusCode + * @return self + * @since 8.2.0 + */ + public function setStatusCode($statusCode) { + $this->statusCode = (int) $statusCode; + return $this; + } + + /** + * @param string $message + * @return self + * @since 8.2.0 + */ + public function setMessage($message) { + $this->message = (string) $message; + return $this; + } + + /** + * @return int + * @since 8.2.0 + */ + public function getStatusCode() { + return $this->statusCode; + } + + /** + * @return string + * @since 8.2.0 + */ + public function getMessage() { + return $this->message; + } +} diff --git a/apps/user_webdavauth/settings.php b/lib/public/sabrepluginexception.php index 1a647fafb16..5dba3b90a02 100644 --- a/apps/user_webdavauth/settings.php +++ b/lib/public/sabrepluginexception.php @@ -1,10 +1,6 @@ <?php /** - * @author Bart Visscher <bartv@thisnet.nl> - * @author Frank Karlitschek <frank@owncloud.org> - * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Joas Schilling <nickvergessen@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -23,19 +19,23 @@ * */ -OC_Util::checkAdminUser(); +namespace OCP; -if($_POST) { - // CSRF check - OCP\JSON::callCheck(); - if(isset($_POST['webdav_url'])) { - OC_CONFIG::setValue('user_webdavauth_url', strip_tags($_POST['webdav_url'])); - } -} +use Sabre\DAV\Exception; -// fill template -$tmpl = new OC_Template( 'user_webdavauth', 'settings'); -$tmpl->assign( 'webdav_url', OC_Config::getValue( "user_webdavauth_url" )); +/** + * @since 8.2.0 + */ +class SabrePluginException extends Exception { -return $tmpl->fetchPage(); + /** + * Returns the HTTP statuscode for this exception + * + * @return int + * @since 8.2.0 + */ + public function getHTTPCode() { + return $this->code; + } +} diff --git a/lib/public/util.php b/lib/public/util.php index c32668b14a8..76b61347d46 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -5,12 +5,14 @@ * @author Björn Schießle <schiessle@owncloud.com> * @author Frank Karlitschek <frank@owncloud.org> * @author Georg Ehrke <georg@owncloud.com> + * @author Individual IT Services <info@individual-it.net> * @author itheiss <ingo.theiss@i-matrixx.de> * @author Jens-Christian Fischer <jens-christian.fischer@switch.ch> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Michael Gapczynski <GapczynskiM@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Nicolas Grekas <nicolas.grekas@gmail.com> * @author Pellaeon Lin <nfsmwlin@gmail.com> * @author Randolph Carter <RandolphCarter@fantasymail.de> * @author Robin Appelman <icewind@owncloud.com> @@ -158,17 +160,10 @@ class Util { * @param \Exception $ex exception to log * @param int $level log level, defaults to \OCP\Util::FATAL * @since ....0.0 - parameter $level was added in 7.0.0 + * @deprecated 8.2.0 use logException of \OCP\ILogger */ public static function logException( $app, \Exception $ex, $level = \OCP\Util::FATAL ) { - $exception = array( - 'Exception' => get_class($ex), - 'Message' => $ex->getMessage(), - 'Code' => $ex->getCode(), - 'Trace' => $ex->getTraceAsString(), - 'File' => $ex->getFile(), - 'Line' => $ex->getLine(), - ); - \OCP\Util::writeLog($app, 'Exception: ' . json_encode($exception), $level); + \OC::$server->getLogger()->logException($ex, ['app' => $app]); } /** @@ -661,6 +656,7 @@ class Util { return \OC_Util::isDefaultExpireDateEnforced(); } + protected static $needUpgradeCache = null; /** * Checks whether the current version needs upgrade. @@ -669,6 +665,9 @@ class Util { * @since 7.0.0 */ public static function needUpgrade() { - return \OC_Util::needUpgrade(\OC::$server->getConfig()); + if (!isset(self::$needUpgradeCache)) { + self::$needUpgradeCache=\OC_Util::needUpgrade(\OC::$server->getConfig()); + } + return self::$needUpgradeCache; } } diff --git a/lib/repair/filletags.php b/lib/repair/filletags.php index 40072209982..8cfc4a7c258 100644 --- a/lib/repair/filletags.php +++ b/lib/repair/filletags.php @@ -1,5 +1,6 @@ <?php /** + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Thomas Müller <thomas.mueller@tmit.eu> * diff --git a/lib/repair/repairinvalidshares.php b/lib/repair/repairinvalidshares.php new file mode 100644 index 00000000000..4b0aeb70c12 --- /dev/null +++ b/lib/repair/repairinvalidshares.php @@ -0,0 +1,80 @@ +<?php +/** + * @author Morris Jobke <hey@morrisjobke.de> + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Repair; + +use OC\Hooks\BasicEmitter; + +/** + * Repairs shares with invalid data + */ +class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep { + + /** + * @var \OCP\IConfig + */ + protected $config; + + /** + * @var \OCP\IDBConnection + */ + protected $connection; + + /** + * @param \OCP\IConfig $config + * @param \OCP\IDBConnection $connection + */ + public function __construct($config, $connection) { + $this->connection = $connection; + $this->config = $config; + } + + public function getName() { + return 'Repair invalid shares'; + } + + /** + * Past bugs would make it possible to set an expiration date on user shares even + * though it is not supported. This functions removes the expiration date from such entries. + */ + private function removeExpirationDateFromNonLinkShares() { + $builder = $this->connection->getQueryBuilder(); + $builder + ->update('share') + ->set('expiration', 'null') + ->where($builder->expr()->isNotNull('expiration')) + ->andWhere($builder->expr()->neq('share_type', $builder->expr()->literal(\OC\Share\Constants::SHARE_TYPE_LINK))); + + $updatedEntries = $builder->execute(); + if ($updatedEntries > 0) { + $this->emit('\OC\Repair', 'info', array('Removed invalid expiration date from ' . $updatedEntries . ' shares')); + } + } + + public function run() { + $ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0'); + if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.7', '<')) { + // this situation was only possible before 8.2 + $this->removeExpirationDateFromNonLinkShares(); + } + } +} diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php index 89ad0ed16c7..3ea9e45816e 100644 --- a/lib/repair/repairmimetypes.php +++ b/lib/repair/repairmimetypes.php @@ -4,6 +4,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Normal Ra <normalraw@gmail.com> * @author Olivier Paroz <github@oparoz.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Victor Dubiniuk <dubiniuk@owncloud.com> * @author Vincent Petry <pvince81@owncloud.com> * @@ -29,6 +30,22 @@ namespace OC\Repair; use OC\Hooks\BasicEmitter; class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep { + /** + * @var \OCP\IConfig + */ + protected $config; + + /** + * @var int + */ + protected $folderMimeTypeId; + + /** + * @param \OCP\IConfig $config + */ + public function __construct($config) { + $this->config = $config; + } public function getName() { return 'Repair mime types'; @@ -79,7 +96,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep { return \OC_DB::prepare(' UPDATE `*PREFIX*filecache` SET `mimetype` = ? - WHERE `mimetype` <> ? AND `name` ILIKE ? + WHERE `mimetype` <> ? AND `mimetype` <> ? AND `name` ILIKE ? '); } @@ -112,6 +129,10 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep { } private function updateMimetypes($updatedMimetypes) { + if (empty($this->folderMimeTypeId)) { + $result = \OC_DB::executeAudited(self::getIdStmt(), array('httpd/unix-directory')); + $this->folderMimeTypeId = (int)$result->fetchOne(); + } foreach ($updatedMimetypes as $extension => $mimetype) { $result = \OC_DB::executeAudited(self::existsStmt(), array($mimetype)); @@ -127,7 +148,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep { $mimetypeId = $result->fetchOne(); // change mimetype for files with x extension - \OC_DB::executeAudited(self::updateByNameStmt(), array($mimetypeId, $mimetypeId, '%.' . $extension)); + \OC_DB::executeAudited(self::updateByNameStmt(), array($mimetypeId, $this->folderMimeTypeId, $mimetypeId, '%.' . $extension)); } } @@ -239,40 +260,101 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep { self::updateMimetypes($updatedMimetypes); } + private function introduceJavaMimeType() { + $updatedMimetypes = array( + 'class' => 'application/java', + 'java' => 'text/x-java-source', + ); + + self::updateMimetypes($updatedMimetypes); + } + + private function introduceHppMimeType() { + $updatedMimetypes = array( + 'hpp' => 'text/x-h', + ); + + self::updateMimetypes($updatedMimetypes); + } + + private function introduceRssMimeType() { + $updatedMimetypes = array( + 'rss' => 'application/rss+xml', + ); + + self::updateMimetypes($updatedMimetypes); + } + + private function introduceRtfMimeType() { + $updatedMimetypes = array( + 'rtf' => 'text/rtf', + ); + + self::updateMimetypes($updatedMimetypes); + } + /** * Fix mime types */ public function run() { - if ($this->fixOfficeMimeTypes()) { - $this->emit('\OC\Repair', 'info', array('Fixed office mime types')); - } - if ($this->fixApkMimeType()) { - $this->emit('\OC\Repair', 'info', array('Fixed APK mime type')); - } + $ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0'); - if ($this->fixFontsMimeTypes()) { - $this->emit('\OC\Repair', 'info', array('Fixed fonts mime types')); - } + // NOTE TO DEVELOPERS: when adding new mime types, please make sure to + // add a version comparison to avoid doing it every time - if ($this->fixPostscriptMimeType()) { - $this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types')); - } + // only update mime types if necessary as it can be expensive + if (version_compare($ocVersionFromBeforeUpdate, '8.2.0', '<')) { + if ($this->fixOfficeMimeTypes()) { + $this->emit('\OC\Repair', 'info', array('Fixed office mime types')); + } - if ($this->introduceRawMimeType()) { - $this->emit('\OC\Repair', 'info', array('Fixed Raw mime types')); - } + if ($this->fixApkMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed APK mime type')); + } - if ($this->introduce3dImagesMimeType()) { - $this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types')); - } + if ($this->fixFontsMimeTypes()) { + $this->emit('\OC\Repair', 'info', array('Fixed fonts mime types')); + } + + if ($this->fixPostscriptMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types')); + } - if ($this->introduceConfMimeType()) { - $this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types')); + if ($this->introduceRawMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed Raw mime types')); + } + + if ($this->introduce3dImagesMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types')); + } + + if ($this->introduceConfMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types')); + } + + if ($this->introduceYamlMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types')); + } } - if ($this->introduceYamlMimeType()) { - $this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types')); + // Mimetype updates from #19272 + if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.8', '<')) { + if ($this->introduceJavaMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed java/class mime types')); + } + + if ($this->introduceHppMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed hpp mime type')); + } + + if ($this->introduceRssMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed rss mime type')); + } + + if ($this->introduceRtfMimeType()) { + $this->emit('\OC\Repair', 'info', array('Fixed rtf mime type')); + } } } } diff --git a/lib/repair/sqliteautoincrement.php b/lib/repair/sqliteautoincrement.php index b8ae5c47ff3..70d0adae5d7 100644 --- a/lib/repair/sqliteautoincrement.php +++ b/lib/repair/sqliteautoincrement.php @@ -1,6 +1,5 @@ <?php /** - * @author Morris Jobke <hey@morrisjobke.de> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. diff --git a/lib/repair/updateoutdatedocsids.php b/lib/repair/updateoutdatedocsids.php index afc9e968cad..5f6ee029536 100644 --- a/lib/repair/updateoutdatedocsids.php +++ b/lib/repair/updateoutdatedocsids.php @@ -1,6 +1,6 @@ <?php /** - * @author Lukas Reschke <l8kas@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/ocs-provider/provider.php b/ocs-provider/provider.php index 04da7402c98..921362b9e50 100644 --- a/ocs-provider/provider.php +++ b/ocs-provider/provider.php @@ -44,9 +44,9 @@ class Provider extends \OCP\AppFramework\Controller { 'PRIVATE_DATA' => [ 'version' => 1, 'endpoints' => [ - 'store' => '/ocs/v1.php/privatedata/setattribute', - 'read' => '/ocs/v1.php/privatedata/getattribute', - 'delete' => '/ocs/v1.php/privatedata/deleteattribute', + 'store' => '/ocs/v2.php/privatedata/setattribute', + 'read' => '/ocs/v2.php/privatedata/getattribute', + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', ], ], ]; @@ -55,13 +55,13 @@ class Provider extends \OCP\AppFramework\Controller { $services['SHARING'] = [ 'version' => 1, 'endpoints' => [ - 'share' => '/ocs/v1.php/apps/files_sharing/api/v1/shares', + 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', ], ]; $services['FEDERATED_SHARING'] = [ 'version' => 1, 'endpoints' => [ - 'share' => '/ocs/v1.php/cloud/shares', + 'share' => '/ocs/v2.php/cloud/shares', 'webdav' => '/public.php/webdav/', ], ]; @@ -71,7 +71,7 @@ class Provider extends \OCP\AppFramework\Controller { $services['ACTIVITY'] = [ 'version' => 1, 'endpoints' => [ - 'list' => '/ocs/v1.php/cloud/activity', + 'list' => '/ocs/v2.php/cloud/activity', ], ]; } @@ -80,13 +80,13 @@ class Provider extends \OCP\AppFramework\Controller { $services['PROVISIONING'] = [ 'version' => 1, 'endpoints' => [ - 'user' => '/ocs/v1.php/cloud/users', - 'groups' => '/ocs/v1.php/cloud/groups', - 'apps' => '/ocs/v1.php/cloud/apps', + 'user' => '/ocs/v2.php/cloud/users', + 'groups' => '/ocs/v2.php/cloud/groups', + 'apps' => '/ocs/v2.php/cloud/apps', ], ]; } return new \OCP\AppFramework\Http\JSONResponse($services); } -}
\ No newline at end of file +} diff --git a/ocs/routes.php b/ocs/routes.php index 9a8625bcc31..4aaa1434b8b 100644 --- a/ocs/routes.php +++ b/ocs/routes.php @@ -4,6 +4,7 @@ * @author Christopher Schäpers <kondou@ts.unde.re> * @author Joas Schilling <nickvergessen@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Tom Needham <tom@owncloud.com> * @@ -90,13 +91,6 @@ API::register( ); API::register( 'get', - '/cloud/users/{userid}', - array('OC_OCS_Cloud', 'getUser'), - 'core', - API::USER_AUTH -); -API::register( - 'get', '/cloud/user', array('OC_OCS_Cloud', 'getCurrentUser'), 'core', diff --git a/ocs/v1.php b/ocs/v1.php index c5c18d20b8a..0aaa5d228da 100644 --- a/ocs/v1.php +++ b/ocs/v1.php @@ -1,7 +1,6 @@ <?php /** * @author Bart Visscher <bartv@thisnet.nl> - * @author Frank Karlitschek <frank@owncloud.org> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> diff --git a/public.php b/public.php index 858e8af7782..aac3c3e517b 100644 --- a/public.php +++ b/public.php @@ -2,10 +2,8 @@ /** * @author Björn Schießle <schiessle@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Georg Ehrke <georg@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> diff --git a/remote.php b/remote.php index 01077e805eb..0282877ca2a 100644 --- a/remote.php +++ b/remote.php @@ -2,10 +2,10 @@ /** * @author Brice Maron <brice@bmaron.net> * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Georg Ehrke <georg@owncloud.com> * @author Jörn Friedrich Dreyer <jfd@butonic.de> * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Vincent Petry <pvince81@owncloud.com> * @@ -26,7 +26,7 @@ * */ -use OC\Connector\Sabre\ExceptionLoggerPlugin; +use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin; use Sabre\DAV\Exception\ServiceUnavailable; use Sabre\DAV\Server; diff --git a/config/ca-bundle.crt b/resources/config/ca-bundle.crt index c93d3c4d4a7..c93d3c4d4a7 100644 --- a/config/ca-bundle.crt +++ b/resources/config/ca-bundle.crt diff --git a/config/mimetypealiases.dist.json b/resources/config/mimetypealiases.dist.json index 2c9bdaa00c8..ed471f228e2 100644 --- a/config/mimetypealiases.dist.json +++ b/resources/config/mimetypealiases.dist.json @@ -1,7 +1,7 @@ { "_comment" : "Array of mimetype aliases.", "_comment2": "Any changes you make here will be overwritten on an update of ownCloud.", - "_comment3": "Put any custom aliases in a new file mimetypealiases.json in this directory", + "_comment3": "Put any custom mappings in a new file mimetypealiases.json in the config/ folder of ownCloud", "_comment4": "After any change to mimetypealiases.json run:", "_comment5": "./occ maintenance:mimetypesjs", @@ -9,23 +9,26 @@ "application/coreldraw": "image", - "application/font-sfnt": "font", - "application/font-woff": "font", - "application/illustrator": "image/vector", + "application/epub+zip": "text", + "application/font-sfnt": "image", + "application/font-woff": "image", + "application/illustrator": "image", + "application/javascript": "text/code", "application/json": "text/code", - "application/msaccess": "database", + "application/msaccess": "file", "application/msexcel": "x-office/spreadsheet", "application/mspowerpoint": "x-office/presentation", "application/msword": "x-office/document", "application/octet-stream": "file", - "application/postscript": "image/vector", + "application/postscript": "image", + "application/rss+xml": "application/xml", "application/vnd.android.package-archive": "package/x-generic", "application/vnd.ms-excel": "x-office/spreadsheet", "application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet", "application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet", "application/vnd.ms-excel.sheet.macroEnabled.12": "x-office/spreadsheet", "application/vnd.ms-excel.template.macroEnabled.12": "x-office/spreadsheet", - "application/vnd.ms-fontobject": "font", + "application/vnd.ms-fontobject": "image", "application/vnd.ms-powerpoint": "x-office/presentation", "application/vnd.ms-powerpoint.addin.macroEnabled.12": "x-office/presentation", "application/vnd.ms-powerpoint.presentation.macroEnabled.12": "x-office/presentation", @@ -49,10 +52,11 @@ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document", "application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document", "application/x-7z-compressed": "package/x-generic", + "application/x-cbr": "text", "application/x-compressed": "package/x-generic", "application/x-dcraw": "image", "application/x-deb": "package/x-generic", - "application/x-font": "font", + "application/x-font": "image", "application/x-gimp": "image", "application/x-gzip": "package/x-generic", "application/x-perl": "text/code", @@ -64,10 +68,17 @@ "application/xml": "text/html", "application/yaml": "text/code", "application/zip": "package/x-generic", + "database": "file", "httpd/unix-directory": "dir", - "image/svg+xml": "image/vector", "text/css": "text/code", "text/csv": "x-office/spreadsheet", - "text/x-shellscript": "text/code" + "text/html": "text/code", + "text/x-c": "text/code", + "text/x-c++src": "text/code", + "text/x-h": "text/code", + "text/x-java-source": "text/code", + "text/x-python": "text/code", + "text/x-shellscript": "text/code", + "web": "text/code" } diff --git a/config/mimetypemapping.dist.json b/resources/config/mimetypemapping.dist.json index 48ec4a56dab..e26ec7038b1 100644 --- a/config/mimetypemapping.dist.json +++ b/resources/config/mimetypemapping.dist.json @@ -4,7 +4,7 @@ "_comment3": "and the second (if present] is a secure alternative", "_comment4": "Any changes you make here will be overwritten on an update of ownCloud", - "_comment5": "Put any custom mappings in a new file mimetypemapping.json in this directory", + "_comment5": "Put any custom mappings in a new file mimetypemapping.json in the config/ folder of ownCloud", "3gp": ["video/3gpp"], @@ -27,6 +27,7 @@ "cbz": ["application/x-cbr"], "cc": ["text/x-c"], "cdr": ["application/coreldraw"], + "class": ["application/java"], "cnf": ["text/plain"], "conf": ["text/plain"], "cpp": ["text/x-c++src"], @@ -57,12 +58,14 @@ "gzip": ["application/x-gzip"], "h": ["text/x-h"], "hh": ["text/x-h"], + "hpp": ["text/x-h"], "html": ["text/html", "text/plain"], "htm": ["text/html", "text/plain"], "ical": ["text/calendar"], "ics": ["text/calendar"], "iiq": ["image/x-dcraw"], "impress": ["text/impress"], + "java": ["text/x-java-source"], "jpeg": ["image/jpeg"], "jpg": ["image/jpeg"], "jps": ["image/jpeg"], @@ -130,6 +133,8 @@ "raf": ["image/x-dcraw"], "rar": ["application/x-rar-compressed"], "reveal": ["text/reveal"], + "rss": ["application/rss+xml"], + "rtf": ["text/rtf"], "rw2": ["image/x-dcraw"], "sgf": ["application/sgf"], "sh-lib": ["text/x-shellscript"], diff --git a/settings/admin.php b/settings/admin.php index 38683438f3a..bccb1171743 100644 --- a/settings/admin.php +++ b/settings/admin.php @@ -12,7 +12,6 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -37,7 +36,7 @@ OC_Util::checkAdminUser(); OC_App::setActiveNavigationEntry("admin"); $template = new OC_Template('settings', 'admin', 'user'); -$l = OC_L10N::get('settings'); +$l = \OC::$server->getL10N('settings'); $showLog = (\OC::$server->getConfig()->getSystemValue('log_type', 'owncloud') === 'owncloud'); $numEntriesToLoad = 3; @@ -87,8 +86,8 @@ $template->assign('shareEnforceExpireDate', $appConfig->getValue('core', 'sharea $excludeGroups = $appConfig->getValue('core', 'shareapi_exclude_groups', 'no') === 'yes' ? true : false; $template->assign('shareExcludeGroups', $excludeGroups); $excludedGroupsList = $appConfig->getValue('core', 'shareapi_exclude_groups_list', ''); -$excludedGroupsList = explode(',', $excludedGroupsList); // FIXME: this should be JSON! -$template->assign('shareExcludedGroupsList', implode('|', $excludedGroupsList)); +$excludedGroupsList = json_decode($excludedGroupsList); +$template->assign('shareExcludedGroupsList', !is_null($excludedGroupsList) ? implode('|', $excludedGroupsList) : ''); $template->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled()); $backends = \OC::$server->getUserManager()->getBackends(); $externalBackends = (count($backends) > 1) ? true : false; @@ -122,6 +121,7 @@ $template->assign('allowPublicUpload', $appConfig->getValue('core', 'shareapi_al $template->assign('allowResharing', $appConfig->getValue('core', 'shareapi_allow_resharing', 'yes')); $template->assign('allowPublicMailNotification', $appConfig->getValue('core', 'shareapi_allow_public_notification', 'no')); $template->assign('allowMailNotification', $appConfig->getValue('core', 'shareapi_allow_mail_notification', 'no')); +$template->assign('allowShareDialogUserEnumeration', $appConfig->getValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes')); $template->assign('onlyShareWithGroupMembers', \OC\Share\Share::shareWithGroupMembersOnly()); $databaseOverload = (strpos(\OCP\Config::getSystemValue('dbtype'), 'sqlite') !== false); $template->assign('databaseOverload', $databaseOverload); diff --git a/settings/ajax/enableapp.php b/settings/ajax/enableapp.php index 55298430e28..04b92283f3e 100644 --- a/settings/ajax/enableapp.php +++ b/settings/ajax/enableapp.php @@ -5,6 +5,7 @@ * @author Kamil Domanski <kdomanski@kdemail.net> * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Thomas Müller <thomas.mueller@tmit.eu> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -28,8 +29,9 @@ OCP\JSON::callCheck(); $groups = isset($_POST['groups']) ? (array)$_POST['groups'] : null; try { - OC_App::enable(OC_App::cleanAppId((string)$_POST['appid']), $groups); - OC_JSON::success(); + $app = OC_App::cleanAppId((string)$_POST['appid']); + OC_App::enable($app, $groups); + OC_JSON::success(['data' => ['update_required' => \OC_App::shouldUpgrade($app)]]); } catch (Exception $e) { \OCP\Util::writeLog('core', $e->getMessage(), \OCP\Util::ERROR); OC_JSON::error(array("data" => array("message" => $e->getMessage()) )); diff --git a/settings/ajax/navigationdetect.php b/settings/ajax/navigationdetect.php index 5d3b34e10ef..be410b874ee 100644 --- a/settings/ajax/navigationdetect.php +++ b/settings/ajax/navigationdetect.php @@ -1,8 +1,7 @@ <?php /** - * @author Bart Visscher <bartv@thisnet.nl> - * @author Lukas Reschke <lukas@owncloud.com> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/settings/changepassword/controller.php b/settings/changepassword/controller.php index 12499ada15d..3fa3ac67edb 100644 --- a/settings/changepassword/controller.php +++ b/settings/changepassword/controller.php @@ -6,7 +6,6 @@ * @author cmeh <cmeh@users.noreply.github.com> * @author Florin Peter <github@florin-peter.de> * @author Jakob Sack <mail@jakobsack.de> - * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Sam Tuke <mail@samtuke.com> * @author Thomas Müller <thomas.mueller@tmit.eu> diff --git a/settings/controller/certificatecontroller.php b/settings/controller/certificatecontroller.php index 4c129dcd588..750144e7a2c 100644 --- a/settings/controller/certificatecontroller.php +++ b/settings/controller/certificatecontroller.php @@ -1,6 +1,8 @@ <?php /** + * @author Björn Schießle <schiessle@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -66,19 +68,25 @@ class CertificateController extends Controller { * @return array */ public function addPersonalRootCertificate() { + $headers = []; + if ($this->request->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE_8])) { + // due to upload iframe workaround, need to set content-type to text/plain + $headers['Content-Type'] = 'text/plain'; + } if ($this->isCertificateImportAllowed() === false) { - return new DataResponse('Individual certificate management disabled', Http::STATUS_FORBIDDEN); + return new DataResponse(['message' => 'Individual certificate management disabled'], Http::STATUS_FORBIDDEN, $headers); } $file = $this->request->getUploadedFile('rootcert_import'); if(empty($file)) { - return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY); + return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY, $headers); } try { $certificate = $this->certificateManager->addCertificate(file_get_contents($file['tmp_name']), $file['name']); - return new DataResponse([ + return new DataResponse( + [ 'name' => $certificate->getName(), 'commonName' => $certificate->getCommonName(), 'organization' => $certificate->getOrganization(), @@ -88,9 +96,12 @@ class CertificateController extends Controller { 'validTillString' => $this->l10n->l('date', $certificate->getExpireDate()), 'issuer' => $certificate->getIssuerName(), 'issuerOrganization' => $certificate->getIssuerOrganization(), - ]); + ], + Http::STATUS_OK, + $headers + ); } catch (\Exception $e) { - return new DataResponse('An error occurred.', Http::STATUS_UNPROCESSABLE_ENTITY); + return new DataResponse('An error occurred.', Http::STATUS_UNPROCESSABLE_ENTITY, $headers); } } @@ -120,8 +131,9 @@ class CertificateController extends Controller { protected function isCertificateImportAllowed() { $externalStorageEnabled = $this->appManager->isEnabledForUser('files_external'); if ($externalStorageEnabled) { - $backendService = \OC_Mount_Config::$app->getContainer()->query('OCA\Files_External\Service\BackendService'); - if ($backendService->getBackendsVisibleFor(\OCA\Files_External\Service\BackendService::VISIBILITY_PERSONAL)) { + /** @var \OCA\Files_External\Service\BackendService $backendService */ + $backendService = \OC_Mount_Config::$app->getContainer()->query('\OCA\Files_External\Service\BackendService'); + if ($backendService->isUserMountingAllowed()) { return true; } } diff --git a/settings/controller/checksetupcontroller.php b/settings/controller/checksetupcontroller.php index ca4eb255f6b..bd0737aacc4 100644 --- a/settings/controller/checksetupcontroller.php +++ b/settings/controller/checksetupcontroller.php @@ -3,6 +3,8 @@ * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 @@ -121,7 +123,7 @@ class CheckSetupController extends Controller { * * @return array */ - public function getCurlVersion() { + protected function getCurlVersion() { return curl_version(); } @@ -135,6 +137,24 @@ class CheckSetupController extends Controller { * @return string */ private function isUsedTlsLibOutdated() { + // Appstore is disabled by default in EE + $appStoreDefault = false; + if (\OC_Util::getEditionString() === '') { + $appStoreDefault = true; + } + + // Don't run check when: + // 1. Server has `has_internet_connection` set to false + // 2. AppStore AND S2S is disabled + if(!$this->config->getSystemValue('has_internet_connection', true)) { + return ''; + } + if(!$this->config->getSystemValue('appstoreenabled', $appStoreDefault) + && $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'no' + && $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') === 'no') { + return ''; + } + $versionString = $this->getCurlVersion(); if(isset($versionString['ssl_version'])) { $versionString = $versionString['ssl_version']; @@ -143,7 +163,7 @@ class CheckSetupController extends Controller { } $features = (string)$this->l10n->t('installing and updating apps via the app store or Federated Cloud Sharing'); - if(!$this->config->getSystemValue('appstoreenabled', true)) { + if(!$this->config->getSystemValue('appstoreenabled', $appStoreDefault)) { $features = (string)$this->l10n->t('Federated Cloud Sharing'); } @@ -175,8 +195,8 @@ class CheckSetupController extends Controller { return ''; } - - /* + + /** * Whether the php version is still supported (at time of release) * according to: https://secure.php.net/supported-versions.php * @@ -193,7 +213,7 @@ class CheckSetupController extends Controller { return ['eol' => $eol, 'version' => PHP_VERSION]; } - /* + /** * Check if the reverse proxy configuration is working as expected * * @return bool @@ -211,6 +231,23 @@ class CheckSetupController extends Controller { } /** + * Checks if the correct memcache module for PHP is installed. Only + * fails if memcached is configured and the working module is not installed. + * + * @return bool + */ + private function isCorrectMemcachedPHPModuleInstalled() { + if ($this->config->getSystemValue('memcache.distributed', null) !== '\OC\Memcache\Memcached') { + return true; + } + + // there are two different memcached modules for PHP + // we only support memcached and not memcache + // https://code.google.com/p/memcached/wiki/PHPClientComparison + return !(!extension_loaded('memcached') && extension_loaded('memcache')); + } + + /** * @return DataResponse */ public function check() { @@ -226,6 +263,7 @@ class CheckSetupController extends Controller { 'phpSupported' => $this->isPhpSupported(), 'forwardedForHeadersWorking' => $this->forwardedForHeadersWorking(), 'reverseProxyDocs' => $this->urlGenerator->linkToDocs('admin-reverse-proxy'), + 'isCorrectMemcachedPHPModuleInstalled' => $this->isCorrectMemcachedPHPModuleInstalled() ] ); } diff --git a/settings/controller/encryptioncontroller.php b/settings/controller/encryptioncontroller.php index 7aaf184482f..b3515f962f4 100644 --- a/settings/controller/encryptioncontroller.php +++ b/settings/controller/encryptioncontroller.php @@ -1,6 +1,7 @@ <?php /** * @author Björn Schießle <schiessle@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. * @license AGPL-3.0 diff --git a/settings/js/admin.js b/settings/js/admin.js index 7117c7b46cf..9f7133c6571 100644 --- a/settings/js/admin.js +++ b/settings/js/admin.js @@ -23,11 +23,7 @@ $(document).ready(function(){ OC.Settings.setupGroupsSelect($(element)); $(element).change(function(ev) { var groups = ev.val || []; - if (groups.length > 0) { - groups = ev.val.join(','); // FIXME: make this JSON - } else { - groups = ''; - } + groups = JSON.stringify(groups); OC.AppConfig.setValue('core', $(this).attr('name'), groups); }); }); diff --git a/settings/js/apps.js b/settings/js/apps.js index f775ecad620..d51c642c9c9 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -245,6 +245,14 @@ OC.Settings.Apps = OC.Settings.Apps || { element.val(t('settings','Enable')); appItem.addClass('appwarning'); } else { + if (result.data.update_required) { + OC.Settings.Apps.showReloadMessage(); + + setTimeout(function() { + location.reload(); + }, 5000); + } + OC.Settings.Apps.rebuildNavigation(); appItem.data('active',true); element.data('active',true); @@ -390,6 +398,20 @@ OC.Settings.Apps = OC.Settings.Apps || { .text(''); }, + showReloadMessage: function(appId) { + OC.dialogs.info( + t( + 'settings', + 'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.' + ), + t('settings','App update'), + function (result) { + window.location.reload(); + }, + true + ); + }, + filter: function(query) { query = query.toLowerCase(); $('#apps-list').find('.section').addClass('hidden'); diff --git a/settings/js/personal.js b/settings/js/personal.js index 33746d22aca..3439eba686f 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -5,8 +5,6 @@ * See the COPYING-README file. */ -/* global OC, t */ - /** * The callback will be fired as soon as enter is pressed by the * user or 1 second after the last data entry @@ -156,6 +154,9 @@ function cleanCropper () { } function avatarResponseHandler (data) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } var $warning = $('#avatar .warning'); $warning.hide(); if (data.status === "success") { @@ -188,7 +189,7 @@ $(document).ready(function () { $.post(OC.generateUrl('/settings/personal/changepassword'), post, function (data) { if (data.status === "success") { $('#pass1').val(''); - $('#pass2').val(''); + $('#pass2').val('').change(); // Hide a possible errormsg and show successmsg $('#password-changed').removeClass('hidden').addClass('inlineblock'); $('#password-error').removeClass('inlineblock').addClass('hidden'); @@ -233,7 +234,21 @@ $(document).ready(function () { var uploadparms = { done: function (e, data) { - avatarResponseHandler(data.result); + var response = data; + if (typeof data.result === 'string') { + response = $.parseJSON(data.result); + } else if (data.result && data.result.length) { + // fetch response from iframe + response = $.parseJSON(data.result[0].body.innerText); + } else { + response = data.result; + } + avatarResponseHandler(response); + }, + submit: function(e, data) { + data.formData = _.extend(data.formData || {}, { + requesttoken: OC.requestToken + }); }, fail: function (e, data){ var msg = data.jqXHR.statusText + ' (' + data.jqXHR.status + ')'; @@ -251,10 +266,6 @@ $(document).ready(function () { } }; - $('#uploadavatarbutton').click(function () { - $('#uploadavatar').click(); - }); - $('#uploadavatar').fileupload(uploadparms); $('#selectavatar').click(function () { @@ -344,7 +355,24 @@ $(document).ready(function () { $('#sslCertificate tr > td').tipsy({gravity: 'n', live: true}); $('#rootcert_import').fileupload({ + submit: function(e, data) { + data.formData = _.extend(data.formData || {}, { + requesttoken: OC.requestToken + }); + }, success: function (data) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } else if (data && data.length) { + // fetch response from iframe + data = $.parseJSON(data[0].body.innerText); + } + if (!data || typeof(data) === 'string') { + // IE8 iframe workaround comes here instead of fail() + OC.Notification.showTemporary( + t('settings', 'An error occurred. Please upload an ASCII-encoded PEM certificate.')); + return; + } var issueDate = new Date(data.validFrom * 1000); var expireDate = new Date(data.validTill * 1000); var now = new Date(); @@ -374,10 +402,6 @@ $(document).ready(function () { } }); - $('#rootcert_import_button').click(function () { - $('#rootcert_import').click(); - }); - if ($('#sslCertificate > tbody > tr').length === 0) { $('#sslCertificate').hide(); } diff --git a/settings/js/users/deleteHandler.js b/settings/js/users/deleteHandler.js index de87f901372..b684aff1889 100644 --- a/settings/js/users/deleteHandler.js +++ b/settings/js/users/deleteHandler.js @@ -172,8 +172,9 @@ DeleteHandler.prototype.cancel = function() { * it, defaults to false */ DeleteHandler.prototype.deleteEntry = function(keepNotification) { + var deferred = $.Deferred(); if(this.canceled || this.oidToDelete === false) { - return false; + return deferred.resolve().promise(); } var dh = this; @@ -188,7 +189,7 @@ DeleteHandler.prototype.deleteEntry = function(keepNotification) { var payload = {}; payload[dh.ajaxParamID] = dh.oidToDelete; - $.ajax({ + return $.ajax({ type: 'DELETE', url: OC.generateUrl(dh.ajaxEndpoint+'/'+this.oidToDelete), // FIXME: do not use synchronous ajax calls as they block the browser ! diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js index 322db6c1b45..c8d2ef7c5b1 100644 --- a/settings/js/users/groups.js +++ b/settings/js/users/groups.js @@ -49,18 +49,26 @@ GroupList = { return parseInt($groupLiElement.data('usercount'), 10); }, - modEveryoneCount: function(diff) { - var $li = GroupList.getGroupLI(GroupList.everyoneGID); + modGroupCount: function(gid, diff) { + var $li = GroupList.getGroupLI(gid); var count = GroupList.getUserCount($li) + diff; GroupList.setUserCount($li, count); }, incEveryoneCount: function() { - GroupList.modEveryoneCount(1); + GroupList.modGroupCount(GroupList.everyoneGID, 1); }, decEveryoneCount: function() { - GroupList.modEveryoneCount(-1); + GroupList.modGroupCount(GroupList.everyoneGID, -1); + }, + + incGroupCount: function(gid) { + GroupList.modGroupCount(gid, 1); + }, + + decGroupCount: function(gid) { + GroupList.modGroupCount(gid, -1); }, getCurrentGID: function () { diff --git a/settings/js/users/users.js b/settings/js/users/users.js index 5b12366ad40..a99b46448be 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -9,6 +9,7 @@ var $userList; var $userListBody; +var UserDeleteHandler; var UserList = { availableGroups: [], offset: 0, @@ -470,6 +471,11 @@ var UserList = { UserList.availableGroups.push(groupName); } + if (response.data.action === 'add') { + GroupList.incGroupCount(groupName); + } else { + GroupList.decGroupCount(groupName); + } } if (response.data.message) { OC.Notification.show(response.data.message); @@ -780,77 +786,116 @@ $(document).ready(function () { t('settings', 'Error creating user')); return false; } - var groups = $('#newusergroups').val() || []; - $.post( - OC.generateUrl('/settings/users/users'), - { - username: username, - password: password, - groups: groups, - email: email - }, - function (result) { - if (result.groups) { - for (var i in result.groups) { - var gid = result.groups[i]; - if(UserList.availableGroups.indexOf(gid) === -1) { - UserList.availableGroups.push(gid); + + var promise; + if (UserDeleteHandler) { + promise = UserDeleteHandler.deleteEntry(); + } else { + promise = $.Deferred().resolve().promise(); + } + + promise.then(function() { + var groups = $('#newusergroups').val() || []; + $.post( + OC.generateUrl('/settings/users/users'), + { + username: username, + password: password, + groups: groups, + email: email + }, + function (result) { + if (result.groups) { + for (var i in result.groups) { + var gid = result.groups[i]; + if(UserList.availableGroups.indexOf(gid) === -1) { + UserList.availableGroups.push(gid); + } + $li = GroupList.getGroupLI(gid); + userCount = GroupList.getUserCount($li); + GroupList.setUserCount($li, userCount + 1); } - $li = GroupList.getGroupLI(gid); - userCount = GroupList.getUserCount($li); - GroupList.setUserCount($li, userCount + 1); } - } - if(!UserList.has(username)) { - UserList.add(result, true); - } - $('#newusername').focus(); - GroupList.incEveryoneCount(); - }).fail(function(result, textStatus, errorThrown) { - OC.dialogs.alert(result.responseJSON.message, t('settings', 'Error creating user')); - }).success(function(){ - $('#newuser').get(0).reset(); - }); + if(!UserList.has(username)) { + UserList.add(result, true); + } + $('#newusername').focus(); + GroupList.incEveryoneCount(); + }).fail(function(result, textStatus, errorThrown) { + OC.dialogs.alert(result.responseJSON.message, t('settings', 'Error creating user')); + }).success(function(){ + $('#newuser').get(0).reset(); + }); + }); }); + if ($('#CheckboxStorageLocation').is(':checked')) { + $("#userlist .storageLocation").show(); + } // Option to display/hide the "Storage location" column $('#CheckboxStorageLocation').click(function() { if ($('#CheckboxStorageLocation').is(':checked')) { $("#userlist .storageLocation").show(); + OC.AppConfig.setValue('core', 'umgmt_show_storage_location', 'true'); } else { $("#userlist .storageLocation").hide(); + OC.AppConfig.setValue('core', 'umgmt_show_storage_location', 'false'); } }); + + if ($('#CheckboxLastLogin').is(':checked')) { + $("#userlist .lastLogin").show(); + } // Option to display/hide the "Last Login" column $('#CheckboxLastLogin').click(function() { if ($('#CheckboxLastLogin').is(':checked')) { $("#userlist .lastLogin").show(); + OC.AppConfig.setValue('core', 'umgmt_show_last_login', 'true'); } else { $("#userlist .lastLogin").hide(); + OC.AppConfig.setValue('core', 'umgmt_show_last_login', 'false'); } }); + + if ($('#CheckboxEmailAddress').is(':checked')) { + $("#userlist .mailAddress").show(); + } // Option to display/hide the "Mail Address" column $('#CheckboxEmailAddress').click(function() { if ($('#CheckboxEmailAddress').is(':checked')) { $("#userlist .mailAddress").show(); + OC.AppConfig.setValue('core', 'umgmt_show_email', 'true'); } else { $("#userlist .mailAddress").hide(); + OC.AppConfig.setValue('core', 'umgmt_show_email', 'false'); } }); + + if ($('#CheckboxUserBackend').is(':checked')) { + $("#userlist .userBackend").show(); + } // Option to display/hide the "User Backend" column $('#CheckboxUserBackend').click(function() { if ($('#CheckboxUserBackend').is(':checked')) { $("#userlist .userBackend").show(); + OC.AppConfig.setValue('core', 'umgmt_show_backend', 'true'); } else { $("#userlist .userBackend").hide(); + OC.AppConfig.setValue('core', 'umgmt_show_backend', 'false'); } }); + + if ($('#CheckboxMailOnUserCreate').is(':checked')) { + $("#newemail").show(); + } // Option to display/hide the "E-Mail" input field $('#CheckboxMailOnUserCreate').click(function() { if ($('#CheckboxMailOnUserCreate').is(':checked')) { $("#newemail").show(); + OC.AppConfig.setValue('core', 'umgmt_send_email', 'true'); } else { $("#newemail").hide(); + OC.AppConfig.setValue('core', 'umgmt_send_email', 'false'); } }); diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 17f02402aee..b29ae9143c6 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "Probíhá odinstalace ...", "Error while uninstalling app" : "Chyba při odinstalaci aplikace", "Uninstall" : "Odinstalovat", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla povolena ale je třeba ji aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.", + "App update" : "Aktualizace aplikace", "An error occurred: {message}" : "Nastala chyba: {message}", "Select a profile picture" : "Vyberte profilový obrázek", "Very weak password" : "Velmi slabé heslo", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Středně silné heslo", "Good password" : "Dobré heslo", "Strong password" : "Silné heslo", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Došlo k chybě. Nahrajte prosím ASCII-kódovaný PEM certifikát.", "Valid until {date}" : "Platný do {date}", "Delete" : "Smazat", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Došlo k chybě. Nahrajte prosím ASCII-kódovaný PEM certifikát.", "Groups" : "Skupiny", "Unable to delete {objName}" : "Nelze smazat {objName}", "Error creating group" : "Chyba při vytváření skupiny", @@ -118,6 +120,7 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php není nejspíše správně nastaveno pro dotazování na proměnné hodnoty systému. Test s getenv(\"PATH\") vrací pouze prázdnou odpověď.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Zkontrolujte prosím konfiguraci php podle <a target=\"_blank\" href=\"%s\">instalační dokumentace a php konfiguraci na serveru, hlavně při použití php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Konfigurace je nastavena pouze pro čtení. Toto znemožňuje některá nastavení přes webové rozhraní. Dále musí být pro každou změnu povolen zápis do konfiguračního souboru ručně.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je patrně nastaveno tak, aby odstraňovalo bloky komentářů. Toto bude mít za následek nedostupnost množství hlavních aplikací.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Toto je pravděpodobně způsobeno aplikacemi pro urychlení načítání jako jsou Zend OPcache nebo eAccelerator.", @@ -146,6 +149,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Povolit uživatelům odesílat emailová upozornění na sdílené soubory ostatním uživatelům", "Exclude groups from sharing" : "Vyjmout skupiny ze sdílení", "These groups will still be able to receive shares, but not to initiate them." : "Těmto skupinám bude stále možno sdílet, nemohou ale sami sdílet ostatním.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Povolit automatické vyplňování v dialogu sdílení. Pokud je toto vypnuto, je třeba ručně vyplňovat celé uživatelské jméno.", "Last cron job execution: %s." : "Poslední cron proběhl: %s.", "Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.", "Cron was not executed yet!" : "Cron ještě nebyl spuštěn!", @@ -154,10 +158,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Použít systémovou službu cron pro volání cron.php každých 15 minut.", "Enable server-side encryption" : "Povolit šifrování na straně serveru", "Please read carefully before activating server-side encryption: " : "Pročtěte prosím důkladně před aktivací šifrování dat na serveru:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Šifrování dat na serveru je nevratný proces. Po zapnutí šifrování jsou všechny datové soubory zašifrovány a toto již poté nelze vypnout", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Kdokoliv s administrátorským přístupem k tomuto ownCloud serveru má možnost dešifrovat data, buď zachycením požadavků nebo získáním uživatelských hesel, která jsou uložena v čitelné podobě v souborech sezení. Šifrování dat na serveru proto nechrání před administrátory serveru, ale je užitečné jako ochrana vašich dat na externě hostovaném úložišti.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "V závislosti na použitém šifrovacím modulu je velikost zašifrovaných souborů navýšena (o 35%% nebo více při použití výchozího modulu)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Pro zabránění ztráty dat je třeba pravidelně zálohovat všechny šifrovací klíče (data/<user>/files_encryption a data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Poté co je zapnuto šifrování, jsou od toho bodu všechny nahrávané soubory šifrovány serverem. Vypnout šifrování bude možné pouze později, až bude šifrovací modul tuto možnost podporovat a po splnění všech nutných podmínek (tzn. nastavení klíčů pro obnovení).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Samotné šifrování nezajistí bezpečnost systému. Projděte si dokumentaci aplikace ownCloud pro více informací o tom jak šifrovací aplikace funguje a jejím správném použití.", + "Be aware that encryption always increases the file size." : "Mějte na paměti, že šifrování vždy navýší velikost souboru.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Je vždy dobré vytvářet pravidelné zálohy svých dat, v případě zapnutého šifrování také zajistěte zálohu šifrovacích klíčů společně se zálohou dat.", "This is the final warning: Do you really want to enable encryption?" : "Toto je poslední varování: Opravdu si přejete zapnout šifrování?", "Enable encryption" : "Povolit šifrování", "No encryption module loaded, please enable an encryption module in the app menu." : "Není načten žádný šifrovací modul, povolte ho prosím v menu aplikací.", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 455280dbeb8..11bd4b12669 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "Probíhá odinstalace ...", "Error while uninstalling app" : "Chyba při odinstalaci aplikace", "Uninstall" : "Odinstalovat", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla povolena ale je třeba ji aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.", + "App update" : "Aktualizace aplikace", "An error occurred: {message}" : "Nastala chyba: {message}", "Select a profile picture" : "Vyberte profilový obrázek", "Very weak password" : "Velmi slabé heslo", @@ -82,9 +84,9 @@ "So-so password" : "Středně silné heslo", "Good password" : "Dobré heslo", "Strong password" : "Silné heslo", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Došlo k chybě. Nahrajte prosím ASCII-kódovaný PEM certifikát.", "Valid until {date}" : "Platný do {date}", "Delete" : "Smazat", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Došlo k chybě. Nahrajte prosím ASCII-kódovaný PEM certifikát.", "Groups" : "Skupiny", "Unable to delete {objName}" : "Nelze smazat {objName}", "Error creating group" : "Chyba při vytváření skupiny", @@ -116,6 +118,7 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php není nejspíše správně nastaveno pro dotazování na proměnné hodnoty systému. Test s getenv(\"PATH\") vrací pouze prázdnou odpověď.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Zkontrolujte prosím konfiguraci php podle <a target=\"_blank\" href=\"%s\">instalační dokumentace a php konfiguraci na serveru, hlavně při použití php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Konfigurace je nastavena pouze pro čtení. Toto znemožňuje některá nastavení přes webové rozhraní. Dále musí být pro každou změnu povolen zápis do konfiguračního souboru ručně.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je patrně nastaveno tak, aby odstraňovalo bloky komentářů. Toto bude mít za následek nedostupnost množství hlavních aplikací.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Toto je pravděpodobně způsobeno aplikacemi pro urychlení načítání jako jsou Zend OPcache nebo eAccelerator.", @@ -144,6 +147,7 @@ "Allow users to send mail notification for shared files to other users" : "Povolit uživatelům odesílat emailová upozornění na sdílené soubory ostatním uživatelům", "Exclude groups from sharing" : "Vyjmout skupiny ze sdílení", "These groups will still be able to receive shares, but not to initiate them." : "Těmto skupinám bude stále možno sdílet, nemohou ale sami sdílet ostatním.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Povolit automatické vyplňování v dialogu sdílení. Pokud je toto vypnuto, je třeba ručně vyplňovat celé uživatelské jméno.", "Last cron job execution: %s." : "Poslední cron proběhl: %s.", "Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.", "Cron was not executed yet!" : "Cron ještě nebyl spuštěn!", @@ -152,10 +156,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Použít systémovou službu cron pro volání cron.php každých 15 minut.", "Enable server-side encryption" : "Povolit šifrování na straně serveru", "Please read carefully before activating server-side encryption: " : "Pročtěte prosím důkladně před aktivací šifrování dat na serveru:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Šifrování dat na serveru je nevratný proces. Po zapnutí šifrování jsou všechny datové soubory zašifrovány a toto již poté nelze vypnout", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Kdokoliv s administrátorským přístupem k tomuto ownCloud serveru má možnost dešifrovat data, buď zachycením požadavků nebo získáním uživatelských hesel, která jsou uložena v čitelné podobě v souborech sezení. Šifrování dat na serveru proto nechrání před administrátory serveru, ale je užitečné jako ochrana vašich dat na externě hostovaném úložišti.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "V závislosti na použitém šifrovacím modulu je velikost zašifrovaných souborů navýšena (o 35%% nebo více při použití výchozího modulu)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Pro zabránění ztráty dat je třeba pravidelně zálohovat všechny šifrovací klíče (data/<user>/files_encryption a data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Poté co je zapnuto šifrování, jsou od toho bodu všechny nahrávané soubory šifrovány serverem. Vypnout šifrování bude možné pouze později, až bude šifrovací modul tuto možnost podporovat a po splnění všech nutných podmínek (tzn. nastavení klíčů pro obnovení).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Samotné šifrování nezajistí bezpečnost systému. Projděte si dokumentaci aplikace ownCloud pro více informací o tom jak šifrovací aplikace funguje a jejím správném použití.", + "Be aware that encryption always increases the file size." : "Mějte na paměti, že šifrování vždy navýší velikost souboru.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Je vždy dobré vytvářet pravidelné zálohy svých dat, v případě zapnutého šifrování také zajistěte zálohu šifrovacích klíčů společně se zálohou dat.", "This is the final warning: Do you really want to enable encryption?" : "Toto je poslední varování: Opravdu si přejete zapnout šifrování?", "Enable encryption" : "Povolit šifrování", "No encryption module loaded, please enable an encryption module in the app menu." : "Není načten žádný šifrovací modul, povolte ho prosím v menu aplikací.", diff --git a/settings/l10n/da.js b/settings/l10n/da.js index 61b012de4f7..0ba43b120fd 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -84,9 +84,9 @@ OC.L10N.register( "So-so password" : "Jævnt kodeord", "Good password" : "Godt kodeord", "Strong password" : "Stærkt kodeord", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Der opstod en fejl. Upload venligst et ASCII-indkodet PEM-certifikat.", "Valid until {date}" : "Gyldig indtil {date}", "Delete" : "Slet", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Der opstod en fejl. Upload venligst et ASCII-indkodet PEM-certifikat.", "Groups" : "Grupper", "Unable to delete {objName}" : "Kunne ikke slette {objName}", "Error creating group" : "Fejl ved oprettelse af gruppe", @@ -149,6 +149,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Tillader brugere at sende mailnotifikationer for delte filer til andre brugere", "Exclude groups from sharing" : "Ekskluder grupper fra at dele", "These groups will still be able to receive shares, but not to initiate them." : "Disse grupper vil stadig kunne modtage delefiler, men ikke skabe dem.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Tillad autofuldførelse af brugernavnet i delings dialogboksen. Hvis funktion er deaktiveret skal det fulde brugernavn indtastes.", "Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.", "Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.", "Cron was not executed yet!" : "Cron har ikke kørt endnu!", @@ -157,10 +158,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Brug systemets cron service til at kalde cron.php hver 15. minut", "Enable server-side encryption" : "Slå kryptering til på serversiden", "Please read carefully before activating server-side encryption: " : "Læs venligst dette omhyggeligt, før der aktivere kryptering på serversiden:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Kryptering på serversiden er en envejsproces. Når krypteringen slås til, så vil alle filer fremover blive krypteret på serveren, og det vil ikke være muligt at slå kryptering fra efterfølgende", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Enhver med priviligeret adgang til din ownCloud-server kan dekryptere dine filer, enten ved at opsnappe forespørgsler eller aflæse brugerkodeord, der bliver lagret i sessionsfiler med klartekst. Kryptering af serversiden beskytter derfor ikke mod ondsindede administratorer, men kan hjælpe til at beskytte dine data når de lagres hos eksterne værter.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Afhængig af det faktiske krypteringsmodul, så øges den generelle filstørrelse (med 35%% eller mere ved brug af standardmodulet)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Du bør jævnligt foretage sikkerhedskopiering af alle krypteringsnøgler, for at forhindre permanente tab af data (data/<user>/files_encryption and data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Dette er den sidste advarsel: Sikker på at du vil slå kryptering til?", "Enable encryption" : "Slå kryptering til", "No encryption module loaded, please enable an encryption module in the app menu." : "Der er ikke indlæst et krypteringsmodul - slå venligst et krypteringsmodul til i app-menuen.", diff --git a/settings/l10n/da.json b/settings/l10n/da.json index 2f18fedf629..f3f61602f11 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -82,9 +82,9 @@ "So-so password" : "Jævnt kodeord", "Good password" : "Godt kodeord", "Strong password" : "Stærkt kodeord", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Der opstod en fejl. Upload venligst et ASCII-indkodet PEM-certifikat.", "Valid until {date}" : "Gyldig indtil {date}", "Delete" : "Slet", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Der opstod en fejl. Upload venligst et ASCII-indkodet PEM-certifikat.", "Groups" : "Grupper", "Unable to delete {objName}" : "Kunne ikke slette {objName}", "Error creating group" : "Fejl ved oprettelse af gruppe", @@ -147,6 +147,7 @@ "Allow users to send mail notification for shared files to other users" : "Tillader brugere at sende mailnotifikationer for delte filer til andre brugere", "Exclude groups from sharing" : "Ekskluder grupper fra at dele", "These groups will still be able to receive shares, but not to initiate them." : "Disse grupper vil stadig kunne modtage delefiler, men ikke skabe dem.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Tillad autofuldførelse af brugernavnet i delings dialogboksen. Hvis funktion er deaktiveret skal det fulde brugernavn indtastes.", "Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.", "Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.", "Cron was not executed yet!" : "Cron har ikke kørt endnu!", @@ -155,10 +156,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Brug systemets cron service til at kalde cron.php hver 15. minut", "Enable server-side encryption" : "Slå kryptering til på serversiden", "Please read carefully before activating server-side encryption: " : "Læs venligst dette omhyggeligt, før der aktivere kryptering på serversiden:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Kryptering på serversiden er en envejsproces. Når krypteringen slås til, så vil alle filer fremover blive krypteret på serveren, og det vil ikke være muligt at slå kryptering fra efterfølgende", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Enhver med priviligeret adgang til din ownCloud-server kan dekryptere dine filer, enten ved at opsnappe forespørgsler eller aflæse brugerkodeord, der bliver lagret i sessionsfiler med klartekst. Kryptering af serversiden beskytter derfor ikke mod ondsindede administratorer, men kan hjælpe til at beskytte dine data når de lagres hos eksterne værter.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Afhængig af det faktiske krypteringsmodul, så øges den generelle filstørrelse (med 35%% eller mere ved brug af standardmodulet)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Du bør jævnligt foretage sikkerhedskopiering af alle krypteringsnøgler, for at forhindre permanente tab af data (data/<user>/files_encryption and data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Dette er den sidste advarsel: Sikker på at du vil slå kryptering til?", "Enable encryption" : "Slå kryptering til", "No encryption module loaded, please enable an encryption module in the app menu." : "Der er ikke indlæst et krypteringsmodul - slå venligst et krypteringsmodul til i app-menuen.", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 477b954f657..39fc0de9362 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -77,6 +77,7 @@ OC.L10N.register( "Uninstalling ...." : "Deinstallieren…", "Error while uninstalling app" : "Fehler beim Deinstallieren der App", "Uninstall" : "Deinstallieren", + "App update" : "App aktualisiert", "An error occurred: {message}" : "Ein Fehler ist aufgetreten: {message}", "Select a profile picture" : "Wähle ein Profilbild", "Very weak password" : "Sehr schwaches Passwort", @@ -84,9 +85,9 @@ OC.L10N.register( "So-so password" : "Durchschnittliches Passwort", "Good password" : "Gutes Passwort", "Strong password" : "Starkes Passwort", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte lade ein ASCII-kodiertes PEM-Zertifikat hoch.", "Valid until {date}" : "Gültig bis {date}", "Delete" : "Löschen", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte lade ein ASCII-kodiertes PEM-Zertifikat hoch.", "Groups" : "Gruppen", "Unable to delete {objName}" : "Löschen von {objName} nicht möglich", "Error creating group" : "Fehler beim Erstellen der Gruppe", @@ -118,6 +119,7 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (\"PATH\") liefert nur eine leere Antwort zurück.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte schau in der <a target=\"_blank\" href=\"%s\">Installationsdokumentation ↗</a>auf Hinweise zur PHP-Konfiguration, sowie die PHP-Konfiguration Deines Servers, insbesondere dann, wenn Du PHP-FPM einsetzt.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Die schreibgeschützte Konfiguration wurde aktiviert. Dies verhindert das Setzen einiger Einstellungen über die Web-Schnittstelle. Weiterhin muss bei jedem Update der Schreibzugriff auf die Datei händisch aktiviert werden.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ist offenbar so konfiguriert, dass PHPDoc-Blöcke in der Anweisung entfernt werden. Dadurch sind mehrere Kern-Apps nicht erreichbar.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dies wird wahrscheinlich durch Zwischenspeicher/Beschleuniger wie etwa Zend OPcache oder eAccelerator verursacht.", @@ -152,6 +154,9 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", "Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren", + "Please read carefully before activating server-side encryption: " : "Bitte sorgfältig lesen, bevor die serverseitige Verschlüsselung aktiviert wird:", + "Be aware that encryption always increases the file size." : "Sei dir bewusst, dass die Verschlüsselung immer die Dateigröße erhöht.", + "This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Verschlüsselung wirklich aktivieren?", "Enable encryption" : "Verschlüsselung aktivieren", "No encryption module loaded, please enable an encryption module in the app menu." : "Kein Verschlüsselungs-Modul geladen, bitte aktiviere ein Verschlüsselungs-Modul im Anwendungs-Menü.", "Select default encryption module:" : "Bite Standard-Verschlüsselungs-Modul auswählen:", @@ -215,7 +220,7 @@ OC.L10N.register( "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Du das Projekt unterstützen möchtest,\n⇥⇥<a href=\"https://owncloud.org/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">beteilige Dich an der Entwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://owncloud.org/promote\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">hilf mit, es bekannter zu machen</a>!", + "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Du das Projekt unterstützen möchtest,\n<a href=\"https://owncloud.org/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">beteilige Dich an der Entwicklung</a>\noder\n<a href=\"https://owncloud.org/promote\"\ntarget=\"_blank\" rel=\"noreferrer\">hilf mit, es bekannter zu machen</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Du verwendest <strong>%s</strong> der verfügbaren <strong>%s</strong>", "Password" : "Passwort", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index 1a7cbdc3c14..52781799d0b 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -75,6 +75,7 @@ "Uninstalling ...." : "Deinstallieren…", "Error while uninstalling app" : "Fehler beim Deinstallieren der App", "Uninstall" : "Deinstallieren", + "App update" : "App aktualisiert", "An error occurred: {message}" : "Ein Fehler ist aufgetreten: {message}", "Select a profile picture" : "Wähle ein Profilbild", "Very weak password" : "Sehr schwaches Passwort", @@ -82,9 +83,9 @@ "So-so password" : "Durchschnittliches Passwort", "Good password" : "Gutes Passwort", "Strong password" : "Starkes Passwort", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte lade ein ASCII-kodiertes PEM-Zertifikat hoch.", "Valid until {date}" : "Gültig bis {date}", "Delete" : "Löschen", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte lade ein ASCII-kodiertes PEM-Zertifikat hoch.", "Groups" : "Gruppen", "Unable to delete {objName}" : "Löschen von {objName} nicht möglich", "Error creating group" : "Fehler beim Erstellen der Gruppe", @@ -116,6 +117,7 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (\"PATH\") liefert nur eine leere Antwort zurück.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte schau in der <a target=\"_blank\" href=\"%s\">Installationsdokumentation ↗</a>auf Hinweise zur PHP-Konfiguration, sowie die PHP-Konfiguration Deines Servers, insbesondere dann, wenn Du PHP-FPM einsetzt.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Die schreibgeschützte Konfiguration wurde aktiviert. Dies verhindert das Setzen einiger Einstellungen über die Web-Schnittstelle. Weiterhin muss bei jedem Update der Schreibzugriff auf die Datei händisch aktiviert werden.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ist offenbar so konfiguriert, dass PHPDoc-Blöcke in der Anweisung entfernt werden. Dadurch sind mehrere Kern-Apps nicht erreichbar.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dies wird wahrscheinlich durch Zwischenspeicher/Beschleuniger wie etwa Zend OPcache oder eAccelerator verursacht.", @@ -150,6 +152,9 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", "Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren", + "Please read carefully before activating server-side encryption: " : "Bitte sorgfältig lesen, bevor die serverseitige Verschlüsselung aktiviert wird:", + "Be aware that encryption always increases the file size." : "Sei dir bewusst, dass die Verschlüsselung immer die Dateigröße erhöht.", + "This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Verschlüsselung wirklich aktivieren?", "Enable encryption" : "Verschlüsselung aktivieren", "No encryption module loaded, please enable an encryption module in the app menu." : "Kein Verschlüsselungs-Modul geladen, bitte aktiviere ein Verschlüsselungs-Modul im Anwendungs-Menü.", "Select default encryption module:" : "Bite Standard-Verschlüsselungs-Modul auswählen:", @@ -213,7 +218,7 @@ "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Du das Projekt unterstützen möchtest,\n⇥⇥<a href=\"https://owncloud.org/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">beteilige Dich an der Entwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://owncloud.org/promote\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">hilf mit, es bekannter zu machen</a>!", + "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Du das Projekt unterstützen möchtest,\n<a href=\"https://owncloud.org/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">beteilige Dich an der Entwicklung</a>\noder\n<a href=\"https://owncloud.org/promote\"\ntarget=\"_blank\" rel=\"noreferrer\">hilf mit, es bekannter zu machen</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Du verwendest <strong>%s</strong> der verfügbaren <strong>%s</strong>", "Password" : "Passwort", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index 5c931504348..31d7a450e58 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -81,9 +81,9 @@ OC.L10N.register( "So-so password" : "Passables Passwort", "Good password" : "Gutes Passwort", "Strong password" : "Starkes Passwort", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte laden Sie ein ASCII-kodiertes PEM-Zertifikat hoch.", "Valid until {date}" : "Gültig bis {date}", "Delete" : "Löschen", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte laden Sie ein ASCII-kodiertes PEM-Zertifikat hoch.", "Groups" : "Gruppen", "Unable to delete {objName}" : "Löschen von {objName} nicht möglich", "Error creating group" : "Fehler beim Erstellen der Gruppe", @@ -212,7 +212,7 @@ OC.L10N.register( "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Sie das Projekt unterstützen möchten,\n⇥⇥<a href=\"https://owncloud.org/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">beteiligen Sie sich an der Entwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://owncloud.org/promote\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">helfen Sie mit, es bekannter zu machen</a>!", + "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Sie das Projekt unterstützen möchten,\n<a href=\"https://owncloud.org/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">beteiligen Sie sich an der Entwicklung</a>\noder\n<a href=\"https://owncloud.org/promote\"\ntarget=\"_blank\" rel=\"noreferrer\">helfen Sie mit, es bekannter zu machen</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Sie verwenden <strong>%s</strong> der verfügbaren <strong>%s</strong>", "Password" : "Passwort", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 0518e75c4e5..e6db2947ee9 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -79,9 +79,9 @@ "So-so password" : "Passables Passwort", "Good password" : "Gutes Passwort", "Strong password" : "Starkes Passwort", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte laden Sie ein ASCII-kodiertes PEM-Zertifikat hoch.", "Valid until {date}" : "Gültig bis {date}", "Delete" : "Löschen", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Es ist ein Fehler aufgetreten. Bitte laden Sie ein ASCII-kodiertes PEM-Zertifikat hoch.", "Groups" : "Gruppen", "Unable to delete {objName}" : "Löschen von {objName} nicht möglich", "Error creating group" : "Fehler beim Erstellen der Gruppe", @@ -210,7 +210,7 @@ "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Sie das Projekt unterstützen möchten,\n⇥⇥<a href=\"https://owncloud.org/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">beteiligen Sie sich an der Entwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://owncloud.org/promote\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">helfen Sie mit, es bekannter zu machen</a>!", + "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Sie das Projekt unterstützen möchten,\n<a href=\"https://owncloud.org/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">beteiligen Sie sich an der Entwicklung</a>\noder\n<a href=\"https://owncloud.org/promote\"\ntarget=\"_blank\" rel=\"noreferrer\">helfen Sie mit, es bekannter zu machen</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Sie verwenden <strong>%s</strong> der verfügbaren <strong>%s</strong>", "Password" : "Passwort", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index e1ca38deeee..c0fce87a611 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "Απεγκατάσταση ....", "Error while uninstalling app" : "Σφάλμα κατά την απεγκατάσταση της εφαρμογής", "Uninstall" : "Απεγκατάσταση", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Η εφαρμογή έχει ενεργοποιηθεί αλλά χρειάζεται ενημέρωση. Θα μεταφερθείτε στη σελίδα ενημέρωσης σε 5 δευτερόλεπτα.", + "App update" : "Ενημέρωση εφαρμογής", "An error occurred: {message}" : "Παρουσιάστηκε σφάλμα: {message}", "Select a profile picture" : "Επιλογή εικόνας προφίλ", "Very weak password" : "Πολύ αδύναμο συνθηματικό", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Μέτριο συνθηματικό", "Good password" : "Καλό συνθηματικό", "Strong password" : "Δυνατό συνθηματικό", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Προέκυψε σφάλμα. Παρακαλούμε μεταφορτώστε ένα πιστοποιητικό PEM κωδικοποιημένο κατά ASCII.", "Valid until {date}" : "Έγκυρο έως {date}", "Delete" : "Διαγραφή", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Προέκυψε σφάλμα. Παρακαλούμε μεταφορτώστε ένα πιστοποιητικό PEM κωδικοποιημένο κατά ASCII.", "Groups" : "Ομάδες", "Unable to delete {objName}" : "Αδυναμία διαγραφής του {objName}", "Error creating group" : "Σφάλμα δημιουργίας ομάδας", @@ -149,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Να επιτρέπεται η αποστολή ειδοποιήσεων σε άλλους χρήστες, μέσω αλληλογραφίας για κοινόχρηστα αρχεία", "Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό", "These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης στο διάλογο διαμοιρασμού. Αν αυτό είναι απενεργοποιημένο θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη.", "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.", "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.", "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!", @@ -157,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Η κρυπτογράφηση είναι μια μη αντιστρεπτή διαδικασία. Μόλις ενεργοποιηθεί, όλα τα αρχεία από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή και η κρυπτογράφηση δεν είναι δυνατόν να απενεργοποιηθεί αργότερα", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Οποιοσδήποτε έχει αυξημένα δικαιώματα πρόσβασης στο διακομιστή του ownCloud σας μπορεί να αποκρυπτογραφήσει τα αρχεία σας είτε παγιδεύοντας τα αιτήματα ή διαβάζοντας τους κωδικούς χρηστών που είναι αποθηκευμένοι σε απλά αρχεία κειμένου. Η κρυπτογράφηση στο διακομιστή δεν προστατεύει επομένως από κακόβουλους διαχειριστές αλλά είναι χρήσιμη στο να προστατεύει τα δεδομένα σας σε εξωτερικούς διακομιστές αποθήκευσης.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Ανάλογα με το άρθρωμα που χρησιμοποιείται το μέγεθος αρχείων γενικά αυξάνεται (κατά 35%% ή και περισσότερο αν χρησιμοποιηθεί το προεπιλεγμένο άρθρωμα)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Θα πρέπει να λαμβάνετε τακτικά αντίγραφα ασφαλείας όλων των κλειδιών κρυπτογράφησης για να αποφύγετε μόνιμη απώλεια δεδομένων (data/<user>/files_encryption και data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Μόλις ενεργοποιηθεί η κρυπτογράφηση, όλα τα αρχεία που θα μεταφορτωθούν από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή. Η κρυπτογράφηση είναι δυνατόν να απενεργοποιηθεί αργότερα μόνο αν το ενεργό άρθρωμα κρυπτογράφησης υποστηρίζει αυτή τη λειτουργία και εκπληρούνται όλες οι προϋποθέσεις (πχ ορισμός κλειδιού ανάκτησης).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Η κρυπτογράφηση από΄μ9ονη της δεν εγγυάται την την ασφάλεια του συστήματος. Παρακαλούμε δείτε την τεκμηρίωση του ownCloud για περισσότερες πληροφορίες σχετικά με το πως δουλεύει η εφαρμογή κρυπτογράφησης και τις υποστηριζόμενες περιπτώσεις χρήσης.", + "Be aware that encryption always increases the file size." : "Έχετε στο νου σας πως η κρυπτογράφηση πάντα αυξάνει το μέγεθος του αρχείου", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Είναι πάντοτε καλό να δημιουργείτε τακτικά αντίγραφα ασφαλείας των δεδομένων σας, στην περίπτωση της κρυπτογράφησης βεβαιωθείτε ότι έχετε λάβει αντίγραφο ασφαλείας των κλειδιών κρυπτογράφησης παράλληλα με τα δεδομένα σας.", "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 92873fb1675..c6e131526d7 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "Απεγκατάσταση ....", "Error while uninstalling app" : "Σφάλμα κατά την απεγκατάσταση της εφαρμογής", "Uninstall" : "Απεγκατάσταση", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Η εφαρμογή έχει ενεργοποιηθεί αλλά χρειάζεται ενημέρωση. Θα μεταφερθείτε στη σελίδα ενημέρωσης σε 5 δευτερόλεπτα.", + "App update" : "Ενημέρωση εφαρμογής", "An error occurred: {message}" : "Παρουσιάστηκε σφάλμα: {message}", "Select a profile picture" : "Επιλογή εικόνας προφίλ", "Very weak password" : "Πολύ αδύναμο συνθηματικό", @@ -82,9 +84,9 @@ "So-so password" : "Μέτριο συνθηματικό", "Good password" : "Καλό συνθηματικό", "Strong password" : "Δυνατό συνθηματικό", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Προέκυψε σφάλμα. Παρακαλούμε μεταφορτώστε ένα πιστοποιητικό PEM κωδικοποιημένο κατά ASCII.", "Valid until {date}" : "Έγκυρο έως {date}", "Delete" : "Διαγραφή", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Προέκυψε σφάλμα. Παρακαλούμε μεταφορτώστε ένα πιστοποιητικό PEM κωδικοποιημένο κατά ASCII.", "Groups" : "Ομάδες", "Unable to delete {objName}" : "Αδυναμία διαγραφής του {objName}", "Error creating group" : "Σφάλμα δημιουργίας ομάδας", @@ -147,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "Να επιτρέπεται η αποστολή ειδοποιήσεων σε άλλους χρήστες, μέσω αλληλογραφίας για κοινόχρηστα αρχεία", "Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό", "These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης στο διάλογο διαμοιρασμού. Αν αυτό είναι απενεργοποιημένο θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη.", "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.", "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.", "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!", @@ -155,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Η κρυπτογράφηση είναι μια μη αντιστρεπτή διαδικασία. Μόλις ενεργοποιηθεί, όλα τα αρχεία από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή και η κρυπτογράφηση δεν είναι δυνατόν να απενεργοποιηθεί αργότερα", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Οποιοσδήποτε έχει αυξημένα δικαιώματα πρόσβασης στο διακομιστή του ownCloud σας μπορεί να αποκρυπτογραφήσει τα αρχεία σας είτε παγιδεύοντας τα αιτήματα ή διαβάζοντας τους κωδικούς χρηστών που είναι αποθηκευμένοι σε απλά αρχεία κειμένου. Η κρυπτογράφηση στο διακομιστή δεν προστατεύει επομένως από κακόβουλους διαχειριστές αλλά είναι χρήσιμη στο να προστατεύει τα δεδομένα σας σε εξωτερικούς διακομιστές αποθήκευσης.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Ανάλογα με το άρθρωμα που χρησιμοποιείται το μέγεθος αρχείων γενικά αυξάνεται (κατά 35%% ή και περισσότερο αν χρησιμοποιηθεί το προεπιλεγμένο άρθρωμα)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Θα πρέπει να λαμβάνετε τακτικά αντίγραφα ασφαλείας όλων των κλειδιών κρυπτογράφησης για να αποφύγετε μόνιμη απώλεια δεδομένων (data/<user>/files_encryption και data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Μόλις ενεργοποιηθεί η κρυπτογράφηση, όλα τα αρχεία που θα μεταφορτωθούν από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή. Η κρυπτογράφηση είναι δυνατόν να απενεργοποιηθεί αργότερα μόνο αν το ενεργό άρθρωμα κρυπτογράφησης υποστηρίζει αυτή τη λειτουργία και εκπληρούνται όλες οι προϋποθέσεις (πχ ορισμός κλειδιού ανάκτησης).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Η κρυπτογράφηση από΄μ9ονη της δεν εγγυάται την την ασφάλεια του συστήματος. Παρακαλούμε δείτε την τεκμηρίωση του ownCloud για περισσότερες πληροφορίες σχετικά με το πως δουλεύει η εφαρμογή κρυπτογράφησης και τις υποστηριζόμενες περιπτώσεις χρήσης.", + "Be aware that encryption always increases the file size." : "Έχετε στο νου σας πως η κρυπτογράφηση πάντα αυξάνει το μέγεθος του αρχείου", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Είναι πάντοτε καλό να δημιουργείτε τακτικά αντίγραφα ασφαλείας των δεδομένων σας, στην περίπτωση της κρυπτογράφησης βεβαιωθείτε ότι έχετε λάβει αντίγραφο ασφαλείας των κλειδιών κρυπτογράφησης παράλληλα με τα δεδομένα σας.", "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index 3385448f4e4..f103c0c3b03 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -78,9 +78,9 @@ OC.L10N.register( "So-so password" : "So-so password", "Good password" : "Good password", "Strong password" : "Strong password", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "An error occurred. Please upload an ASCII-encoded PEM certificate.", "Valid until {date}" : "Valid until {date}", "Delete" : "Delete", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "An error occurred. Please upload an ASCII-encoded PEM certificate.", "Groups" : "Groups", "Unable to delete {objName}" : "Unable to delete {objName}", "Error creating group" : "Error creating group", diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 7a426bbc1f4..a1a6697a0de 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -76,9 +76,9 @@ "So-so password" : "So-so password", "Good password" : "Good password", "Strong password" : "Strong password", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "An error occurred. Please upload an ASCII-encoded PEM certificate.", "Valid until {date}" : "Valid until {date}", "Delete" : "Delete", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "An error occurred. Please upload an ASCII-encoded PEM certificate.", "Groups" : "Groups", "Unable to delete {objName}" : "Unable to delete {objName}", "Error creating group" : "Error creating group", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 1ffc4e9fcf6..f3eba3e61d9 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -84,9 +84,9 @@ OC.L10N.register( "So-so password" : "Contraseña pasable", "Good password" : "Contraseña buena", "Strong password" : "Contraseña muy buena", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ha ocurrido un error. Por favor, cargue un certificado PEM codificado en ASCII.", "Valid until {date}" : "Válido hasta {date}", "Delete" : "Eliminar", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ha ocurrido un error. Por favor, cargue un certificado PEM codificado en ASCII.", "Groups" : "Grupos", "Unable to delete {objName}" : "No es posible eliminar {objName}", "Error creating group" : "Error al crear un grupo", @@ -118,7 +118,8 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php parece que no está configurado correctamente para solicitar las variables de entorno del sistema. La prueba con getenv(\"PATH\") sólo retorna una respuesta vacía.", - "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Se ha habilitado la configuración de sólo lectura. Esto evita que ajustar algunas configuraciones a través de la interfaz web. Además, el archivo debe hacerse modificable manualmente para cada actualización.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor, compruebe la <a target=\"_blank\" href=\"%s\">documentación de instalación ↗</a> para las notas de configuración de php y la configuración de php de su servidor, especialmente cuando use php-fpm.", + "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Se ha habilitado la configuración de sólo lectura. Esto evita tener que ajustar algunas configuraciones a través de la interfaz web. Además, el archivo debe hacerse modificable manualmente para cada actualización.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado para eliminar bloques de documentos en línea. Esto hará que varias aplicaciones principales no estén accesibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Probablemente esto venga a causa de la caché o un acelerador, tales como Zend OPcache o eAccelerator.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Su servidor está operando con Microsoft Windows. Le recomendamos GNU/Linux encarecidamente para disfrutar una experiencia óptima como usuario.", @@ -146,6 +147,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Permitir a los usuarios enviar notificaciones por correo electrónico de los archivos compartidos a otros usuarios", "Exclude groups from sharing" : "Excluye grupos de compartir", "These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir contenidos compartidos, pero no podrán, pero no podrán iniciarlos.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir autocompletación del nombre de usuario en diálogos de compartición. Si está deshabilitado, se requiere introducir el nombre de usuario.", "Last cron job execution: %s." : "Cron se ejecutó por última vez: %s", "Last cron job execution: %s. Something seems wrong." : "Cron se ejecutó por última vez: %s. Algo va mal.", "Cron was not executed yet!" : "¡Cron aún no ha sido ejecutado!", @@ -154,10 +156,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 15 minutos.", "Enable server-side encryption" : "Habilitar cifrado en el servidor", "Please read carefully before activating server-side encryption: " : "Por favor lea cuidadosamente antes de activar el cifrado del lado del servidor.", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "El cifrado en el lado servidor es un proceso de una sola vía. Una vez el cifrado está habilitado, todos los archivos desde este punto en adelante serán cifrados en el servidor y no será posible deshabilitar el cifrado posteriormente. ", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Cualquiera que tenga acceso a este servidor ownCloud, puede descifrar estos archivos, simplemente leyendo la contraseña que se guarda en texto plano en los archivos de sesión. El cifrado del lado servidor, no protege por tanto de administradores malintencionados, pero es ùtil para proteger los datos en almacenes de datos externos de accesos no autorizados. ", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Dependiendo del módulo de cifrado seleccionado, el tamaño de los archivos se puede ver incrementado (hasta un 35%% o más para las opciones por defecto).", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Deberia salvar de forma regular las claves de cifrado para evitar la perdida de datos (data/<user>/files_encryption and data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Esta es la advertencia final. ¿Realmente quiere activar el cifrado?", "Enable encryption" : "Habilitar cifrado", "No encryption module loaded, please enable an encryption module in the app menu." : "No se ha cargado el modulo de cifrado. Por favor habilite un modulo de cifrado en el menú de aplicaciones.", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index b3ee25ce612..9078dd3ea7b 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -82,9 +82,9 @@ "So-so password" : "Contraseña pasable", "Good password" : "Contraseña buena", "Strong password" : "Contraseña muy buena", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ha ocurrido un error. Por favor, cargue un certificado PEM codificado en ASCII.", "Valid until {date}" : "Válido hasta {date}", "Delete" : "Eliminar", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ha ocurrido un error. Por favor, cargue un certificado PEM codificado en ASCII.", "Groups" : "Grupos", "Unable to delete {objName}" : "No es posible eliminar {objName}", "Error creating group" : "Error al crear un grupo", @@ -116,7 +116,8 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php parece que no está configurado correctamente para solicitar las variables de entorno del sistema. La prueba con getenv(\"PATH\") sólo retorna una respuesta vacía.", - "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Se ha habilitado la configuración de sólo lectura. Esto evita que ajustar algunas configuraciones a través de la interfaz web. Además, el archivo debe hacerse modificable manualmente para cada actualización.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor, compruebe la <a target=\"_blank\" href=\"%s\">documentación de instalación ↗</a> para las notas de configuración de php y la configuración de php de su servidor, especialmente cuando use php-fpm.", + "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Se ha habilitado la configuración de sólo lectura. Esto evita tener que ajustar algunas configuraciones a través de la interfaz web. Además, el archivo debe hacerse modificable manualmente para cada actualización.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado para eliminar bloques de documentos en línea. Esto hará que varias aplicaciones principales no estén accesibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Probablemente esto venga a causa de la caché o un acelerador, tales como Zend OPcache o eAccelerator.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Su servidor está operando con Microsoft Windows. Le recomendamos GNU/Linux encarecidamente para disfrutar una experiencia óptima como usuario.", @@ -144,6 +145,7 @@ "Allow users to send mail notification for shared files to other users" : "Permitir a los usuarios enviar notificaciones por correo electrónico de los archivos compartidos a otros usuarios", "Exclude groups from sharing" : "Excluye grupos de compartir", "These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir contenidos compartidos, pero no podrán, pero no podrán iniciarlos.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir autocompletación del nombre de usuario en diálogos de compartición. Si está deshabilitado, se requiere introducir el nombre de usuario.", "Last cron job execution: %s." : "Cron se ejecutó por última vez: %s", "Last cron job execution: %s. Something seems wrong." : "Cron se ejecutó por última vez: %s. Algo va mal.", "Cron was not executed yet!" : "¡Cron aún no ha sido ejecutado!", @@ -152,10 +154,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 15 minutos.", "Enable server-side encryption" : "Habilitar cifrado en el servidor", "Please read carefully before activating server-side encryption: " : "Por favor lea cuidadosamente antes de activar el cifrado del lado del servidor.", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "El cifrado en el lado servidor es un proceso de una sola vía. Una vez el cifrado está habilitado, todos los archivos desde este punto en adelante serán cifrados en el servidor y no será posible deshabilitar el cifrado posteriormente. ", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Cualquiera que tenga acceso a este servidor ownCloud, puede descifrar estos archivos, simplemente leyendo la contraseña que se guarda en texto plano en los archivos de sesión. El cifrado del lado servidor, no protege por tanto de administradores malintencionados, pero es ùtil para proteger los datos en almacenes de datos externos de accesos no autorizados. ", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Dependiendo del módulo de cifrado seleccionado, el tamaño de los archivos se puede ver incrementado (hasta un 35%% o más para las opciones por defecto).", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Deberia salvar de forma regular las claves de cifrado para evitar la perdida de datos (data/<user>/files_encryption and data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Esta es la advertencia final. ¿Realmente quiere activar el cifrado?", "Enable encryption" : "Habilitar cifrado", "No encryption module loaded, please enable an encryption module in the app menu." : "No se ha cargado el modulo de cifrado. Por favor habilite un modulo de cifrado en el menú de aplicaciones.", diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js index fa4a506fab0..122422aac97 100644 --- a/settings/l10n/es_AR.js +++ b/settings/l10n/es_AR.js @@ -94,6 +94,9 @@ OC.L10N.register( "Cheers!" : "¡Saludos!", "Forum" : "Foro", "Get the apps to sync your files" : "Obtené Apps para sincronizar tus archivos", + "Desktop client" : "Cliente de escritorio", + "Android app" : "App para Android", + "iOS app" : "App para iOS", "Show First Run Wizard again" : "Mostrar de nuevo el asistente de primera ejecución", "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Usás <strong>%s</strong> de los <strong>%s</strong> disponibles", "Password" : "Contraseña", diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json index e8098e575c5..72e593031b8 100644 --- a/settings/l10n/es_AR.json +++ b/settings/l10n/es_AR.json @@ -92,6 +92,9 @@ "Cheers!" : "¡Saludos!", "Forum" : "Foro", "Get the apps to sync your files" : "Obtené Apps para sincronizar tus archivos", + "Desktop client" : "Cliente de escritorio", + "Android app" : "App para Android", + "iOS app" : "App para iOS", "Show First Run Wizard again" : "Mostrar de nuevo el asistente de primera ejecución", "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Usás <strong>%s</strong> de los <strong>%s</strong> disponibles", "Password" : "Contraseña", diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js index 0453a78f842..3111101135b 100644 --- a/settings/l10n/es_MX.js +++ b/settings/l10n/es_MX.js @@ -20,6 +20,7 @@ OC.L10N.register( "Wrong admin recovery password. Please check the password and try again." : "Contraseña de recuperación de administrador incorrecta. Por favor compruebe la contraseña e inténtelo de nuevo.", "Unable to change password" : "No se ha podido cambiar la contraseña", "Enabled" : "Habilitar", + "Saved" : "Guardado", "Email sent" : "Correo electrónico enviado", "Email saved" : "Correo electrónico guardado", "All" : "Todos", @@ -47,12 +48,14 @@ OC.L10N.register( "Warnings, errors and fatal issues" : "Advertencias, errores y problemas fatales", "Errors and fatal issues" : "Errores y problemas fatales", "Fatal issues only" : "Problemas fatales solamente", + "None" : "Ninguno", "Login" : "Iniciar sesión", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "No se ha encontrado el modulo PHP 'fileinfo'. Le recomendamos encarecidamente que habilite este módulo para obtener mejores resultados con la detección de tipos MIME.", "System locale can not be set to a one which supports UTF-8." : "No se puede escoger una configuración regional que soporte UTF-8.", "This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de los archivos.", "Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición", "Allow public uploads" : "Permitir subidas públicas", + "days" : "días", "Allow resharing" : "Permitir re-compartición", "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.", diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json index 5bba876327a..d0cd473e262 100644 --- a/settings/l10n/es_MX.json +++ b/settings/l10n/es_MX.json @@ -18,6 +18,7 @@ "Wrong admin recovery password. Please check the password and try again." : "Contraseña de recuperación de administrador incorrecta. Por favor compruebe la contraseña e inténtelo de nuevo.", "Unable to change password" : "No se ha podido cambiar la contraseña", "Enabled" : "Habilitar", + "Saved" : "Guardado", "Email sent" : "Correo electrónico enviado", "Email saved" : "Correo electrónico guardado", "All" : "Todos", @@ -45,12 +46,14 @@ "Warnings, errors and fatal issues" : "Advertencias, errores y problemas fatales", "Errors and fatal issues" : "Errores y problemas fatales", "Fatal issues only" : "Problemas fatales solamente", + "None" : "Ninguno", "Login" : "Iniciar sesión", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "No se ha encontrado el modulo PHP 'fileinfo'. Le recomendamos encarecidamente que habilite este módulo para obtener mejores resultados con la detección de tipos MIME.", "System locale can not be set to a one which supports UTF-8." : "No se puede escoger una configuración regional que soporte UTF-8.", "This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de los archivos.", "Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición", "Allow public uploads" : "Permitir subidas públicas", + "days" : "días", "Allow resharing" : "Permitir re-compartición", "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.", diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js index 96a724cae10..3971f00a605 100644 --- a/settings/l10n/fa.js +++ b/settings/l10n/fa.js @@ -1,10 +1,16 @@ OC.L10N.register( "settings", { + "APCu" : "APCu", + "Redis" : "Redis", + "Security & setup warnings" : "اخطارهای نصب و امنیتی", "Sharing" : "اشتراک گذاری", + "Server-side encryption" : "رمزگذاری سمت سرور", "External Storage" : "حافظه خارجی", "Cron" : "زمانبند", + "Email server" : "سرور ایمیل", "Log" : "کارنامه", + "Tips & tricks" : "نکات و راهنماییها", "Updates" : "به روز رسانی ها", "Authentication error" : "خطا در اعتبار سنجی", "Your full name has been changed." : "نام کامل شما تغییر یافت", @@ -22,12 +28,31 @@ OC.L10N.register( "Wrong admin recovery password. Please check the password and try again." : "رمز مدیریتی بازیابی غلط است. لطفاً رمز را کنترل کرده و دوباره امتحان نمایید.", "Unable to change password" : "نمیتوان رمز را تغییر داد", "Enabled" : "فعال شده", + "Not enabled" : "غیر فعال", + "Group already exists." : "گروه در حال حاضر موجود است", + "Unable to add group." : "افزودن گروه امکان پذیر نیست.", + "Unable to delete group." : "حذف گروه امکان پذیر نیست.", "Saved" : "ذخیره شد", "test email settings" : "تنظیمات ایمیل آزمایشی", "Email sent" : "ایمیل ارسال شد", + "Invalid mail address" : "آدرس ایمیل نامعتبر است", + "A user with that name already exists." : "کاربری با همین نام در حال حاضر وجود دارد.", + "Unable to create user." : "ایجاد کاربر امکانپذیر نیست.", + "Your %s account was created" : "حساب کاربری شما %s ایجاد شد", + "Unable to delete user." : "حذف کاربر امکان پذیر نیست.", + "Forbidden" : "ممنوعه", + "Invalid user" : "کاربر نامعتبر", + "Unable to change mail address" : "تغییر آدرس ایمیل امکانپذیر نیست", "Email saved" : "ایمیل ذخیره شد", + "Add trusted domain" : "افزودن دامنه مورد اعتماد", + "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", + "Migration started …" : "مهاجرت شروع شد...", "Sending..." : "در حال ارسال...", + "Official" : "رسمی", + "Approved" : "تایید شده", + "Experimental" : "آزمایشی", "All" : "همه", + "Update to %s" : "بروزرسانی به %s", "Please wait...." : "لطفا صبر کنید ...", "Error while disabling app" : "خطا در هنگام غیر فعال سازی برنامه", "Disable" : "غیرفعال", @@ -39,12 +64,15 @@ OC.L10N.register( "Uninstalling ...." : "در حال حذف...", "Error while uninstalling app" : "خطا در هنگام حذف برنامه....", "Uninstall" : "حذف", + "App update" : "به روز رسانی برنامه", + "An error occurred: {message}" : "یک خطا رخداده است: {message}", "Select a profile picture" : "انتخاب تصویر پروفایل", "Very weak password" : "رمز عبور بسیار ضعیف", "Weak password" : "رمز عبور ضعیف", "So-so password" : "رمز عبور متوسط", "Good password" : "رمز عبور خوب", "Strong password" : "رمز عبور قوی", + "Valid until {date}" : "معتبر تا {date}", "Delete" : "حذف", "Groups" : "گروه ها", "Unable to delete {objName}" : "امکان حذف {objName} وجود ندارد", @@ -52,13 +80,18 @@ OC.L10N.register( "A valid group name must be provided" : "نام کاربری معتبر می بایست وارد شود", "deleted {groupName}" : "گروه {groupName} حذف شد", "undo" : "بازگشت", + "no group" : "هیچ گروهی", "never" : "هرگز", "deleted {userName}" : "کاربر {userName} حذف شد", "add group" : "افزودن گروه", + "Changing the password will result in data loss, because data recovery is not available for this user" : "با توجه به عدم دستیابی به بازگردانی اطلاعات برای کاربر، تغییر رمز عبور باعث از بین رفتن اطلاعات خواهد شد", "A valid username must be provided" : "نام کاربری صحیح باید وارد شود", "Error creating user" : "خطا در ایجاد کاربر", "A valid password must be provided" : "رمز عبور صحیح باید وارد شود", + "A valid email must be provided" : "یک ایمیل معتبر باید وارد شود", "__language_name__" : "__language_name__", + "Sync clients" : "همگامسازی مشتریان", + "Personal info" : "مشخصات شخصی", "SSL root certificates" : "گواهی های اصلی SSL ", "Everything (fatal issues, errors, warnings, info, debug)" : "همه موارد (مشکلات مهلک، خطاها، اخطارها، اطلاعات، خطایابی)", "Info, warnings, errors and fatal issues" : "اطلاعات، اخطارها، خطاها، مشکلات اساسی", @@ -72,19 +105,30 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "ماژول 'fileinfo' PHP از کار افتاده است.ما اکیدا توصیه می کنیم که این ماژول را فعال کنید تا نتایج بهتری به وسیله ی mime-type detection دریافت کنید.", + "All checks passed." : "تمامی موارد با موفقیت چک شدند.", + "Open documentation" : "بازکردن مستند", "Allow apps to use the Share API" : "اجازه ی برنامه ها برای استفاده از API اشتراک گذاری", "Allow users to share via link" : "اجازه دادن به کاربران برای اشتراک گذاری توسط پیوند", "Enforce password protection" : "اجبار برای محافظت توسط رمز عبور", "Allow public uploads" : "اجازه بارگذاری عمومی", + "Allow users to send mail notification for shared files" : "اجازه به کاربران برای ارسال ایمیل نوتیفیکیشن برای فایلهای به اشتراکگذاشته شده", "Set default expiration date" : "اعمال تاریخ اتمام پیش فرض", "Expire after " : "اتمام اعتبار بعد از", "days" : "روز", "Enforce expiration date" : "اعمال تاریخ اتمام اشتراک گذاری", "Allow resharing" : "مجوز اشتراک گذاری مجدد", + "Restrict users to only share with users in their groups" : "محدود کردن کاربران برای اشتراکگذاری تنها میان کاربران گروه خود", "Exclude groups from sharing" : "مستثنی شدن گروه ها از اشتراک گذاری", "Cron was not executed yet!" : "کران هنوز اجرا نشده است!", "Execute one task with each page loaded" : "اجرای یک وظیفه با هر بار بارگذاری صفحه", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php در یک سرویس webcron ثبت شده است که هر 15 دقیقه یک بار بر روی بستر http فراخوانی شود.", + "Enable server-side encryption" : "فعالسازی رمزگذاری سمت-سرور", + "Be aware that encryption always increases the file size." : "توجه داشته باشید که همواره رمزگذاری حجم فایل را افزایش خواهد داد.", + "This is the final warning: Do you really want to enable encryption?" : "این آخرین اخطار است: آیا میخواهید رمزگذاری را فعال کنید ؟", + "Enable encryption" : "فعال کردن رمزگذاری", + "No encryption module loaded, please enable an encryption module in the app menu." : "هیچ ماژول رمزگذاریای بارگذاری نشده است، لطفا ماژول رمزگذاری را در منو برنامه فعال کنید.", + "Select default encryption module:" : "انتخاب ماژول پیشفرض رمزگذاری:", + "Start migration" : "شروع مهاجرت", "This is used for sending out notifications." : "این برای ارسال هشدار ها استفاده می شود", "Send mode" : "حالت ارسال", "Encryption" : "رمزگذاری", @@ -100,15 +144,33 @@ OC.L10N.register( "Test email settings" : "تنظیمات ایمیل آزمایشی", "Send email" : "ارسال ایمیل", "Log level" : "سطح ورود", + "Download logfile" : "دانلود فایل لاگ", "More" : "بیشتر", "Less" : "کمتر", + "Advanced monitoring" : "مانیتورینگ پیشرفته", + "Performance tuning" : "تنظیم کارایی", + "Improving the config.php" : "بهبود config.php", + "Theming" : "قالببندی", + "Hardening and security guidance" : "راهنمای امنسازی", "Version" : "نسخه", + "Developer documentation" : "مستندات توسعهدهندگان", "by" : "با", + "licensed" : "مجوزنامه", "Documentation:" : "مستند سازی:", + "User documentation" : "مستندات کاربر", + "Admin documentation" : "مستندات مدیر", + "Show description …" : "نمایش توضیحات ...", + "Hide description …" : "عدم نمایش توضیحات...", + "This app cannot be installed because the following dependencies are not fulfilled:" : "امکان نصب این برنامه وجود ندارد، این پیشنیازها انجام نشدهاند:", "Enable only for specific groups" : "فعال سازی تنها برای گروه های خاص", "Uninstall App" : "حذف برنامه", + "Enable experimental apps" : "فعالسازی برنامههای آزمایشی", + "No apps found for your version" : "هیچ برنامهای برای نسخهی شما یافت نشد", "Cheers!" : "سلامتی!", + "Administrator documentation" : "مستندات مدیر", + "Online documentation" : "مستندات آنلاین", "Forum" : "انجمن", + "Commercial support" : "پشتیبانی تجاری", "Get the apps to sync your files" : "برنامه ها را دریافت کنید تا فایل هایتان را همگام سازید", "Desktop client" : "نرم افزار دسکتاپ", "Android app" : "اپ اندروید", @@ -120,17 +182,33 @@ OC.L10N.register( "Current password" : "گذرواژه کنونی", "New password" : "گذرواژه جدید", "Change password" : "تغییر گذر واژه", + "Full name" : "نام کامل", + "No display name set" : "هیچ نام نمایشی تعیین نشده است", "Email" : "ایمیل", "Your email address" : "پست الکترونیکی شما", + "Fill in an email address to enable password recovery and receive notifications" : "فیلد آدرس ایمیل را به منظور فعالسازی بازیابی رمزعبور در دریافت نوتیفیکیشها پر کنید", + "No email address set" : "آدرسایمیلی تنظیم نشده است", + "You are member of the following groups:" : "شما عضو این گروهها هستید:", "Profile picture" : "تصویر پروفایل", "Upload new" : "بارگذاری جدید", "Select new from Files" : "انتخاب جدید از میان فایل ها", "Remove image" : "تصویر پاک شود", + "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "فایل pnd یا jpg. در حالت ایدهآل بصورت مربع و یا شما میتوانید آنرا برش بزنید. حجم فایل نمیتواند از حداکثر سایز 20MB بیشتر باشد.", "Cancel" : "منصرف شدن", "Choose as profile image" : "یک تصویر پروفایل انتخاب کنید", "Language" : "زبان", "Help translate" : "به ترجمه آن کمک کنید", + "Common Name" : "نام مشترک", + "Valid until" : "متعبر تا", + "Issued By" : "صدور توسط", + "Valid until %s" : "متعبر تا %s", + "Import root certificate" : "وارد کردن گواهی اصلی", + "Show storage location" : "نمایش محل ذخیرهسازی", + "Show last log in" : "نمایش اخرین ورود", + "Send email to new user" : "ارسال ایمیل به کاربر جدید", + "Show email address" : "نمایش پست الکترونیکی", "Username" : "نام کاربری", + "E-Mail" : "ایمیل", "Create" : "ایجاد کردن", "Admin Recovery Password" : "مدیریت بازیابی رمز عبور", "Enter the recovery password in order to recover the users files during password change" : "در حین تغییر رمز عبور به منظور بازیابی فایل های کاربران، رمز عبور بازیابی را وارد کنید", @@ -143,11 +221,13 @@ OC.L10N.register( "Unlimited" : "نامحدود", "Other" : "دیگر", "Full Name" : "نام کامل", + "Group Admin for" : "مدیر گروه برای", "Quota" : "سهم", "Storage Location" : "محل فضای ذخیره سازی", "Last Login" : "اخرین ورود", "change full name" : "تغییر نام کامل", "set new password" : "تنظیم کلمه عبور جدید", + "change email address" : "تغییر آدرس ایمیل ", "Default" : "پیش فرض" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json index 354e56e1ffc..5301d244861 100644 --- a/settings/l10n/fa.json +++ b/settings/l10n/fa.json @@ -1,8 +1,14 @@ { "translations": { + "APCu" : "APCu", + "Redis" : "Redis", + "Security & setup warnings" : "اخطارهای نصب و امنیتی", "Sharing" : "اشتراک گذاری", + "Server-side encryption" : "رمزگذاری سمت سرور", "External Storage" : "حافظه خارجی", "Cron" : "زمانبند", + "Email server" : "سرور ایمیل", "Log" : "کارنامه", + "Tips & tricks" : "نکات و راهنماییها", "Updates" : "به روز رسانی ها", "Authentication error" : "خطا در اعتبار سنجی", "Your full name has been changed." : "نام کامل شما تغییر یافت", @@ -20,12 +26,31 @@ "Wrong admin recovery password. Please check the password and try again." : "رمز مدیریتی بازیابی غلط است. لطفاً رمز را کنترل کرده و دوباره امتحان نمایید.", "Unable to change password" : "نمیتوان رمز را تغییر داد", "Enabled" : "فعال شده", + "Not enabled" : "غیر فعال", + "Group already exists." : "گروه در حال حاضر موجود است", + "Unable to add group." : "افزودن گروه امکان پذیر نیست.", + "Unable to delete group." : "حذف گروه امکان پذیر نیست.", "Saved" : "ذخیره شد", "test email settings" : "تنظیمات ایمیل آزمایشی", "Email sent" : "ایمیل ارسال شد", + "Invalid mail address" : "آدرس ایمیل نامعتبر است", + "A user with that name already exists." : "کاربری با همین نام در حال حاضر وجود دارد.", + "Unable to create user." : "ایجاد کاربر امکانپذیر نیست.", + "Your %s account was created" : "حساب کاربری شما %s ایجاد شد", + "Unable to delete user." : "حذف کاربر امکان پذیر نیست.", + "Forbidden" : "ممنوعه", + "Invalid user" : "کاربر نامعتبر", + "Unable to change mail address" : "تغییر آدرس ایمیل امکانپذیر نیست", "Email saved" : "ایمیل ذخیره شد", + "Add trusted domain" : "افزودن دامنه مورد اعتماد", + "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", + "Migration started …" : "مهاجرت شروع شد...", "Sending..." : "در حال ارسال...", + "Official" : "رسمی", + "Approved" : "تایید شده", + "Experimental" : "آزمایشی", "All" : "همه", + "Update to %s" : "بروزرسانی به %s", "Please wait...." : "لطفا صبر کنید ...", "Error while disabling app" : "خطا در هنگام غیر فعال سازی برنامه", "Disable" : "غیرفعال", @@ -37,12 +62,15 @@ "Uninstalling ...." : "در حال حذف...", "Error while uninstalling app" : "خطا در هنگام حذف برنامه....", "Uninstall" : "حذف", + "App update" : "به روز رسانی برنامه", + "An error occurred: {message}" : "یک خطا رخداده است: {message}", "Select a profile picture" : "انتخاب تصویر پروفایل", "Very weak password" : "رمز عبور بسیار ضعیف", "Weak password" : "رمز عبور ضعیف", "So-so password" : "رمز عبور متوسط", "Good password" : "رمز عبور خوب", "Strong password" : "رمز عبور قوی", + "Valid until {date}" : "معتبر تا {date}", "Delete" : "حذف", "Groups" : "گروه ها", "Unable to delete {objName}" : "امکان حذف {objName} وجود ندارد", @@ -50,13 +78,18 @@ "A valid group name must be provided" : "نام کاربری معتبر می بایست وارد شود", "deleted {groupName}" : "گروه {groupName} حذف شد", "undo" : "بازگشت", + "no group" : "هیچ گروهی", "never" : "هرگز", "deleted {userName}" : "کاربر {userName} حذف شد", "add group" : "افزودن گروه", + "Changing the password will result in data loss, because data recovery is not available for this user" : "با توجه به عدم دستیابی به بازگردانی اطلاعات برای کاربر، تغییر رمز عبور باعث از بین رفتن اطلاعات خواهد شد", "A valid username must be provided" : "نام کاربری صحیح باید وارد شود", "Error creating user" : "خطا در ایجاد کاربر", "A valid password must be provided" : "رمز عبور صحیح باید وارد شود", + "A valid email must be provided" : "یک ایمیل معتبر باید وارد شود", "__language_name__" : "__language_name__", + "Sync clients" : "همگامسازی مشتریان", + "Personal info" : "مشخصات شخصی", "SSL root certificates" : "گواهی های اصلی SSL ", "Everything (fatal issues, errors, warnings, info, debug)" : "همه موارد (مشکلات مهلک، خطاها، اخطارها، اطلاعات، خطایابی)", "Info, warnings, errors and fatal issues" : "اطلاعات، اخطارها، خطاها، مشکلات اساسی", @@ -70,19 +103,30 @@ "SSL" : "SSL", "TLS" : "TLS", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "ماژول 'fileinfo' PHP از کار افتاده است.ما اکیدا توصیه می کنیم که این ماژول را فعال کنید تا نتایج بهتری به وسیله ی mime-type detection دریافت کنید.", + "All checks passed." : "تمامی موارد با موفقیت چک شدند.", + "Open documentation" : "بازکردن مستند", "Allow apps to use the Share API" : "اجازه ی برنامه ها برای استفاده از API اشتراک گذاری", "Allow users to share via link" : "اجازه دادن به کاربران برای اشتراک گذاری توسط پیوند", "Enforce password protection" : "اجبار برای محافظت توسط رمز عبور", "Allow public uploads" : "اجازه بارگذاری عمومی", + "Allow users to send mail notification for shared files" : "اجازه به کاربران برای ارسال ایمیل نوتیفیکیشن برای فایلهای به اشتراکگذاشته شده", "Set default expiration date" : "اعمال تاریخ اتمام پیش فرض", "Expire after " : "اتمام اعتبار بعد از", "days" : "روز", "Enforce expiration date" : "اعمال تاریخ اتمام اشتراک گذاری", "Allow resharing" : "مجوز اشتراک گذاری مجدد", + "Restrict users to only share with users in their groups" : "محدود کردن کاربران برای اشتراکگذاری تنها میان کاربران گروه خود", "Exclude groups from sharing" : "مستثنی شدن گروه ها از اشتراک گذاری", "Cron was not executed yet!" : "کران هنوز اجرا نشده است!", "Execute one task with each page loaded" : "اجرای یک وظیفه با هر بار بارگذاری صفحه", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php در یک سرویس webcron ثبت شده است که هر 15 دقیقه یک بار بر روی بستر http فراخوانی شود.", + "Enable server-side encryption" : "فعالسازی رمزگذاری سمت-سرور", + "Be aware that encryption always increases the file size." : "توجه داشته باشید که همواره رمزگذاری حجم فایل را افزایش خواهد داد.", + "This is the final warning: Do you really want to enable encryption?" : "این آخرین اخطار است: آیا میخواهید رمزگذاری را فعال کنید ؟", + "Enable encryption" : "فعال کردن رمزگذاری", + "No encryption module loaded, please enable an encryption module in the app menu." : "هیچ ماژول رمزگذاریای بارگذاری نشده است، لطفا ماژول رمزگذاری را در منو برنامه فعال کنید.", + "Select default encryption module:" : "انتخاب ماژول پیشفرض رمزگذاری:", + "Start migration" : "شروع مهاجرت", "This is used for sending out notifications." : "این برای ارسال هشدار ها استفاده می شود", "Send mode" : "حالت ارسال", "Encryption" : "رمزگذاری", @@ -98,15 +142,33 @@ "Test email settings" : "تنظیمات ایمیل آزمایشی", "Send email" : "ارسال ایمیل", "Log level" : "سطح ورود", + "Download logfile" : "دانلود فایل لاگ", "More" : "بیشتر", "Less" : "کمتر", + "Advanced monitoring" : "مانیتورینگ پیشرفته", + "Performance tuning" : "تنظیم کارایی", + "Improving the config.php" : "بهبود config.php", + "Theming" : "قالببندی", + "Hardening and security guidance" : "راهنمای امنسازی", "Version" : "نسخه", + "Developer documentation" : "مستندات توسعهدهندگان", "by" : "با", + "licensed" : "مجوزنامه", "Documentation:" : "مستند سازی:", + "User documentation" : "مستندات کاربر", + "Admin documentation" : "مستندات مدیر", + "Show description …" : "نمایش توضیحات ...", + "Hide description …" : "عدم نمایش توضیحات...", + "This app cannot be installed because the following dependencies are not fulfilled:" : "امکان نصب این برنامه وجود ندارد، این پیشنیازها انجام نشدهاند:", "Enable only for specific groups" : "فعال سازی تنها برای گروه های خاص", "Uninstall App" : "حذف برنامه", + "Enable experimental apps" : "فعالسازی برنامههای آزمایشی", + "No apps found for your version" : "هیچ برنامهای برای نسخهی شما یافت نشد", "Cheers!" : "سلامتی!", + "Administrator documentation" : "مستندات مدیر", + "Online documentation" : "مستندات آنلاین", "Forum" : "انجمن", + "Commercial support" : "پشتیبانی تجاری", "Get the apps to sync your files" : "برنامه ها را دریافت کنید تا فایل هایتان را همگام سازید", "Desktop client" : "نرم افزار دسکتاپ", "Android app" : "اپ اندروید", @@ -118,17 +180,33 @@ "Current password" : "گذرواژه کنونی", "New password" : "گذرواژه جدید", "Change password" : "تغییر گذر واژه", + "Full name" : "نام کامل", + "No display name set" : "هیچ نام نمایشی تعیین نشده است", "Email" : "ایمیل", "Your email address" : "پست الکترونیکی شما", + "Fill in an email address to enable password recovery and receive notifications" : "فیلد آدرس ایمیل را به منظور فعالسازی بازیابی رمزعبور در دریافت نوتیفیکیشها پر کنید", + "No email address set" : "آدرسایمیلی تنظیم نشده است", + "You are member of the following groups:" : "شما عضو این گروهها هستید:", "Profile picture" : "تصویر پروفایل", "Upload new" : "بارگذاری جدید", "Select new from Files" : "انتخاب جدید از میان فایل ها", "Remove image" : "تصویر پاک شود", + "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "فایل pnd یا jpg. در حالت ایدهآل بصورت مربع و یا شما میتوانید آنرا برش بزنید. حجم فایل نمیتواند از حداکثر سایز 20MB بیشتر باشد.", "Cancel" : "منصرف شدن", "Choose as profile image" : "یک تصویر پروفایل انتخاب کنید", "Language" : "زبان", "Help translate" : "به ترجمه آن کمک کنید", + "Common Name" : "نام مشترک", + "Valid until" : "متعبر تا", + "Issued By" : "صدور توسط", + "Valid until %s" : "متعبر تا %s", + "Import root certificate" : "وارد کردن گواهی اصلی", + "Show storage location" : "نمایش محل ذخیرهسازی", + "Show last log in" : "نمایش اخرین ورود", + "Send email to new user" : "ارسال ایمیل به کاربر جدید", + "Show email address" : "نمایش پست الکترونیکی", "Username" : "نام کاربری", + "E-Mail" : "ایمیل", "Create" : "ایجاد کردن", "Admin Recovery Password" : "مدیریت بازیابی رمز عبور", "Enter the recovery password in order to recover the users files during password change" : "در حین تغییر رمز عبور به منظور بازیابی فایل های کاربران، رمز عبور بازیابی را وارد کنید", @@ -141,11 +219,13 @@ "Unlimited" : "نامحدود", "Other" : "دیگر", "Full Name" : "نام کامل", + "Group Admin for" : "مدیر گروه برای", "Quota" : "سهم", "Storage Location" : "محل فضای ذخیره سازی", "Last Login" : "اخرین ورود", "change full name" : "تغییر نام کامل", "set new password" : "تنظیم کلمه عبور جدید", + "change email address" : "تغییر آدرس ایمیل ", "Default" : "پیش فرض" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index c670d7abb59..18ba17f8b6c 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -76,6 +76,8 @@ OC.L10N.register( "Uninstalling ...." : "Poistetaan asennusta....", "Error while uninstalling app" : "Virhe sovellusta poistaessa", "Uninstall" : "Poista asennus", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Tämä sovellus on otettu käyttöön, mutta se vaatii päivityksen. Sinut ohjataan päivityssivulle viiden sekunnin kuluttua.", + "App update" : "Sovelluspäivitys", "An error occurred: {message}" : "Tapahtui virhe: {message}", "Select a profile picture" : "Valitse profiilikuva", "Very weak password" : "Erittäin heikko salasana", @@ -83,9 +85,9 @@ OC.L10N.register( "So-so password" : "Kohtalainen salasana", "Good password" : "Hyvä salasana", "Strong password" : "Vahva salasana", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Tapahtu virhe. Lähetä ASCII-koodattu PEM-varmenne.", "Valid until {date}" : "Kelvollinen {date} asti", "Delete" : "Poista", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Tapahtu virhe. Lähetä ASCII-koodattu PEM-varmenne.", "Groups" : "Ryhmät", "Unable to delete {objName}" : "Kohteen {objName} poistaminen epäonnistui", "Error creating group" : "Virhe ryhmää luotaessa", @@ -140,6 +142,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Salli käyttäjien lähettää muille käyttäjille sähköpostitse ilmoitus jaetuista tiedostoista", "Exclude groups from sharing" : "Kiellä ryhmiä jakamasta", "These groups will still be able to receive shares, but not to initiate them." : "Nämä ryhmät kykenevät vastaanottamaan jakoja, mutta eivät kuitenkaan itse pysty luoda jakoja.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Salli käyttäjätunnuksen automaattinen täydentäminen jakamisikkunnassa. Jos tämä asetus on pois käytöstä, tulee käyttäjätunnus kirjoittaa kokonaan itse.", "Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.", "Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.", "Cron was not executed yet!" : "Cronia ei suoritettu vielä!", @@ -148,8 +151,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Käytä järjestelmän cron-palvelua cron.php-tiedoston kutsumista varten 15 minuutin välein.", "Enable server-side encryption" : "Käytä palvelinpään salausta", "Please read carefully before activating server-side encryption: " : "Lue tarkasti, ennen kuin otat palvelinpään salauksen käyttöön:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Salausta ei voi perua. Kun salaus on käytössä, kaikki tiedostot siitä hetkestä eteenpäin palvelimella on salattu, eikä salausta voi enää poistaa käytöstä.", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Varmista, että otat säännöllisesti varmuuskopiot salausavaimista, jotta et menetä kaikkia tietoja pysyvästi (data/<käyttäjä>/files_encryption ja data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Tämä on viimeinen varoitus: haluatko varmasti ottaa salauksen käyttöön?", "Enable encryption" : "Käytä salausta", "No encryption module loaded, please enable an encryption module in the app menu." : "Salausmoduulia ei ole käytössä. Ota salausmoduuli käyttöön sovellusvalikosta.", diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index 01b79449331..deb850873db 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -74,6 +74,8 @@ "Uninstalling ...." : "Poistetaan asennusta....", "Error while uninstalling app" : "Virhe sovellusta poistaessa", "Uninstall" : "Poista asennus", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Tämä sovellus on otettu käyttöön, mutta se vaatii päivityksen. Sinut ohjataan päivityssivulle viiden sekunnin kuluttua.", + "App update" : "Sovelluspäivitys", "An error occurred: {message}" : "Tapahtui virhe: {message}", "Select a profile picture" : "Valitse profiilikuva", "Very weak password" : "Erittäin heikko salasana", @@ -81,9 +83,9 @@ "So-so password" : "Kohtalainen salasana", "Good password" : "Hyvä salasana", "Strong password" : "Vahva salasana", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Tapahtu virhe. Lähetä ASCII-koodattu PEM-varmenne.", "Valid until {date}" : "Kelvollinen {date} asti", "Delete" : "Poista", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Tapahtu virhe. Lähetä ASCII-koodattu PEM-varmenne.", "Groups" : "Ryhmät", "Unable to delete {objName}" : "Kohteen {objName} poistaminen epäonnistui", "Error creating group" : "Virhe ryhmää luotaessa", @@ -138,6 +140,7 @@ "Allow users to send mail notification for shared files to other users" : "Salli käyttäjien lähettää muille käyttäjille sähköpostitse ilmoitus jaetuista tiedostoista", "Exclude groups from sharing" : "Kiellä ryhmiä jakamasta", "These groups will still be able to receive shares, but not to initiate them." : "Nämä ryhmät kykenevät vastaanottamaan jakoja, mutta eivät kuitenkaan itse pysty luoda jakoja.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Salli käyttäjätunnuksen automaattinen täydentäminen jakamisikkunnassa. Jos tämä asetus on pois käytöstä, tulee käyttäjätunnus kirjoittaa kokonaan itse.", "Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.", "Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.", "Cron was not executed yet!" : "Cronia ei suoritettu vielä!", @@ -146,8 +149,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Käytä järjestelmän cron-palvelua cron.php-tiedoston kutsumista varten 15 minuutin välein.", "Enable server-side encryption" : "Käytä palvelinpään salausta", "Please read carefully before activating server-side encryption: " : "Lue tarkasti, ennen kuin otat palvelinpään salauksen käyttöön:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Salausta ei voi perua. Kun salaus on käytössä, kaikki tiedostot siitä hetkestä eteenpäin palvelimella on salattu, eikä salausta voi enää poistaa käytöstä.", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Varmista, että otat säännöllisesti varmuuskopiot salausavaimista, jotta et menetä kaikkia tietoja pysyvästi (data/<käyttäjä>/files_encryption ja data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Tämä on viimeinen varoitus: haluatko varmasti ottaa salauksen käyttöön?", "Enable encryption" : "Käytä salausta", "No encryption module loaded, please enable an encryption module in the app menu." : "Salausmoduulia ei ole käytössä. Ota salausmoduuli käyttöön sovellusvalikosta.", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 83b7d5f76d8..535f504f9ab 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -40,7 +40,7 @@ OC.L10N.register( "Unable to delete group." : "Impossible de supprimer le groupe.", "log-level out of allowed range" : "niveau de journalisation hors borne", "Saved" : "Sauvegardé", - "test email settings" : "tester les paramètres e-mail", + "test email settings" : "Test des paramètres e-mail", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres. (Erreur: %s)", "Email sent" : "E-mail envoyé", "You need to set your user email before being able to send test emails." : "Vous devez définir une adresse e-mail dans vos paramètres personnels avant de pouvoir envoyer des e-mails de test.", @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "Désinstallation...", "Error while uninstalling app" : "Erreur lors de la désinstallation de l'application", "Uninstall" : "Désinstaller", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "L'application a été activée mais doit être mise à jour. Vous allez être redirigé vers la page des mises à jour dans 5 secondes.", + "App update" : "Mise à jour", "An error occurred: {message}" : "Une erreur est survenue : {message}", "Select a profile picture" : "Selectionnez une photo de profil ", "Very weak password" : "Mot de passe de très faible sécurité", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Mot de passe de sécurité tout juste acceptable", "Good password" : "Mot de passe de sécurité suffisante", "Strong password" : "Mot de passe de forte sécurité", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Une erreur est survenue. Veuillez fournir un certificat PEM encodé au format ASCII.", "Valid until {date}" : "Valide jusqu'au {date}", "Delete" : "Supprimer", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Une erreur est survenue. Veuillez fournir un certificat PEM encodé au format ASCII.", "Groups" : "Groupes", "Unable to delete {objName}" : "Impossible de supprimer {objName}", "Error creating group" : "Erreur lors de la création du groupe", @@ -118,17 +120,20 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php ne semble pas être configuré de manière à récupérer les valeurs des variables d’environnement. Le test de la commande getenv(\"PATH\") retourne seulement une réponse vide. ", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Veuillez consulter <a target=\"_blank\" href=\"%s\">la documentation d'installation ↗</a> pour savoir comment configurer php sur votre serveur, en particulier en cas d'utilisation de php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "La configuration est en mode lecture seule. Ceci empêche la modification de certaines configurations via l'interface web. De plus, le fichier doit être passé manuellement en lecture-écriture avant chaque mise à jour.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP est apparemment configuré pour supprimer les blocs de documentation internes. Cela rendra plusieurs applications de base inaccessibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La raison est probablement l'utilisation d'un cache / accélérateur tel que Zend OPcache ou eAccelerator.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Votre serveur fonctionne actuellement sur une plateforme Microsoft Windows. Nous vous recommandons fortement d'utiliser une plateforme Linux pour une expérience utilisateur optimale.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "Une version de %1$s plus ancienne que %2$s est installée. Pour améliorer la stabilité et les performances, nous recommandons de mettre %1$s à jour.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Le module PHP 'fileinfo' est manquant. Il est vivement recommandé de l'activer afin d'obtenir de meilleurs résultats de détection mime-type.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers est désactivé. Cela peut causer des conflits en cas d'accès concurrent. Configurez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "System locale can not be set to a one which supports UTF-8." : "Les paramètres régionaux n'ont pu être configurés avec prise en charge d'UTF-8.", "This means that there might be problems with certain characters in file names." : "Cela signifie qu'il pourrait y avoir des problèmes avec certains caractères dans les noms de fichier.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données. Pour de meilleures performances il est recommandé d'utiliser plutôt memcache. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.", "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", @@ -146,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Autoriser les utilisateurs à envoyer des notifications de partage par e-mail", "Exclude groups from sharing" : "Empêcher certains groupes de partager", "These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Activer l'autocomplétion des noms d'utilisateurs dans la fenêtre de partage. Si cette option est désactivée, les noms complets doivent être indiqués.", "Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.", "Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.", "Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !", @@ -154,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", "Enable server-side encryption" : "Activer le chiffrement côté serveur", "Please read carefully before activating server-side encryption: " : "Veuillez lire ceci avec attention avant d'activer le chiffrement :", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Le chiffrement côté serveur est un processus à sens unique. Une fois le chiffrement activé, tous les fichiers seront dorénavant chiffrés sur le serveur, et il ne sera plus possible de désactiver le chiffrement.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Toute personne ayant un accès d'administrateur sur votre serveur ownCloud peut déchiffrer vos fichiers en interceptant les requêtes, ou en lisant les mots de passe des utilisateurs qui sont stockés dans les fichiers de sessions. Le chiffrement côté serveur n'empêche donc pas vos fichiers d'être lus par des administrateurs mal intentionnés, mais sert à protéger vos données stockées sur des espaces de stockages externes ou tiers.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Selon le module de chiffrement utilisé, la taille des fichiers peut augmenter (dans le cas du module par défaut, l'augmentation est de 35%% ou plus)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Vous devriez sauvegarder régulièrement les clés de chiffrement pour éviter toute perte de données irrémédiable (data/<user>/files_encryption et data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Une fois le chiffrement activé, les fichiers téléversés sur le serveur à partir de ce moment seront stockés sous forme chiffrée. Il n'est possible de désactiver le chiffrement que si le module utilisé le permet spécifiquement, et que toutes les conditions préalables sont réunies pour ce faire (par exemple la création d'une clef de récupération).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Le chiffrement seul ne peut garantir la sécurité du système. Veuillez consulter la documentation ownCloud pour comprendre comment fonctionne l'application de chiffrement, et les cas d'utilisation pris en charge.", + "Be aware that encryption always increases the file size." : "Veuillez noter que le chiffrement augmente toujours la taille des fichiers.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Il est opportun de sauvegarder régulièrement vos données. Si ces données sont chiffrées, n'oubliez pas de sauvegarder aussi les clés de chiffrement.", "This is the final warning: Do you really want to enable encryption?" : "Dernier avertissement : Voulez-vous vraiment activer le chiffrement ?", "Enable encryption" : "Activer le chiffrement", "No encryption module loaded, please enable an encryption module in the app menu." : "Aucun module de chiffrement n'est chargé. Merci d'activer un module de chiffrement dans le menu des applications.", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 3cf724abc26..5bb64ec01d6 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -38,7 +38,7 @@ "Unable to delete group." : "Impossible de supprimer le groupe.", "log-level out of allowed range" : "niveau de journalisation hors borne", "Saved" : "Sauvegardé", - "test email settings" : "tester les paramètres e-mail", + "test email settings" : "Test des paramètres e-mail", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres. (Erreur: %s)", "Email sent" : "E-mail envoyé", "You need to set your user email before being able to send test emails." : "Vous devez définir une adresse e-mail dans vos paramètres personnels avant de pouvoir envoyer des e-mails de test.", @@ -75,6 +75,8 @@ "Uninstalling ...." : "Désinstallation...", "Error while uninstalling app" : "Erreur lors de la désinstallation de l'application", "Uninstall" : "Désinstaller", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "L'application a été activée mais doit être mise à jour. Vous allez être redirigé vers la page des mises à jour dans 5 secondes.", + "App update" : "Mise à jour", "An error occurred: {message}" : "Une erreur est survenue : {message}", "Select a profile picture" : "Selectionnez une photo de profil ", "Very weak password" : "Mot de passe de très faible sécurité", @@ -82,9 +84,9 @@ "So-so password" : "Mot de passe de sécurité tout juste acceptable", "Good password" : "Mot de passe de sécurité suffisante", "Strong password" : "Mot de passe de forte sécurité", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Une erreur est survenue. Veuillez fournir un certificat PEM encodé au format ASCII.", "Valid until {date}" : "Valide jusqu'au {date}", "Delete" : "Supprimer", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Une erreur est survenue. Veuillez fournir un certificat PEM encodé au format ASCII.", "Groups" : "Groupes", "Unable to delete {objName}" : "Impossible de supprimer {objName}", "Error creating group" : "Erreur lors de la création du groupe", @@ -116,17 +118,20 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php ne semble pas être configuré de manière à récupérer les valeurs des variables d’environnement. Le test de la commande getenv(\"PATH\") retourne seulement une réponse vide. ", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Veuillez consulter <a target=\"_blank\" href=\"%s\">la documentation d'installation ↗</a> pour savoir comment configurer php sur votre serveur, en particulier en cas d'utilisation de php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "La configuration est en mode lecture seule. Ceci empêche la modification de certaines configurations via l'interface web. De plus, le fichier doit être passé manuellement en lecture-écriture avant chaque mise à jour.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP est apparemment configuré pour supprimer les blocs de documentation internes. Cela rendra plusieurs applications de base inaccessibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La raison est probablement l'utilisation d'un cache / accélérateur tel que Zend OPcache ou eAccelerator.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Votre serveur fonctionne actuellement sur une plateforme Microsoft Windows. Nous vous recommandons fortement d'utiliser une plateforme Linux pour une expérience utilisateur optimale.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "Une version de %1$s plus ancienne que %2$s est installée. Pour améliorer la stabilité et les performances, nous recommandons de mettre %1$s à jour.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Le module PHP 'fileinfo' est manquant. Il est vivement recommandé de l'activer afin d'obtenir de meilleurs résultats de détection mime-type.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers est désactivé. Cela peut causer des conflits en cas d'accès concurrent. Configurez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "System locale can not be set to a one which supports UTF-8." : "Les paramètres régionaux n'ont pu être configurés avec prise en charge d'UTF-8.", "This means that there might be problems with certain characters in file names." : "Cela signifie qu'il pourrait y avoir des problèmes avec certains caractères dans les noms de fichier.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données. Pour de meilleures performances il est recommandé d'utiliser plutôt memcache. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.", "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", @@ -144,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "Autoriser les utilisateurs à envoyer des notifications de partage par e-mail", "Exclude groups from sharing" : "Empêcher certains groupes de partager", "These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Activer l'autocomplétion des noms d'utilisateurs dans la fenêtre de partage. Si cette option est désactivée, les noms complets doivent être indiqués.", "Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.", "Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.", "Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !", @@ -152,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", "Enable server-side encryption" : "Activer le chiffrement côté serveur", "Please read carefully before activating server-side encryption: " : "Veuillez lire ceci avec attention avant d'activer le chiffrement :", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Le chiffrement côté serveur est un processus à sens unique. Une fois le chiffrement activé, tous les fichiers seront dorénavant chiffrés sur le serveur, et il ne sera plus possible de désactiver le chiffrement.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Toute personne ayant un accès d'administrateur sur votre serveur ownCloud peut déchiffrer vos fichiers en interceptant les requêtes, ou en lisant les mots de passe des utilisateurs qui sont stockés dans les fichiers de sessions. Le chiffrement côté serveur n'empêche donc pas vos fichiers d'être lus par des administrateurs mal intentionnés, mais sert à protéger vos données stockées sur des espaces de stockages externes ou tiers.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Selon le module de chiffrement utilisé, la taille des fichiers peut augmenter (dans le cas du module par défaut, l'augmentation est de 35%% ou plus)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Vous devriez sauvegarder régulièrement les clés de chiffrement pour éviter toute perte de données irrémédiable (data/<user>/files_encryption et data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Une fois le chiffrement activé, les fichiers téléversés sur le serveur à partir de ce moment seront stockés sous forme chiffrée. Il n'est possible de désactiver le chiffrement que si le module utilisé le permet spécifiquement, et que toutes les conditions préalables sont réunies pour ce faire (par exemple la création d'une clef de récupération).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Le chiffrement seul ne peut garantir la sécurité du système. Veuillez consulter la documentation ownCloud pour comprendre comment fonctionne l'application de chiffrement, et les cas d'utilisation pris en charge.", + "Be aware that encryption always increases the file size." : "Veuillez noter que le chiffrement augmente toujours la taille des fichiers.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Il est opportun de sauvegarder régulièrement vos données. Si ces données sont chiffrées, n'oubliez pas de sauvegarder aussi les clés de chiffrement.", "This is the final warning: Do you really want to enable encryption?" : "Dernier avertissement : Voulez-vous vraiment activer le chiffrement ?", "Enable encryption" : "Activer le chiffrement", "No encryption module loaded, please enable an encryption module in the app menu." : "Aucun module de chiffrement n'est chargé. Merci d'activer un module de chiffrement dans le menu des applications.", diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index 60ea6e3c846..5dc7cdaa1f4 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -84,9 +84,9 @@ OC.L10N.register( "So-so password" : "Contrasinal non moi aló", "Good password" : "Bo contrasinal", "Strong password" : "Contrasinal forte", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Produciuse un erro. Envíe un certificado PEM codificado en ASCII.", "Valid until {date}" : "Válido ata {date}", "Delete" : "Eliminar", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Produciuse un erro. Envíe un certificado PEM codificado en ASCII.", "Groups" : "Grupos", "Unable to delete {objName}" : "Non é posíbel eliminar {objName}", "Error creating group" : "Produciuse un erro ao crear o grupo", diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index 16472c0ac34..a807e517445 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -82,9 +82,9 @@ "So-so password" : "Contrasinal non moi aló", "Good password" : "Bo contrasinal", "Strong password" : "Contrasinal forte", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Produciuse un erro. Envíe un certificado PEM codificado en ASCII.", "Valid until {date}" : "Válido ata {date}", "Delete" : "Eliminar", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Produciuse un erro. Envíe un certificado PEM codificado en ASCII.", "Groups" : "Grupos", "Unable to delete {objName}" : "Non é posíbel eliminar {objName}", "Error creating group" : "Produciuse un erro ao crear o grupo", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 226ce7e01d9..f62795a0a84 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -30,6 +30,7 @@ OC.L10N.register( "Unable to change password" : "Nem sikerült megváltoztatni a jelszót", "Enabled" : "Engedélyezve", "Not enabled" : "Tiltva", + "installing and updating apps via the app store or Federated Cloud Sharing" : "alkalmazások telepítése és frissítése az alkalmazás tárból vagy Szövetséges Felhő Megosztásból", "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben", "A problem occurred, please check your log files (Error: %s)" : "Probléma történt, kérjük nézd meg a naplófájlokat (Hiba: %s).", "Migration Completed" : "Migráció kész!", @@ -72,6 +73,7 @@ OC.L10N.register( "Uninstalling ...." : "Eltávolítás ...", "Error while uninstalling app" : "Hiba történt az alkalmazás eltávolítása közben", "Uninstall" : "Eltávolítás", + "App update" : "Alkalmazás frissítése", "An error occurred: {message}" : "Hiba történt: {message}", "Select a profile picture" : "Válasszon profilképet!", "Very weak password" : "Nagyon gyenge jelszó", @@ -137,6 +139,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "A felhasználók küldhessenek más felhasználóknak e-mail értesítést a megosztott fájlokról", "Exclude groups from sharing" : "Csoportok megosztási jogának tiltása", "These groups will still be able to receive shares, but not to initiate them." : "E csoportok tagjaival meg lehet osztani anyagokat, de ők nem hozhatnak létre megosztást.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Felhasználónév automatikus befejezése engedélyezése a megosztás ablakban. Ha le van tiltva, akkor a teljes felhasználónevet kell beírni.", "Last cron job execution: %s." : "Az utolsó cron feladat ekkor futott le: %s.", "Last cron job execution: %s. Something seems wrong." : "Az utolsó cron feladat ekkor futott le: %s. Valami nincs rendben.", "Cron was not executed yet!" : "A cron feladat még nem futott le!", @@ -145,7 +148,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.", "Enable server-side encryption" : "Szerveroldali titkosítás engedélyezése", "Please read carefully before activating server-side encryption: " : "Kérjük, ezt olvasd el figyelmesen mielőtt engedélyezed a szerveroldali titkosítást:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "A szerveroldali titkosítás egyirányú folyamat. Ha egyszer engedélyezve lett a titkosítás, akkor onnantól kezdve a szerveren az összes fájl titkosításra kerül, melyet később nem lehet visszafordítani.", "This is the final warning: Do you really want to enable encryption?" : "Ez az utolsó figyelmeztetés: Biztosan szeretnéd engedélyezni a titkosítást?", "Enable encryption" : "Titkosítás engedélyezése", "No encryption module loaded, please enable an encryption module in the app menu." : "Nincs titkosítási modul betöltve, kérjük engedélyezd a titkosítási modult az alkalmazások menüben.", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index 14577924e94..b324010e426 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -28,6 +28,7 @@ "Unable to change password" : "Nem sikerült megváltoztatni a jelszót", "Enabled" : "Engedélyezve", "Not enabled" : "Tiltva", + "installing and updating apps via the app store or Federated Cloud Sharing" : "alkalmazások telepítése és frissítése az alkalmazás tárból vagy Szövetséges Felhő Megosztásból", "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben", "A problem occurred, please check your log files (Error: %s)" : "Probléma történt, kérjük nézd meg a naplófájlokat (Hiba: %s).", "Migration Completed" : "Migráció kész!", @@ -70,6 +71,7 @@ "Uninstalling ...." : "Eltávolítás ...", "Error while uninstalling app" : "Hiba történt az alkalmazás eltávolítása közben", "Uninstall" : "Eltávolítás", + "App update" : "Alkalmazás frissítése", "An error occurred: {message}" : "Hiba történt: {message}", "Select a profile picture" : "Válasszon profilképet!", "Very weak password" : "Nagyon gyenge jelszó", @@ -135,6 +137,7 @@ "Allow users to send mail notification for shared files to other users" : "A felhasználók küldhessenek más felhasználóknak e-mail értesítést a megosztott fájlokról", "Exclude groups from sharing" : "Csoportok megosztási jogának tiltása", "These groups will still be able to receive shares, but not to initiate them." : "E csoportok tagjaival meg lehet osztani anyagokat, de ők nem hozhatnak létre megosztást.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Felhasználónév automatikus befejezése engedélyezése a megosztás ablakban. Ha le van tiltva, akkor a teljes felhasználónevet kell beírni.", "Last cron job execution: %s." : "Az utolsó cron feladat ekkor futott le: %s.", "Last cron job execution: %s. Something seems wrong." : "Az utolsó cron feladat ekkor futott le: %s. Valami nincs rendben.", "Cron was not executed yet!" : "A cron feladat még nem futott le!", @@ -143,7 +146,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.", "Enable server-side encryption" : "Szerveroldali titkosítás engedélyezése", "Please read carefully before activating server-side encryption: " : "Kérjük, ezt olvasd el figyelmesen mielőtt engedélyezed a szerveroldali titkosítást:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "A szerveroldali titkosítás egyirányú folyamat. Ha egyszer engedélyezve lett a titkosítás, akkor onnantól kezdve a szerveren az összes fájl titkosításra kerül, melyet később nem lehet visszafordítani.", "This is the final warning: Do you really want to enable encryption?" : "Ez az utolsó figyelmeztetés: Biztosan szeretnéd engedélyezni a titkosítást?", "Enable encryption" : "Titkosítás engedélyezése", "No encryption module loaded, please enable an encryption module in the app menu." : "Nincs titkosítási modul betöltve, kérjük engedélyezd a titkosítási modult az alkalmazások menüben.", diff --git a/settings/l10n/hy.js b/settings/l10n/hy.js index e73644e2e08..bc0e467826b 100644 --- a/settings/l10n/hy.js +++ b/settings/l10n/hy.js @@ -1,7 +1,23 @@ OC.L10N.register( "settings", { + "Language changed" : "Լեզուն փոխվեց", + "Very weak password" : "Շատ թույլ գաղտնաբառ", + "Weak password" : "Թույլ գաղտնաբառ", + "Good password" : "Լավ գաղտնաբառ", "Delete" : "Ջնջել", + "Groups" : "Խմբեր", + "never" : "երբեք", + "add group" : "խումբ ավելացնել", + "SSL" : "SSL", + "TLS" : "TLS", + "Password" : "Գաղտնաբառ", + "New password" : "Նոր գաղտնաբառ", + "Email" : "Էլ. հասցե", + "Cancel" : "Չեղարկել", + "Language" : "Լեզու", + "Help translate" : "Օգնել թարգմանել", + "Group" : "Խումբ", "Other" : "Այլ" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/hy.json b/settings/l10n/hy.json index e3706d9554d..26cfdf5c9a7 100644 --- a/settings/l10n/hy.json +++ b/settings/l10n/hy.json @@ -1,5 +1,21 @@ { "translations": { + "Language changed" : "Լեզուն փոխվեց", + "Very weak password" : "Շատ թույլ գաղտնաբառ", + "Weak password" : "Թույլ գաղտնաբառ", + "Good password" : "Լավ գաղտնաբառ", "Delete" : "Ջնջել", + "Groups" : "Խմբեր", + "never" : "երբեք", + "add group" : "խումբ ավելացնել", + "SSL" : "SSL", + "TLS" : "TLS", + "Password" : "Գաղտնաբառ", + "New password" : "Նոր գաղտնաբառ", + "Email" : "Էլ. հասցե", + "Cancel" : "Չեղարկել", + "Language" : "Լեզու", + "Help translate" : "Օգնել թարգմանել", + "Group" : "Խումբ", "Other" : "Այլ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/settings/l10n/ia.js b/settings/l10n/ia.js index 3f90be0c618..0c06c89fc7b 100644 --- a/settings/l10n/ia.js +++ b/settings/l10n/ia.js @@ -2,6 +2,7 @@ OC.L10N.register( "settings", { "Log" : "Registro", + "Updates" : "Actualisationes", "Language changed" : "Linguage cambiate", "Invalid request" : "Requesta invalide", "Wrong password" : "Contrasigno errate", diff --git a/settings/l10n/ia.json b/settings/l10n/ia.json index 346d1b15994..2b7a5222aca 100644 --- a/settings/l10n/ia.json +++ b/settings/l10n/ia.json @@ -1,5 +1,6 @@ { "translations": { "Log" : "Registro", + "Updates" : "Actualisationes", "Language changed" : "Linguage cambiate", "Invalid request" : "Requesta invalide", "Wrong password" : "Contrasigno errate", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index 141b155da83..2910dc1ce09 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "Mencopot ...", "Error while uninstalling app" : "Terjadi kesalahan saat mencopot aplikasi", "Uninstall" : "Copot", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikasi sudah diaktifkan tetapi perlu diperbarui. Anda akan dialihkan ke halaman pembaruan dalam 5 detik.", + "App update" : "Pembaruan Aplikasi", "An error occurred: {message}" : "Sebuah kesalahan yang muncul: {message}", "Select a profile picture" : "Pilih foto profil", "Very weak password" : "Sandi sangat lemah", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Sandi lumayan", "Good password" : "Sandi baik", "Strong password" : "Sandi kuat", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Terjadi kesalahan. Mohon unggah sertifikat PEM terenkode-ASCII.", "Valid until {date}" : "Berlaku sampai {date}", "Delete" : "Hapus", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Terjadi kesalahan. Mohon unggah sertifikat PEM terenkode-ASCII.", "Groups" : "Grup", "Unable to delete {objName}" : "Tidak dapat menghapus {objName}", "Error creating group" : "Terjadi kesalahan saat membuat grup", @@ -149,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Izinkan pengguna mengirim pemberitahuan email saat berbagi berkas kepada pengguna lainnya", "Exclude groups from sharing" : "Tidak termasuk grup untuk berbagi", "These groups will still be able to receive shares, but not to initiate them." : "Grup ini akan tetap dapat menerima berbagi, tatapi tidak dapat membagikan.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Izinkan penyelesai otomatis pada nama pengguna di jendela dialog berbagi. Jika ini dinonaktifkan, nama pengguna utuh perlu dimasukkan.", "Last cron job execution: %s." : "Eksekusi penjadwalan cron terakhir: %s.", "Last cron job execution: %s. Something seems wrong." : "Eksekusi penjadwalan cron terakhir: %s. Kelihatannya ada yang salah.", "Cron was not executed yet!" : "Cron masih belum dieksekusi!", @@ -157,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Gunakan layanan cron sistem untuk memanggil berkas cron.php setiap 15 menit.", "Enable server-side encryption" : "Aktifkan enkripsi sisi-server", "Please read carefully before activating server-side encryption: " : "Mohon baca dengan teliti sebelum mengaktifkan enkripsi server-side:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Enkripsi server-side adalah proses sekali jalan. Setelah enkripsi diaktifkan, semua berkas mulai saat ini dan selanjutnya akan dienkripsi pada server dan tidak mungkin untuk menonaktifkan enkripsi di lain waktu", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Siapa saja yang memiliki hak akses pada server ownCloud dapat mendeskripsi berkas-berkas Anda dengan mencegat permintaan atau membaca sandi pengguna yang disimpan dalam berkas-berkas sesi teks biasa. Enkripsi server-side tidak serta merta melindungi dari administrator jahat tetapi akan berguna untuk melindungi data Anda pada penyimpanan eksternal.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Tergantung pada modul enkripsi yang sebenarnya, pada umumnya ukuran berkas akan bertambah (sekitar 35%% atau lebih ketika menggunakan modul standar)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Anda disarankan mencadangkan semua kunci enkripsi Anda secara berkala untuk mencegah kehilangan data pemanen (data/<user>/files_encryption dan data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Setelah enkripsi diaktifkan, semua berkas yang diunggah pada server mulai saat ini akan dienkripsi saat singgah pada server. Penonaktifan enkripsi hanya mungkin berhasil jika modul enkripsi yang aktif mendukung fungsi ini dan semua prasyarat (misalnya pengaturan kunci pemulihan) sudah terpenuhi.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Enkripsi saja tidak menjamin keamanan sistem. Silakan lihat dokumentasi ownCloud untuk informasi lebih lanjut tentang bagaimana aplikasi enkripsi bekerja, dan kasus penggunaan yang didukung.", + "Be aware that encryption always increases the file size." : "Ingat bahwa enkripsi selalu menambah ukuran berkas.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Alangkah baiknya untuk membuat cadangan data secara rutin, dalam kasus enkripsi, pastikan untuk mencadangkan kunci enkripsi bersama dengan data Anda.", "This is the final warning: Do you really want to enable encryption?" : "Ini adalah peringatan terakhir: Apakah Anda yakin ingin mengaktifkan enkripsi?", "Enable encryption" : "Aktifkan enkripsi", "No encryption module loaded, please enable an encryption module in the app menu." : "Tidak ada modul enkripsi yang dimuat, mohon aktifkan modul enkripsi di menu aplikasi.", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index fcc2b647465..4408965251b 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "Mencopot ...", "Error while uninstalling app" : "Terjadi kesalahan saat mencopot aplikasi", "Uninstall" : "Copot", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikasi sudah diaktifkan tetapi perlu diperbarui. Anda akan dialihkan ke halaman pembaruan dalam 5 detik.", + "App update" : "Pembaruan Aplikasi", "An error occurred: {message}" : "Sebuah kesalahan yang muncul: {message}", "Select a profile picture" : "Pilih foto profil", "Very weak password" : "Sandi sangat lemah", @@ -82,9 +84,9 @@ "So-so password" : "Sandi lumayan", "Good password" : "Sandi baik", "Strong password" : "Sandi kuat", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Terjadi kesalahan. Mohon unggah sertifikat PEM terenkode-ASCII.", "Valid until {date}" : "Berlaku sampai {date}", "Delete" : "Hapus", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Terjadi kesalahan. Mohon unggah sertifikat PEM terenkode-ASCII.", "Groups" : "Grup", "Unable to delete {objName}" : "Tidak dapat menghapus {objName}", "Error creating group" : "Terjadi kesalahan saat membuat grup", @@ -147,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "Izinkan pengguna mengirim pemberitahuan email saat berbagi berkas kepada pengguna lainnya", "Exclude groups from sharing" : "Tidak termasuk grup untuk berbagi", "These groups will still be able to receive shares, but not to initiate them." : "Grup ini akan tetap dapat menerima berbagi, tatapi tidak dapat membagikan.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Izinkan penyelesai otomatis pada nama pengguna di jendela dialog berbagi. Jika ini dinonaktifkan, nama pengguna utuh perlu dimasukkan.", "Last cron job execution: %s." : "Eksekusi penjadwalan cron terakhir: %s.", "Last cron job execution: %s. Something seems wrong." : "Eksekusi penjadwalan cron terakhir: %s. Kelihatannya ada yang salah.", "Cron was not executed yet!" : "Cron masih belum dieksekusi!", @@ -155,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Gunakan layanan cron sistem untuk memanggil berkas cron.php setiap 15 menit.", "Enable server-side encryption" : "Aktifkan enkripsi sisi-server", "Please read carefully before activating server-side encryption: " : "Mohon baca dengan teliti sebelum mengaktifkan enkripsi server-side:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Enkripsi server-side adalah proses sekali jalan. Setelah enkripsi diaktifkan, semua berkas mulai saat ini dan selanjutnya akan dienkripsi pada server dan tidak mungkin untuk menonaktifkan enkripsi di lain waktu", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Siapa saja yang memiliki hak akses pada server ownCloud dapat mendeskripsi berkas-berkas Anda dengan mencegat permintaan atau membaca sandi pengguna yang disimpan dalam berkas-berkas sesi teks biasa. Enkripsi server-side tidak serta merta melindungi dari administrator jahat tetapi akan berguna untuk melindungi data Anda pada penyimpanan eksternal.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Tergantung pada modul enkripsi yang sebenarnya, pada umumnya ukuran berkas akan bertambah (sekitar 35%% atau lebih ketika menggunakan modul standar)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Anda disarankan mencadangkan semua kunci enkripsi Anda secara berkala untuk mencegah kehilangan data pemanen (data/<user>/files_encryption dan data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Setelah enkripsi diaktifkan, semua berkas yang diunggah pada server mulai saat ini akan dienkripsi saat singgah pada server. Penonaktifan enkripsi hanya mungkin berhasil jika modul enkripsi yang aktif mendukung fungsi ini dan semua prasyarat (misalnya pengaturan kunci pemulihan) sudah terpenuhi.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Enkripsi saja tidak menjamin keamanan sistem. Silakan lihat dokumentasi ownCloud untuk informasi lebih lanjut tentang bagaimana aplikasi enkripsi bekerja, dan kasus penggunaan yang didukung.", + "Be aware that encryption always increases the file size." : "Ingat bahwa enkripsi selalu menambah ukuran berkas.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Alangkah baiknya untuk membuat cadangan data secara rutin, dalam kasus enkripsi, pastikan untuk mencadangkan kunci enkripsi bersama dengan data Anda.", "This is the final warning: Do you really want to enable encryption?" : "Ini adalah peringatan terakhir: Apakah Anda yakin ingin mengaktifkan enkripsi?", "Enable encryption" : "Aktifkan enkripsi", "No encryption module loaded, please enable an encryption module in the app menu." : "Tidak ada modul enkripsi yang dimuat, mohon aktifkan modul enkripsi di menu aplikasi.", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 4279a8d41ca..3fd8ac02b07 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "Disinstallazione...", "Error while uninstalling app" : "Errore durante la disinstallazione dell'applicazione", "Uninstall" : "Disinstalla", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "L'applicazione è stata abilitata, ma deve essere aggiornata. Sarai rediretto alla pagina di aggiornamento in 5 secondi.", + "App update" : "Aggiornamento applicazione", "An error occurred: {message}" : "Si è verificato un errore: {message}", "Select a profile picture" : "Seleziona un'immagine del profilo", "Very weak password" : "Password molto debole", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Password così-così", "Good password" : "Password buona", "Strong password" : "Password forte", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Si è verificato un errore. Carica un certificato PEM codificato in ASCII.", "Valid until {date}" : "Valido fino al {date}", "Delete" : "Elimina", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Si è verificato un errore. Carica un certificato PEM codificato in ASCII.", "Groups" : "Gruppi", "Unable to delete {objName}" : "Impossibile eliminare {objName}", "Error creating group" : "Errore durante la creazione del gruppo", @@ -149,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Consenti agli utenti di inviare email di notifica per i file condivisi con altri utenti", "Exclude groups from sharing" : "Escludi gruppi dalla condivisione", "These groups will still be able to receive shares, but not to initiate them." : "Questi gruppi saranno in grado di ricevere condivisioni, ma non iniziarle.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Consenti il completamento del nome utente nella finestra di condivisione. Se è disabilitata, è necessario digitare il nome utente completo.", "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.", "Cron was not executed yet!" : "Cron non è stato ancora eseguito!", @@ -157,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 15 minuti.", "Enable server-side encryption" : "Abilita cifratura lato server", "Please read carefully before activating server-side encryption: " : "Leggi attentamente prima di attivare la cifratura lato server:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "La cifratura è un processo a senso unico. Una volta che la cifratura è abilitata, tutti i file da quel momento in poi saranno cifrati sul server e non sarà possibile disattivare la cifratura successivamente", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Chiunque abbia un accesso privilegiato al tuo server ownCloud può decifrare i tuoi file intercettando le richieste o leggendo le password degli utenti che sono memorizzate come testo semplice nei file di sessione. La cifratura lato server non protegge perciò dagli amministratori scorretti, ma è utile per proteggere i tuoi dati sulle archiviazioni ospitate esternamente.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "In base all'attuale modulo di cifratura, la dimensione generale dei file è \nincrementata (del 35%% o più quando si utilizza il modulo predefinito)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Dovresti fare regolarmente una copia di sicurezza di tutte le chiavi di cifratura per evitare perdite di dati definitive (data/<utente>/files_encryption and data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Quando la cifratura è abilitata, tutti i file caricati sul server da quel momento in poi saranno cifrati sul server. Sarà possibile solo disabilitare successivamente la cifratura se il modulo di cifratura attivo lo consente, e se tutti i prerequisiti (ad es. l'impostazione di una chiave di recupero) sono verificati.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "La sola cifratura non garantisce la sicurezza del sistema. Vedi la documentazione di ownCloud per ulteriori informazioni su come funziona l'applicazione di cifratura, e per i casi d'uso supportati.", + "Be aware that encryption always increases the file size." : "Considera che la cifratura incrementa sempre la dimensione dei file.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Ti consigliamo di creare copie di sicurezza dei tuoi dati con regolarità, in caso di utilizzo della cifratura, assicurati di creare una copia delle chiavi di cifratura insieme ai tuoi dati.", "This is the final warning: Do you really want to enable encryption?" : "Questo è l'ultimo avviso: vuoi davvero abilitare la cifratura?", "Enable encryption" : "Abilita cifratura", "No encryption module loaded, please enable an encryption module in the app menu." : "Nessun modulo di cifratura caricato, carica un modulo di cifratura nel menu delle applicazioni.", @@ -237,7 +240,7 @@ OC.L10N.register( "No display name set" : "Nome visualizzato non impostato", "Email" : "Posta elettronica", "Your email address" : "Il tuo indirizzo email", - "Fill in an email address to enable password recovery and receive notifications" : "Inserisci il tuo indirizzo di posta per abilitare il recupero della password e ricevere notifiche", + "Fill in an email address to enable password recovery and receive notifications" : "Inserisci il tuo indirizzo di posta per abilitare il ripristino della password e ricevere notifiche", "No email address set" : "Nessun indirizzo email impostato", "You are member of the following groups:" : "Sei membro dei seguenti gruppi:", "Profile picture" : "Immagine del profilo", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index 416d5706280..20c713419aa 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "Disinstallazione...", "Error while uninstalling app" : "Errore durante la disinstallazione dell'applicazione", "Uninstall" : "Disinstalla", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "L'applicazione è stata abilitata, ma deve essere aggiornata. Sarai rediretto alla pagina di aggiornamento in 5 secondi.", + "App update" : "Aggiornamento applicazione", "An error occurred: {message}" : "Si è verificato un errore: {message}", "Select a profile picture" : "Seleziona un'immagine del profilo", "Very weak password" : "Password molto debole", @@ -82,9 +84,9 @@ "So-so password" : "Password così-così", "Good password" : "Password buona", "Strong password" : "Password forte", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Si è verificato un errore. Carica un certificato PEM codificato in ASCII.", "Valid until {date}" : "Valido fino al {date}", "Delete" : "Elimina", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Si è verificato un errore. Carica un certificato PEM codificato in ASCII.", "Groups" : "Gruppi", "Unable to delete {objName}" : "Impossibile eliminare {objName}", "Error creating group" : "Errore durante la creazione del gruppo", @@ -147,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "Consenti agli utenti di inviare email di notifica per i file condivisi con altri utenti", "Exclude groups from sharing" : "Escludi gruppi dalla condivisione", "These groups will still be able to receive shares, but not to initiate them." : "Questi gruppi saranno in grado di ricevere condivisioni, ma non iniziarle.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Consenti il completamento del nome utente nella finestra di condivisione. Se è disabilitata, è necessario digitare il nome utente completo.", "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.", "Cron was not executed yet!" : "Cron non è stato ancora eseguito!", @@ -155,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 15 minuti.", "Enable server-side encryption" : "Abilita cifratura lato server", "Please read carefully before activating server-side encryption: " : "Leggi attentamente prima di attivare la cifratura lato server:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "La cifratura è un processo a senso unico. Una volta che la cifratura è abilitata, tutti i file da quel momento in poi saranno cifrati sul server e non sarà possibile disattivare la cifratura successivamente", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Chiunque abbia un accesso privilegiato al tuo server ownCloud può decifrare i tuoi file intercettando le richieste o leggendo le password degli utenti che sono memorizzate come testo semplice nei file di sessione. La cifratura lato server non protegge perciò dagli amministratori scorretti, ma è utile per proteggere i tuoi dati sulle archiviazioni ospitate esternamente.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "In base all'attuale modulo di cifratura, la dimensione generale dei file è \nincrementata (del 35%% o più quando si utilizza il modulo predefinito)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Dovresti fare regolarmente una copia di sicurezza di tutte le chiavi di cifratura per evitare perdite di dati definitive (data/<utente>/files_encryption and data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Quando la cifratura è abilitata, tutti i file caricati sul server da quel momento in poi saranno cifrati sul server. Sarà possibile solo disabilitare successivamente la cifratura se il modulo di cifratura attivo lo consente, e se tutti i prerequisiti (ad es. l'impostazione di una chiave di recupero) sono verificati.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "La sola cifratura non garantisce la sicurezza del sistema. Vedi la documentazione di ownCloud per ulteriori informazioni su come funziona l'applicazione di cifratura, e per i casi d'uso supportati.", + "Be aware that encryption always increases the file size." : "Considera che la cifratura incrementa sempre la dimensione dei file.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Ti consigliamo di creare copie di sicurezza dei tuoi dati con regolarità, in caso di utilizzo della cifratura, assicurati di creare una copia delle chiavi di cifratura insieme ai tuoi dati.", "This is the final warning: Do you really want to enable encryption?" : "Questo è l'ultimo avviso: vuoi davvero abilitare la cifratura?", "Enable encryption" : "Abilita cifratura", "No encryption module loaded, please enable an encryption module in the app menu." : "Nessun modulo di cifratura caricato, carica un modulo di cifratura nel menu delle applicazioni.", @@ -235,7 +238,7 @@ "No display name set" : "Nome visualizzato non impostato", "Email" : "Posta elettronica", "Your email address" : "Il tuo indirizzo email", - "Fill in an email address to enable password recovery and receive notifications" : "Inserisci il tuo indirizzo di posta per abilitare il recupero della password e ricevere notifiche", + "Fill in an email address to enable password recovery and receive notifications" : "Inserisci il tuo indirizzo di posta per abilitare il ripristino della password e ricevere notifiche", "No email address set" : "Nessun indirizzo email impostato", "You are member of the following groups:" : "Sei membro dei seguenti gruppi:", "Profile picture" : "Immagine del profilo", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 43c75680057..74e3673c4ce 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -75,6 +75,8 @@ OC.L10N.register( "Uninstalling ...." : "アンインストール中 ....", "Error while uninstalling app" : "アプリをアンインストール中にエラーが発生", "Uninstall" : "アンインストール", + "App update" : "アプリのアップデート", + "An error occurred: {message}" : "エラーが発生しました: {message}", "Select a profile picture" : "プロファイル画像を選択", "Very weak password" : "非常に弱いパスワード", "Weak password" : "弱いパスワード", @@ -99,7 +101,7 @@ OC.L10N.register( "A valid password must be provided" : "有効なパスワードを指定する必要があります", "A valid email must be provided" : "有効なメールアドレスを指定する必要があります", "__language_name__" : "Japanese (日本語)", - "Sync clients" : "クライアントの同期", + "Sync clients" : "同期用クライアント", "Personal info" : "個人情報", "SSL root certificates" : "SSLルート証明書", "Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)", @@ -138,6 +140,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "他ユーザーへの共有ファイルに関するメール通知の送信をユーザーに許可する", "Exclude groups from sharing" : "共有可能なグループから除外する", "These groups will still be able to receive shares, but not to initiate them." : "このグループでは、フォルダー共有を開始することはできませんが、共有されたフォルダーを参照することはできます。", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "共有ダイアログでのユーザー名の自動補完を有効にする。このチェックを無効にした場合は、完全なユーザー名を入力する必要があります。", "Last cron job execution: %s." : "最終cronジョブ実行: %s", "Last cron job execution: %s. Something seems wrong." : "最終cronジョブ実行: %s 何らかの問題があります。", "Cron was not executed yet!" : "cronはまだ実行されていません!", @@ -174,6 +177,8 @@ OC.L10N.register( "Advanced monitoring" : "詳細モニタリング", "Performance tuning" : "パフォーマンスチューニング", "Improving the config.php" : "config.phpの改善", + "Theming" : "テーマ", + "Hardening and security guidance" : "堅牢化とセキュリティガイダンス", "Version" : "バージョン", "Developer documentation" : "開発者ドキュメント", "by" : "by", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index cbc130a24e0..ca01117ad8f 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -73,6 +73,8 @@ "Uninstalling ...." : "アンインストール中 ....", "Error while uninstalling app" : "アプリをアンインストール中にエラーが発生", "Uninstall" : "アンインストール", + "App update" : "アプリのアップデート", + "An error occurred: {message}" : "エラーが発生しました: {message}", "Select a profile picture" : "プロファイル画像を選択", "Very weak password" : "非常に弱いパスワード", "Weak password" : "弱いパスワード", @@ -97,7 +99,7 @@ "A valid password must be provided" : "有効なパスワードを指定する必要があります", "A valid email must be provided" : "有効なメールアドレスを指定する必要があります", "__language_name__" : "Japanese (日本語)", - "Sync clients" : "クライアントの同期", + "Sync clients" : "同期用クライアント", "Personal info" : "個人情報", "SSL root certificates" : "SSLルート証明書", "Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)", @@ -136,6 +138,7 @@ "Allow users to send mail notification for shared files to other users" : "他ユーザーへの共有ファイルに関するメール通知の送信をユーザーに許可する", "Exclude groups from sharing" : "共有可能なグループから除外する", "These groups will still be able to receive shares, but not to initiate them." : "このグループでは、フォルダー共有を開始することはできませんが、共有されたフォルダーを参照することはできます。", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "共有ダイアログでのユーザー名の自動補完を有効にする。このチェックを無効にした場合は、完全なユーザー名を入力する必要があります。", "Last cron job execution: %s." : "最終cronジョブ実行: %s", "Last cron job execution: %s. Something seems wrong." : "最終cronジョブ実行: %s 何らかの問題があります。", "Cron was not executed yet!" : "cronはまだ実行されていません!", @@ -172,6 +175,8 @@ "Advanced monitoring" : "詳細モニタリング", "Performance tuning" : "パフォーマンスチューニング", "Improving the config.php" : "config.phpの改善", + "Theming" : "テーマ", + "Hardening and security guidance" : "堅牢化とセキュリティガイダンス", "Version" : "バージョン", "Developer documentation" : "開発者ドキュメント", "by" : "by", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index fdfcf281457..5d5fed01962 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -33,7 +33,7 @@ OC.L10N.register( "installing and updating apps via the app store or Federated Cloud Sharing" : "앱 스토어 및 연합 클라우드 공유로 앱 설치 및 업데이트", "Federated Cloud Sharing" : "클라우드 연합 공유", "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL이 오래된 %s 버전을 사용하고 있습니다(%s). 운영 체제나 기능을 업데이트하지 않으면 %s 등을 안정적으로 사용할 수 없습니다.", - "A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)", + "A problem occurred, please check your log files (Error: %s)" : "문제가 발생했습니다. 로그 파일을 참조하십시오(오류: %s)", "Migration Completed" : "이전 완료됨", "Group already exists." : "그룹이 이미 존재합니다.", "Unable to add group." : "그룹을 추가할 수 없습니다.", @@ -41,13 +41,13 @@ OC.L10N.register( "log-level out of allowed range" : "로그 단계가 허용 범위를 벗어남", "Saved" : "저장됨", "test email settings" : "이메일 설정 시험", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "이메일을 보내는 중 오류가 발생하였습니다. 설정을 확인하십시오.(오류: %s)", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "이메일을 보내는 중 오류가 발생했습니다. 설정을 확인하십시오.(오류: %s)", "Email sent" : "이메일 발송됨", "You need to set your user email before being able to send test emails." : "테스트 이메일을 보내기 전 내 주소를 설정해야 합니다.", "Invalid mail address" : "잘못된 이메일 주소", "A user with that name already exists." : "같은 이름의 사용자가 이미 존재합니다.", "Unable to create user." : "사용자를 만들 수 없습니다.", - "Your %s account was created" : "%s 계정을 등록하였습니다", + "Your %s account was created" : "%s 계정을 등록했습니다", "Unable to delete user." : "사용자를 삭제할 수 없습니다.", "Forbidden" : "거부됨", "Invalid user" : "잘못된 사용자", @@ -63,7 +63,7 @@ OC.L10N.register( "Experimental" : "실험적", "All" : "모두", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "공식 앱은 ownCloud 커뮤니티 내에서 개발됩니다. ownCloud의 주요 기능을 제공하며 상용 환경에서 사용 가능합니다.", - "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과하였습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과했습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "이 앱의 보안 문제가 점검되지 않았고, 출시된 지 얼마 지나지 않았거나 아직 불안정합니다. 본인 책임 하에 설치하십시오.", "Update to %s" : "%s(으)로 업데이트", "Please wait...." : "기다려 주십시오....", @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "제거 하는 중 ....", "Error while uninstalling app" : "앱을 제거하는 중 오류 발생", "Uninstall" : "제거", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "앱이 활성화되었지만, 앱을 업데이트해야 합니다. 5초 후 앱 업데이트 페이지로 넘어갑니다.", + "App update" : "앱 업데이트", "An error occurred: {message}" : "오류 발생: {message}", "Select a profile picture" : "프로필 사진 선택", "Very weak password" : "매우 약한 암호", @@ -84,12 +86,12 @@ OC.L10N.register( "So-so password" : "그저 그런 암호", "Good password" : "좋은 암호", "Strong password" : "강력한 암호", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "오류가 발생했습니다. ASCII로 인코딩된 PEM 인증서를 업로드하십시오.", "Valid until {date}" : "{date}까지 유효함", "Delete" : "삭제", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "오류가 발생하였습니다. ASCII로 인코딩된 PEM 인증서를 업로드하십시오.", "Groups" : "그룹", "Unable to delete {objName}" : "{objName}을(를) 삭제할 수 없음", - "Error creating group" : "그룹을 생성하는 중 오류가 발생하였습니다", + "Error creating group" : "그룹을 생성하는 중 오류가 발생했습니다", "A valid group name must be provided" : "올바른 그룹 이름을 입력해야 함", "deleted {groupName}" : "{groupName} 삭제됨", "undo" : "실행 취소", @@ -125,13 +127,15 @@ OC.L10N.register( "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "서버가 Microsoft Windows 환경에서 동작하고 있습니다. 최적의 사용자 경험을 위해서는 리눅스를 사용할 것을 권장합니다.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s의 버전 %2$s 이하가 설치되어 있습니다. 안정성 및 성능 개선을 위하여 %1$s의 새 버전을 설치하는 것을 추천합니다.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 모듈 'fileinfo'가 존재하지 않습니다. MIME 형식 감지 결과를 향상시키기 위하여 이 모듈을 활성화하는 것을 추천합니다.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "트랜잭션 기반 파일 잠금이 비활성화되어 있으며, 경쟁 상태 문제가 발생할 수 있습니다. config.php에서 'filelocking.enabled'를 활성화하면 본 문제를 해결할 수 있습니다. 더 많은 정보를 보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.", "System locale can not be set to a one which supports UTF-8." : "UTF-8을 지원하는 시스템 로캘을 사용할 수 없습니다.", "This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", - "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생하였습니다:", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "잠금 백엔드로 데이터베이스를 사용하고 있으므로 트랜잭션 기반 파일 잠금을 사용합니다. 더 좋은 성능을 내려면 memcache 기반 잠금 사용을 추천합니다. 더 많은 정보를 보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a target=\"_blank\" href=\"%s\">설치 가이드 ↗</a>를 다시 확인하시고 <a href=\"#log-section\">로그</a>의 오류 및 경고를 확인하십시오.", - "All checks passed." : "모든 검사를 통과하였습니다.", + "All checks passed." : "모든 검사를 통과했습니다.", "Open documentation" : "문서 열기", "Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용", "Allow users to share via link" : "사용자별 링크 공유 허용", @@ -147,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "다른 사용자에게 공유 파일 이메일 알림 전송 허용", "Exclude groups from sharing" : "공유에서 그룹 제외", "These groups will still be able to receive shares, but not to initiate them." : "이 그룹의 사용자들은 다른 사용자가 공유한 파일을 받을 수는 있지만, 자기 파일을 공유할 수는 없습니다.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "공유 대화 상자에서 사용자 이름 자동 완성을 사용합니다. 이 설정을 사용하지 않으면 전체 사용자 이름을 입력해야 합니다.", "Last cron job execution: %s." : "마지막 cron 작업 실행: %s.", "Last cron job execution: %s. Something seems wrong." : "마지막 cron 작업 실행: %s. 문제가 발생한 것 같습니다.", "Cron was not executed yet!" : "Cron이 실행되지 않았습니다!", @@ -155,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.", "Enable server-side encryption" : "서버 측 암호화 사용", "Please read carefully before activating server-side encryption: " : "서버 측 암호화를 활성화하기 전에 읽어 보십시오:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "서버 측 암호화 작업은 단방향입니다. 암호화를 한 번 활성화하면 그 시점 이후에 서버에 저장되는 모든 파일이 암호화되며 나중에 암호화를 비활성화할 수 없습니다.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ownCloud 서버에 관리자 권한을 가지고 있는 임의의 사용자가 요청을 가로채거나 일반 텍스트 세션 파일에 있는 사용자 암호를 읽어서 암호화를 해제할 수 있습니다. 서버 측 암호화는 악의적인 관리자로부터 파일을 보호할 수는 없으나, 외부에 호스팅된 저장소에 있는 파일을 보호할 수 있습니다.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "암호화 방식에 따라서 파일이 저장된 크기가 증가합니다(기본 모듈 사용 시 최소 35%%)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "데이터 손실을 방지하려면 모든 암호화 키를 주기적으로 백업해야 합니다(data/<user>/files_encryption 및 data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "암호화를 사용하면, 사용하기 시작한 시간 이후에 서버에 업로드된 모든 파일이 암호화됩니다. 나중에 암호화를 사용하지 않으려면 사용하고 있는 암호화 모듈에서 비활성화를 지원해야 하고 모든 사전 조건(예: 복구 키 설정)을 만족해야 합니다.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "암호화만 사용하여 시스템의 보안을 유지할 수는 없습니다. 암호화 앱 동작 방식과 지원하는 사용 예제를 보려면 ownCloud 문서를 참조하십시오.", + "Be aware that encryption always increases the file size." : "암호화된 파일의 크기는 항상 커집니다.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "데이터를 주기적으로 백업하는 것을 추천하며, 암호화를 사용하고 있다면 데이터와 더불어 암호화 키도 백업하십시오.", "This is the final warning: Do you really want to enable encryption?" : "마지막 경고입니다. 암호화를 활성화하시겠습니까?", "Enable encryption" : "암호화 사용", "No encryption module loaded, please enable an encryption module in the app menu." : "암호화 모듈을 불러오지 않았습니다. 앱 메뉴에서 암호화 모듈을 활성화하십시오.", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index 5c05bed51e8..d7ac88cf0f3 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -31,7 +31,7 @@ "installing and updating apps via the app store or Federated Cloud Sharing" : "앱 스토어 및 연합 클라우드 공유로 앱 설치 및 업데이트", "Federated Cloud Sharing" : "클라우드 연합 공유", "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL이 오래된 %s 버전을 사용하고 있습니다(%s). 운영 체제나 기능을 업데이트하지 않으면 %s 등을 안정적으로 사용할 수 없습니다.", - "A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)", + "A problem occurred, please check your log files (Error: %s)" : "문제가 발생했습니다. 로그 파일을 참조하십시오(오류: %s)", "Migration Completed" : "이전 완료됨", "Group already exists." : "그룹이 이미 존재합니다.", "Unable to add group." : "그룹을 추가할 수 없습니다.", @@ -39,13 +39,13 @@ "log-level out of allowed range" : "로그 단계가 허용 범위를 벗어남", "Saved" : "저장됨", "test email settings" : "이메일 설정 시험", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "이메일을 보내는 중 오류가 발생하였습니다. 설정을 확인하십시오.(오류: %s)", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "이메일을 보내는 중 오류가 발생했습니다. 설정을 확인하십시오.(오류: %s)", "Email sent" : "이메일 발송됨", "You need to set your user email before being able to send test emails." : "테스트 이메일을 보내기 전 내 주소를 설정해야 합니다.", "Invalid mail address" : "잘못된 이메일 주소", "A user with that name already exists." : "같은 이름의 사용자가 이미 존재합니다.", "Unable to create user." : "사용자를 만들 수 없습니다.", - "Your %s account was created" : "%s 계정을 등록하였습니다", + "Your %s account was created" : "%s 계정을 등록했습니다", "Unable to delete user." : "사용자를 삭제할 수 없습니다.", "Forbidden" : "거부됨", "Invalid user" : "잘못된 사용자", @@ -61,7 +61,7 @@ "Experimental" : "실험적", "All" : "모두", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "공식 앱은 ownCloud 커뮤니티 내에서 개발됩니다. ownCloud의 주요 기능을 제공하며 상용 환경에서 사용 가능합니다.", - "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과하였습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과했습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "이 앱의 보안 문제가 점검되지 않았고, 출시된 지 얼마 지나지 않았거나 아직 불안정합니다. 본인 책임 하에 설치하십시오.", "Update to %s" : "%s(으)로 업데이트", "Please wait...." : "기다려 주십시오....", @@ -75,6 +75,8 @@ "Uninstalling ...." : "제거 하는 중 ....", "Error while uninstalling app" : "앱을 제거하는 중 오류 발생", "Uninstall" : "제거", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "앱이 활성화되었지만, 앱을 업데이트해야 합니다. 5초 후 앱 업데이트 페이지로 넘어갑니다.", + "App update" : "앱 업데이트", "An error occurred: {message}" : "오류 발생: {message}", "Select a profile picture" : "프로필 사진 선택", "Very weak password" : "매우 약한 암호", @@ -82,12 +84,12 @@ "So-so password" : "그저 그런 암호", "Good password" : "좋은 암호", "Strong password" : "강력한 암호", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "오류가 발생했습니다. ASCII로 인코딩된 PEM 인증서를 업로드하십시오.", "Valid until {date}" : "{date}까지 유효함", "Delete" : "삭제", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "오류가 발생하였습니다. ASCII로 인코딩된 PEM 인증서를 업로드하십시오.", "Groups" : "그룹", "Unable to delete {objName}" : "{objName}을(를) 삭제할 수 없음", - "Error creating group" : "그룹을 생성하는 중 오류가 발생하였습니다", + "Error creating group" : "그룹을 생성하는 중 오류가 발생했습니다", "A valid group name must be provided" : "올바른 그룹 이름을 입력해야 함", "deleted {groupName}" : "{groupName} 삭제됨", "undo" : "실행 취소", @@ -123,13 +125,15 @@ "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "서버가 Microsoft Windows 환경에서 동작하고 있습니다. 최적의 사용자 경험을 위해서는 리눅스를 사용할 것을 권장합니다.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s의 버전 %2$s 이하가 설치되어 있습니다. 안정성 및 성능 개선을 위하여 %1$s의 새 버전을 설치하는 것을 추천합니다.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 모듈 'fileinfo'가 존재하지 않습니다. MIME 형식 감지 결과를 향상시키기 위하여 이 모듈을 활성화하는 것을 추천합니다.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "트랜잭션 기반 파일 잠금이 비활성화되어 있으며, 경쟁 상태 문제가 발생할 수 있습니다. config.php에서 'filelocking.enabled'를 활성화하면 본 문제를 해결할 수 있습니다. 더 많은 정보를 보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.", "System locale can not be set to a one which supports UTF-8." : "UTF-8을 지원하는 시스템 로캘을 사용할 수 없습니다.", "This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", - "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생하였습니다:", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "잠금 백엔드로 데이터베이스를 사용하고 있으므로 트랜잭션 기반 파일 잠금을 사용합니다. 더 좋은 성능을 내려면 memcache 기반 잠금 사용을 추천합니다. 더 많은 정보를 보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a target=\"_blank\" href=\"%s\">설치 가이드 ↗</a>를 다시 확인하시고 <a href=\"#log-section\">로그</a>의 오류 및 경고를 확인하십시오.", - "All checks passed." : "모든 검사를 통과하였습니다.", + "All checks passed." : "모든 검사를 통과했습니다.", "Open documentation" : "문서 열기", "Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용", "Allow users to share via link" : "사용자별 링크 공유 허용", @@ -145,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "다른 사용자에게 공유 파일 이메일 알림 전송 허용", "Exclude groups from sharing" : "공유에서 그룹 제외", "These groups will still be able to receive shares, but not to initiate them." : "이 그룹의 사용자들은 다른 사용자가 공유한 파일을 받을 수는 있지만, 자기 파일을 공유할 수는 없습니다.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "공유 대화 상자에서 사용자 이름 자동 완성을 사용합니다. 이 설정을 사용하지 않으면 전체 사용자 이름을 입력해야 합니다.", "Last cron job execution: %s." : "마지막 cron 작업 실행: %s.", "Last cron job execution: %s. Something seems wrong." : "마지막 cron 작업 실행: %s. 문제가 발생한 것 같습니다.", "Cron was not executed yet!" : "Cron이 실행되지 않았습니다!", @@ -153,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.", "Enable server-side encryption" : "서버 측 암호화 사용", "Please read carefully before activating server-side encryption: " : "서버 측 암호화를 활성화하기 전에 읽어 보십시오:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "서버 측 암호화 작업은 단방향입니다. 암호화를 한 번 활성화하면 그 시점 이후에 서버에 저장되는 모든 파일이 암호화되며 나중에 암호화를 비활성화할 수 없습니다.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ownCloud 서버에 관리자 권한을 가지고 있는 임의의 사용자가 요청을 가로채거나 일반 텍스트 세션 파일에 있는 사용자 암호를 읽어서 암호화를 해제할 수 있습니다. 서버 측 암호화는 악의적인 관리자로부터 파일을 보호할 수는 없으나, 외부에 호스팅된 저장소에 있는 파일을 보호할 수 있습니다.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "암호화 방식에 따라서 파일이 저장된 크기가 증가합니다(기본 모듈 사용 시 최소 35%%)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "데이터 손실을 방지하려면 모든 암호화 키를 주기적으로 백업해야 합니다(data/<user>/files_encryption 및 data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "암호화를 사용하면, 사용하기 시작한 시간 이후에 서버에 업로드된 모든 파일이 암호화됩니다. 나중에 암호화를 사용하지 않으려면 사용하고 있는 암호화 모듈에서 비활성화를 지원해야 하고 모든 사전 조건(예: 복구 키 설정)을 만족해야 합니다.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "암호화만 사용하여 시스템의 보안을 유지할 수는 없습니다. 암호화 앱 동작 방식과 지원하는 사용 예제를 보려면 ownCloud 문서를 참조하십시오.", + "Be aware that encryption always increases the file size." : "암호화된 파일의 크기는 항상 커집니다.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "데이터를 주기적으로 백업하는 것을 추천하며, 암호화를 사용하고 있다면 데이터와 더불어 암호화 키도 백업하십시오.", "This is the final warning: Do you really want to enable encryption?" : "마지막 경고입니다. 암호화를 활성화하시겠습니까?", "Enable encryption" : "암호화 사용", "No encryption module loaded, please enable an encryption module in the app menu." : "암호화 모듈을 불러오지 않았습니다. 앱 메뉴에서 암호화 모듈을 활성화하십시오.", diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js index bf13c23f2af..75a9eab3986 100644 --- a/settings/l10n/lt_LT.js +++ b/settings/l10n/lt_LT.js @@ -19,6 +19,7 @@ OC.L10N.register( "Wrong admin recovery password. Please check the password and try again." : "Netinkamas administratoriau atkūrimo slaptažodis. Prašome pasitikrinti ir bandyti vėl.", "Unable to change password" : "Nepavyksta pakeisti slaptažodžio", "Enabled" : "Įjungta", + "Saved" : "Išsaugoti", "Email sent" : "Laiškas išsiųstas", "Email saved" : "El. paštas išsaugotas", "All" : "Viskas", @@ -31,6 +32,11 @@ OC.L10N.register( "Error while updating app" : "Įvyko klaida atnaujinant programą", "Updated" : "Atnaujinta", "Select a profile picture" : "Pažymėkite profilio paveikslėlį", + "Very weak password" : "Labai silpnas slaptažodis", + "Weak password" : "Silpnas slaptažodis", + "So-so password" : "Neblogas slaptažodis", + "Good password" : "Geras slaptažodis", + "Strong password" : "Stiprus slaptažodis", "Delete" : "Ištrinti", "Groups" : "Grupės", "undo" : "anuliuoti", @@ -52,6 +58,7 @@ OC.L10N.register( "Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php yra registruotas tinklapio suplanuotų užduočių paslaugose, kad iškviesti cron.php kas 15 minučių per http.", "Encryption" : "Šifravimas", + "Authentication required" : "Reikalinga autentikacija", "Server address" : "Serverio adresas", "Port" : "Prievadas", "Log level" : "Žurnalo išsamumas", diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json index fe387dabec5..ee3c7ff0747 100644 --- a/settings/l10n/lt_LT.json +++ b/settings/l10n/lt_LT.json @@ -17,6 +17,7 @@ "Wrong admin recovery password. Please check the password and try again." : "Netinkamas administratoriau atkūrimo slaptažodis. Prašome pasitikrinti ir bandyti vėl.", "Unable to change password" : "Nepavyksta pakeisti slaptažodžio", "Enabled" : "Įjungta", + "Saved" : "Išsaugoti", "Email sent" : "Laiškas išsiųstas", "Email saved" : "El. paštas išsaugotas", "All" : "Viskas", @@ -29,6 +30,11 @@ "Error while updating app" : "Įvyko klaida atnaujinant programą", "Updated" : "Atnaujinta", "Select a profile picture" : "Pažymėkite profilio paveikslėlį", + "Very weak password" : "Labai silpnas slaptažodis", + "Weak password" : "Silpnas slaptažodis", + "So-so password" : "Neblogas slaptažodis", + "Good password" : "Geras slaptažodis", + "Strong password" : "Stiprus slaptažodis", "Delete" : "Ištrinti", "Groups" : "Grupės", "undo" : "anuliuoti", @@ -50,6 +56,7 @@ "Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php yra registruotas tinklapio suplanuotų užduočių paslaugose, kad iškviesti cron.php kas 15 minučių per http.", "Encryption" : "Šifravimas", + "Authentication required" : "Reikalinga autentikacija", "Server address" : "Serverio adresas", "Port" : "Prievadas", "Log level" : "Žurnalo išsamumas", diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index 84466f61617..3e6048d7405 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -84,9 +84,9 @@ OC.L10N.register( "So-so password" : "So-so-passord", "Good password" : "Bra passord", "Strong password" : "Sterkt passord", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.", "Valid until {date}" : "Gyldig til {date}", "Delete" : "Slett", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.", "Groups" : "Grupper", "Unable to delete {objName}" : "Kan ikke slette {objName}", "Error creating group" : "Feil ved oppretting av gruppe", @@ -157,10 +157,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert 15. minutt.", "Enable server-side encryption" : "Aktiver serverkryptering", "Please read carefully before activating server-side encryption: " : "Vennligst les dette nøye før du aktiverer serverkrykptering:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Serverkryptering er en enveisprosess. Når kryptering er blitt aktivert, vil alle filer fra det tidspunktet av bli kryptert på serveren og det vil ikke være mulig å deaktivere kryptering senere.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Alle som har privilegert tilgang til ownCloud-serveren din kan dekryptere filene dine enten ved å fange opp forespørsler eller ved å lese brukerpassord som er lagret i klartekst i økt-filer. Serverkryptering beskytter derfor ikke mot uærlige administratorer, men det er nyttig for å beskytte dine data på eksternt oppkoblede lagringsplasser.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Avhengig av den faktiske krypteringsmodulen økes filstørrelsen generelt (med 35%% eller mer ved bruk av standardmodulen)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Du bør ta periodisk sikkerhetskopi av alle krypteringsnøkler for å forhindre permanent tap av data (data/<user>/files_encryption og data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Dette er siste advarsel: Vil du virkelig aktivere kryptering?", "Enable encryption" : "Aktiver kryptering", "No encryption module loaded, please enable an encryption module in the app menu." : "Ingen krypteringsmodul er lastet. Aktiver en krypteringsmodul i app-menyen.", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 6b3bd343762..79545168f56 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -82,9 +82,9 @@ "So-so password" : "So-so-passord", "Good password" : "Bra passord", "Strong password" : "Sterkt passord", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.", "Valid until {date}" : "Gyldig til {date}", "Delete" : "Slett", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.", "Groups" : "Grupper", "Unable to delete {objName}" : "Kan ikke slette {objName}", "Error creating group" : "Feil ved oppretting av gruppe", @@ -155,10 +155,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert 15. minutt.", "Enable server-side encryption" : "Aktiver serverkryptering", "Please read carefully before activating server-side encryption: " : "Vennligst les dette nøye før du aktiverer serverkrykptering:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Serverkryptering er en enveisprosess. Når kryptering er blitt aktivert, vil alle filer fra det tidspunktet av bli kryptert på serveren og det vil ikke være mulig å deaktivere kryptering senere.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Alle som har privilegert tilgang til ownCloud-serveren din kan dekryptere filene dine enten ved å fange opp forespørsler eller ved å lese brukerpassord som er lagret i klartekst i økt-filer. Serverkryptering beskytter derfor ikke mot uærlige administratorer, men det er nyttig for å beskytte dine data på eksternt oppkoblede lagringsplasser.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Avhengig av den faktiske krypteringsmodulen økes filstørrelsen generelt (med 35%% eller mer ved bruk av standardmodulen)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Du bør ta periodisk sikkerhetskopi av alle krypteringsnøkler for å forhindre permanent tap av data (data/<user>/files_encryption og data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Dette er siste advarsel: Vil du virkelig aktivere kryptering?", "Enable encryption" : "Aktiver kryptering", "No encryption module loaded, please enable an encryption module in the app menu." : "Ingen krypteringsmodul er lastet. Aktiver en krypteringsmodul i app-menyen.", diff --git a/settings/l10n/nds.js b/settings/l10n/nds.js new file mode 100644 index 00000000000..e1998c807fd --- /dev/null +++ b/settings/l10n/nds.js @@ -0,0 +1,19 @@ +OC.L10N.register( + "settings", + { + "External Storage" : "Externer Speicher", + "Saved" : "Gespeichert", + "Very weak password" : "Sehr schwaches Passwort", + "Weak password" : "Schwaches Passwort", + "So-so password" : "Mittelstarkes Passwort", + "Good password" : "Gutes Passwort", + "Strong password" : "Starkes Passwort", + "Delete" : "Löschen", + "None" : "Keine(r)", + "Enable encryption" : "Verschlüsselung aktivieren", + "Port" : "Port", + "Password" : "Passwort", + "Cancel" : "Abbrechen", + "Username" : "Benutzername" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/nds.json b/settings/l10n/nds.json new file mode 100644 index 00000000000..2c56decc573 --- /dev/null +++ b/settings/l10n/nds.json @@ -0,0 +1,17 @@ +{ "translations": { + "External Storage" : "Externer Speicher", + "Saved" : "Gespeichert", + "Very weak password" : "Sehr schwaches Passwort", + "Weak password" : "Schwaches Passwort", + "So-so password" : "Mittelstarkes Passwort", + "Good password" : "Gutes Passwort", + "Strong password" : "Starkes Passwort", + "Delete" : "Löschen", + "None" : "Keine(r)", + "Enable encryption" : "Verschlüsselung aktivieren", + "Port" : "Port", + "Password" : "Passwort", + "Cancel" : "Abbrechen", + "Username" : "Benutzername" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index d2026810359..b593323e6ad 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "De-installeren ...", "Error while uninstalling app" : "Fout bij de-installeren app", "Uninstall" : "De-installeren", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is geactiveerd maar moet worden bijgewerkt. U wordt over 5 seconden doorgeleid naar de bijwerkpagina.", + "App update" : "App update", "An error occurred: {message}" : "Er heeft zich een fout voorgedaan: {message}", "Select a profile picture" : "Kies een profielafbeelding", "Very weak password" : "Zeer zwak wachtwoord", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Matig wachtwoord", "Good password" : "Goed wachtwoord", "Strong password" : "Sterk wachtwoord", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Er trad een fout op. Upload als een ASCII-gecodeerd PEM certificaat.", "Valid until {date}" : "Geldig tot {date}", "Delete" : "Verwijder", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Er trad een fout op. Upload als een ASCII-gecodeerd PEM certificaat.", "Groups" : "Groepen", "Unable to delete {objName}" : "Kan {objName} niet verwijderen", "Error creating group" : "Fout bij aanmaken groep", @@ -149,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Sta gebruikers toe om e-mailnotificaties aan andere gebruikers te versturen voor gedeelde bestanden", "Exclude groups from sharing" : "Sluit groepen uit van delen", "These groups will still be able to receive shares, but not to initiate them." : "Deze groepen kunnen gedeelde mappen bestanden ontvangen, maar kunnen ze niet starten.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Sta auto-aanvullen van gebruikersnaam toe in de Delen-dialoog. Als dit is uitgeschakeld, moet de gebruikersnaam volledig worden ingevuld.", "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.", "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.", "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!", @@ -157,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.", "Enable server-side encryption" : "Server-side versleuteling inschakelen", "Please read carefully before activating server-side encryption: " : "Lees dit goed, voordat u de serverside versleuteling activeert:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Versleuteling van de server is een eenrichtingsproces. Als versleuteling is ingeschakeld, worden alle bestanden vanaf dat moment versleuteld op de server en is het niet meer mogelijk versleuteling later uit te schakelen.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Iedereen met toegang met hoge autorisaties op uw ownCloud server kan ue bestanden ontcijferen door aanvragen af te luisteren of de wachtwoorden van gebruikers die in leesbare tekst in sessie bestanden zijn opgeslagen uit te lezen. Versleuteling van de server beschermt dus niet tegen kwaadwillende beheerders, maar is praktisch om uw data op externe opslag te beveiligen.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Afhankelijk van de gebruikte cryptomodule, zal de bestandsomvang gemiddeld toenemen (35%% of meer bij gebruik van de standaardmodule)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "U zou regelmatig uw cryptosleutels moeten backuppen om permanent gegevensverlies te voorkomen (data/<user>/files_encryption en data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Als versleuteling is ingeschakeld, worden alle geüploade bestanden vanaf dat moment versleuteld opgeslagen op de server. Het is alleen mogelijk om de versleuteling later uit te schakelen als de actieve versleutelingsmodule dit ondersteunt en aan alle pré-condities (mn de ingestelde herstelsleutel) wordt voldaan.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Alleen maar versleutelen is geen garantie voor veiligheid van het systeem. Lees de ownCloud documentatie voor meer informatie over de versleutelingsapp en de ondersteunde use cases.", + "Be aware that encryption always increases the file size." : "Let erop dat versleuteling de bestandsomvang altijd laat toenemen.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Het is altijd verstandig om regelmatig backups van uw bestanden te maken. Zorg ervoor dat u in geval van versleuteling ook de cryptosleutel met uw gegevens backupt.", "This is the final warning: Do you really want to enable encryption?" : "Dit is de laatste waarschuwing: Wilt u versleuteling echt inschakelen?", "Enable encryption" : "Versleuteling inschakelen", "No encryption module loaded, please enable an encryption module in the app menu." : "Er is geen cryptomodule geladen, activeer een cryptomodule in het appmenu", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 42c1dacf922..05a702eb74a 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "De-installeren ...", "Error while uninstalling app" : "Fout bij de-installeren app", "Uninstall" : "De-installeren", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is geactiveerd maar moet worden bijgewerkt. U wordt over 5 seconden doorgeleid naar de bijwerkpagina.", + "App update" : "App update", "An error occurred: {message}" : "Er heeft zich een fout voorgedaan: {message}", "Select a profile picture" : "Kies een profielafbeelding", "Very weak password" : "Zeer zwak wachtwoord", @@ -82,9 +84,9 @@ "So-so password" : "Matig wachtwoord", "Good password" : "Goed wachtwoord", "Strong password" : "Sterk wachtwoord", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Er trad een fout op. Upload als een ASCII-gecodeerd PEM certificaat.", "Valid until {date}" : "Geldig tot {date}", "Delete" : "Verwijder", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Er trad een fout op. Upload als een ASCII-gecodeerd PEM certificaat.", "Groups" : "Groepen", "Unable to delete {objName}" : "Kan {objName} niet verwijderen", "Error creating group" : "Fout bij aanmaken groep", @@ -147,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "Sta gebruikers toe om e-mailnotificaties aan andere gebruikers te versturen voor gedeelde bestanden", "Exclude groups from sharing" : "Sluit groepen uit van delen", "These groups will still be able to receive shares, but not to initiate them." : "Deze groepen kunnen gedeelde mappen bestanden ontvangen, maar kunnen ze niet starten.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Sta auto-aanvullen van gebruikersnaam toe in de Delen-dialoog. Als dit is uitgeschakeld, moet de gebruikersnaam volledig worden ingevuld.", "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.", "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.", "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!", @@ -155,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.", "Enable server-side encryption" : "Server-side versleuteling inschakelen", "Please read carefully before activating server-side encryption: " : "Lees dit goed, voordat u de serverside versleuteling activeert:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Versleuteling van de server is een eenrichtingsproces. Als versleuteling is ingeschakeld, worden alle bestanden vanaf dat moment versleuteld op de server en is het niet meer mogelijk versleuteling later uit te schakelen.", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Iedereen met toegang met hoge autorisaties op uw ownCloud server kan ue bestanden ontcijferen door aanvragen af te luisteren of de wachtwoorden van gebruikers die in leesbare tekst in sessie bestanden zijn opgeslagen uit te lezen. Versleuteling van de server beschermt dus niet tegen kwaadwillende beheerders, maar is praktisch om uw data op externe opslag te beveiligen.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Afhankelijk van de gebruikte cryptomodule, zal de bestandsomvang gemiddeld toenemen (35%% of meer bij gebruik van de standaardmodule)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "U zou regelmatig uw cryptosleutels moeten backuppen om permanent gegevensverlies te voorkomen (data/<user>/files_encryption en data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Als versleuteling is ingeschakeld, worden alle geüploade bestanden vanaf dat moment versleuteld opgeslagen op de server. Het is alleen mogelijk om de versleuteling later uit te schakelen als de actieve versleutelingsmodule dit ondersteunt en aan alle pré-condities (mn de ingestelde herstelsleutel) wordt voldaan.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Alleen maar versleutelen is geen garantie voor veiligheid van het systeem. Lees de ownCloud documentatie voor meer informatie over de versleutelingsapp en de ondersteunde use cases.", + "Be aware that encryption always increases the file size." : "Let erop dat versleuteling de bestandsomvang altijd laat toenemen.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Het is altijd verstandig om regelmatig backups van uw bestanden te maken. Zorg ervoor dat u in geval van versleuteling ook de cryptosleutel met uw gegevens backupt.", "This is the final warning: Do you really want to enable encryption?" : "Dit is de laatste waarschuwing: Wilt u versleuteling echt inschakelen?", "Enable encryption" : "Versleuteling inschakelen", "No encryption module loaded, please enable an encryption module in the app menu." : "Er is geen cryptomodule geladen, activeer een cryptomodule in het appmenu", diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js index c4e745e368e..89fb4cc5133 100644 --- a/settings/l10n/oc.js +++ b/settings/l10n/oc.js @@ -1,6 +1,7 @@ OC.L10N.register( "settings", { + "APCu" : "APCu", "Security & setup warnings" : "Avertiments de seguretat & configuracion", "Sharing" : "Partiment", "Server-side encryption" : "Chiframent costat servidor", @@ -28,6 +29,7 @@ OC.L10N.register( "Unable to change password" : "Impossible de modificar lo senhal", "Enabled" : "Activadas", "Not enabled" : "Desactivadas", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Una error s'es produsida, verificatz vòstres fichièrs de log (Error: %s)", "Migration Completed" : "Migracion acabada", "Group already exists." : "Aqueste grop existís ja.", @@ -53,6 +55,9 @@ OC.L10N.register( "Migration in progress. Please wait until the migration is finished" : "Migracion en cors. Esperatz qu'aquela s'acabe", "Migration started …" : "Migracion aviada...", "Sending..." : "Mandadís en cors...", + "Official" : "Oficial", + "Approved" : "Aprovat", + "Experimental" : "Experimental", "All" : "Totes", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Las aplicacions oficialas son desvolopadas per e amb la comunautat ownCloud. Ofrisson sas foncionalitats principalas a ownCloud e son prèstas per una utilizacion en produccion. ", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Las aplicacions aprovadas son creadas per de desvolopaires de fisança e an passat los tèst de seguretat. Son activament mantengudas dins un depaus dobèrt e lors desvolopaires pensan que son establas per una utilizacion normala.", @@ -68,15 +73,16 @@ OC.L10N.register( "Uninstalling ...." : "Desinstallacion...", "Error while uninstalling app" : "Error al moment de la desinstallacion de l'aplicacion", "Uninstall" : "Desinstallar", + "An error occurred: {message}" : "Una error s'es produsida : {message}", "Select a profile picture" : "Seleccionar una fòto de perfil ", "Very weak password" : "Senhal de fòrt febla seguretat", "Weak password" : "Senhal de febla seguretat", "So-so password" : "Senhal de seguretat tot bèl juste acceptable", "Good password" : "Senhal de seguretat sufisenta", "Strong password" : "Senhal de fòrta seguretat", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Una error s'es produsida. Provesissètz un certificat PEM encodat al format ASCII.", "Valid until {date}" : "Valid fins al {date}", "Delete" : "Suprimir", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Una error s'es produsida. Provesissètz un certificat PEM encodat al format ASCII.", "Groups" : "Gropes", "Unable to delete {objName}" : "Impossible de suprimir {objName}", "Error creating group" : "Error al moment de la creacion del grop", diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json index 9a2d5a5bc2d..4efe3443352 100644 --- a/settings/l10n/oc.json +++ b/settings/l10n/oc.json @@ -1,4 +1,5 @@ { "translations": { + "APCu" : "APCu", "Security & setup warnings" : "Avertiments de seguretat & configuracion", "Sharing" : "Partiment", "Server-side encryption" : "Chiframent costat servidor", @@ -26,6 +27,7 @@ "Unable to change password" : "Impossible de modificar lo senhal", "Enabled" : "Activadas", "Not enabled" : "Desactivadas", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Una error s'es produsida, verificatz vòstres fichièrs de log (Error: %s)", "Migration Completed" : "Migracion acabada", "Group already exists." : "Aqueste grop existís ja.", @@ -51,6 +53,9 @@ "Migration in progress. Please wait until the migration is finished" : "Migracion en cors. Esperatz qu'aquela s'acabe", "Migration started …" : "Migracion aviada...", "Sending..." : "Mandadís en cors...", + "Official" : "Oficial", + "Approved" : "Aprovat", + "Experimental" : "Experimental", "All" : "Totes", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Las aplicacions oficialas son desvolopadas per e amb la comunautat ownCloud. Ofrisson sas foncionalitats principalas a ownCloud e son prèstas per una utilizacion en produccion. ", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Las aplicacions aprovadas son creadas per de desvolopaires de fisança e an passat los tèst de seguretat. Son activament mantengudas dins un depaus dobèrt e lors desvolopaires pensan que son establas per una utilizacion normala.", @@ -66,15 +71,16 @@ "Uninstalling ...." : "Desinstallacion...", "Error while uninstalling app" : "Error al moment de la desinstallacion de l'aplicacion", "Uninstall" : "Desinstallar", + "An error occurred: {message}" : "Una error s'es produsida : {message}", "Select a profile picture" : "Seleccionar una fòto de perfil ", "Very weak password" : "Senhal de fòrt febla seguretat", "Weak password" : "Senhal de febla seguretat", "So-so password" : "Senhal de seguretat tot bèl juste acceptable", "Good password" : "Senhal de seguretat sufisenta", "Strong password" : "Senhal de fòrta seguretat", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Una error s'es produsida. Provesissètz un certificat PEM encodat al format ASCII.", "Valid until {date}" : "Valid fins al {date}", "Delete" : "Suprimir", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Una error s'es produsida. Provesissètz un certificat PEM encodat al format ASCII.", "Groups" : "Gropes", "Unable to delete {objName}" : "Impossible de suprimir {objName}", "Error creating group" : "Error al moment de la creacion del grop", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 3819e70d5ac..9805f5fc61e 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "Desinstalando ...", "Error while uninstalling app" : "Erro enquanto desinstalava aplicativo", "Uninstall" : "Desinstalar", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "O aplicativo foi habilitado, mas precisa ser atualizado. Você será redirecionado para a página de atualização em 5 segundos.", + "App update" : "Atualização de aplicativo", "An error occurred: {message}" : "Ocorreu um erro: {message}", "Select a profile picture" : "Selecione uma imagem para o perfil", "Very weak password" : "Senha muito fraca", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "Senha mais ou menos", "Good password" : "Boa senha", "Strong password" : "Senha forte", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ocorreu um erro. Por favor envie um certificado ASCII-encoded PEM", "Valid until {date}" : "Vádido até {date}", "Delete" : "Excluir", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ocorreu um erro. Por favor envie um certificado ASCII-encoded PEM", "Groups" : "Grupos", "Unable to delete {objName}" : "Não é possível excluir {objName}", "Error creating group" : "Erro ao criar grupo", @@ -149,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Permitir aos usuários enviar notificação de email de arquivos compartilhados para outros usuários", "Exclude groups from sharing" : "Excluir grupos de compartilhamento", "These groups will still be able to receive shares, but not to initiate them." : "Esses grupos ainda serão capazes de receber compartilhamentos, mas não para iniciá-los.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir autocompletar nome de usuário no diálogo de compartilhamento. Se isto estiver desativado o nome de usuário completo precisa ser inserido.", "Last cron job execution: %s." : "Última execução do trabalho cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.", "Cron was not executed yet!" : "Cron não foi executado ainda!", @@ -157,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php cada 15 minutos.", "Enable server-side encryption" : "Habilitar a Criptografia do Lado do Servidor", "Please read carefully before activating server-side encryption: " : "Por favor, leia com atenção antes de ativar a criptografia do lado do servidor:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Encriptação do lado do servidor é um processo de uma direção. Uma vez que a criptografia está habilitada, todos os arquivos a partir desse ponto em diante serão criptografados no servidor e não será possível desativar a criptografia em uma data posterior", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Qualquer pessoa que tenha acesso privilegiado ao seu servidor ownCloud pode descriptografar os arquivos quer, interceptando pedidos ou a leitura de senhas de usuários que são armazenados em arquivos de sessão texto simples. Encriptação do lado do servidor, portanto, não protege contra os administradores mal-intencionados, mas é útil para proteger seus dados em armazenamento hospedados externamente.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Dependendo do módulo atual de criptografia o tamanho geral do arquivo será aumentado (por 35 %% ou mais quando se usa o módulo padrão)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Você deve regularmente fazer backup de todas as chaves de criptografia para evitar a perda de dados permanente (data/<user>/files_encryption e data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Uma vez que a criptografia é ativada, todos os arquivos carregados para o servidor a partir desse ponto em diante serão criptografados e estarão disponíveis no servidor. Só será possível desativar a criptografia em uma data posterior, se o módulo de criptografia ativo suporta essa função, e todas as pré-condições sejam cumpridas(por exemplo, definindo uma chave de recuperação).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Criptografia por si só não garante a segurança do sistema. Por favor, consulte a documentação ownCloud para obter mais informações sobre como o aplicativo de criptografia funciona, e os casos de uso suportados.", + "Be aware that encryption always increases the file size." : "Esteja ciente de que a criptografia sempre aumenta o tamanho do arquivo.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "É sempre bom criar backups regulares dos seus dados, em caso de criptografia certifique-se de fazer backup das chaves de criptografia, juntamente com os seus dados.", "This is the final warning: Do you really want to enable encryption?" : "Este é o aviso final: Você realmente quer ativar a criptografia?", "Enable encryption" : "Ativar criptografia", "No encryption module loaded, please enable an encryption module in the app menu." : "Nenhum módulo de criptografia carregado, por favor, ative um módulo de criptografia no menu de aplicativos.", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index bba1b4b5847..d5328281a24 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "Desinstalando ...", "Error while uninstalling app" : "Erro enquanto desinstalava aplicativo", "Uninstall" : "Desinstalar", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "O aplicativo foi habilitado, mas precisa ser atualizado. Você será redirecionado para a página de atualização em 5 segundos.", + "App update" : "Atualização de aplicativo", "An error occurred: {message}" : "Ocorreu um erro: {message}", "Select a profile picture" : "Selecione uma imagem para o perfil", "Very weak password" : "Senha muito fraca", @@ -82,9 +84,9 @@ "So-so password" : "Senha mais ou menos", "Good password" : "Boa senha", "Strong password" : "Senha forte", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ocorreu um erro. Por favor envie um certificado ASCII-encoded PEM", "Valid until {date}" : "Vádido até {date}", "Delete" : "Excluir", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ocorreu um erro. Por favor envie um certificado ASCII-encoded PEM", "Groups" : "Grupos", "Unable to delete {objName}" : "Não é possível excluir {objName}", "Error creating group" : "Erro ao criar grupo", @@ -147,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "Permitir aos usuários enviar notificação de email de arquivos compartilhados para outros usuários", "Exclude groups from sharing" : "Excluir grupos de compartilhamento", "These groups will still be able to receive shares, but not to initiate them." : "Esses grupos ainda serão capazes de receber compartilhamentos, mas não para iniciá-los.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir autocompletar nome de usuário no diálogo de compartilhamento. Se isto estiver desativado o nome de usuário completo precisa ser inserido.", "Last cron job execution: %s." : "Última execução do trabalho cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.", "Cron was not executed yet!" : "Cron não foi executado ainda!", @@ -155,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php cada 15 minutos.", "Enable server-side encryption" : "Habilitar a Criptografia do Lado do Servidor", "Please read carefully before activating server-side encryption: " : "Por favor, leia com atenção antes de ativar a criptografia do lado do servidor:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Encriptação do lado do servidor é um processo de uma direção. Uma vez que a criptografia está habilitada, todos os arquivos a partir desse ponto em diante serão criptografados no servidor e não será possível desativar a criptografia em uma data posterior", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Qualquer pessoa que tenha acesso privilegiado ao seu servidor ownCloud pode descriptografar os arquivos quer, interceptando pedidos ou a leitura de senhas de usuários que são armazenados em arquivos de sessão texto simples. Encriptação do lado do servidor, portanto, não protege contra os administradores mal-intencionados, mas é útil para proteger seus dados em armazenamento hospedados externamente.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Dependendo do módulo atual de criptografia o tamanho geral do arquivo será aumentado (por 35 %% ou mais quando se usa o módulo padrão)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Você deve regularmente fazer backup de todas as chaves de criptografia para evitar a perda de dados permanente (data/<user>/files_encryption e data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Uma vez que a criptografia é ativada, todos os arquivos carregados para o servidor a partir desse ponto em diante serão criptografados e estarão disponíveis no servidor. Só será possível desativar a criptografia em uma data posterior, se o módulo de criptografia ativo suporta essa função, e todas as pré-condições sejam cumpridas(por exemplo, definindo uma chave de recuperação).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Criptografia por si só não garante a segurança do sistema. Por favor, consulte a documentação ownCloud para obter mais informações sobre como o aplicativo de criptografia funciona, e os casos de uso suportados.", + "Be aware that encryption always increases the file size." : "Esteja ciente de que a criptografia sempre aumenta o tamanho do arquivo.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "É sempre bom criar backups regulares dos seus dados, em caso de criptografia certifique-se de fazer backup das chaves de criptografia, juntamente com os seus dados.", "This is the final warning: Do you really want to enable encryption?" : "Este é o aviso final: Você realmente quer ativar a criptografia?", "Enable encryption" : "Ativar criptografia", "No encryption module loaded, please enable an encryption module in the app menu." : "Nenhum módulo de criptografia carregado, por favor, ative um módulo de criptografia no menu de aplicativos.", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index 4366083d5c2..54d87a1096c 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -77,6 +77,7 @@ OC.L10N.register( "Uninstalling ...." : "Удаление ...", "Error while uninstalling app" : "Ошибка при удалении приложения", "Uninstall" : "Удалить", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Приложение было включено и нуждается в обновлении. Вас перенаправит на страницу обновления через 5 секунд.", "An error occurred: {message}" : "Произошла ошибка: {message}", "Select a profile picture" : "Выберите аватар", "Very weak password" : "Очень слабый пароль", @@ -84,9 +85,9 @@ OC.L10N.register( "So-so password" : "Так себе пароль", "Good password" : "Хороший пароль", "Strong password" : "Стойкий пароль", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Произошла ошибка. Пожалуйста загрузите сертификат PEM в ASCII кодировке.", "Valid until {date}" : "Действительно до {дата}", "Delete" : "Удалить", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Произошла ошибка. Пожалуйста загрузите сертификат PEM в ASCII кодировке.", "Groups" : "Группы", "Unable to delete {objName}" : "Невозможно удалить {objName}", "Error creating group" : "Ошибка создания группы", @@ -118,18 +119,22 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP был установлен неверно. Запрос getenv(\"PATH\") возвращает пустые результаты.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Пожалуйста обратитесь к <a target=\"_blank\" href=\"%s\">документации по установке</a> для получения заметок по настройке php, а также к настройкам php вашего сервера, особенно это касается php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Конфигурационный файл в режиме только для чтения. В связи с этим некоторые настройки веб-интерфейса невозможно изменить. Учтите, что для установки обновлений, вам потребуется самостоятельно разрешить запись в конфигурационный файл.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Очевидно, PHP настроен на вычищение блоков встроенной документации. Это сделает несколько центральных приложений недоступными.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Возможно это вызвано кешем/ускорителем вроде Zend OPcache или eAccelerator.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер работает на ОС Microsoft Windows. Мы настоятельно рекомендуем использовать ОС семейства Linux для достижения наилучших условий использования.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s ниже установленной версии %2$s, по причинам стабильности и производительности мы рекомендуем обновиться до новой версии %1$s.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-модуль 'fileinfo' отсутствует. Мы настоятельно рекомендуем включить этот модуль для улучшения определения типов (mime-type) файлов.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Блокировка файлов во время передачи отключена, это может привести к состоянию гонки. Включите параметр 'filelocking.enabled' в config.php для избежания этой проблемы. За подробной информацией обратитесь к <a target=\"_blank\" href=\"%s\">документации</a>.", "System locale can not be set to a one which supports UTF-8." : "Невозможно установить системную локаль, поддерживающую UTF-8", "This means that there might be problems with certain characters in file names." : "Это значит, что могут быть проблемы с некоторыми символами в именах файлов.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Мы рекомендуем установить требуемые пакеты для вашей системы для поддержки одного из следующих языков: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Механизм блокировки файлов во время передачи основан на базе данных, для лучшей производительности рекомендуется использование memcache. За подробной информацией обратитесь к <a target=\"_blank\" href=\"%s\">документации</a>.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Пожалуйста, перепроверьте <a href=\"%s\">инструкцию по установке</a> и проверьте ошибки или предупреждения в <a href=\"#log-section\">журнале</a>", + "All checks passed." : "Все проверки пройдены.", "Open documentation" : "Открыть документацию", "Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа", "Allow users to share via link" : "Разрешить пользователям публикации через ссылки", @@ -145,6 +150,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Разрешить пользователям отправлять оповещение других пользователей об открытии доступа к файлам", "Exclude groups from sharing" : "Исключить группы из общего доступа", "These groups will still be able to receive shares, but not to initiate them." : "Эти группы смогут получать общие ресурсы, но не могут их создавать.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Включить автоматическое завершение имен пользователей в окне общего доступа. Если отключено, то необходимо вводить полное имя вручную.", "Last cron job execution: %s." : "Последнее выполненное Cron задание: %s.", "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное Cron задание: %s. Что-то кажется неправильным.", "Cron was not executed yet!" : "Задачи cron ещё не запускались!", @@ -152,6 +158,11 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.", "Enable server-side encryption" : "Включить шифрование на стороне сервера", + "Please read carefully before activating server-side encryption: " : "Пожалуйста прочтите внимательно прежде чем включать шифрование на стороне сервера:", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Шифрование не гарантирует безопасность системы. Пожалуйста читайте документацию для получения информации о работе модуля шифрования и случаи его использования.", + "Be aware that encryption always increases the file size." : "Будьте в курсе, что шифрование всегда увеличивает размер файла.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Хорошая практика делать регулярные резервные копии ваших данных. При использовании шифрования сохраняйте ключи вместе с данными.", + "This is the final warning: Do you really want to enable encryption?" : "Это последнее предупреждение: Вы действительно желаете включить шифрование?", "Enable encryption" : "Включить шифрование", "No encryption module loaded, please enable an encryption module in the app menu." : "Модуль шифрования не загружен, пожалуйста включите модуль шифрования в меню приложений.", "Select default encryption module:" : "Выберите модуль шифрования по умолчанию:", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 55a2680ed30..12b183c2fac 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -75,6 +75,7 @@ "Uninstalling ...." : "Удаление ...", "Error while uninstalling app" : "Ошибка при удалении приложения", "Uninstall" : "Удалить", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Приложение было включено и нуждается в обновлении. Вас перенаправит на страницу обновления через 5 секунд.", "An error occurred: {message}" : "Произошла ошибка: {message}", "Select a profile picture" : "Выберите аватар", "Very weak password" : "Очень слабый пароль", @@ -82,9 +83,9 @@ "So-so password" : "Так себе пароль", "Good password" : "Хороший пароль", "Strong password" : "Стойкий пароль", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Произошла ошибка. Пожалуйста загрузите сертификат PEM в ASCII кодировке.", "Valid until {date}" : "Действительно до {дата}", "Delete" : "Удалить", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Произошла ошибка. Пожалуйста загрузите сертификат PEM в ASCII кодировке.", "Groups" : "Группы", "Unable to delete {objName}" : "Невозможно удалить {objName}", "Error creating group" : "Ошибка создания группы", @@ -116,18 +117,22 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP был установлен неверно. Запрос getenv(\"PATH\") возвращает пустые результаты.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Пожалуйста обратитесь к <a target=\"_blank\" href=\"%s\">документации по установке</a> для получения заметок по настройке php, а также к настройкам php вашего сервера, особенно это касается php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Конфигурационный файл в режиме только для чтения. В связи с этим некоторые настройки веб-интерфейса невозможно изменить. Учтите, что для установки обновлений, вам потребуется самостоятельно разрешить запись в конфигурационный файл.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Очевидно, PHP настроен на вычищение блоков встроенной документации. Это сделает несколько центральных приложений недоступными.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Возможно это вызвано кешем/ускорителем вроде Zend OPcache или eAccelerator.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер работает на ОС Microsoft Windows. Мы настоятельно рекомендуем использовать ОС семейства Linux для достижения наилучших условий использования.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s ниже установленной версии %2$s, по причинам стабильности и производительности мы рекомендуем обновиться до новой версии %1$s.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-модуль 'fileinfo' отсутствует. Мы настоятельно рекомендуем включить этот модуль для улучшения определения типов (mime-type) файлов.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Блокировка файлов во время передачи отключена, это может привести к состоянию гонки. Включите параметр 'filelocking.enabled' в config.php для избежания этой проблемы. За подробной информацией обратитесь к <a target=\"_blank\" href=\"%s\">документации</a>.", "System locale can not be set to a one which supports UTF-8." : "Невозможно установить системную локаль, поддерживающую UTF-8", "This means that there might be problems with certain characters in file names." : "Это значит, что могут быть проблемы с некоторыми символами в именах файлов.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Мы рекомендуем установить требуемые пакеты для вашей системы для поддержки одного из следующих языков: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Механизм блокировки файлов во время передачи основан на базе данных, для лучшей производительности рекомендуется использование memcache. За подробной информацией обратитесь к <a target=\"_blank\" href=\"%s\">документации</a>.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Пожалуйста, перепроверьте <a href=\"%s\">инструкцию по установке</a> и проверьте ошибки или предупреждения в <a href=\"#log-section\">журнале</a>", + "All checks passed." : "Все проверки пройдены.", "Open documentation" : "Открыть документацию", "Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа", "Allow users to share via link" : "Разрешить пользователям публикации через ссылки", @@ -143,6 +148,7 @@ "Allow users to send mail notification for shared files to other users" : "Разрешить пользователям отправлять оповещение других пользователей об открытии доступа к файлам", "Exclude groups from sharing" : "Исключить группы из общего доступа", "These groups will still be able to receive shares, but not to initiate them." : "Эти группы смогут получать общие ресурсы, но не могут их создавать.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Включить автоматическое завершение имен пользователей в окне общего доступа. Если отключено, то необходимо вводить полное имя вручную.", "Last cron job execution: %s." : "Последнее выполненное Cron задание: %s.", "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное Cron задание: %s. Что-то кажется неправильным.", "Cron was not executed yet!" : "Задачи cron ещё не запускались!", @@ -150,6 +156,11 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.", "Enable server-side encryption" : "Включить шифрование на стороне сервера", + "Please read carefully before activating server-side encryption: " : "Пожалуйста прочтите внимательно прежде чем включать шифрование на стороне сервера:", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Шифрование не гарантирует безопасность системы. Пожалуйста читайте документацию для получения информации о работе модуля шифрования и случаи его использования.", + "Be aware that encryption always increases the file size." : "Будьте в курсе, что шифрование всегда увеличивает размер файла.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Хорошая практика делать регулярные резервные копии ваших данных. При использовании шифрования сохраняйте ключи вместе с данными.", + "This is the final warning: Do you really want to enable encryption?" : "Это последнее предупреждение: Вы действительно желаете включить шифрование?", "Enable encryption" : "Включить шифрование", "No encryption module loaded, please enable an encryption module in the app menu." : "Модуль шифрования не загружен, пожалуйста включите модуль шифрования в меню приложений.", "Select default encryption module:" : "Выберите модуль шифрования по умолчанию:", diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index a4152a544c6..7423b86e026 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -1,109 +1,287 @@ OC.L10N.register( "settings", { - "Sharing" : "Ndarje", + "APCu" : "APCu", + "Redis" : "Redis", + "Security & setup warnings" : "Sinjalizime sigurie & rregullimi", + "Sharing" : "Ndarje me të tjerët", + "Server-side encryption" : "Fshehtëzim më anë shërbyesi", + "External Storage" : "Depozitim i Jashtëm", "Cron" : "Cron", - "Log" : "Historik aktiviteti", - "Authentication error" : "Gabim autentifikimi", - "Your full name has been changed." : "Emri juaj i plotë ka ndryshuar.", - "Unable to change full name" : "Nuk mund të ndryshohet emri i plotë", - "Couldn't remove app." : "Nuk mund të hiqet aplikacioni.", + "Email server" : "Shërbyes email-esh", + "Log" : "Regjistër", + "Tips & tricks" : "Ndihmëza & rrengje", + "Updates" : "Përditësime", + "Authentication error" : "Gabim mirëfilltësimi", + "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", + "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", + "Couldn't remove app." : "S’hoqi dot aplikacionin.", "Language changed" : "Gjuha u ndryshua", "Invalid request" : "Kërkesë e pavlefshme", - "Admins can't remove themself from the admin group" : "Administratorët nuk mund të heqin vehten prej grupit admin", - "Unable to add user to group %s" : "E pamundur t'i shtohet përdoruesi grupit %s", - "Unable to remove user from group %s" : "E pamundur të hiqet përdoruesi nga grupi %s", - "Couldn't update app." : "E pamundur të përditësohet app.", + "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", + "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", + "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", + "Couldn't update app." : "S’përditësoi dot aplikacionin.", "Wrong password" : "Fjalëkalim i gabuar", - "No user supplied" : "Nuk është dhënë asnjë përdorues", - "Please provide an admin recovery password, otherwise all user data will be lost" : "Ju lutem jepni një fjalëkalim restaurimi administrativ, në të kundërt të gjitha të dhënat do humbasin", - "Wrong admin recovery password. Please check the password and try again." : "Fjalëkalim i gabuar restaurimi administrativ. Ju lutem kontrolloni fjalëkalimin dhe provoni përsëri.", - "Unable to change password" : "Fjalëkalimi nuk mund të ndryshohet", - "Enabled" : "Aktivizuar", - "Not enabled" : "Jo aktive", + "No user supplied" : "S’u dha përdorues", + "Please provide an admin recovery password, otherwise all user data will be lost" : "Ju lutemi, jepni një fjalëkalim rikthimesh për përgjegjësin, në të kundërt të gjitha të dhënat do të humbasin", + "Wrong admin recovery password. Please check the password and try again." : "Fjalëkalim i gabuar rikthimesh për përgjegjësin. Ju lutemi, kontrolloni fjalëkalimin dhe provoni përsëri.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Programi klient s’mbulon ndryshime fjalëkalimi, por kyçi i përdoruesi për fshehtëzime u përditësua me sukses.", + "Unable to change password" : "S’arrin të ndryshojë fjalëkalimin", + "Enabled" : "E aktivizuar", + "Not enabled" : "E paaktivizuar", + "installing and updating apps via the app store or Federated Cloud Sharing" : "instalim dhe përditësim aplikacionesh përmes shitores së aplikacioneve ose Federated Cloud Sharing", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL-ja po përdor një version %s të vjetruar (%s). Ju lutemi, përditësoni sistemin tuaj operativ ose përndryshe veçori të tilla si %s nuk do të punojnë në mënyrë të qëndrueshme.", + "A problem occurred, please check your log files (Error: %s)" : "Ndodhi një gabim, ju lutemi, kontrolloni kartelat tuaja regjistër (Error: %s)", + "Migration Completed" : "Migrimi u Plotësua", + "Group already exists." : "Grupi ekziston tashmë.", + "Unable to add group." : "S’arrin të shtojë grup.", + "Unable to delete group." : "S’arrin të fshijë grup.", + "log-level out of allowed range" : "nivel regjistrimi jashtë intervalit të lejuar", "Saved" : "U ruajt", - "test email settings" : "parametra test për email", + "test email settings" : "testoni rregullime email-i", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ndodhi një gabim gjatë dërgimit të email-it. Ju lutemi, rishikoni rregullimet tuaja. (Error: %s)", "Email sent" : "Email-i u dërgua", - "Email saved" : "Email u ruajt", - "Sending..." : "Duke dërguar", - "All" : "Të gjitha", - "Please wait...." : "Ju lutem prisni...", - "Disable" : "Çaktivizo", - "Enable" : "Aktivizo", - "Updating...." : "Duke përditësuar...", - "Error while updating app" : "Gabim gjatë përditësimit të app", - "Updated" : "I përditësuar", - "Select a profile picture" : "Zgjidh një foto profili", + "You need to set your user email before being able to send test emails." : "Lypset të caktoni email-in tuaj si përdorues, përpara se të jeni në gjendje të dërgoni email-e provë.", + "Invalid mail address" : "Adresë email e pavlefshme", + "A user with that name already exists." : "Ka tashmë një përdorues me këtë emër.", + "Unable to create user." : "S’arrin të krijojë përdoruesi.", + "Your %s account was created" : "Llogaria juaj %s u krijua", + "Unable to delete user." : "S’arrin të fshijë përdorues.", + "Forbidden" : "E ndaluar", + "Invalid user" : "Përdorues i pavlefshëm", + "Unable to change mail address" : "S’arrin të ndryshojë adresë email", + "Email saved" : "Email-i u ruajt", + "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", + "Add trusted domain" : "Shtoni përkatësi të besuar", + "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", + "Migration started …" : "Migrimi filloi …", + "Sending..." : "Po dërgohet…", + "Official" : "Zyrtare", + "Approved" : "Të miratuara", + "Experimental" : "Eksperimentale", + "All" : "Krejt", + "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplikacionet zyrtare ndërtohen brenda bashkësisë ownCloud. Ato ofrojnë funksione qendrore për ownCloud dhe janë gati për t’u përdorur në prodhim.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikacionet e miratuara ndërtohen nga zhvillues të besuar dhe kanë kaluar një kontroll të përciptë sigurie. Mirëmbahen aktivisht në një depo të hapur kodi dhe mirëmbajtësit e tyre i konsiderojnë të qëndrueshme për përdorime nga të rastit deri në ato normale.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ky aplikacion s’është kontrolluar për probleme sigurie dhe është i ri ose i njohur si i paqëndrueshëm. Instalojeni duke e mbajtur vetë përgjegjësinë.", + "Update to %s" : "Përditësoje me %s", + "Please wait...." : "Ju lutemi, prisni…", + "Error while disabling app" : "Gabim në çaktivizimin e aplikacionit", + "Disable" : "Çaktivizoje", + "Enable" : "Aktivizoje", + "Error while enabling app" : "Gabim në aktivizimin e aplikacionit", + "Updating...." : "Po përditësohet…", + "Error while updating app" : "Gabim gjatë përditësimit të aplikacionit", + "Updated" : "U përditësua", + "Uninstalling ...." : "Po çinstalohet…", + "Error while uninstalling app" : "Gabim në çinstalimin e aplikacionit", + "Uninstall" : "Çinstaloje", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikacioni është aktivizuar, por lyp të përditësohet. Do të ridrejtoheni te faqja e përditësimeve brenda 5 sekondash.", + "App update" : "Përditësim aplikacioni", + "An error occurred: {message}" : "Ndodhi një gabim: {message}", + "Select a profile picture" : "Përzgjidhni një foto profili", "Very weak password" : "Fjalëkalim shumë i dobët", "Weak password" : "Fjalëkalim i dobët", - "So-so password" : "Fjalëkalim i pranueshëm", + "So-so password" : "Fjalëkalim çka", "Good password" : "Fjalëkalim i mirë", - "Strong password" : "Fjalëkalim shumë i mirë", - "Delete" : "Fshi", - "Groups" : "Grupet", + "Strong password" : "Fjalëkalim i fortë", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ndodhi një gabim. Ju lutemi, ngarkoni një dëshmi PEM të koduar me ASCII.", + "Valid until {date}" : "E vlefshme deri më {date}", + "Delete" : "Fshije", + "Groups" : "Grupe", + "Unable to delete {objName}" : "S’arrin të fshijë {objName}", + "Error creating group" : "Gabim gjatë krijimit të grupit", + "A valid group name must be provided" : "Duhet dhënë një emër i vlefshëm grupi", "deleted {groupName}" : "u fshi {groupName}", - "undo" : "anullo veprimin", - "never" : "asnjëherë", + "undo" : "zhbëje", + "no group" : "pa grup", + "never" : "kurrë", "deleted {userName}" : "u fshi {userName}", "add group" : "shto grup", - "A valid username must be provided" : "Duhet të jepni një emër të vlefshëm përdoruesi", + "Changing the password will result in data loss, because data recovery is not available for this user" : "Ndryshimi i fjalëkalimit do të sjellë humbje të dhënash, ngaqë rikthimi i të dhënave s’është i përdorshëm për këtë përdorues", + "A valid username must be provided" : "Duhet dhënë një emër të vlefshëm përdoruesi", "Error creating user" : "Gabim gjatë krijimit të përdoruesit", - "A valid password must be provided" : "Duhet të jepni një fjalëkalim te vlefshëm", + "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", + "A valid email must be provided" : "Duhet dhënë një email i vlefshëm", "__language_name__" : "Shqip", - "None" : "Asgjë", - "Login" : "Hyr", - "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me këmbngulje të aktivizoni këtë modul për të arritur rezultate më të mirame identifikimin e tipeve te ndryshme MIME.", - "Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin share API", - "Allow public uploads" : "Lejo ngarkimin publik", - "Expire after " : "Skadon pas", - "days" : "diitë", - "Allow resharing" : "Lejo ri-ndarjen", + "Sync clients" : "Klientë njëkohësimi", + "Personal info" : "Të dhëna personale", + "SSL root certificates" : "Dëshmi SSL rrënjë", + "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", + "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", + "Warnings, errors and fatal issues" : "Sinjalizime, gabime dhe probleme fatale", + "Errors and fatal issues" : "Gabime dhe probleme fatale", + "Fatal issues only" : "Vetëm probleme fatale", + "None" : "Asnjë", + "Login" : "Hyrje", + "Plain" : "E thjeshtë", + "SSL" : "SSL", + "TLS" : "TLS", + "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP-ja nuk duket të jetë rregulluar si duhet për të kërkuar ndryshore mjedisi sistemi. Testi me getenv(\"PATH\") kthen vetëm një përgjigje të zbrazët.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Ju lutemi, kontrolloni <a target=\"_blank\" href=\"%s\">dokumentimin e instalimit ↗</a> për shënime mbi formësimin e PHP-së dhe formësimin e PHP-së të shërbyesi juaj, veçanërisht kur përdoret php-fpm.", + "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Rregullimi Vetëm-Lexim u aktivizua. Kjo parandalon rregullimin e disa parametrave përmes ndërfaqes web. Më tej, për çdo përditësim kartela lyp të kalohet dorazi si e shkrueshme.", + "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Duket se PHP-ja është rregulluar që të heqë blloqe të brendshme dokumentimi. Kjo do t’i bëjë të papërdrshme disa aplikacione bazë.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Shërbyesi juaj xhiron nën Microsoft Windows. Këshillojmë fort Linux-in për punim optimal nga ana e përdoruesit.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "Ka të instaluar %1$s nën versionin %2$s, për arsye qëndrueshmërie dhe performance këshillojmë të përditësohet me një version %1$s më të ri.", + "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me forcë ta aktivizoni këtë modul, për të patur përfundimet më të mira në zbulim llojesh MIME.", + "System locale can not be set to a one which supports UTF-8." : "Si vendore sistemi nuk mund të caktohet një që mbulon UTF-8.", + "This means that there might be problems with certain characters in file names." : "Kjo do të thotë që mund të ketë probleme me disa shenja në emra kartelash.", + "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Këshillojmë me forcë instalimin në sistemin tuaj të paketave të domosdoshme për mbulim të një prej vendoreve vijuese: %s.", + "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Nëse instalimi juaj nuk është bërë në rrënjë të përkatësisë dhe përdor cron sistemi, mund të ketë probleme me prodhimin e URL-së. Që të shmangen këto probleme, ju lutemi, jepini mundësisë \"overwrite.cli.url\" te kartela juaj config.php vlerën e shtegut webroot të instalimit tuaj (E këshillueshme: \"%s\")", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "S’qe e mundur të përmbushej akti cron përmes CLI-së. U shfaqën gabimet teknike vijuese:", + "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ju lutemi, rihidhuni një sy <a target=\"_blank\" href=\"%s\">udhërrëfyesve të instalimit ↗</a>, dhe kontrolloni te <a href=\"#log-section\">regjistri</a> për çfarëdo gabimesh apo sinjalizimesh.", + "All checks passed." : "I kaloi krejt kontrollet.", + "Open documentation" : "Hapni dokumentimin", + "Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin API Share", + "Allow users to share via link" : "Lejoji përdoruesit të ndajnë me të tjerët përmes lidhjesh", + "Enforce password protection" : "Detyro mbrojtje me fjalëkalim", + "Allow public uploads" : "Lejo ngarkime publike", + "Allow users to send mail notification for shared files" : "Lejoju përdoruesve të dërgojnë njoftime me email për kartela të ndara me të tjerët", + "Set default expiration date" : "Caktoni datë parazgjedhje skadimi", + "Expire after " : "Skadon pas ", + "days" : "ditësh", + "Enforce expiration date" : "Detyro datë skadimi", + "Allow resharing" : "Lejo rindarje", + "Restrict users to only share with users in their groups" : "Përdoruesit kufizoji të ndajnë gjëra vetëm me përdorues në grupin e tyre", + "Allow users to send mail notification for shared files to other users" : "Lejoju përdoruesve t’u dërgojnë përdoruesve të tjerë njoftime me email për kartela të ndara me të tjerët", + "Exclude groups from sharing" : "Përjashtoni grupe nga ndarjet", + "These groups will still be able to receive shares, but not to initiate them." : "Këto grupe prapë do të jenë në gjendje të marrin ndarje nga të tjerët, por jo të fillojnë të tilla.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Lejo vetëplotësim emra përdoruesish te dialogu i ndarjeve me të tjerët. Nëse kjo është e çaktivizuar, do të duhet të jepen emra përdoruesish.", + "Last cron job execution: %s." : "Përmbushja e fundit e aktit cron: %s.", + "Last cron job execution: %s. Something seems wrong." : "Përmbushja e fundit e aktit cron: %s. Duket se nuk shkon diçka.", + "Cron was not executed yet!" : "Cron-i s’qe ekzekutuar ende!", "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara", - "Send mode" : "Mënyra e dërgimit", - "Encryption" : "Kodifikimi", + "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php është regjistruar te një shërbim webcron që ta aktivizojë cron.php-në çdo 15 minuta përmes http-je.", + "Use system's cron service to call the cron.php file every 15 minutes." : "Përdorni shërbimin cron të sistemit që ta aktivizojë cron.php-në çdo 15 minuta.", + "Enable server-side encryption" : "Aktivizo fshehtëzim më anë të shërbyesit", + "Please read carefully before activating server-side encryption: " : "Ju lutemi, lexoni me kujdes përpara aktivizimit të fshehtëzimeve më anë shërbyesi: ", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Pasi të jetë aktivizuar fshehtëzimi, krejt kartelat e ngarkuara te shërbyesi nga kjo pikë e tutje do të fshehtëzohen pasi të jenë depozituar në shërbyes. Çaktivizimi i fshehtëzimit në një datë të mëvonshme do të jetë i mundur vetëm nëse moduli aktiv i fshehtëzimeve e mbulon këtë funksion, dhe nëse plotësohen krejt parakushtet (p.sh. caktimi i një kyçi rimarrjesh).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Fshehtëzimi, dhe vetëm kaq, s’garanton sigurinë e sistemit. Ju lutemi, për më tepër të dhëna se si funksionon aplikacioni i fshehtëzimeve, dhe për raste përdorimi që mbulon, lexoni dokumentimin e ownCloud-it.", + "Be aware that encryption always increases the file size." : "Kini parasysh që fshehtëzimi e rrit gjithnjë madhësinë e kartelës.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Është gjithmonë ide e mirë të krijohen kopjeruajtje të rregullta të të dhënave tuaja, në rast fshehtëzimi sigurohuni që bëni kopjeruajtje të kyçeve të fshehtëzimit, tok me të dhënat tuaja.", + "This is the final warning: Do you really want to enable encryption?" : "Ky është sinjalizimi përfundimtar: Doni vërtet të aktivizohet fshehtëzimi?", + "Enable encryption" : "Aktivizoni fshehtëzim", + "No encryption module loaded, please enable an encryption module in the app menu." : "S’ka të ngarkuar modul fshehtëzimi, ju lutemi, aktivizoni një modul fshehtëzimi që nga menuja e aplikacionit.", + "Select default encryption module:" : "Përzgjidhni modul parazgjedhje fshehtëzimi:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Lypset të migroni kyçet tuaj të fshehtëzimit nga fshehtëzimi i vjetër (ownCloud <= 8.0) te i riu. Ju lutemi, aktivizoni \"Modul parazgjedhje fshehtëzimesh\" dhe ekzekutoni 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Lypset të migroni kyçet tuaj të fshehtëzimit nga fshehtëzimi i vjetër (ownCloud <= 8.0) te i riu.", + "Start migration" : "Fillo migrimin", + "This is used for sending out notifications." : "Ky përdoret për të dërguar njoftime.", + "Send mode" : "Mënyrë dërgimi", + "Encryption" : "Fshehtëzim", "From address" : "Nga adresa", - "mail" : "postë", - "Server address" : "Adresa e serverit", - "Port" : "Porta", - "Credentials" : "Kredencialet", + "mail" : "email", + "Authentication method" : "Metodë mirëfilltësimi", + "Authentication required" : "Lypset mirëfilltësim", + "Server address" : "Adresë shërbyesi", + "Port" : "Portë", + "Credentials" : "Kredenciale", + "SMTP Username" : "Emër përdoruesi SMTP", + "SMTP Password" : "Fjalëkalim SMTP", + "Store credentials" : "Depozitoji kredencialet", + "Test email settings" : "Testoni rregullimet e email-it", "Send email" : "Dërgo email", - "Log level" : "Niveli i Historikut", + "Log level" : "Shkallë regjistrimi", + "Download logfile" : "Shkarkoni kartelën regjistër", "More" : "Më tepër", - "Less" : "M'pak", - "Version" : "Versioni", + "Less" : "Më pak", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Kartela regjistër është më e madhe se 100 MB. Shkarkimi i saj mund të hajë ca kohë!", + "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Si bazë të dhënash përdoret SQLite. Për instalime më të ngarkuara, këshillojmë të kalohet në një program tjetër baze të dhënash.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Përdorimi i SQLite-it nuk këshillohet veçanërisht kur përdoret klienti desktop për njëkohësim kartelash.", + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Për të kaluar te një tjetër bazë të dhënash përdorni mjetin rresht urdhrash: 'occ db:convert-type', ose shihni <a target=\"_blank\" href=\"%s\">dokumentimin ↗</a>.", + "How to do backups" : "Si të bëhen kopjeruajtje", + "Advanced monitoring" : "Mbikëqyrje e mëtejshme", + "Performance tuning" : "Përimtime performance", + "Improving the config.php" : "Si të përmirësohet config.php", + "Theming" : "Ndryshim teme grafike", + "Hardening and security guidance" : "Udhëzime për forcim dhe siguri", + "Version" : "Version", + "Developer documentation" : "Dokumentim për zhvillues", + "Experimental applications ahead" : "Keni përpara aplikacione eksperimentale", + "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplikacionet eksperimentale nuk kontrollohen për probleme sigurie, mund të jenë të rinj ose të njohur si të paqëndrueshëm, dhe nën zhvillim intensiv. Instalimi i tyre mund të shkaktojë humbje të dhënash ose cenim të sigurisë.", "by" : "nga", - "Documentation:" : "Dokumentacioni:", - "Cheers!" : "Gjithë të mirat", - "Forum" : "Forumi", - "Get the apps to sync your files" : "Bëni që aplikacionet të sinkronizojnë skedarët tuaj", - "Show First Run Wizard again" : "Rishfaq përsëri fazat për hapjen e herës së parë", - "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Ju keni përdorur <strong>%s</strong> nga <strong>%s</strong> të mundshme ", + "licensed" : "licencuar sipas", + "Documentation:" : "Dokumentim:", + "User documentation" : "Dokumentim për përdoruesit", + "Admin documentation" : "Dokumentim për përgjegjësit", + "Show description …" : "Shfaq përshkrim …", + "Hide description …" : "Fshihe përshkrimin …", + "This app cannot be installed because the following dependencies are not fulfilled:" : "Ky aplikacion s’mund të instalohet, ngaqë për të nuk plotësohen varësitë vijuese:", + "Enable only for specific groups" : "Aktivizoje vetëm për grupe të veçantë", + "Uninstall App" : "Çinstaloje Aplikacionin", + "Enable experimental apps" : "Aktivizo aplikacione eksperimentale", + "No apps found for your version" : "S’u gjetën aplikacione për versionin tuaj", + "Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Njatjeta,<br><br>thjesht po ju bëjmë të ditur që tani keni një llogar %s.<br><br>Emri juaj i përdoruesit: %s<br>Hyni në të te: <a href=\"%s\">%s</a><br><br>", + "Cheers!" : "Gëzuar!", + "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", + "Administrator documentation" : "Dokumentim për përgjegjës", + "Online documentation" : "Dokumentim në Internet", + "Forum" : "Forum", + "Issue tracker" : "Gjurmues të metash", + "Commercial support" : "Asistencë komerciale", + "Get the apps to sync your files" : "Merrni aplikacionet për njëkohësim të kartelave tuaja", + "Desktop client" : "Klient desktopi", + "Android app" : "Aplikacion për Android", + "iOS app" : "Aplikacion për iOS", + "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Nëse doni ta përkrahni projektin\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">merrni pjesë te zhvillimi i tij</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">përhapni fjalën për të</a>!", + "Show First Run Wizard again" : "Shfaqe sërish Ndihmësin e Herës së Parë", + "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Keni përdorur <strong>%s</strong> nga <strong>%s</strong> tuajat", "Password" : "Fjalëkalim", - "Unable to change your password" : "Nuk është e mundur të ndryshohet fjalëkalimi", - "Current password" : "Fjalëkalimi aktual", + "Unable to change your password" : "S’arrin të ndryshojë fjalëkalimin tuaj", + "Current password" : "Fjalëkalimi i tanishëm", "New password" : "Fjalëkalimi i ri", "Change password" : "Ndrysho fjalëkalimin", + "Full name" : "Emër i plotë", + "No display name set" : "S’është caktuar emër për në ekran", "Email" : "Email", "Your email address" : "Adresa juaj email", - "Profile picture" : "Foto Profili", - "Remove image" : "Fshi imazh", - "Cancel" : "Anullo", - "Choose as profile image" : "Vendos si foto profili", - "Language" : "Gjuha", + "Fill in an email address to enable password recovery and receive notifications" : "Futni një adresë email që të aktivizoni rimarrje fjalëkalimi dhe për të marrë njoftime", + "No email address set" : "S’është caktuar adresë email", + "You are member of the following groups:" : "Jeni anëtar i grupeve vijuese:", + "Profile picture" : "Foto profili", + "Upload new" : "Ngarko të re", + "Select new from Files" : "Përzgjidhni të re prej Kartelash", + "Remove image" : "Hiqe figurën", + "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Ose png, ose jpg. E mira do të ishte katrore, por do të jeni në gjendje ta qethni. Nuk lejohet që kartela të tejkalojë madhësinë maksimum prej 20 MB.", + "Your avatar is provided by your original account." : "Avatari juaj jepet nga llogaria juaj origjinale.", + "Cancel" : "Anuloje", + "Choose as profile image" : "Zgjidhni një figurë profili", + "Language" : "Gjuhë", "Help translate" : "Ndihmoni në përkthim", - "Username" : "Përdoruesi", - "Create" : "Krijo", + "Common Name" : "Emër i Rëndomtë", + "Valid until" : "E vlefshme deri më", + "Issued By" : "Lëshuar Nga", + "Valid until %s" : "E vlefshme deri më %s", + "Import root certificate" : "Importoni dëshmi rrënjë", + "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Krijuar nga {communityopen}bashkësia ownCloud{linkclose}, {githubopen}kodi burim{linkclose} mund të përdoret sipas licencës {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.", + "Show storage location" : "Shfaq vendndodhje depozite", + "Show last log in" : "Shfaq hyrjen e fundit", + "Show user backend" : "Shfaq programin klient të përdoruesit", + "Send email to new user" : "Dërgo email përdoruesi të ri", + "Show email address" : "Shfaq adresë email", + "Username" : "Emër përdoruesi", + "E-Mail" : "Email", + "Create" : "Krijoje", "Admin Recovery Password" : "Rigjetja e fjalëkalimit të Admin", - "Enter the recovery password in order to recover the users files during password change" : "Jepni fjalëkalimin e rigjetjes për të rigjetur skedarët e përdoruesit gjatë ndryshimit të fjalëkalimit", - "Add Group" : "Shto Grup", + "Enter the recovery password in order to recover the users files during password change" : "Jepni fjalëkalim rimarrje që të mund të rimerrni kartela përdoruesi gjatë ndryshimit të fjalëkalimit", + "Add Group" : "Shtoni Grup", "Group" : "Grup", - "Everyone" : "Të gjithë", + "Everyone" : "Kushdo", + "Admins" : "Administratorë", + "Default Quota" : "Kuota Parazgjedhje", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ju lutemi, jepni kuotë depozitimi (psh: \"512 MB\" ose \"12 GB\")", "Unlimited" : "E pakufizuar", "Other" : "Tjetër", - "Full Name" : "Emri i plotë", + "Full Name" : "Emri i Plotë", + "Group Admin for" : "Admin Grupi për", + "Quota" : "Kuota", + "Storage Location" : "Vendndodhje Depozite", + "User Backend" : "Program klient i përdoruesit", "Last Login" : "Hyrja e fundit", - "change full name" : "ndrysho emrin e plotë", - "set new password" : "vendos fjalëkalim të ri", - "Default" : "Paracaktuar" + "change full name" : "ndryshoni emrin e plotë", + "set new password" : "caktoni fjalëkalim të ri", + "change email address" : "ndryshoni adresën email", + "Default" : "Parazgjedhje" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index 9d196ff0abc..4abef20fbae 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -1,107 +1,285 @@ { "translations": { - "Sharing" : "Ndarje", + "APCu" : "APCu", + "Redis" : "Redis", + "Security & setup warnings" : "Sinjalizime sigurie & rregullimi", + "Sharing" : "Ndarje me të tjerët", + "Server-side encryption" : "Fshehtëzim më anë shërbyesi", + "External Storage" : "Depozitim i Jashtëm", "Cron" : "Cron", - "Log" : "Historik aktiviteti", - "Authentication error" : "Gabim autentifikimi", - "Your full name has been changed." : "Emri juaj i plotë ka ndryshuar.", - "Unable to change full name" : "Nuk mund të ndryshohet emri i plotë", - "Couldn't remove app." : "Nuk mund të hiqet aplikacioni.", + "Email server" : "Shërbyes email-esh", + "Log" : "Regjistër", + "Tips & tricks" : "Ndihmëza & rrengje", + "Updates" : "Përditësime", + "Authentication error" : "Gabim mirëfilltësimi", + "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", + "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", + "Couldn't remove app." : "S’hoqi dot aplikacionin.", "Language changed" : "Gjuha u ndryshua", "Invalid request" : "Kërkesë e pavlefshme", - "Admins can't remove themself from the admin group" : "Administratorët nuk mund të heqin vehten prej grupit admin", - "Unable to add user to group %s" : "E pamundur t'i shtohet përdoruesi grupit %s", - "Unable to remove user from group %s" : "E pamundur të hiqet përdoruesi nga grupi %s", - "Couldn't update app." : "E pamundur të përditësohet app.", + "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", + "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", + "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", + "Couldn't update app." : "S’përditësoi dot aplikacionin.", "Wrong password" : "Fjalëkalim i gabuar", - "No user supplied" : "Nuk është dhënë asnjë përdorues", - "Please provide an admin recovery password, otherwise all user data will be lost" : "Ju lutem jepni një fjalëkalim restaurimi administrativ, në të kundërt të gjitha të dhënat do humbasin", - "Wrong admin recovery password. Please check the password and try again." : "Fjalëkalim i gabuar restaurimi administrativ. Ju lutem kontrolloni fjalëkalimin dhe provoni përsëri.", - "Unable to change password" : "Fjalëkalimi nuk mund të ndryshohet", - "Enabled" : "Aktivizuar", - "Not enabled" : "Jo aktive", + "No user supplied" : "S’u dha përdorues", + "Please provide an admin recovery password, otherwise all user data will be lost" : "Ju lutemi, jepni një fjalëkalim rikthimesh për përgjegjësin, në të kundërt të gjitha të dhënat do të humbasin", + "Wrong admin recovery password. Please check the password and try again." : "Fjalëkalim i gabuar rikthimesh për përgjegjësin. Ju lutemi, kontrolloni fjalëkalimin dhe provoni përsëri.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Programi klient s’mbulon ndryshime fjalëkalimi, por kyçi i përdoruesi për fshehtëzime u përditësua me sukses.", + "Unable to change password" : "S’arrin të ndryshojë fjalëkalimin", + "Enabled" : "E aktivizuar", + "Not enabled" : "E paaktivizuar", + "installing and updating apps via the app store or Federated Cloud Sharing" : "instalim dhe përditësim aplikacionesh përmes shitores së aplikacioneve ose Federated Cloud Sharing", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL-ja po përdor një version %s të vjetruar (%s). Ju lutemi, përditësoni sistemin tuaj operativ ose përndryshe veçori të tilla si %s nuk do të punojnë në mënyrë të qëndrueshme.", + "A problem occurred, please check your log files (Error: %s)" : "Ndodhi një gabim, ju lutemi, kontrolloni kartelat tuaja regjistër (Error: %s)", + "Migration Completed" : "Migrimi u Plotësua", + "Group already exists." : "Grupi ekziston tashmë.", + "Unable to add group." : "S’arrin të shtojë grup.", + "Unable to delete group." : "S’arrin të fshijë grup.", + "log-level out of allowed range" : "nivel regjistrimi jashtë intervalit të lejuar", "Saved" : "U ruajt", - "test email settings" : "parametra test për email", + "test email settings" : "testoni rregullime email-i", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ndodhi një gabim gjatë dërgimit të email-it. Ju lutemi, rishikoni rregullimet tuaja. (Error: %s)", "Email sent" : "Email-i u dërgua", - "Email saved" : "Email u ruajt", - "Sending..." : "Duke dërguar", - "All" : "Të gjitha", - "Please wait...." : "Ju lutem prisni...", - "Disable" : "Çaktivizo", - "Enable" : "Aktivizo", - "Updating...." : "Duke përditësuar...", - "Error while updating app" : "Gabim gjatë përditësimit të app", - "Updated" : "I përditësuar", - "Select a profile picture" : "Zgjidh një foto profili", + "You need to set your user email before being able to send test emails." : "Lypset të caktoni email-in tuaj si përdorues, përpara se të jeni në gjendje të dërgoni email-e provë.", + "Invalid mail address" : "Adresë email e pavlefshme", + "A user with that name already exists." : "Ka tashmë një përdorues me këtë emër.", + "Unable to create user." : "S’arrin të krijojë përdoruesi.", + "Your %s account was created" : "Llogaria juaj %s u krijua", + "Unable to delete user." : "S’arrin të fshijë përdorues.", + "Forbidden" : "E ndaluar", + "Invalid user" : "Përdorues i pavlefshëm", + "Unable to change mail address" : "S’arrin të ndryshojë adresë email", + "Email saved" : "Email-i u ruajt", + "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", + "Add trusted domain" : "Shtoni përkatësi të besuar", + "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", + "Migration started …" : "Migrimi filloi …", + "Sending..." : "Po dërgohet…", + "Official" : "Zyrtare", + "Approved" : "Të miratuara", + "Experimental" : "Eksperimentale", + "All" : "Krejt", + "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplikacionet zyrtare ndërtohen brenda bashkësisë ownCloud. Ato ofrojnë funksione qendrore për ownCloud dhe janë gati për t’u përdorur në prodhim.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikacionet e miratuara ndërtohen nga zhvillues të besuar dhe kanë kaluar një kontroll të përciptë sigurie. Mirëmbahen aktivisht në një depo të hapur kodi dhe mirëmbajtësit e tyre i konsiderojnë të qëndrueshme për përdorime nga të rastit deri në ato normale.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ky aplikacion s’është kontrolluar për probleme sigurie dhe është i ri ose i njohur si i paqëndrueshëm. Instalojeni duke e mbajtur vetë përgjegjësinë.", + "Update to %s" : "Përditësoje me %s", + "Please wait...." : "Ju lutemi, prisni…", + "Error while disabling app" : "Gabim në çaktivizimin e aplikacionit", + "Disable" : "Çaktivizoje", + "Enable" : "Aktivizoje", + "Error while enabling app" : "Gabim në aktivizimin e aplikacionit", + "Updating...." : "Po përditësohet…", + "Error while updating app" : "Gabim gjatë përditësimit të aplikacionit", + "Updated" : "U përditësua", + "Uninstalling ...." : "Po çinstalohet…", + "Error while uninstalling app" : "Gabim në çinstalimin e aplikacionit", + "Uninstall" : "Çinstaloje", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikacioni është aktivizuar, por lyp të përditësohet. Do të ridrejtoheni te faqja e përditësimeve brenda 5 sekondash.", + "App update" : "Përditësim aplikacioni", + "An error occurred: {message}" : "Ndodhi një gabim: {message}", + "Select a profile picture" : "Përzgjidhni një foto profili", "Very weak password" : "Fjalëkalim shumë i dobët", "Weak password" : "Fjalëkalim i dobët", - "So-so password" : "Fjalëkalim i pranueshëm", + "So-so password" : "Fjalëkalim çka", "Good password" : "Fjalëkalim i mirë", - "Strong password" : "Fjalëkalim shumë i mirë", - "Delete" : "Fshi", - "Groups" : "Grupet", + "Strong password" : "Fjalëkalim i fortë", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ndodhi një gabim. Ju lutemi, ngarkoni një dëshmi PEM të koduar me ASCII.", + "Valid until {date}" : "E vlefshme deri më {date}", + "Delete" : "Fshije", + "Groups" : "Grupe", + "Unable to delete {objName}" : "S’arrin të fshijë {objName}", + "Error creating group" : "Gabim gjatë krijimit të grupit", + "A valid group name must be provided" : "Duhet dhënë një emër i vlefshëm grupi", "deleted {groupName}" : "u fshi {groupName}", - "undo" : "anullo veprimin", - "never" : "asnjëherë", + "undo" : "zhbëje", + "no group" : "pa grup", + "never" : "kurrë", "deleted {userName}" : "u fshi {userName}", "add group" : "shto grup", - "A valid username must be provided" : "Duhet të jepni një emër të vlefshëm përdoruesi", + "Changing the password will result in data loss, because data recovery is not available for this user" : "Ndryshimi i fjalëkalimit do të sjellë humbje të dhënash, ngaqë rikthimi i të dhënave s’është i përdorshëm për këtë përdorues", + "A valid username must be provided" : "Duhet dhënë një emër të vlefshëm përdoruesi", "Error creating user" : "Gabim gjatë krijimit të përdoruesit", - "A valid password must be provided" : "Duhet të jepni një fjalëkalim te vlefshëm", + "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm", + "A valid email must be provided" : "Duhet dhënë një email i vlefshëm", "__language_name__" : "Shqip", - "None" : "Asgjë", - "Login" : "Hyr", - "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me këmbngulje të aktivizoni këtë modul për të arritur rezultate më të mirame identifikimin e tipeve te ndryshme MIME.", - "Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin share API", - "Allow public uploads" : "Lejo ngarkimin publik", - "Expire after " : "Skadon pas", - "days" : "diitë", - "Allow resharing" : "Lejo ri-ndarjen", + "Sync clients" : "Klientë njëkohësimi", + "Personal info" : "Të dhëna personale", + "SSL root certificates" : "Dëshmi SSL rrënjë", + "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", + "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", + "Warnings, errors and fatal issues" : "Sinjalizime, gabime dhe probleme fatale", + "Errors and fatal issues" : "Gabime dhe probleme fatale", + "Fatal issues only" : "Vetëm probleme fatale", + "None" : "Asnjë", + "Login" : "Hyrje", + "Plain" : "E thjeshtë", + "SSL" : "SSL", + "TLS" : "TLS", + "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP-ja nuk duket të jetë rregulluar si duhet për të kërkuar ndryshore mjedisi sistemi. Testi me getenv(\"PATH\") kthen vetëm një përgjigje të zbrazët.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Ju lutemi, kontrolloni <a target=\"_blank\" href=\"%s\">dokumentimin e instalimit ↗</a> për shënime mbi formësimin e PHP-së dhe formësimin e PHP-së të shërbyesi juaj, veçanërisht kur përdoret php-fpm.", + "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Rregullimi Vetëm-Lexim u aktivizua. Kjo parandalon rregullimin e disa parametrave përmes ndërfaqes web. Më tej, për çdo përditësim kartela lyp të kalohet dorazi si e shkrueshme.", + "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Duket se PHP-ja është rregulluar që të heqë blloqe të brendshme dokumentimi. Kjo do t’i bëjë të papërdrshme disa aplikacione bazë.", + "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.", + "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Shërbyesi juaj xhiron nën Microsoft Windows. Këshillojmë fort Linux-in për punim optimal nga ana e përdoruesit.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "Ka të instaluar %1$s nën versionin %2$s, për arsye qëndrueshmërie dhe performance këshillojmë të përditësohet me një version %1$s më të ri.", + "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me forcë ta aktivizoni këtë modul, për të patur përfundimet më të mira në zbulim llojesh MIME.", + "System locale can not be set to a one which supports UTF-8." : "Si vendore sistemi nuk mund të caktohet një që mbulon UTF-8.", + "This means that there might be problems with certain characters in file names." : "Kjo do të thotë që mund të ketë probleme me disa shenja në emra kartelash.", + "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Këshillojmë me forcë instalimin në sistemin tuaj të paketave të domosdoshme për mbulim të një prej vendoreve vijuese: %s.", + "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Nëse instalimi juaj nuk është bërë në rrënjë të përkatësisë dhe përdor cron sistemi, mund të ketë probleme me prodhimin e URL-së. Që të shmangen këto probleme, ju lutemi, jepini mundësisë \"overwrite.cli.url\" te kartela juaj config.php vlerën e shtegut webroot të instalimit tuaj (E këshillueshme: \"%s\")", + "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "S’qe e mundur të përmbushej akti cron përmes CLI-së. U shfaqën gabimet teknike vijuese:", + "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ju lutemi, rihidhuni një sy <a target=\"_blank\" href=\"%s\">udhërrëfyesve të instalimit ↗</a>, dhe kontrolloni te <a href=\"#log-section\">regjistri</a> për çfarëdo gabimesh apo sinjalizimesh.", + "All checks passed." : "I kaloi krejt kontrollet.", + "Open documentation" : "Hapni dokumentimin", + "Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin API Share", + "Allow users to share via link" : "Lejoji përdoruesit të ndajnë me të tjerët përmes lidhjesh", + "Enforce password protection" : "Detyro mbrojtje me fjalëkalim", + "Allow public uploads" : "Lejo ngarkime publike", + "Allow users to send mail notification for shared files" : "Lejoju përdoruesve të dërgojnë njoftime me email për kartela të ndara me të tjerët", + "Set default expiration date" : "Caktoni datë parazgjedhje skadimi", + "Expire after " : "Skadon pas ", + "days" : "ditësh", + "Enforce expiration date" : "Detyro datë skadimi", + "Allow resharing" : "Lejo rindarje", + "Restrict users to only share with users in their groups" : "Përdoruesit kufizoji të ndajnë gjëra vetëm me përdorues në grupin e tyre", + "Allow users to send mail notification for shared files to other users" : "Lejoju përdoruesve t’u dërgojnë përdoruesve të tjerë njoftime me email për kartela të ndara me të tjerët", + "Exclude groups from sharing" : "Përjashtoni grupe nga ndarjet", + "These groups will still be able to receive shares, but not to initiate them." : "Këto grupe prapë do të jenë në gjendje të marrin ndarje nga të tjerët, por jo të fillojnë të tilla.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Lejo vetëplotësim emra përdoruesish te dialogu i ndarjeve me të tjerët. Nëse kjo është e çaktivizuar, do të duhet të jepen emra përdoruesish.", + "Last cron job execution: %s." : "Përmbushja e fundit e aktit cron: %s.", + "Last cron job execution: %s. Something seems wrong." : "Përmbushja e fundit e aktit cron: %s. Duket se nuk shkon diçka.", + "Cron was not executed yet!" : "Cron-i s’qe ekzekutuar ende!", "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara", - "Send mode" : "Mënyra e dërgimit", - "Encryption" : "Kodifikimi", + "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php është regjistruar te një shërbim webcron që ta aktivizojë cron.php-në çdo 15 minuta përmes http-je.", + "Use system's cron service to call the cron.php file every 15 minutes." : "Përdorni shërbimin cron të sistemit që ta aktivizojë cron.php-në çdo 15 minuta.", + "Enable server-side encryption" : "Aktivizo fshehtëzim më anë të shërbyesit", + "Please read carefully before activating server-side encryption: " : "Ju lutemi, lexoni me kujdes përpara aktivizimit të fshehtëzimeve më anë shërbyesi: ", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Pasi të jetë aktivizuar fshehtëzimi, krejt kartelat e ngarkuara te shërbyesi nga kjo pikë e tutje do të fshehtëzohen pasi të jenë depozituar në shërbyes. Çaktivizimi i fshehtëzimit në një datë të mëvonshme do të jetë i mundur vetëm nëse moduli aktiv i fshehtëzimeve e mbulon këtë funksion, dhe nëse plotësohen krejt parakushtet (p.sh. caktimi i një kyçi rimarrjesh).", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "Fshehtëzimi, dhe vetëm kaq, s’garanton sigurinë e sistemit. Ju lutemi, për më tepër të dhëna se si funksionon aplikacioni i fshehtëzimeve, dhe për raste përdorimi që mbulon, lexoni dokumentimin e ownCloud-it.", + "Be aware that encryption always increases the file size." : "Kini parasysh që fshehtëzimi e rrit gjithnjë madhësinë e kartelës.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Është gjithmonë ide e mirë të krijohen kopjeruajtje të rregullta të të dhënave tuaja, në rast fshehtëzimi sigurohuni që bëni kopjeruajtje të kyçeve të fshehtëzimit, tok me të dhënat tuaja.", + "This is the final warning: Do you really want to enable encryption?" : "Ky është sinjalizimi përfundimtar: Doni vërtet të aktivizohet fshehtëzimi?", + "Enable encryption" : "Aktivizoni fshehtëzim", + "No encryption module loaded, please enable an encryption module in the app menu." : "S’ka të ngarkuar modul fshehtëzimi, ju lutemi, aktivizoni një modul fshehtëzimi që nga menuja e aplikacionit.", + "Select default encryption module:" : "Përzgjidhni modul parazgjedhje fshehtëzimi:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Lypset të migroni kyçet tuaj të fshehtëzimit nga fshehtëzimi i vjetër (ownCloud <= 8.0) te i riu. Ju lutemi, aktivizoni \"Modul parazgjedhje fshehtëzimesh\" dhe ekzekutoni 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Lypset të migroni kyçet tuaj të fshehtëzimit nga fshehtëzimi i vjetër (ownCloud <= 8.0) te i riu.", + "Start migration" : "Fillo migrimin", + "This is used for sending out notifications." : "Ky përdoret për të dërguar njoftime.", + "Send mode" : "Mënyrë dërgimi", + "Encryption" : "Fshehtëzim", "From address" : "Nga adresa", - "mail" : "postë", - "Server address" : "Adresa e serverit", - "Port" : "Porta", - "Credentials" : "Kredencialet", + "mail" : "email", + "Authentication method" : "Metodë mirëfilltësimi", + "Authentication required" : "Lypset mirëfilltësim", + "Server address" : "Adresë shërbyesi", + "Port" : "Portë", + "Credentials" : "Kredenciale", + "SMTP Username" : "Emër përdoruesi SMTP", + "SMTP Password" : "Fjalëkalim SMTP", + "Store credentials" : "Depozitoji kredencialet", + "Test email settings" : "Testoni rregullimet e email-it", "Send email" : "Dërgo email", - "Log level" : "Niveli i Historikut", + "Log level" : "Shkallë regjistrimi", + "Download logfile" : "Shkarkoni kartelën regjistër", "More" : "Më tepër", - "Less" : "M'pak", - "Version" : "Versioni", + "Less" : "Më pak", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Kartela regjistër është më e madhe se 100 MB. Shkarkimi i saj mund të hajë ca kohë!", + "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Si bazë të dhënash përdoret SQLite. Për instalime më të ngarkuara, këshillojmë të kalohet në një program tjetër baze të dhënash.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Përdorimi i SQLite-it nuk këshillohet veçanërisht kur përdoret klienti desktop për njëkohësim kartelash.", + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Për të kaluar te një tjetër bazë të dhënash përdorni mjetin rresht urdhrash: 'occ db:convert-type', ose shihni <a target=\"_blank\" href=\"%s\">dokumentimin ↗</a>.", + "How to do backups" : "Si të bëhen kopjeruajtje", + "Advanced monitoring" : "Mbikëqyrje e mëtejshme", + "Performance tuning" : "Përimtime performance", + "Improving the config.php" : "Si të përmirësohet config.php", + "Theming" : "Ndryshim teme grafike", + "Hardening and security guidance" : "Udhëzime për forcim dhe siguri", + "Version" : "Version", + "Developer documentation" : "Dokumentim për zhvillues", + "Experimental applications ahead" : "Keni përpara aplikacione eksperimentale", + "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Aplikacionet eksperimentale nuk kontrollohen për probleme sigurie, mund të jenë të rinj ose të njohur si të paqëndrueshëm, dhe nën zhvillim intensiv. Instalimi i tyre mund të shkaktojë humbje të dhënash ose cenim të sigurisë.", "by" : "nga", - "Documentation:" : "Dokumentacioni:", - "Cheers!" : "Gjithë të mirat", - "Forum" : "Forumi", - "Get the apps to sync your files" : "Bëni që aplikacionet të sinkronizojnë skedarët tuaj", - "Show First Run Wizard again" : "Rishfaq përsëri fazat për hapjen e herës së parë", - "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Ju keni përdorur <strong>%s</strong> nga <strong>%s</strong> të mundshme ", + "licensed" : "licencuar sipas", + "Documentation:" : "Dokumentim:", + "User documentation" : "Dokumentim për përdoruesit", + "Admin documentation" : "Dokumentim për përgjegjësit", + "Show description …" : "Shfaq përshkrim …", + "Hide description …" : "Fshihe përshkrimin …", + "This app cannot be installed because the following dependencies are not fulfilled:" : "Ky aplikacion s’mund të instalohet, ngaqë për të nuk plotësohen varësitë vijuese:", + "Enable only for specific groups" : "Aktivizoje vetëm për grupe të veçantë", + "Uninstall App" : "Çinstaloje Aplikacionin", + "Enable experimental apps" : "Aktivizo aplikacione eksperimentale", + "No apps found for your version" : "S’u gjetën aplikacione për versionin tuaj", + "Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Njatjeta,<br><br>thjesht po ju bëjmë të ditur që tani keni një llogar %s.<br><br>Emri juaj i përdoruesit: %s<br>Hyni në të te: <a href=\"%s\">%s</a><br><br>", + "Cheers!" : "Gëzuar!", + "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", + "Administrator documentation" : "Dokumentim për përgjegjës", + "Online documentation" : "Dokumentim në Internet", + "Forum" : "Forum", + "Issue tracker" : "Gjurmues të metash", + "Commercial support" : "Asistencë komerciale", + "Get the apps to sync your files" : "Merrni aplikacionet për njëkohësim të kartelave tuaja", + "Desktop client" : "Klient desktopi", + "Android app" : "Aplikacion për Android", + "iOS app" : "Aplikacion për iOS", + "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Nëse doni ta përkrahni projektin\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">merrni pjesë te zhvillimi i tij</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">përhapni fjalën për të</a>!", + "Show First Run Wizard again" : "Shfaqe sërish Ndihmësin e Herës së Parë", + "You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Keni përdorur <strong>%s</strong> nga <strong>%s</strong> tuajat", "Password" : "Fjalëkalim", - "Unable to change your password" : "Nuk është e mundur të ndryshohet fjalëkalimi", - "Current password" : "Fjalëkalimi aktual", + "Unable to change your password" : "S’arrin të ndryshojë fjalëkalimin tuaj", + "Current password" : "Fjalëkalimi i tanishëm", "New password" : "Fjalëkalimi i ri", "Change password" : "Ndrysho fjalëkalimin", + "Full name" : "Emër i plotë", + "No display name set" : "S’është caktuar emër për në ekran", "Email" : "Email", "Your email address" : "Adresa juaj email", - "Profile picture" : "Foto Profili", - "Remove image" : "Fshi imazh", - "Cancel" : "Anullo", - "Choose as profile image" : "Vendos si foto profili", - "Language" : "Gjuha", + "Fill in an email address to enable password recovery and receive notifications" : "Futni një adresë email që të aktivizoni rimarrje fjalëkalimi dhe për të marrë njoftime", + "No email address set" : "S’është caktuar adresë email", + "You are member of the following groups:" : "Jeni anëtar i grupeve vijuese:", + "Profile picture" : "Foto profili", + "Upload new" : "Ngarko të re", + "Select new from Files" : "Përzgjidhni të re prej Kartelash", + "Remove image" : "Hiqe figurën", + "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Ose png, ose jpg. E mira do të ishte katrore, por do të jeni në gjendje ta qethni. Nuk lejohet që kartela të tejkalojë madhësinë maksimum prej 20 MB.", + "Your avatar is provided by your original account." : "Avatari juaj jepet nga llogaria juaj origjinale.", + "Cancel" : "Anuloje", + "Choose as profile image" : "Zgjidhni një figurë profili", + "Language" : "Gjuhë", "Help translate" : "Ndihmoni në përkthim", - "Username" : "Përdoruesi", - "Create" : "Krijo", + "Common Name" : "Emër i Rëndomtë", + "Valid until" : "E vlefshme deri më", + "Issued By" : "Lëshuar Nga", + "Valid until %s" : "E vlefshme deri më %s", + "Import root certificate" : "Importoni dëshmi rrënjë", + "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Krijuar nga {communityopen}bashkësia ownCloud{linkclose}, {githubopen}kodi burim{linkclose} mund të përdoret sipas licencës {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.", + "Show storage location" : "Shfaq vendndodhje depozite", + "Show last log in" : "Shfaq hyrjen e fundit", + "Show user backend" : "Shfaq programin klient të përdoruesit", + "Send email to new user" : "Dërgo email përdoruesi të ri", + "Show email address" : "Shfaq adresë email", + "Username" : "Emër përdoruesi", + "E-Mail" : "Email", + "Create" : "Krijoje", "Admin Recovery Password" : "Rigjetja e fjalëkalimit të Admin", - "Enter the recovery password in order to recover the users files during password change" : "Jepni fjalëkalimin e rigjetjes për të rigjetur skedarët e përdoruesit gjatë ndryshimit të fjalëkalimit", - "Add Group" : "Shto Grup", + "Enter the recovery password in order to recover the users files during password change" : "Jepni fjalëkalim rimarrje që të mund të rimerrni kartela përdoruesi gjatë ndryshimit të fjalëkalimit", + "Add Group" : "Shtoni Grup", "Group" : "Grup", - "Everyone" : "Të gjithë", + "Everyone" : "Kushdo", + "Admins" : "Administratorë", + "Default Quota" : "Kuota Parazgjedhje", + "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Ju lutemi, jepni kuotë depozitimi (psh: \"512 MB\" ose \"12 GB\")", "Unlimited" : "E pakufizuar", "Other" : "Tjetër", - "Full Name" : "Emri i plotë", + "Full Name" : "Emri i Plotë", + "Group Admin for" : "Admin Grupi për", + "Quota" : "Kuota", + "Storage Location" : "Vendndodhje Depozite", + "User Backend" : "Program klient i përdoruesit", "Last Login" : "Hyrja e fundit", - "change full name" : "ndrysho emrin e plotë", - "set new password" : "vendos fjalëkalim të ri", - "Default" : "Paracaktuar" + "change full name" : "ndryshoni emrin e plotë", + "set new password" : "caktoni fjalëkalim të ri", + "change email address" : "ndryshoni adresën email", + "Default" : "Parazgjedhje" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 38026284af1..42901082535 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -81,9 +81,9 @@ OC.L10N.register( "So-so password" : "Осредња лозинка", "Good password" : "Добра лозинка", "Strong password" : "Јака лозинка", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Дошло је до грешке. Отпремите АСКИ кодирани ПЕМ сертификат.", "Valid until {date}" : "Важи до {date}", "Delete" : "Обриши", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Дошло је до грешке. Отпремите АСКИ кодирани ПЕМ сертификат.", "Groups" : "Групе", "Unable to delete {objName}" : "Не могу да обришем {objName}", "Error creating group" : "Грешка при прављењу групе", diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index 5206512092d..44df955b25b 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -79,9 +79,9 @@ "So-so password" : "Осредња лозинка", "Good password" : "Добра лозинка", "Strong password" : "Јака лозинка", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Дошло је до грешке. Отпремите АСКИ кодирани ПЕМ сертификат.", "Valid until {date}" : "Важи до {date}", "Delete" : "Обриши", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Дошло је до грешке. Отпремите АСКИ кодирани ПЕМ сертификат.", "Groups" : "Групе", "Unable to delete {objName}" : "Не могу да обришем {objName}", "Error creating group" : "Грешка при прављењу групе", diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index 62f0164c787..2435bf932c6 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -77,6 +77,8 @@ OC.L10N.register( "Uninstalling ...." : "กำลังถอนการติดตั้ง ...", "Error while uninstalling app" : "เกิดข้อผิดพลาดขณะถอนการติดตั้งแอพพลิเคชัน", "Uninstall" : "ถอนการติดตั้ง", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "แอพฯจะต้องเปิดใช้งานก่อนทำการอัพเดท คุณจะถูกนำไปยังหน้าอัพเดทใน 5 วินาที", + "App update" : "อัพเดทแอพฯ", "An error occurred: {message}" : "เกิดข้อผิดพลาด: {message}", "Select a profile picture" : "เลือกรูปภาพโปรไฟล์", "Very weak password" : "รหัสผ่านระดับต่ำมาก", @@ -84,9 +86,9 @@ OC.L10N.register( "So-so password" : "รหัสผ่านระดับปกติ", "Good password" : "รหัสผ่านระดับดี", "Strong password" : "รหัสผ่านระดับดีมาก", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "เกิดข้อผิดพลาด กรุณาอัพโหลดใบรับรองเข้ารหัส ASCII PEM", "Valid until {date}" : "ใช้ได้จนถึงวันที่ {date}", "Delete" : "ลบ", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "เกิดข้อผิดพลาด กรุณาอัพโหลดใบรับรองเข้ารหัส ASCII PEM", "Groups" : "กลุ่ม", "Unable to delete {objName}" : "ไม่สามารถลบ {objName}", "Error creating group" : "ข้อผิดพลาดขณะกำลังสร้างกลุ่ม", @@ -149,6 +151,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "อนุญาตให้ผู้ใช้ส่งการแจ้งเตือนอีเมลสำหรับไฟล์ที่แชร์กับผู้ใช้อื่นๆ", "Exclude groups from sharing" : "ไม่รวมกลุ่มที่แชร์", "These groups will still be able to receive shares, but not to initiate them." : "กลุ่มนี้จะยังคงสามารถได้รับการแชร์ แต่พวกเขาจะไม่รู้จักมัน", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "อนุญาตให้เติมชื่อผู้ใช้ในกล่องตอบโต้อัตโนมัติ ถ้านี้ถูกปิดใช้งานชื่อผู้ใช้จะต้องกรอกเอง", "Last cron job execution: %s." : "การดำเนินการ cron job ล่าสุด: %s", "Last cron job execution: %s. Something seems wrong." : "การดำเนินการ cron job ล่าสุด: %s ดูเหมือนมีบางสิ่งไม่ถูกต้อง", "Cron was not executed yet!" : "Cron ไม่ได้ถูกดำเนินการ!", @@ -157,10 +160,10 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "บริการ cron ของระบบจะเรียกไฟล์ cron.php ทุกq 15 นาที", "Enable server-side encryption" : "เปิดการใช้งานเข้ารหัสฝั่งเซิร์ฟเวอร์", "Please read carefully before activating server-side encryption: " : "กรุณาอ่านอย่างละเอียดก่อนที่จะเปิดใช้งานการเข้ารหัสฝั่งเซิร์ฟเวอร์:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "การเข้ารหัสฝั่งเซิร์ฟเวอร์เป็นกระบวนการหนึ่ง เมื่อมีการเปิดใช้การเข้ารหัสไฟล์ทั้งหมดและมันจะเป็นไปไม่ได้ที่จะปิดการใช้งานการเข้ารหัสในภายหลัง", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ทุกคนที่มีสิทธิในการเข้าถึงเซิร์ฟเวอร์ ownCloud คุณสามารถถอดรหัสไฟล์ของคุณโดยการสกัดกั้นการร้องขอหรือการอ่านรหัสผ่านของผู้ใช้ซึ่งจะถูกเก็บไว้ในเซสชั่นไฟล์ข้อความธรรมดา การเข้ารหัสฝั่งเซิร์ฟเวอร์จึงไม่ได้ป้องกันผู้ดูแลระบบที่เป็นอันตราย แต่จะเป็นประโยชน์สำหรับการปกป้องข้อมูลของคุณในการจัดเก็บข้อมูลจากภายนอก", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "ทั้งนี้ขึ้นอยู่กับโมดูลการเข้ารหัสที่เกิดขึ้นจริงขนาดไฟล์ทั่วไปจะเพิ่มขึ้น (35%% หรือมากกว่าเมื่อใช้โมดูลเริ่มต้น)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "คุณควรสำรองข้อมูลคีย์การเข้ารหัสอย่างสม่ำเสมอ เพื่อป้องกันการสูญเสียข้อมูลอย่างถาวร (data/<user>/files_encryption และ data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "เมื่อเปิดใช้งานการเข้ารหัส ไฟล์ทั้งหมดที่อัพโหลดไปยังเซิร์ฟเวอร์นั้นจะถูกเข้ารหัสในส่วนของเซิฟเวอร์ มันเป็นไปได้ที่จะปิดใช้งานการเข้ารหัสในภายหลัง ถ้าเปิดใช้ฟังก์ชั่นการสนับสนุนโมดูลการเข้ารหัสที่และเงื่อนไขก่อน (เช่น การตั้งค่าคีย์กู้คืน)", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "การเข้ารหัสลับเพียงอย่างเดียวไม่ได้รับประกันความปลอดภัยของระบบ โปรดดูเอกสาร ownCloud สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเข้ารหัสแอพพลิเคชันและกรณีการสนับสนุน", + "Be aware that encryption always increases the file size." : "โปรดทราบว่าหากเข้ารหัสไฟล์จะทำให้ขนาดของไฟล์ใหญ่ขึ้น", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "มันจะดีถ้าคุณสำรองข้อมูลบ่อยๆ ในกรณีของการเข้ารหัสโปรดแน่ใจว่าจะสำรองคีย์การเข้ารหัสลับพร้อมกับข้อมูลของคุณ", "This is the final warning: Do you really want to enable encryption?" : "นี่คือการเตือนครั้งสุดท้าย: คุณต้องการที่จะเปิดใช้การเข้ารหัส?", "Enable encryption" : "เปิดใช้งานการเข้ารหัส", "No encryption module loaded, please enable an encryption module in the app menu." : "ไม่มีโมดูลการเข้ารหัสโหลดโปรดเปิดใช้งานโมดูลการเข้ารหัสในเมนูแอพฯ", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index 92670ee82d8..85f56bca0cb 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -75,6 +75,8 @@ "Uninstalling ...." : "กำลังถอนการติดตั้ง ...", "Error while uninstalling app" : "เกิดข้อผิดพลาดขณะถอนการติดตั้งแอพพลิเคชัน", "Uninstall" : "ถอนการติดตั้ง", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "แอพฯจะต้องเปิดใช้งานก่อนทำการอัพเดท คุณจะถูกนำไปยังหน้าอัพเดทใน 5 วินาที", + "App update" : "อัพเดทแอพฯ", "An error occurred: {message}" : "เกิดข้อผิดพลาด: {message}", "Select a profile picture" : "เลือกรูปภาพโปรไฟล์", "Very weak password" : "รหัสผ่านระดับต่ำมาก", @@ -82,9 +84,9 @@ "So-so password" : "รหัสผ่านระดับปกติ", "Good password" : "รหัสผ่านระดับดี", "Strong password" : "รหัสผ่านระดับดีมาก", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "เกิดข้อผิดพลาด กรุณาอัพโหลดใบรับรองเข้ารหัส ASCII PEM", "Valid until {date}" : "ใช้ได้จนถึงวันที่ {date}", "Delete" : "ลบ", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "เกิดข้อผิดพลาด กรุณาอัพโหลดใบรับรองเข้ารหัส ASCII PEM", "Groups" : "กลุ่ม", "Unable to delete {objName}" : "ไม่สามารถลบ {objName}", "Error creating group" : "ข้อผิดพลาดขณะกำลังสร้างกลุ่ม", @@ -147,6 +149,7 @@ "Allow users to send mail notification for shared files to other users" : "อนุญาตให้ผู้ใช้ส่งการแจ้งเตือนอีเมลสำหรับไฟล์ที่แชร์กับผู้ใช้อื่นๆ", "Exclude groups from sharing" : "ไม่รวมกลุ่มที่แชร์", "These groups will still be able to receive shares, but not to initiate them." : "กลุ่มนี้จะยังคงสามารถได้รับการแชร์ แต่พวกเขาจะไม่รู้จักมัน", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "อนุญาตให้เติมชื่อผู้ใช้ในกล่องตอบโต้อัตโนมัติ ถ้านี้ถูกปิดใช้งานชื่อผู้ใช้จะต้องกรอกเอง", "Last cron job execution: %s." : "การดำเนินการ cron job ล่าสุด: %s", "Last cron job execution: %s. Something seems wrong." : "การดำเนินการ cron job ล่าสุด: %s ดูเหมือนมีบางสิ่งไม่ถูกต้อง", "Cron was not executed yet!" : "Cron ไม่ได้ถูกดำเนินการ!", @@ -155,10 +158,10 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "บริการ cron ของระบบจะเรียกไฟล์ cron.php ทุกq 15 นาที", "Enable server-side encryption" : "เปิดการใช้งานเข้ารหัสฝั่งเซิร์ฟเวอร์", "Please read carefully before activating server-side encryption: " : "กรุณาอ่านอย่างละเอียดก่อนที่จะเปิดใช้งานการเข้ารหัสฝั่งเซิร์ฟเวอร์:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "การเข้ารหัสฝั่งเซิร์ฟเวอร์เป็นกระบวนการหนึ่ง เมื่อมีการเปิดใช้การเข้ารหัสไฟล์ทั้งหมดและมันจะเป็นไปไม่ได้ที่จะปิดการใช้งานการเข้ารหัสในภายหลัง", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ทุกคนที่มีสิทธิในการเข้าถึงเซิร์ฟเวอร์ ownCloud คุณสามารถถอดรหัสไฟล์ของคุณโดยการสกัดกั้นการร้องขอหรือการอ่านรหัสผ่านของผู้ใช้ซึ่งจะถูกเก็บไว้ในเซสชั่นไฟล์ข้อความธรรมดา การเข้ารหัสฝั่งเซิร์ฟเวอร์จึงไม่ได้ป้องกันผู้ดูแลระบบที่เป็นอันตราย แต่จะเป็นประโยชน์สำหรับการปกป้องข้อมูลของคุณในการจัดเก็บข้อมูลจากภายนอก", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "ทั้งนี้ขึ้นอยู่กับโมดูลการเข้ารหัสที่เกิดขึ้นจริงขนาดไฟล์ทั่วไปจะเพิ่มขึ้น (35%% หรือมากกว่าเมื่อใช้โมดูลเริ่มต้น)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "คุณควรสำรองข้อมูลคีย์การเข้ารหัสอย่างสม่ำเสมอ เพื่อป้องกันการสูญเสียข้อมูลอย่างถาวร (data/<user>/files_encryption และ data/files_encryption)", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "เมื่อเปิดใช้งานการเข้ารหัส ไฟล์ทั้งหมดที่อัพโหลดไปยังเซิร์ฟเวอร์นั้นจะถูกเข้ารหัสในส่วนของเซิฟเวอร์ มันเป็นไปได้ที่จะปิดใช้งานการเข้ารหัสในภายหลัง ถ้าเปิดใช้ฟังก์ชั่นการสนับสนุนโมดูลการเข้ารหัสที่และเงื่อนไขก่อน (เช่น การตั้งค่าคีย์กู้คืน)", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "การเข้ารหัสลับเพียงอย่างเดียวไม่ได้รับประกันความปลอดภัยของระบบ โปรดดูเอกสาร ownCloud สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเข้ารหัสแอพพลิเคชันและกรณีการสนับสนุน", + "Be aware that encryption always increases the file size." : "โปรดทราบว่าหากเข้ารหัสไฟล์จะทำให้ขนาดของไฟล์ใหญ่ขึ้น", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "มันจะดีถ้าคุณสำรองข้อมูลบ่อยๆ ในกรณีของการเข้ารหัสโปรดแน่ใจว่าจะสำรองคีย์การเข้ารหัสลับพร้อมกับข้อมูลของคุณ", "This is the final warning: Do you really want to enable encryption?" : "นี่คือการเตือนครั้งสุดท้าย: คุณต้องการที่จะเปิดใช้การเข้ารหัส?", "Enable encryption" : "เปิดใช้งานการเข้ารหัส", "No encryption module loaded, please enable an encryption module in the app menu." : "ไม่มีโมดูลการเข้ารหัสโหลดโปรดเปิดใช้งานโมดูลการเข้ารหัสในเมนูแอพฯ", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index 13d5ac9687d..aa73557302d 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -32,7 +32,7 @@ OC.L10N.register( "Not enabled" : "Etkin değil", "installing and updating apps via the app store or Federated Cloud Sharing" : "uygulama mağazası ve Birleşmiş Bulut Paylaşımından uygulama kurma ve güncelleme", "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı", - "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL eskide kalmış bir sürüm %s kullanıyor (%s). Lütfen işletim sisteminizi güncelleyin yoksa %s gibi özellikler düzgün çalışmayacaktır.", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL eskide kalmış bir sürüm %s kullanıyor (%s). Lütfen işletim sisteminizi güncelleyin, aksi halde %s gibi özellikler düzgün çalışmayacaktır.", "A problem occurred, please check your log files (Error: %s)" : "Bir problem oluştu, lütfen log dosyalarını kontrol edin (Hata: %s)", "Migration Completed" : "Taşınma Tamamlandı", "Group already exists." : "Grup zaten mevcut.", @@ -84,9 +84,9 @@ OC.L10N.register( "So-so password" : "Normal parola", "Good password" : "İyi parola", "Strong password" : "Güçlü parola", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Bir hata oluştu. Lütfen ASCII-kodlanmış PEM sertifikasını yükleyin.", "Valid until {date}" : "{date} tarihine kadar geçerli", "Delete" : "Sil", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Bir hata oluştu. Lütfen ASCII-kodlanmış PEM sertifikasını yükleyin.", "Groups" : "Gruplar", "Unable to delete {objName}" : "{objName} silinemiyor", "Error creating group" : "Grup oluşturulurken hata", @@ -118,17 +118,20 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP sistem değişkenleri sorgusuna uygun olarak ayarlanmamış görünüyor. getenv(\"PATH\") komutu sadece boş bir cevap döndürüyor.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum belgelendirmesindeki ↗</a> php ayarlama notlarını ve sunucudaki özellikle php-fpm kullanırken php ayarlamalarını kontrol edin.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Salt Okunur yapılandırma etkinleştirilmiş. Bu, bazı ayarların web arayüzü ile yapılandırılmasını önler. Ayrıca, bu dosya her güncelleme sırasında el ile yazılabilir yapılmalıdır.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP satırıçi doc bloklarını ayıklamak üzere yapılandırılmış gibi görünüyor. Bu, bazı çekirdek (core) uygulamalarını erişilemez yapacak.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Bu, muhtemelen Zend OPcache veya eAccelerator gibi bir önbellek/hızlandırıcı nedeniyle gerçekleşir.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Sunucunuz, Microsoft Windows ile çalışıyor. En uygun kullanıcı deneyimi için şiddetle Linux'u öneriyoruz.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s %2$s sürümünden eskisi yüklü. Kararlılık ve performans nedenleri ile daha yeni bir %1$s sürümüne güncellemenizi öneriyoruz.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modülü 'fileinfo' kayıp. MIME türü tanıma ile en iyi sonuçları elde etmek için bu modülü etkinleştirmenizi öneririz.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "İşlemsel dosya kilidi devre dışı, bu yarış koşulu durumlarına sebep olabilir. Bu sorunları önlemek için config.php içerisindeki 'filelocking.enabled' seçeneğini etkinleştirin. Daha fazla bilgi için <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.", "System locale can not be set to a one which supports UTF-8." : "Sistem yereli, UTF-8 destekleyenlerden biri olarak ayarlanamadı.", "This means that there might be problems with certain characters in file names." : "Bu, dosya adlarında belirli karakterlerde problem olabileceği anlamına gelir.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "İşlemsel dosya kilidi, kilitleme arkaucu olarak veritabanını kullanıyor. En iyi performans için kilitleme adına memcache yapılandırılması önerilir. Daha fazla bilgi için <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum rehberlerini ↗</a> iki kez denetleyip <a href=\"#log-section\">günlük</a> içerisindeki hata ve uyarılara bakın.", "All checks passed." : "Tüm kontroller geçildi.", "Open documentation" : "Belgelendirmeyi aç", @@ -146,6 +149,7 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Kullanıcıların diğer kullanıcılara, paylaşılmış dosyalar için posta bildirimi göndermesine izin ver", "Exclude groups from sharing" : "Grupları paylaşma eyleminden hariç tut", "These groups will still be able to receive shares, but not to initiate them." : "Bu gruplar hala paylaşımları alabilecek, ancak başlatamayacaktır.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Paylaşma iletişim kutusunda kullanıcı adı otomatik tamamlamasını etkinleştir. Devre dışı olduğunda tam kullanıcı adı girilmeli.", "Last cron job execution: %s." : "Son cron çalıştırılma: %s.", "Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.", "Cron was not executed yet!" : "Cron henüz çalıştırılmadı!", @@ -154,10 +158,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını her 15 dakikada bir çağırmak için sistem cron hizmetini kullan.", "Enable server-side encryption" : "Sunucu taraflı şifrelemeyi aç", "Please read carefully before activating server-side encryption: " : "Lütfen sunucu tarafında şifrelemeyi etkinleştirmeden önce dikkatlice okuyun: ", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Sunucu tarafında şifreleme tek yönlü bir işlemdir. Bir defa etkinleştirildiğinde sunucudaki tüm dosyalar şifrelenir ve ileri bir tarihte şifrelemeyi iptal etmek mümkün değildir", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ownCloud sunucunuza erişimi olan biri isteklere müdahale ederek veya oturum dosyalarında düz metin olarak saklanan parolayı kullanarak dosyalarınızın şifrelenmesini çözebilir. Bu nedenle sunucu tarafında şifreleme işlemi kötü niyetli sistem yöneticisine karşı koruma sağlamaz ama verinizi harici depolamada tutmanız durumunda yararlıdır.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Gerçek şifreleme modülüne bağlı olarak genel dosya boyutu artar (35%% veya varsayılan modül kullanıldığında daha fazla)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Veri kaybının önüne geçmek için düzenli olarak tüm şifreleme anahtarlarınızı yedeklemelisiniz (data/<user>/files_encryption and data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Bu son uyarıdır: Şifrelemeyi etkinleştirmek istiyor musunuz?", "Enable encryption" : "Şifrelemeyi aç", "No encryption module loaded, please enable an encryption module in the app menu." : "Hiç şifrelenme modülü yüklenmemiş, lütfen uygulama menüsünden bir şifreleme modülü etkinleştirin.", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index a995fcdc928..96067996c9a 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -30,7 +30,7 @@ "Not enabled" : "Etkin değil", "installing and updating apps via the app store or Federated Cloud Sharing" : "uygulama mağazası ve Birleşmiş Bulut Paylaşımından uygulama kurma ve güncelleme", "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı", - "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL eskide kalmış bir sürüm %s kullanıyor (%s). Lütfen işletim sisteminizi güncelleyin yoksa %s gibi özellikler düzgün çalışmayacaktır.", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL eskide kalmış bir sürüm %s kullanıyor (%s). Lütfen işletim sisteminizi güncelleyin, aksi halde %s gibi özellikler düzgün çalışmayacaktır.", "A problem occurred, please check your log files (Error: %s)" : "Bir problem oluştu, lütfen log dosyalarını kontrol edin (Hata: %s)", "Migration Completed" : "Taşınma Tamamlandı", "Group already exists." : "Grup zaten mevcut.", @@ -82,9 +82,9 @@ "So-so password" : "Normal parola", "Good password" : "İyi parola", "Strong password" : "Güçlü parola", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Bir hata oluştu. Lütfen ASCII-kodlanmış PEM sertifikasını yükleyin.", "Valid until {date}" : "{date} tarihine kadar geçerli", "Delete" : "Sil", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Bir hata oluştu. Lütfen ASCII-kodlanmış PEM sertifikasını yükleyin.", "Groups" : "Gruplar", "Unable to delete {objName}" : "{objName} silinemiyor", "Error creating group" : "Grup oluşturulurken hata", @@ -116,17 +116,20 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP sistem değişkenleri sorgusuna uygun olarak ayarlanmamış görünüyor. getenv(\"PATH\") komutu sadece boş bir cevap döndürüyor.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum belgelendirmesindeki ↗</a> php ayarlama notlarını ve sunucudaki özellikle php-fpm kullanırken php ayarlamalarını kontrol edin.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Salt Okunur yapılandırma etkinleştirilmiş. Bu, bazı ayarların web arayüzü ile yapılandırılmasını önler. Ayrıca, bu dosya her güncelleme sırasında el ile yazılabilir yapılmalıdır.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP satırıçi doc bloklarını ayıklamak üzere yapılandırılmış gibi görünüyor. Bu, bazı çekirdek (core) uygulamalarını erişilemez yapacak.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Bu, muhtemelen Zend OPcache veya eAccelerator gibi bir önbellek/hızlandırıcı nedeniyle gerçekleşir.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Sunucunuz, Microsoft Windows ile çalışıyor. En uygun kullanıcı deneyimi için şiddetle Linux'u öneriyoruz.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s %2$s sürümünden eskisi yüklü. Kararlılık ve performans nedenleri ile daha yeni bir %1$s sürümüne güncellemenizi öneriyoruz.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modülü 'fileinfo' kayıp. MIME türü tanıma ile en iyi sonuçları elde etmek için bu modülü etkinleştirmenizi öneririz.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "İşlemsel dosya kilidi devre dışı, bu yarış koşulu durumlarına sebep olabilir. Bu sorunları önlemek için config.php içerisindeki 'filelocking.enabled' seçeneğini etkinleştirin. Daha fazla bilgi için <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.", "System locale can not be set to a one which supports UTF-8." : "Sistem yereli, UTF-8 destekleyenlerden biri olarak ayarlanamadı.", "This means that there might be problems with certain characters in file names." : "Bu, dosya adlarında belirli karakterlerde problem olabileceği anlamına gelir.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "İşlemsel dosya kilidi, kilitleme arkaucu olarak veritabanını kullanıyor. En iyi performans için kilitleme adına memcache yapılandırılması önerilir. Daha fazla bilgi için <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum rehberlerini ↗</a> iki kez denetleyip <a href=\"#log-section\">günlük</a> içerisindeki hata ve uyarılara bakın.", "All checks passed." : "Tüm kontroller geçildi.", "Open documentation" : "Belgelendirmeyi aç", @@ -144,6 +147,7 @@ "Allow users to send mail notification for shared files to other users" : "Kullanıcıların diğer kullanıcılara, paylaşılmış dosyalar için posta bildirimi göndermesine izin ver", "Exclude groups from sharing" : "Grupları paylaşma eyleminden hariç tut", "These groups will still be able to receive shares, but not to initiate them." : "Bu gruplar hala paylaşımları alabilecek, ancak başlatamayacaktır.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Paylaşma iletişim kutusunda kullanıcı adı otomatik tamamlamasını etkinleştir. Devre dışı olduğunda tam kullanıcı adı girilmeli.", "Last cron job execution: %s." : "Son cron çalıştırılma: %s.", "Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.", "Cron was not executed yet!" : "Cron henüz çalıştırılmadı!", @@ -152,10 +156,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını her 15 dakikada bir çağırmak için sistem cron hizmetini kullan.", "Enable server-side encryption" : "Sunucu taraflı şifrelemeyi aç", "Please read carefully before activating server-side encryption: " : "Lütfen sunucu tarafında şifrelemeyi etkinleştirmeden önce dikkatlice okuyun: ", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Sunucu tarafında şifreleme tek yönlü bir işlemdir. Bir defa etkinleştirildiğinde sunucudaki tüm dosyalar şifrelenir ve ileri bir tarihte şifrelemeyi iptal etmek mümkün değildir", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ownCloud sunucunuza erişimi olan biri isteklere müdahale ederek veya oturum dosyalarında düz metin olarak saklanan parolayı kullanarak dosyalarınızın şifrelenmesini çözebilir. Bu nedenle sunucu tarafında şifreleme işlemi kötü niyetli sistem yöneticisine karşı koruma sağlamaz ama verinizi harici depolamada tutmanız durumunda yararlıdır.", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Gerçek şifreleme modülüne bağlı olarak genel dosya boyutu artar (35%% veya varsayılan modül kullanıldığında daha fazla)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "Veri kaybının önüne geçmek için düzenli olarak tüm şifreleme anahtarlarınızı yedeklemelisiniz (data/<user>/files_encryption and data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "Bu son uyarıdır: Şifrelemeyi etkinleştirmek istiyor musunuz?", "Enable encryption" : "Şifrelemeyi aç", "No encryption module loaded, please enable an encryption module in the app menu." : "Hiç şifrelenme modülü yüklenmemiş, lütfen uygulama menüsünden bir şifreleme modülü etkinleştirin.", diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index d2d08df164c..50c08d287a8 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -4,7 +4,7 @@ OC.L10N.register( "Redis" : "Redis", "Security & setup warnings" : "Попередження безпеки та налаштування", "Sharing" : "Спільний доступ", - "Server-side encryption" : "Серверне шіфрування", + "Server-side encryption" : "Шифрування на сервері", "External Storage" : "Зовнішні сховища", "Cron" : "Планувальник Cron", "Email server" : "Сервер електронної пошти", @@ -12,35 +12,37 @@ OC.L10N.register( "Tips & tricks" : "Поради і трюки", "Updates" : "Оновлення", "Authentication error" : "Помилка автентифікації", - "Your full name has been changed." : "Ваше ім'я було змінене", - "Unable to change full name" : "Неможливо змінити ім'я", + "Your full name has been changed." : "Ваше повне ім'я було змінено", + "Unable to change full name" : "Неможливо змінити повне ім'я", "Couldn't remove app." : "Неможливо видалити додаток.", - "Language changed" : "Мова змінена", + "Language changed" : "Мову змінено", "Invalid request" : "Некоректний запит", "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", - "Couldn't update app." : "Не вдалося оновити програму. ", + "Couldn't update app." : "Не вдалося оновити додаток. ", "Wrong password" : "Невірний пароль", - "No user supplied" : "Користувач не знайдений", - "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль адміністратора для відновлення, інакше всі дані будуть втрачені", - "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль адміністратора для відновлення. Будь ласка, перевірте пароль та спробуйте ще раз.", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Використовуваний механізм не підтримує зміну паролів, але користувальницький ключ шифрування був успішно змінено", + "No user supplied" : "Користувача не вказано", + "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль відновлення адміністратора, інакше всі дані будуть втрачені", + "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend не підтримує зміну паролів, але користувацький ключ шифрування було успішно змінено", "Unable to change password" : "Неможливо змінити пароль", "Enabled" : "Увімкнено", "Not enabled" : "Вимкнено", + "installing and updating apps via the app store or Federated Cloud Sharing" : "встановлення та оновлення додатків через магазин додатків або Об’єднання хмарних сховищ", "Federated Cloud Sharing" : "Об’єднання хмарних сховищ", - "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL використовує застарілу версію %s (%s). Будь ласка, поновіть вашу операційну систему або функції, такі як %s не працюватимуть надійно.", + "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої файли журналів (Помилка: %s)", "Migration Completed" : "Міграцію завершено", "Group already exists." : "Група вже існує.", "Unable to add group." : "Неможливо додати групу.", "Unable to delete group." : "Неможливо видалити групу.", - "log-level out of allowed range" : "Перевищений розмір файлу-журналу", - "Saved" : "Збереженно", - "test email settings" : "перевірити налаштування електронної пошти", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час відправки email сталася помилка. Будь ласка перевірте налаштування. (Помилка:%s)", - "Email sent" : "Ел. пошта надіслана", - "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових повідомлень ви повинні вказати свою електронну адресу.", + "log-level out of allowed range" : "рівень протоколювання перевищує дозволені межі", + "Saved" : "Збережено", + "test email settings" : "тест налаштувань електронної пошти", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час надсилання email сталася помилка. Будь ласка перевірте налаштування. (Помилка: %s)", + "Email sent" : "Лист надіслано", + "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових листів ви повинні вказати свою email адресу.", "Invalid mail address" : "Неправильна email адреса", "A user with that name already exists." : "Користувач з таким іменем вже існує.", "Unable to create user." : "Неможливо створити користувача.", @@ -56,31 +58,34 @@ OC.L10N.register( "Migration started …" : "Міграцію розпочато ...", "Sending..." : "Надсилання...", "Official" : "Офіційні", + "Approved" : "Схвалені", "Experimental" : "Експериментальні", "All" : "Всі", - "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні застосунки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшні.", - "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені застосунки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.", + "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні додатки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшені.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені додатки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ця програма не перевірена на вразливості безпеки і є новою або нестабільною. Встановлюйте її на власний ризик.", "Update to %s" : "Оновити до %s", "Please wait...." : "Зачекайте, будь ласка...", - "Error while disabling app" : "Помилка відключення додатка", + "Error while disabling app" : "Помилка вимикання додатка", "Disable" : "Вимкнути", - "Enable" : "Включити", - "Error while enabling app" : "Помилка підключення додатка", + "Enable" : "Увімкнути", + "Error while enabling app" : "Помилка вмикання додатка", "Updating...." : "Оновлюється...", - "Error while updating app" : "Помилка при оновленні програми", + "Error while updating app" : "Помилка при оновленні додатку", "Updated" : "Оновлено", "Uninstalling ...." : "Видалення...", "Error while uninstalling app" : "Помилка видалення додатка", "Uninstall" : "Видалити", + "An error occurred: {message}" : "Сталася помилка: {message}", "Select a profile picture" : "Обрати зображення облікового запису", "Very weak password" : "Дуже слабкий пароль", "Weak password" : "Слабкий пароль", "So-so password" : "Такий собі пароль", "Good password" : "Добрий пароль", "Strong password" : "Надійний пароль", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Виникла помилка. Будь ласка вивантажте PEM сертифікат в ASCII-кодуванні.", "Valid until {date}" : "Дійсно до {date}", "Delete" : "Видалити", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Виникла помилка. Будь ласка вивантажте PEM сертифікат в ASCII-кодуванні.", "Groups" : "Групи", "Unable to delete {objName}" : "Не вдалося видалити {objName}", "Error creating group" : "Помилка створення групи", @@ -95,11 +100,11 @@ OC.L10N.register( "A valid username must be provided" : "Потрібно задати вірне ім'я користувача", "Error creating user" : "Помилка при створенні користувача", "A valid password must be provided" : "Потрібно задати вірний пароль", - "A valid email must be provided" : "Вкажіть дійсний e-mail", + "A valid email must be provided" : "Вкажіть дійсний email", "__language_name__" : "__language_name__", - "Sync clients" : "Синхронізація клієнтів", + "Sync clients" : "Клієнти синхронізації", "Personal info" : "Особиста інформація", - "SSL root certificates" : "SSL кореневі сертифікати", + "SSL root certificates" : "Кореневі SSL сертифікати", "Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)", "Info, warnings, errors and fatal issues" : "Інформаційні, попередження, помилки та критичні проблеми", "Warnings, errors and fatal issues" : "Попередження, помилки та критичні проблеми", @@ -121,6 +126,7 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файлу config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:", + "All checks passed." : "Всі перевірки пройдено.", "Open documentation" : "Відкрити документацію", "Allow apps to use the Share API" : "Дозволити програмам використовувати API спільного доступу", "Allow users to share via link" : "Дозволити користувачам ділитися через посилання", @@ -130,58 +136,60 @@ OC.L10N.register( "Set default expiration date" : "Встановити термін дії за замовчуванням", "Expire after " : "Скінчиться через", "days" : "днів", - "Enforce expiration date" : "Термін дії обов'язково", + "Enforce expiration date" : "Термін дії обов'язковий", "Allow resharing" : "Дозволити перевідкривати спільний доступ", "Restrict users to only share with users in their groups" : "Дозволити користувачам відкривати спільний доступ лише для користувачів з їхньої групи", "Allow users to send mail notification for shared files to other users" : "Дозволити користувачам сповіщати листами про спільний доступ до файлів", "Exclude groups from sharing" : "Виключити групи зі спільного доступу", "These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.", - "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.", - "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Дозволи автодоповнення імені користувача в діалозі спільного доступу. Якщо вимкнено - треба буде вводити повне ім’я користувача.", + "Last cron job execution: %s." : "Останнє виконане Cron завдання: %s.", + "Last cron job execution: %s. Something seems wrong." : "Останнє виконане Cron завдання: %s. Щось здається неправильним.", "Cron was not executed yet!" : "Cron-задачі ще не запускалися!", "Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.", "Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.", - "Enable server-side encryption" : "Увімкнути серверне шіфрування", + "Enable server-side encryption" : "Увімкнути шифрування на сервері", "Enable encryption" : "Увімкнути шифрування", "Select default encryption module:" : "Обрати модуль шифрування за замовчуванням:", "Start migration" : "Розпочати міграцію", "This is used for sending out notifications." : "Використовується для відсилання повідомлень.", - "Send mode" : "Надіслати повідомлення", + "Send mode" : "Режим надсилання", "Encryption" : "Шифрування", "From address" : "Адреса відправника", "mail" : "пошта", - "Authentication method" : "Метод перевірки автентифікації", + "Authentication method" : "Спосіб аутентифікації", "Authentication required" : "Потрібна аутентифікація", "Server address" : "Адреса сервера", "Port" : "Порт", "Credentials" : "Облікові дані", "SMTP Username" : "Ім'я користувача SMTP", "SMTP Password" : "Пароль SMTP", - "Store credentials" : "Зберігання облікових даних", - "Test email settings" : "Перевірити налаштування електронної пошти", + "Store credentials" : "Зберігати облікові дані", + "Test email settings" : "Тестувати налаштування електронної пошти", "Send email" : "Надіслати листа", "Log level" : "Рівень протоколювання", "Download logfile" : "Завантажити файл журналу", "More" : "Більше", "Less" : "Менше", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Журнал-файл - більше 100 МБ. Його скачування може зайняти деякий час!", - "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо переключитися на інший тип серверу баз даних.", - "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Файл журналу - більше 100 МБ. Його завантаження може зайняти деякий час!", + "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо перейти на інший тип серверу баз даних.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо сумнівне використання SQLite при синхронізації файлів з використанням клієнта для ПК.", "How to do backups" : "Як робити резервне копіювання", - "Advanced monitoring" : "Просунутий моніторинг", + "Advanced monitoring" : "Розширений моніторинг", "Performance tuning" : "Налаштування продуктивності", - "Improving the config.php" : "Покращення ", + "Improving the config.php" : "Покращення config.php", "Theming" : "Оформлення", "Hardening and security guidance" : "Інструктування з безпеки та захисту", "Version" : "Версія", "Developer documentation" : "Документація для розробників", - "Experimental applications ahead" : "Спершу експериментальні застосунки", - "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні застосунки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.", + "Experimental applications ahead" : "Спершу експериментальні додатки", + "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні додатки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.", "by" : "по", "licensed" : "Ліцензовано", "Documentation:" : "Документація:", "User documentation" : "Користувацька документація", + "Admin documentation" : "Документація адміністратора", "Show description …" : "Показати деталі ...", "Hide description …" : "Сховати деталі ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:", diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index 8105eb7e379..0dae9595c72 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -2,7 +2,7 @@ "Redis" : "Redis", "Security & setup warnings" : "Попередження безпеки та налаштування", "Sharing" : "Спільний доступ", - "Server-side encryption" : "Серверне шіфрування", + "Server-side encryption" : "Шифрування на сервері", "External Storage" : "Зовнішні сховища", "Cron" : "Планувальник Cron", "Email server" : "Сервер електронної пошти", @@ -10,35 +10,37 @@ "Tips & tricks" : "Поради і трюки", "Updates" : "Оновлення", "Authentication error" : "Помилка автентифікації", - "Your full name has been changed." : "Ваше ім'я було змінене", - "Unable to change full name" : "Неможливо змінити ім'я", + "Your full name has been changed." : "Ваше повне ім'я було змінено", + "Unable to change full name" : "Неможливо змінити повне ім'я", "Couldn't remove app." : "Неможливо видалити додаток.", - "Language changed" : "Мова змінена", + "Language changed" : "Мову змінено", "Invalid request" : "Некоректний запит", "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", - "Couldn't update app." : "Не вдалося оновити програму. ", + "Couldn't update app." : "Не вдалося оновити додаток. ", "Wrong password" : "Невірний пароль", - "No user supplied" : "Користувач не знайдений", - "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль адміністратора для відновлення, інакше всі дані будуть втрачені", - "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль адміністратора для відновлення. Будь ласка, перевірте пароль та спробуйте ще раз.", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Використовуваний механізм не підтримує зміну паролів, але користувальницький ключ шифрування був успішно змінено", + "No user supplied" : "Користувача не вказано", + "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль відновлення адміністратора, інакше всі дані будуть втрачені", + "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend не підтримує зміну паролів, але користувацький ключ шифрування було успішно змінено", "Unable to change password" : "Неможливо змінити пароль", "Enabled" : "Увімкнено", "Not enabled" : "Вимкнено", + "installing and updating apps via the app store or Federated Cloud Sharing" : "встановлення та оновлення додатків через магазин додатків або Об’єднання хмарних сховищ", "Federated Cloud Sharing" : "Об’єднання хмарних сховищ", - "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL використовує застарілу версію %s (%s). Будь ласка, поновіть вашу операційну систему або функції, такі як %s не працюватимуть надійно.", + "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої файли журналів (Помилка: %s)", "Migration Completed" : "Міграцію завершено", "Group already exists." : "Група вже існує.", "Unable to add group." : "Неможливо додати групу.", "Unable to delete group." : "Неможливо видалити групу.", - "log-level out of allowed range" : "Перевищений розмір файлу-журналу", - "Saved" : "Збереженно", - "test email settings" : "перевірити налаштування електронної пошти", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час відправки email сталася помилка. Будь ласка перевірте налаштування. (Помилка:%s)", - "Email sent" : "Ел. пошта надіслана", - "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових повідомлень ви повинні вказати свою електронну адресу.", + "log-level out of allowed range" : "рівень протоколювання перевищує дозволені межі", + "Saved" : "Збережено", + "test email settings" : "тест налаштувань електронної пошти", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час надсилання email сталася помилка. Будь ласка перевірте налаштування. (Помилка: %s)", + "Email sent" : "Лист надіслано", + "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових листів ви повинні вказати свою email адресу.", "Invalid mail address" : "Неправильна email адреса", "A user with that name already exists." : "Користувач з таким іменем вже існує.", "Unable to create user." : "Неможливо створити користувача.", @@ -54,31 +56,34 @@ "Migration started …" : "Міграцію розпочато ...", "Sending..." : "Надсилання...", "Official" : "Офіційні", + "Approved" : "Схвалені", "Experimental" : "Експериментальні", "All" : "Всі", - "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні застосунки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшні.", - "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені застосунки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.", + "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні додатки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшені.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені додатки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ця програма не перевірена на вразливості безпеки і є новою або нестабільною. Встановлюйте її на власний ризик.", "Update to %s" : "Оновити до %s", "Please wait...." : "Зачекайте, будь ласка...", - "Error while disabling app" : "Помилка відключення додатка", + "Error while disabling app" : "Помилка вимикання додатка", "Disable" : "Вимкнути", - "Enable" : "Включити", - "Error while enabling app" : "Помилка підключення додатка", + "Enable" : "Увімкнути", + "Error while enabling app" : "Помилка вмикання додатка", "Updating...." : "Оновлюється...", - "Error while updating app" : "Помилка при оновленні програми", + "Error while updating app" : "Помилка при оновленні додатку", "Updated" : "Оновлено", "Uninstalling ...." : "Видалення...", "Error while uninstalling app" : "Помилка видалення додатка", "Uninstall" : "Видалити", + "An error occurred: {message}" : "Сталася помилка: {message}", "Select a profile picture" : "Обрати зображення облікового запису", "Very weak password" : "Дуже слабкий пароль", "Weak password" : "Слабкий пароль", "So-so password" : "Такий собі пароль", "Good password" : "Добрий пароль", "Strong password" : "Надійний пароль", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Виникла помилка. Будь ласка вивантажте PEM сертифікат в ASCII-кодуванні.", "Valid until {date}" : "Дійсно до {date}", "Delete" : "Видалити", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Виникла помилка. Будь ласка вивантажте PEM сертифікат в ASCII-кодуванні.", "Groups" : "Групи", "Unable to delete {objName}" : "Не вдалося видалити {objName}", "Error creating group" : "Помилка створення групи", @@ -93,11 +98,11 @@ "A valid username must be provided" : "Потрібно задати вірне ім'я користувача", "Error creating user" : "Помилка при створенні користувача", "A valid password must be provided" : "Потрібно задати вірний пароль", - "A valid email must be provided" : "Вкажіть дійсний e-mail", + "A valid email must be provided" : "Вкажіть дійсний email", "__language_name__" : "__language_name__", - "Sync clients" : "Синхронізація клієнтів", + "Sync clients" : "Клієнти синхронізації", "Personal info" : "Особиста інформація", - "SSL root certificates" : "SSL кореневі сертифікати", + "SSL root certificates" : "Кореневі SSL сертифікати", "Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)", "Info, warnings, errors and fatal issues" : "Інформаційні, попередження, помилки та критичні проблеми", "Warnings, errors and fatal issues" : "Попередження, помилки та критичні проблеми", @@ -119,6 +124,7 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файлу config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:", + "All checks passed." : "Всі перевірки пройдено.", "Open documentation" : "Відкрити документацію", "Allow apps to use the Share API" : "Дозволити програмам використовувати API спільного доступу", "Allow users to share via link" : "Дозволити користувачам ділитися через посилання", @@ -128,58 +134,60 @@ "Set default expiration date" : "Встановити термін дії за замовчуванням", "Expire after " : "Скінчиться через", "days" : "днів", - "Enforce expiration date" : "Термін дії обов'язково", + "Enforce expiration date" : "Термін дії обов'язковий", "Allow resharing" : "Дозволити перевідкривати спільний доступ", "Restrict users to only share with users in their groups" : "Дозволити користувачам відкривати спільний доступ лише для користувачів з їхньої групи", "Allow users to send mail notification for shared files to other users" : "Дозволити користувачам сповіщати листами про спільний доступ до файлів", "Exclude groups from sharing" : "Виключити групи зі спільного доступу", "These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.", - "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.", - "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Дозволи автодоповнення імені користувача в діалозі спільного доступу. Якщо вимкнено - треба буде вводити повне ім’я користувача.", + "Last cron job execution: %s." : "Останнє виконане Cron завдання: %s.", + "Last cron job execution: %s. Something seems wrong." : "Останнє виконане Cron завдання: %s. Щось здається неправильним.", "Cron was not executed yet!" : "Cron-задачі ще не запускалися!", "Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.", "Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.", - "Enable server-side encryption" : "Увімкнути серверне шіфрування", + "Enable server-side encryption" : "Увімкнути шифрування на сервері", "Enable encryption" : "Увімкнути шифрування", "Select default encryption module:" : "Обрати модуль шифрування за замовчуванням:", "Start migration" : "Розпочати міграцію", "This is used for sending out notifications." : "Використовується для відсилання повідомлень.", - "Send mode" : "Надіслати повідомлення", + "Send mode" : "Режим надсилання", "Encryption" : "Шифрування", "From address" : "Адреса відправника", "mail" : "пошта", - "Authentication method" : "Метод перевірки автентифікації", + "Authentication method" : "Спосіб аутентифікації", "Authentication required" : "Потрібна аутентифікація", "Server address" : "Адреса сервера", "Port" : "Порт", "Credentials" : "Облікові дані", "SMTP Username" : "Ім'я користувача SMTP", "SMTP Password" : "Пароль SMTP", - "Store credentials" : "Зберігання облікових даних", - "Test email settings" : "Перевірити налаштування електронної пошти", + "Store credentials" : "Зберігати облікові дані", + "Test email settings" : "Тестувати налаштування електронної пошти", "Send email" : "Надіслати листа", "Log level" : "Рівень протоколювання", "Download logfile" : "Завантажити файл журналу", "More" : "Більше", "Less" : "Менше", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Журнал-файл - більше 100 МБ. Його скачування може зайняти деякий час!", - "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо переключитися на інший тип серверу баз даних.", - "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Файл журналу - більше 100 МБ. Його завантаження може зайняти деякий час!", + "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо перейти на інший тип серверу баз даних.", + "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо сумнівне використання SQLite при синхронізації файлів з використанням клієнта для ПК.", "How to do backups" : "Як робити резервне копіювання", - "Advanced monitoring" : "Просунутий моніторинг", + "Advanced monitoring" : "Розширений моніторинг", "Performance tuning" : "Налаштування продуктивності", - "Improving the config.php" : "Покращення ", + "Improving the config.php" : "Покращення config.php", "Theming" : "Оформлення", "Hardening and security guidance" : "Інструктування з безпеки та захисту", "Version" : "Версія", "Developer documentation" : "Документація для розробників", - "Experimental applications ahead" : "Спершу експериментальні застосунки", - "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні застосунки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.", + "Experimental applications ahead" : "Спершу експериментальні додатки", + "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні додатки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.", "by" : "по", "licensed" : "Ліцензовано", "Documentation:" : "Документація:", "User documentation" : "Користувацька документація", + "Admin documentation" : "Документація адміністратора", "Show description …" : "Показати деталі ...", "Hide description …" : "Сховати деталі ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:", diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index 992d70465e3..8f219771e45 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -84,9 +84,9 @@ OC.L10N.register( "So-so password" : "一般强度的密码", "Good password" : "较强的密码", "Strong password" : "强密码", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误。请上传 ASCII 编码的 PEM 证书。", "Valid until {date}" : "有效期至 {date}", "Delete" : "删除", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误。请上传 ASCII 编码的 PEM 证书。", "Groups" : "组", "Unable to delete {objName}" : "无法删除 {objName}", "Error creating group" : "创建组时出错", @@ -118,17 +118,20 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\\\"PATH\\\") 测试只返回一个空值。", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "请检查PHP配置说明和服务器的 PHP 配置的 <a target=\"_blank\" href=\"%s\">安装文档 ↗</a>,使用 PHP-FPM 时尤其如此。", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "只读配置已启用。这样可防止通过 WEB 接口设置一些配置。此外,每次更新后该文件需要手动设置为可写。", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除行内 <doc> 块,这将导致数个核心应用无法访问。", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的,例如 Zend OPcache 或 eAccelerator。", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "你的服务器是运行于 Microsoft Windows 系统。我们强烈推荐使用 Linux 系统以获得最佳的用户体验。比如中文文件夹和文件名支持。", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s 下版本 %2$s 已安装。基于稳定和性能的原因,我们强烈建议更新至 %1$s 版本。", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定被禁用,这可能会导致竞争条件问题。在config.php 中启用“filelocking.enabled”可以避免这些问题。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。", "System locale can not be set to a one which supports UTF-8." : "系统语系无法设置为支持 UTF-8 的语系。", "This means that there might be problems with certain characters in file names." : "这意味着一些文件名中的特定字符可能有问题。", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "请点击检查 <a target=\\\"_blank\\\" href=\\\"%s\\\"> 安装向导 ↗</a>, 点击 <a href=\\\"#log-section\\\"> 日志 </a>查看详细错误和警告。", "All checks passed." : "所有检查已通过。", "Open documentation" : "打开文档", @@ -154,10 +157,6 @@ OC.L10N.register( "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。", "Enable server-side encryption" : "启用服务器端加密", "Please read carefully before activating server-side encryption: " : "在激活服务器端加密之前,请仔细阅读:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "服务器端加密是一个单向的过程。一旦启用加密,从该点向前所有文件都将在服务器上进行加密,它将无法在以后禁用加密", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "只要有权访问您的 ownCloud 服务器就可能解密你的文件,通过截获请求或读出以纯文本会话文件存储的用户密码。服务端加密。它不仅让你免遭恶意的管理员查看隐私,在保护你在外部托管的存储中的数据也非常有用。", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "根据实际加密模块上的一般文件大小而增加 (使用默认的模块时,35%% 以上)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "你应该定期备份所有加密密钥,以防数据永久丢失 (data/<user>/files_encryption 和 data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "这是最后一次警告:你真的想启用加密?", "Enable encryption" : "启用加密", "No encryption module loaded, please enable an encryption module in the app menu." : "没有加载加密模块,请在 APP 应用菜单中启用加密模块。", diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index 97eae6702a7..55c49f52075 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -82,9 +82,9 @@ "So-so password" : "一般强度的密码", "Good password" : "较强的密码", "Strong password" : "强密码", + "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误。请上传 ASCII 编码的 PEM 证书。", "Valid until {date}" : "有效期至 {date}", "Delete" : "删除", - "An error occurred. Please upload an ASCII-encoded PEM certificate." : "出现了一个错误。请上传 ASCII 编码的 PEM 证书。", "Groups" : "组", "Unable to delete {objName}" : "无法删除 {objName}", "Error creating group" : "创建组时出错", @@ -116,17 +116,20 @@ "SSL" : "SSL", "TLS" : "TLS", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\\\"PATH\\\") 测试只返回一个空值。", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "请检查PHP配置说明和服务器的 PHP 配置的 <a target=\"_blank\" href=\"%s\">安装文档 ↗</a>,使用 PHP-FPM 时尤其如此。", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "只读配置已启用。这样可防止通过 WEB 接口设置一些配置。此外,每次更新后该文件需要手动设置为可写。", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除行内 <doc> 块,这将导致数个核心应用无法访问。", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的,例如 Zend OPcache 或 eAccelerator。", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "你的服务器是运行于 Microsoft Windows 系统。我们强烈推荐使用 Linux 系统以获得最佳的用户体验。比如中文文件夹和文件名支持。", "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s 下版本 %2$s 已安装。基于稳定和性能的原因,我们强烈建议更新至 %1$s 版本。", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定被禁用,这可能会导致竞争条件问题。在config.php 中启用“filelocking.enabled”可以避免这些问题。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。", "System locale can not be set to a one which supports UTF-8." : "系统语系无法设置为支持 UTF-8 的语系。", "This means that there might be problems with certain characters in file names." : "这意味着一些文件名中的特定字符可能有问题。", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", + "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "请点击检查 <a target=\\\"_blank\\\" href=\\\"%s\\\"> 安装向导 ↗</a>, 点击 <a href=\\\"#log-section\\\"> 日志 </a>查看详细错误和警告。", "All checks passed." : "所有检查已通过。", "Open documentation" : "打开文档", @@ -152,10 +155,6 @@ "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。", "Enable server-side encryption" : "启用服务器端加密", "Please read carefully before activating server-side encryption: " : "在激活服务器端加密之前,请仔细阅读:", - "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "服务器端加密是一个单向的过程。一旦启用加密,从该点向前所有文件都将在服务器上进行加密,它将无法在以后禁用加密", - "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "只要有权访问您的 ownCloud 服务器就可能解密你的文件,通过截获请求或读出以纯文本会话文件存储的用户密码。服务端加密。它不仅让你免遭恶意的管理员查看隐私,在保护你在外部托管的存储中的数据也非常有用。", - "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "根据实际加密模块上的一般文件大小而增加 (使用默认的模块时,35%% 以上)", - "You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)" : "你应该定期备份所有加密密钥,以防数据永久丢失 (data/<user>/files_encryption 和 data/files_encryption)", "This is the final warning: Do you really want to enable encryption?" : "这是最后一次警告:你真的想启用加密?", "Enable encryption" : "启用加密", "No encryption module loaded, please enable an encryption module in the app menu." : "没有加载加密模块,请在 APP 应用菜单中启用加密模块。", diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js index 9f3946a930f..355533c0e67 100644 --- a/settings/l10n/zh_TW.js +++ b/settings/l10n/zh_TW.js @@ -29,6 +29,7 @@ OC.L10N.register( "Unable to change password" : "無法修改密碼", "Enabled" : "已啓用", "Not enabled" : "無啟動", + "Federated Cloud Sharing" : "聯盟式雲端分享", "Migration Completed" : "遷移已完成", "Group already exists." : "群組已存在", "Unable to add group." : "無法新增群組", @@ -98,13 +99,18 @@ OC.L10N.register( "System locale can not be set to a one which supports UTF-8." : "系統語系無法設定只支援 UTF-8", "This means that there might be problems with certain characters in file names." : "這個意思是指在檔名中使用一些字元可能會有問題", "Allow apps to use the Share API" : "允許 apps 使用分享 API", + "Enforce password protection" : "強制分享連結使用密碼保護", "Allow public uploads" : "允許任何人上傳", "Allow users to send mail notification for shared files" : "允許使用者寄送有關分享檔案的郵件通知", "days" : "天", + "Enforce expiration date" : "強制分享連結設置分享期限", "Allow resharing" : "允許轉貼分享", + "Allow users to send mail notification for shared files to other users" : "允許使用者寄送檔案分享通知給其他使用者", + "Exclude groups from sharing" : "禁止群組分享檔案", "Cron was not executed yet!" : "排程沒有執行!", "Execute one task with each page loaded" : "當頁面載入時,執行", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "已經與 webcron 服務註冊好,將會每15分鐘呼叫 cron.php", + "Enable server-side encryption" : "啓用伺服器端加密", "This is used for sending out notifications." : "寄送通知用", "Send mode" : "寄送模式", "Encryption" : "加密", @@ -180,6 +186,7 @@ OC.L10N.register( "Language" : "語言", "Help translate" : "幫助翻譯", "Common Name" : "Common Name", + "Issued By" : "發行者:", "Show storage location" : "顯示儲存位置", "Show last log in" : "顯示最近登入", "Show user backend" : "顯示用戶後台", diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json index ce87ffa614a..fad9ad99ed5 100644 --- a/settings/l10n/zh_TW.json +++ b/settings/l10n/zh_TW.json @@ -27,6 +27,7 @@ "Unable to change password" : "無法修改密碼", "Enabled" : "已啓用", "Not enabled" : "無啟動", + "Federated Cloud Sharing" : "聯盟式雲端分享", "Migration Completed" : "遷移已完成", "Group already exists." : "群組已存在", "Unable to add group." : "無法新增群組", @@ -96,13 +97,18 @@ "System locale can not be set to a one which supports UTF-8." : "系統語系無法設定只支援 UTF-8", "This means that there might be problems with certain characters in file names." : "這個意思是指在檔名中使用一些字元可能會有問題", "Allow apps to use the Share API" : "允許 apps 使用分享 API", + "Enforce password protection" : "強制分享連結使用密碼保護", "Allow public uploads" : "允許任何人上傳", "Allow users to send mail notification for shared files" : "允許使用者寄送有關分享檔案的郵件通知", "days" : "天", + "Enforce expiration date" : "強制分享連結設置分享期限", "Allow resharing" : "允許轉貼分享", + "Allow users to send mail notification for shared files to other users" : "允許使用者寄送檔案分享通知給其他使用者", + "Exclude groups from sharing" : "禁止群組分享檔案", "Cron was not executed yet!" : "排程沒有執行!", "Execute one task with each page loaded" : "當頁面載入時,執行", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "已經與 webcron 服務註冊好,將會每15分鐘呼叫 cron.php", + "Enable server-side encryption" : "啓用伺服器端加密", "This is used for sending out notifications." : "寄送通知用", "Send mode" : "寄送模式", "Encryption" : "加密", @@ -178,6 +184,7 @@ "Language" : "語言", "Help translate" : "幫助翻譯", "Common Name" : "Common Name", + "Issued By" : "發行者:", "Show storage location" : "顯示儲存位置", "Show last log in" : "顯示最近登入", "Show user backend" : "顯示用戶後台", diff --git a/settings/personal.php b/settings/personal.php index 0cfdc9ed371..8cbcf923a58 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -4,14 +4,15 @@ * @author Bart Visscher <bartv@thisnet.nl> * @author Björn Schießle <schiessle@owncloud.com> * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Frank Karlitschek <frank@owncloud.org> * @author Georg Ehrke <georg@owncloud.com> * @author Jakob Sack <mail@jakobsack.de> * @author Jan-Christoph Borchardt <hey@jancborchardt.net> + * @author Joas Schilling <nickvergessen@owncloud.com> * @author Lukas Reschke <lukas@owncloud.com> * @author Marvin Thomas Rabe <mrabe@marvinrabe.de> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Volkan Gezer <volkangezer@gmail.com> @@ -45,6 +46,7 @@ OC_Util::addScript( 'settings', 'personal' ); OC_Util::addStyle( 'settings', 'settings' ); \OC_Util::addVendorScript('strengthify/jquery.strengthify'); \OC_Util::addVendorStyle('strengthify/strengthify'); +\OC_Util::addScript('files', 'jquery.iframe-transport'); \OC_Util::addScript('files', 'jquery.fileupload'); if ($config->getSystemValue('enable_avatars', true) === true) { \OC_Util::addVendorScript('jcrop/js/jquery.Jcrop'); @@ -118,7 +120,9 @@ $clients = array( $enableCertImport = false; $externalStorageEnabled = \OC::$server->getAppManager()->isEnabledForUser('files_external'); if ($externalStorageEnabled) { - $enableCertImport = true; + /** @var \OCA\Files_External\Service\BackendService $backendService */ + $backendService = \OC_Mount_Config::$app->getContainer()->query('\OCA\Files_External\Service\BackendService'); + $enableCertImport = $backendService->isUserMountingAllowed(); } @@ -148,7 +152,7 @@ sort($groups2); $tmpl->assign('groups', $groups2); // add hardcoded forms from the template -$l = OC_L10N::get('settings'); +$l = \OC::$server->getL10N('settings'); $formsAndMore = []; $formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')]; $formsAndMore[]= ['anchor' => 'passwordform', 'section-name' => $l->t('Personal info')]; diff --git a/settings/templates/admin.php b/settings/templates/admin.php index 36088d9f8c2..27785c26dfe 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -203,30 +203,30 @@ if ($_['cronErrors']) { title="<?php p($l->t('Open documentation'));?>" href="<?php p(link_to_docs('admin-sharing')); ?>"></a> <p id="enable"> - <input type="checkbox" name="shareapi_enabled" id="shareAPIEnabled" + <input type="checkbox" name="shareapi_enabled" id="shareAPIEnabled" class="checkbox" value="1" <?php if ($_['shareAPIEnabled'] === 'yes') print_unescaped('checked="checked"'); ?> /> <label for="shareAPIEnabled"><?php p($l->t('Allow apps to use the Share API'));?></label><br/> </p> <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>"> - <input type="checkbox" name="shareapi_allow_links" id="allowLinks" + <input type="checkbox" name="shareapi_allow_links" id="allowLinks" class="checkbox" value="1" <?php if ($_['allowLinks'] === 'yes') print_unescaped('checked="checked"'); ?> /> <label for="allowLinks"><?php p($l->t('Allow users to share via link'));?></label><br/> </p> <p id="publicLinkSettings" class="indent <?php if ($_['allowLinks'] !== 'yes' || $_['shareAPIEnabled'] === 'no') p('hidden'); ?>"> - <input type="checkbox" name="shareapi_enforce_links_password" id="enforceLinkPassword" + <input type="checkbox" name="shareapi_enforce_links_password" id="enforceLinkPassword" class="checkbox" value="1" <?php if ($_['enforceLinkPassword']) print_unescaped('checked="checked"'); ?> /> <label for="enforceLinkPassword"><?php p($l->t('Enforce password protection'));?></label><br/> - <input type="checkbox" name="shareapi_allow_public_upload" id="allowPublicUpload" + <input type="checkbox" name="shareapi_allow_public_upload" id="allowPublicUpload" class="checkbox" value="1" <?php if ($_['allowPublicUpload'] == 'yes') print_unescaped('checked="checked"'); ?> /> <label for="allowPublicUpload"><?php p($l->t('Allow public uploads'));?></label><br/> - <input type="checkbox" name="shareapi_allow_public_notification" id="allowPublicMailNotification" + <input type="checkbox" name="shareapi_allow_public_notification" id="allowPublicMailNotification" class="checkbox" value="1" <?php if ($_['allowPublicMailNotification'] == 'yes') print_unescaped('checked="checked"'); ?> /> <label for="allowPublicMailNotification"><?php p($l->t('Allow users to send mail notification for shared files'));?></label><br/> - <input type="checkbox" name="shareapi_default_expire_date" id="shareapiDefaultExpireDate" + <input type="checkbox" name="shareapi_default_expire_date" id="shareapiDefaultExpireDate" class="checkbox" value="1" <?php if ($_['shareDefaultExpireDateSet'] === 'yes') print_unescaped('checked="checked"'); ?> /> <label for="shareapiDefaultExpireDate"><?php p($l->t('Set default expiration date'));?></label><br/> @@ -236,27 +236,27 @@ if ($_['cronErrors']) { <input type="text" name='shareapi_expire_after_n_days' id="shareapiExpireAfterNDays" placeholder="<?php p('7')?>" value='<?php p($_['shareExpireAfterNDays']) ?>' /> <?php p($l->t( 'days' )); ?> - <input type="checkbox" name="shareapi_enforce_expire_date" id="shareapiEnforceExpireDate" + <input type="checkbox" name="shareapi_enforce_expire_date" id="shareapiEnforceExpireDate" class="checkbox" value="1" <?php if ($_['shareEnforceExpireDate'] === 'yes') print_unescaped('checked="checked"'); ?> /> <label for="shareapiEnforceExpireDate"><?php p($l->t('Enforce expiration date'));?></label><br/> </p> <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>"> - <input type="checkbox" name="shareapi_allow_resharing" id="allowResharing" + <input type="checkbox" name="shareapi_allow_resharing" id="allowResharing" class="checkbox" value="1" <?php if ($_['allowResharing'] === 'yes') print_unescaped('checked="checked"'); ?> /> <label for="allowResharing"><?php p($l->t('Allow resharing'));?></label><br/> </p> <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>"> - <input type="checkbox" name="shareapi_only_share_with_group_members" id="onlyShareWithGroupMembers" + <input type="checkbox" name="shareapi_only_share_with_group_members" id="onlyShareWithGroupMembers" class="checkbox" value="1" <?php if ($_['onlyShareWithGroupMembers']) print_unescaped('checked="checked"'); ?> /> <label for="onlyShareWithGroupMembers"><?php p($l->t('Restrict users to only share with users in their groups'));?></label><br/> </p> <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>"> - <input type="checkbox" name="shareapi_allow_mail_notification" id="allowMailNotification" + <input type="checkbox" name="shareapi_allow_mail_notification" id="allowMailNotification" class="checkbox" value="1" <?php if ($_['allowMailNotification'] === 'yes') print_unescaped('checked="checked"'); ?> /> <label for="allowMailNotification"><?php p($l->t('Allow users to send mail notification for shared files to other users'));?></label><br/> </p> <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>"> - <input type="checkbox" name="shareapi_exclude_groups" id="shareapiExcludeGroups" + <input type="checkbox" name="shareapi_exclude_groups" id="shareapiExcludeGroups" class="checkbox" value="1" <?php if ($_['shareExcludeGroups']) print_unescaped('checked="checked"'); ?> /> <label for="shareapiExcludeGroups"><?php p($l->t('Exclude groups from sharing'));?></label><br/> </p> @@ -265,6 +265,11 @@ if ($_['cronErrors']) { <br /> <em><?php p($l->t('These groups will still be able to receive shares, but not to initiate them.')); ?></em> </p> + <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>"> + <input type="checkbox" name="shareapi_allow_share_dialog_user_enumeration" value="1" id="shareapi_allow_share_dialog_user_enumeration" class="checkbox" + <?php if ($_['allowShareDialogUserEnumeration'] === 'yes') print_unescaped('checked="checked"'); ?> /> + <label for="shareapi_allow_share_dialog_user_enumeration"><?php p($l->t('Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered.'));?></label><br /> + </p> <?php print_unescaped($_['fileSharingSettings']); ?> </div> @@ -339,7 +344,7 @@ if ($_['cronErrors']) { <p id="enable"> <input type="checkbox" - id="enableEncryption" + id="enableEncryption" class="checkbox" value="1" <?php if ($_['encryptionEnabled']) print_unescaped('checked="checked" disabled="disabled"'); ?> /> <label for="enableEncryption"><?php p($l->t('Enable server-side encryption')); ?> <span id="startmigration_msg" class="msg"></span> </label><br/> @@ -348,10 +353,10 @@ if ($_['cronErrors']) { <div id="EncryptionWarning" class="warning hidden"> <p><?php p($l->t('Please read carefully before activating server-side encryption: ')); ?></p> <ul> - <li><?php p($l->t('Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date')); ?></li> - <li><?php p($l->t('Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage.')); ?></li> - <li><?php p($l->t('Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)')); ?></li> - <li><?php p($l->t('You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)')); ?></li> + <li><?php p($l->t('Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met.')); ?></li> + <li><?php p($l->t('Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases.')); ?></li> + <li><?php p($l->t('Be aware that encryption always increases the file size.')); ?></li> + <li><?php p($l->t('It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data.')); ?></li> </ul> <p><?php p($l->t('This is the final warning: Do you really want to enable encryption?')) ?> <input type="button" @@ -453,7 +458,7 @@ if ($_['cronErrors']) { <?php endforeach;?> </select> - <input type="checkbox" name="mail_smtpauth" id="mail_smtpauth" value="1" + <input type="checkbox" name="mail_smtpauth" id="mail_smtpauth" class="checkbox" value="1" <?php if ($_['mail_smtpauth']) print_unescaped('checked="checked"'); ?> /> <label for="mail_smtpauth"><?php p($l->t( 'Authentication required' )); ?></label> </p> diff --git a/settings/templates/personal.php b/settings/templates/personal.php index c0adaf9c5a3..0eba71d77d1 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -155,10 +155,11 @@ if($_['passwordChangeSupported']) { <div class="avatardiv"></div><br> <div class="warning hidden"></div> <?php if ($_['avatarChangeSupported']): ?> - <div class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></div> - <input type="file" class="hidden" name="files[]" id="uploadavatar"> + <label for="uploadavatar" class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></label> <div class="inlineblock button" id="selectavatar"><?php p($l->t('Select new from Files')); ?></div> - <div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div><br> + <div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div> + <input type="file" name="files[]" id="uploadavatar" class="hiddenuploadfield"> + <br> <?php p($l->t('Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB.')); ?> <?php else: ?> <?php p($l->t('Your avatar is provided by your original account.')); ?> @@ -239,8 +240,8 @@ if($_['passwordChangeSupported']) { </tbody> </table> <form class="uploadButton" method="post" action="<?php p($_['urlGenerator']->linkToRoute('settings.Certificate.addPersonalRootCertificate')); ?>" target="certUploadFrame"> - <input type="file" id="rootcert_import" name="rootcert_import" class="hidden"> - <input type="button" id="rootcert_import_button" value="<?php p($l->t('Import root certificate')); ?>"/> + <label for="rootcert_import" class="inlineblock button" id="rootcert_import_button"><?php p($l->t('Import root certificate')); ?></label> + <input type="file" id="rootcert_import" name="rootcert_import" class="hiddenuploadfield"> </form> </div> <?php endif; ?> diff --git a/settings/templates/users/main.php b/settings/templates/users/main.php index 73552f8ad2e..0abe31f4a59 100644 --- a/settings/templates/users/main.php +++ b/settings/templates/users/main.php @@ -45,31 +45,36 @@ translation('settings'); <div id="userlistoptions"> <p> - <input type="checkbox" name="StorageLocation" value="StorageLocation" id="CheckboxStorageLocation"> + <input type="checkbox" name="StorageLocation" value="StorageLocation" id="CheckboxStorageLocation" + <?php if ($_['show_storage_location'] === 'true') print_unescaped('checked="checked"'); ?> /> <label for="CheckboxStorageLocation"> <?php p($l->t('Show storage location')) ?> </label> </p> <p> - <input type="checkbox" name="LastLogin" value="LastLogin" id="CheckboxLastLogin"> + <input type="checkbox" name="LastLogin" value="LastLogin" id="CheckboxLastLogin" + <?php if ($_['show_last_login'] === 'true') print_unescaped('checked="checked"'); ?> /> <label for="CheckboxLastLogin"> <?php p($l->t('Show last log in')) ?> </label> </p> <p> - <input type="checkbox" name="UserBackend" value="UserBackend" id="CheckboxUserBackend"> + <input type="checkbox" name="UserBackend" value="UserBackend" id="CheckboxUserBackend" + <?php if ($_['show_backend'] === 'true') print_unescaped('checked="checked"'); ?> /> <label for="CheckboxUserBackend"> <?php p($l->t('Show user backend')) ?> </label> </p> <p> - <input type="checkbox" name="MailOnUserCreate" value="MailOnUserCreate" id="CheckboxMailOnUserCreate"> + <input type="checkbox" name="MailOnUserCreate" value="MailOnUserCreate" id="CheckboxMailOnUserCreate" + <?php if ($_['send_email'] === 'true') print_unescaped('checked="checked"'); ?> /> <label for="CheckboxMailOnUserCreate"> <?php p($l->t('Send email to new user')) ?> </label> </p> <p> - <input type="checkbox" name="EmailAddress" value="EmailAddress" id="CheckboxEmailAddress"> + <input type="checkbox" name="EmailAddress" value="EmailAddress" id="CheckboxEmailAddress" + <?php if ($_['show_email'] === 'true') print_unescaped('checked="checked"'); ?> /> <label for="CheckboxEmailAddress"> <?php p($l->t('Show email address')) ?> </label> diff --git a/settings/users.php b/settings/users.php index 843995a57f9..f16cbca2ae9 100644 --- a/settings/users.php +++ b/settings/users.php @@ -11,6 +11,8 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Stephan Peijnik <speijnik@anexia-it.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @@ -99,4 +101,11 @@ $tmpl->assign('default_quota', $defaultQuota); $tmpl->assign('defaultQuotaIsUserDefined', $defaultQuotaIsUserDefined); $tmpl->assign('recoveryAdminEnabled', $recoveryAdminEnabled); $tmpl->assign('enableAvatars', \OC::$server->getConfig()->getSystemValue('enable_avatars', true)); + +$tmpl->assign('show_storage_location', $config->getAppValue('core', 'umgmt_show_storage_location', 'false')); +$tmpl->assign('show_last_login', $config->getAppValue('core', 'umgmt_show_last_login', 'false')); +$tmpl->assign('show_email', $config->getAppValue('core', 'umgmt_show_email', 'false')); +$tmpl->assign('show_backend', $config->getAppValue('core', 'umgmt_show_backend', 'false')); +$tmpl->assign('send_email', $config->getAppValue('core', 'umgmt_send_email', 'false')); + $tmpl->printPage(); diff --git a/status.php b/status.php index 90250ff2615..f59dc16b6a2 100644 --- a/status.php +++ b/status.php @@ -4,6 +4,7 @@ * @author Christopher Schäpers <kondou@ts.unde.re> * @author Frank Karlitschek <frank@owncloud.org> * @author Jörn Friedrich Dreyer <jfd@butonic.de> + * @author Lukas Reschke <lukas@owncloud.com> * @author Masaki Kawabata Neto <masaki.kawabata@gmail.com> * @author Morris Jobke <hey@morrisjobke.de> * diff --git a/tests/apps/testapp-infoxml-version-different/appinfo/info.xml b/tests/apps/testapp-infoxml-version-different/appinfo/info.xml new file mode 100644 index 00000000000..c765400a76f --- /dev/null +++ b/tests/apps/testapp-infoxml-version-different/appinfo/info.xml @@ -0,0 +1,9 @@ +<?xml version="1.0"?> +<info> + <id>testapp-infoxml-version</id> + <version>1.2.3</version> + <author>Jane</author> + <description>A b c</description> + <licence>Abc</licence> + <name>Test app</name> +</info> diff --git a/tests/apps/testapp-infoxml-version-different/appinfo/version b/tests/apps/testapp-infoxml-version-different/appinfo/version new file mode 100644 index 00000000000..e8ea05db814 --- /dev/null +++ b/tests/apps/testapp-infoxml-version-different/appinfo/version @@ -0,0 +1 @@ +1.2.4 diff --git a/tests/apps/testapp-infoxml-version/appinfo/info.xml b/tests/apps/testapp-infoxml-version/appinfo/info.xml new file mode 100644 index 00000000000..c765400a76f --- /dev/null +++ b/tests/apps/testapp-infoxml-version/appinfo/info.xml @@ -0,0 +1,9 @@ +<?xml version="1.0"?> +<info> + <id>testapp-infoxml-version</id> + <version>1.2.3</version> + <author>Jane</author> + <description>A b c</description> + <licence>Abc</licence> + <name>Test app</name> +</info> diff --git a/tests/apps/testapp-infoxml-version/appinfo/version b/tests/apps/testapp-infoxml-version/appinfo/version new file mode 100644 index 00000000000..0495c4a88ca --- /dev/null +++ b/tests/apps/testapp-infoxml-version/appinfo/version @@ -0,0 +1 @@ +1.2.3 diff --git a/tests/apps/testapp-infoxml/appinfo/info.xml b/tests/apps/testapp-infoxml/appinfo/info.xml new file mode 100644 index 00000000000..cb63a0fc76e --- /dev/null +++ b/tests/apps/testapp-infoxml/appinfo/info.xml @@ -0,0 +1,9 @@ +<?xml version="1.0"?> +<info> + <id>testapp-infoxml</id> + <version>1.2.3</version> + <author>Jane</author> + <description>A b c</description> + <licence>Abc</licence> + <name>Test app</name> +</info> diff --git a/tests/apps/testapp-name-missing/appinfo/info.xml b/tests/apps/testapp-name-missing/appinfo/info.xml new file mode 100644 index 00000000000..f0a62b8d380 --- /dev/null +++ b/tests/apps/testapp-name-missing/appinfo/info.xml @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<info> + <id>testapp-version</id> + <version>1.1.1</version> + <author>Jane</author> + <description>A b c</description> + <licence>Abc</licence> +</info> diff --git a/tests/apps/testapp-version-missing/appinfo/info.xml b/tests/apps/testapp-version-missing/appinfo/info.xml new file mode 100644 index 00000000000..d7da3e07e36 --- /dev/null +++ b/tests/apps/testapp-version-missing/appinfo/info.xml @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<info> + <id>testapp-version</id> + <author>Jane</author> + <description>A b c</description> + <licence>Abc</licence> + <name>Test app</name> +</info> diff --git a/tests/apps/testapp-version/appinfo/info.xml b/tests/apps/testapp-version/appinfo/info.xml new file mode 100644 index 00000000000..d7da3e07e36 --- /dev/null +++ b/tests/apps/testapp-version/appinfo/info.xml @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<info> + <id>testapp-version</id> + <author>Jane</author> + <description>A b c</description> + <licence>Abc</licence> + <name>Test app</name> +</info> diff --git a/tests/apps/testapp-version/appinfo/version b/tests/apps/testapp-version/appinfo/version new file mode 100644 index 00000000000..0495c4a88ca --- /dev/null +++ b/tests/apps/testapp-version/appinfo/version @@ -0,0 +1 @@ +1.2.3 diff --git a/tests/core/avatar/avatarcontrollertest.php b/tests/core/avatar/avatarcontrollertest.php index e8fb977fae1..929a4e5f91d 100644 --- a/tests/core/avatar/avatarcontrollertest.php +++ b/tests/core/avatar/avatarcontrollertest.php @@ -76,6 +76,8 @@ class AvatarControllerTest extends \Test\TestCase { ->disableOriginalConstructor()->getMock(); $this->container['UserFolder'] = $this->getMockBuilder('OCP\Files\Folder') ->disableOriginalConstructor()->getMock(); + $this->container['Logger'] = $this->getMockBuilder('OCP\ILogger') + ->disableOriginalConstructor()->getMock(); $this->avatarMock = $this->getMockBuilder('OCP\IAvatar') ->disableOriginalConstructor()->getMock(); @@ -217,8 +219,11 @@ class AvatarControllerTest extends \Test\TestCase { $this->avatarMock->method('remove')->will($this->throwException(new \Exception("foo"))); $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock); - $response = $this->avatarController->deleteAvatar(); - $this->assertEquals(Http::STATUS_BAD_REQUEST, $response->getStatus()); + $this->container['Logger']->expects($this->once()) + ->method('logException') + ->with(new \Exception("foo")); + $expectedResponse = new Http\DataResponse(['data' => ['message' => 'An error occurred. Please contact your admin.']], Http::STATUS_BAD_REQUEST); + $this->assertEquals($expectedResponse, $this->avatarController->deleteAvatar()); } /** @@ -329,6 +334,26 @@ class AvatarControllerTest extends \Test\TestCase { } /** + * Test what happens if the upload of the avatar fails + */ + public function testPostAvatarException() { + $this->container['Cache']->expects($this->once()) + ->method('set') + ->will($this->throwException(new \Exception("foo"))); + $file = $this->getMockBuilder('OCP\Files\File') + ->disableOriginalConstructor()->getMock(); + $file->method('getContent')->willReturn(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); + $this->container['UserFolder']->method('get')->willReturn($file); + + $this->container['Logger']->expects($this->once()) + ->method('logException') + ->with(new \Exception("foo")); + $expectedResponse = new Http\DataResponse(['data' => ['message' => 'An error occurred. Please contact your admin.']], Http::STATUS_OK); + $this->assertEquals($expectedResponse, $this->avatarController->postAvatar('avatar.jpg')); + } + + + /** * Test invalid crop argument */ public function testPostCroppedAvatarInvalidCrop() { @@ -372,6 +397,23 @@ class AvatarControllerTest extends \Test\TestCase { } /** + * Test what happens if the cropping of the avatar fails + */ + public function testPostCroppedAvatarException() { + $this->container['Cache']->method('get')->willReturn(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); + + $this->avatarMock->method('set')->will($this->throwException(new \Exception('foo'))); + $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock); + + $this->container['Logger']->expects($this->once()) + ->method('logException') + ->with(new \Exception('foo')); + $expectedResponse = new Http\DataResponse(['data' => ['message' => 'An error occurred. Please contact your admin.']], Http::STATUS_BAD_REQUEST); + $this->assertEquals($expectedResponse, $this->avatarController->postCroppedAvatar(['x' => 0, 'y' => 0, 'w' => 10, 'h' => 11])); + } + + + /** * Check for proper reply on proper crop argument */ public function testFileTooBig() { diff --git a/tests/core/command/config/listconfigstest.php b/tests/core/command/config/listconfigstest.php index 7492701cce3..bde6a1b0db3 100644 --- a/tests/core/command/config/listconfigstest.php +++ b/tests/core/command/config/listconfigstest.php @@ -23,6 +23,7 @@ namespace Tests\Core\Command\Config; use OC\Core\Command\Config\ListConfigs; +use OCP\IConfig; use Test\TestCase; class ListConfigsTest extends TestCase { @@ -66,7 +67,7 @@ class ListConfigsTest extends TestCase { 'overwrite.cli.url', ], [ - ['secret', 'N;', 'my secret'], + ['secret', 'N;', IConfig::SENSITIVE_VALUE], ['overwrite.cli.url', 'N;', 'http://localhost'], ], // app config @@ -81,7 +82,7 @@ class ListConfigsTest extends TestCase { false, json_encode([ 'system' => [ - 'secret' => ListConfigs::SENSITIVE_VALUE, + 'secret' => IConfig::SENSITIVE_VALUE, 'overwrite.cli.url' => 'http://localhost', ], 'apps' => [ @@ -139,12 +140,12 @@ class ListConfigsTest extends TestCase { 'overwrite.cli.url', ], [ - ['secret', 'N;', 'my secret'], + ['secret', 'N;', IConfig::SENSITIVE_VALUE], ['objectstore', 'N;', [ 'class' => 'OC\\Files\\ObjectStore\\Swift', 'arguments' => [ 'username' => 'facebook100000123456789', - 'password' => 'Secr3tPaSSWoRdt7', + 'password' => IConfig::SENSITIVE_VALUE, ], ]], ['overwrite.cli.url', 'N;', 'http://localhost'], @@ -161,12 +162,12 @@ class ListConfigsTest extends TestCase { false, json_encode([ 'system' => [ - 'secret' => ListConfigs::SENSITIVE_VALUE, + 'secret' => IConfig::SENSITIVE_VALUE, 'objectstore' => [ 'class' => 'OC\\Files\\ObjectStore\\Swift', 'arguments' => [ 'username' => 'facebook100000123456789', - 'password' => ListConfigs::SENSITIVE_VALUE, + 'password' => IConfig::SENSITIVE_VALUE, ], ], 'overwrite.cli.url' => 'http://localhost', @@ -276,9 +277,15 @@ class ListConfigsTest extends TestCase { $this->systemConfig->expects($this->any()) ->method('getKeys') ->willReturn($systemConfigs); - $this->systemConfig->expects($this->any()) - ->method('getValue') - ->willReturnMap($systemConfigMap); + if ($private) { + $this->systemConfig->expects($this->any()) + ->method('getValue') + ->willReturnMap($systemConfigMap); + } else { + $this->systemConfig->expects($this->any()) + ->method('getFilteredValue') + ->willReturnMap($systemConfigMap); + } $this->appConfig->expects($this->any()) ->method('getApps') diff --git a/tests/data/app/code-checker/test-const.php b/tests/data/app/code-checker/test-const.php index 2af6baf2f3d..7ea3bd6c870 100644 --- a/tests/data/app/code-checker/test-const.php +++ b/tests/data/app/code-checker/test-const.php @@ -5,6 +5,6 @@ */ class BadClass { public function foo() { - $bar = OC_API::ADMIN_AUTH; + $bar = \OC_API::ADMIN_AUTH; } } diff --git a/tests/lib/api.php b/tests/lib/api.php index 6a8fcfcd058..1d1f97c4942 100644 --- a/tests/lib/api.php +++ b/tests/lib/api.php @@ -36,6 +36,50 @@ class Test_API extends \Test\TestCase { $this->assertEquals($success, $result->succeeded()); } + /** + * @return array + */ + public function versionDataScriptNameProvider() { + return [ + // Valid script name + [ + '/master/ocs/v2.php', + true, + ], + + // Invalid script names + [ + '/master/ocs/v2.php/someInvalidPathName', + false, + ], + [ + '/master/ocs/v1.php', + false, + ], + [ + '', + false, + ], + ]; + } + + /** + * @dataProvider versionDataScriptNameProvider + * @param string $scriptName + * @param bool $expected + */ + public function testIsV2($scriptName, $expected) { + $request = $this->getMockBuilder('\OCP\IRequest') + ->disableOriginalConstructor() + ->getMock(); + $request + ->expects($this->once()) + ->method('getScriptName') + ->will($this->returnValue($scriptName)); + + $this->assertEquals($expected, $this->invokePrivate(new \OC_API, 'isV2', [$request])); + } + function dataProviderTestOneResult() { return [ [100, true], diff --git a/tests/lib/app/codechecker/deprecationchecktest.php b/tests/lib/app/codechecker/deprecationchecktest.php index 2cf64a9d186..ee69f075a61 100644 --- a/tests/lib/app/codechecker/deprecationchecktest.php +++ b/tests/lib/app/codechecker/deprecationchecktest.php @@ -38,6 +38,7 @@ class DeprecationCheckTest extends TestCase { ['OCP\AppFramework\IApi', 1006, 'test-deprecated-use-alias.php'], ['AppFramework\IApi', 1001, 'test-deprecated-use-sub.php'], ['OAF\IApi', 1001, 'test-deprecated-use-sub-alias.php'], + ['OC_API::ADMIN_AUTH', 1003, 'test-const.php'], ]; } @@ -61,7 +62,6 @@ class DeprecationCheckTest extends TestCase { ['test-extends.php'], ['test-implements.php'], ['test-static-call.php'], - ['test-const.php'], ['test-new.php'], ['test-use.php'], ['test-identical-operator.php'], diff --git a/tests/lib/app/codechecker/infocheckertest.php b/tests/lib/app/codechecker/infocheckertest.php new file mode 100644 index 00000000000..59c1316b769 --- /dev/null +++ b/tests/lib/app/codechecker/infocheckertest.php @@ -0,0 +1,73 @@ +<?php +/** + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC\App\CodeChecker; + +use OC\App\InfoParser; +use Test\TestCase; + +class InfoCheckerTest extends TestCase { + /** @var InfoChecker */ + protected $infoChecker; + + public static function setUpBeforeClass() { + \OC::$APPSROOTS[] = [ + 'path' => \OC::$SERVERROOT . '/tests/apps', + 'url' => '/apps-test', + 'writable' => false, + ]; + } + + public static function tearDownAfterClass() { + // remove last element + array_pop(\OC::$APPSROOTS); + } + + protected function setUp() { + parent::setUp(); + $infoParser = new InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator()); + + $this->infoChecker = new InfoChecker($infoParser); + } + + public function appInfoData() { + return [ + ['testapp-infoxml', []], + ['testapp-version', []], + ['testapp-infoxml-version', []], + ['testapp-infoxml-version-different', [['type' => 'differentVersions', 'message' => 'appinfo/version: 1.2.4 - appinfo/info.xml: 1.2.3']]], + ['testapp-version-missing', [['type' => 'mandatoryFieldMissing', 'field' => 'version']]], + ['testapp-name-missing', [['type' => 'mandatoryFieldMissing', 'field' => 'name']]], + ]; + } + + /** + * @dataProvider appInfoData + * + * @param $appId + * @param $expectedErrors + */ + public function testApps($appId, $expectedErrors) { + $errors = $this->infoChecker->analyse($appId); + + $this->assertEquals($expectedErrors, $errors); + } +} diff --git a/tests/lib/appframework/controller/ControllerTest.php b/tests/lib/appframework/controller/ControllerTest.php index 243014a91a7..c847525c263 100644 --- a/tests/lib/appframework/controller/ControllerTest.php +++ b/tests/lib/appframework/controller/ControllerTest.php @@ -178,7 +178,7 @@ class ControllerTest extends \Test\TestCase { 'test' => 'something', 'Cache-Control' => 'no-cache, must-revalidate', 'Content-Type' => 'application/json; charset=utf-8', - 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'", + 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'", ]; $response = $this->controller->customDataResponse(array('hi')); diff --git a/tests/lib/appframework/http/ContentSecurityPolicyTest.php b/tests/lib/appframework/http/ContentSecurityPolicyTest.php index 082c032a420..6d9c6d7b8d9 100644 --- a/tests/lib/appframework/http/ContentSecurityPolicyTest.php +++ b/tests/lib/appframework/http/ContentSecurityPolicyTest.php @@ -28,19 +28,19 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDefault() { - $defaultPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $defaultPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->assertSame($defaultPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyScriptDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyScriptDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com www.owncloud.org 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com www.owncloud.org 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.org'); @@ -48,7 +48,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowScriptDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.com'); @@ -56,7 +56,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowScriptDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.org'); @@ -64,7 +64,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowScriptDomainMultipleStacked() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.org')->disallowScriptDomain('www.owncloud.com'); @@ -72,14 +72,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyScriptAllowInline() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->allowInlineScript(true); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyScriptAllowInlineWithDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com'); $this->contentSecurityPolicy->allowInlineScript(true); @@ -87,7 +87,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyScriptDisallowInlineAndEval() { - $expectedPolicy = "default-src 'none';script-src 'self';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->allowInlineScript(false); $this->contentSecurityPolicy->allowEvalScript(false); @@ -95,14 +95,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyStyleDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyStyleDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com www.owncloud.org 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com www.owncloud.org 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.org'); @@ -110,7 +110,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowStyleDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.com'); @@ -118,7 +118,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowStyleDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.org'); @@ -126,7 +126,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowStyleDomainMultipleStacked() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.org')->disallowStyleDomain('www.owncloud.com'); @@ -134,35 +134,35 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyStyleAllowInline() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->allowInlineStyle(true); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyStyleAllowInlineWithDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyStyleDisallowInline() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->allowInlineStyle(false); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyImageDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyImageDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: www.owncloud.com www.owncloud.org;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob: www.owncloud.com www.owncloud.org;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.org'); @@ -170,7 +170,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowImageDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowImageDomain('www.owncloud.com'); @@ -178,7 +178,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowImageDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowImageDomain('www.owncloud.org'); @@ -186,7 +186,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowImageDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowImageDomain('www.owncloud.org')->disallowImageDomain('www.owncloud.com'); @@ -194,14 +194,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyFontDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyFontDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self' www.owncloud.com www.owncloud.org;connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self' www.owncloud.com www.owncloud.org;connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.org'); @@ -209,7 +209,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowFontDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowFontDomain('www.owncloud.com'); @@ -217,7 +217,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowFontDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowFontDomain('www.owncloud.org'); @@ -225,7 +225,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowFontDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowFontDomain('www.owncloud.org')->disallowFontDomain('www.owncloud.com'); @@ -233,14 +233,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyConnectDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'"; $this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyConnectDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self' www.owncloud.com www.owncloud.org;media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self' www.owncloud.com www.owncloud.org;media-src 'self'"; $this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.org'); @@ -248,7 +248,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowConnectDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.com'); @@ -256,7 +256,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowConnectDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'"; $this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.org'); @@ -264,7 +264,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowConnectDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.org')->disallowConnectDomain('www.owncloud.com'); @@ -272,14 +272,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyMediaDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com"; $this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyMediaDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com www.owncloud.org"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com www.owncloud.org"; $this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.org'); @@ -287,7 +287,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowMediaDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.com'); @@ -295,7 +295,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowMediaDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com"; $this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.org'); @@ -303,7 +303,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowMediaDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.org')->disallowMediaDomain('www.owncloud.com'); @@ -311,14 +311,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyObjectDomainValid() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com"; $this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyObjectDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com www.owncloud.org"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com www.owncloud.org"; $this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.org'); @@ -326,7 +326,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowObjectDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.com'); @@ -334,7 +334,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowObjectDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com"; $this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.org'); @@ -342,7 +342,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowObjectDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.org')->disallowObjectDomain('www.owncloud.com'); @@ -350,14 +350,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetAllowedFrameDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com"; $this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyFrameDomainValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com www.owncloud.org"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com www.owncloud.org"; $this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); $this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.org'); @@ -365,7 +365,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowFrameDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.com'); @@ -373,7 +373,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowFrameDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com"; $this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.org'); @@ -381,7 +381,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowFrameDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.org')->disallowFrameDomain('www.owncloud.com'); @@ -389,14 +389,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetAllowedChildSrcDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com"; $this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.com'); $this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy()); } public function testGetPolicyChildSrcValidMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com child.owncloud.org"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com child.owncloud.org"; $this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.com'); $this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.org'); @@ -404,7 +404,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowChildSrcDomain() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.com'); @@ -412,7 +412,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowChildSrcDomainMultiple() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';child-src www.owncloud.com"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';child-src www.owncloud.com"; $this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.org'); @@ -420,7 +420,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testGetPolicyDisallowChildSrcDomainMultipleStakes() { - $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com'); $this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.org')->disallowChildSrcDomain('www.owncloud.com'); @@ -428,7 +428,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase { } public function testConfigureStacked() { - $expectedPolicy = "default-src 'none';script-src 'self' script.owncloud.org;style-src 'self' style.owncloud.org;img-src 'self' data: img.owncloud.org;font-src 'self' font.owncloud.org;connect-src 'self' connect.owncloud.org;media-src 'self' media.owncloud.org;object-src objects.owncloud.org;frame-src frame.owncloud.org;child-src child.owncloud.org"; + $expectedPolicy = "default-src 'none';script-src 'self' script.owncloud.org;style-src 'self' style.owncloud.org;img-src 'self' data: blob: img.owncloud.org;font-src 'self' font.owncloud.org;connect-src 'self' connect.owncloud.org;media-src 'self' media.owncloud.org;object-src objects.owncloud.org;frame-src frame.owncloud.org;child-src child.owncloud.org"; $this->contentSecurityPolicy->allowInlineStyle(false) ->allowEvalScript(false) diff --git a/tests/lib/appframework/http/DataResponseTest.php b/tests/lib/appframework/http/DataResponseTest.php index 2b7817c28e9..e3d5689d54c 100644 --- a/tests/lib/appframework/http/DataResponseTest.php +++ b/tests/lib/appframework/http/DataResponseTest.php @@ -68,7 +68,7 @@ class DataResponseTest extends \Test\TestCase { $expectedHeaders = [ 'Cache-Control' => 'no-cache, must-revalidate', - 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'", + 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'", ]; $expectedHeaders = array_merge($expectedHeaders, $headers); diff --git a/tests/lib/appframework/http/RequestTest.php b/tests/lib/appframework/http/RequestTest.php index deb28909869..bb9910b6a46 100644 --- a/tests/lib/appframework/http/RequestTest.php +++ b/tests/lib/appframework/http/RequestTest.php @@ -60,18 +60,18 @@ class RequestTest extends \Test\TestCase { ); // Countable - $this->assertEquals(2, count($request)); + $this->assertSame(2, count($request)); // Array access - $this->assertEquals('Joey', $request['nickname']); + $this->assertSame('Joey', $request['nickname']); // "Magic" accessors - $this->assertEquals('Joey', $request->{'nickname'}); + $this->assertSame('Joey', $request->{'nickname'}); $this->assertTrue(isset($request['nickname'])); $this->assertTrue(isset($request->{'nickname'})); - $this->assertEquals(false, isset($request->{'flickname'})); + $this->assertFalse(isset($request->{'flickname'})); // Only testing 'get', but same approach for post, files etc. - $this->assertEquals('Joey', $request->get['nickname']); + $this->assertSame('Joey', $request->get['nickname']); // Always returns null if variable not set. - $this->assertEquals(null, $request->{'flickname'}); + $this->assertSame(null, $request->{'flickname'}); } @@ -92,9 +92,9 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals(3, count($request)); - $this->assertEquals('Janey', $request->{'nickname'}); - $this->assertEquals('Johnny Weissmüller', $request->{'name'}); + $this->assertSame(3, count($request)); + $this->assertSame('Janey', $request->{'nickname'}); + $this->assertSame('Johnny Weissmüller', $request->{'name'}); } @@ -172,10 +172,10 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('GET', $request->method); + $this->assertSame('GET', $request->method); $result = $request->get; - $this->assertEquals('John Q. Public', $result['name']); - $this->assertEquals('Joey', $result['nickname']); + $this->assertSame('John Q. Public', $result['name']); + $this->assertSame('Joey', $result['nickname']); } public function testJsonPost() { @@ -194,12 +194,33 @@ class RequestTest extends \Test\TestCase { $this->stream ); + $this->assertSame('POST', $request->method); + $result = $request->post; + $this->assertSame('John Q. Public', $result['name']); + $this->assertSame('Joey', $result['nickname']); + $this->assertSame('Joey', $request->params['nickname']); + $this->assertSame('Joey', $request['nickname']); + } + + public function testNotJsonPost() { + global $data; + $data = 'this is not valid json'; + $vars = array( + 'method' => 'POST', + 'server' => array('CONTENT_TYPE' => 'application/json; utf-8') + ); + + $request = new Request( + $vars, + $this->secureRandom, + $this->getMock('\OCP\Security\ICrypto'), + $this->config, + $this->stream + ); + $this->assertEquals('POST', $request->method); $result = $request->post; - $this->assertEquals('John Q. Public', $result['name']); - $this->assertEquals('Joey', $result['nickname']); - $this->assertEquals('Joey', $request->params['nickname']); - $this->assertEquals('Joey', $request['nickname']); + // ensure there's no error attempting to decode the content } public function testPatch() { @@ -219,11 +240,11 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('PATCH', $request->method); + $this->assertSame('PATCH', $request->method); $result = $request->patch; - $this->assertEquals('John Q. Public', $result['name']); - $this->assertEquals('Joey', $result['nickname']); + $this->assertSame('John Q. Public', $result['name']); + $this->assertSame('Joey', $result['nickname']); } public function testJsonPatchAndPut() { @@ -244,11 +265,11 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('PUT', $request->method); + $this->assertSame('PUT', $request->method); $result = $request->put; - $this->assertEquals('John Q. Public', $result['name']); - $this->assertEquals('Joey', $result['nickname']); + $this->assertSame('John Q. Public', $result['name']); + $this->assertSame('Joey', $result['nickname']); // PATCH content $data = '{"name": "John Q. Public", "nickname": null}'; @@ -265,11 +286,11 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('PATCH', $request->method); + $this->assertSame('PATCH', $request->method); $result = $request->patch; - $this->assertEquals('John Q. Public', $result['name']); - $this->assertEquals(null, $result['nickname']); + $this->assertSame('John Q. Public', $result['name']); + $this->assertSame(null, $result['nickname']); } public function testPutStream() { @@ -290,10 +311,10 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('PUT', $request->method); + $this->assertSame('PUT', $request->method); $resource = $request->put; $contents = stream_get_contents($resource); - $this->assertEquals($data, $contents); + $this->assertSame($data, $contents); try { $resource = $request->put; @@ -322,7 +343,7 @@ class RequestTest extends \Test\TestCase { $newParams = array('id' => '3', 'test' => 'test2'); $request->setUrlParameters($newParams); - $this->assertEquals('test2', $request->getParam('test')); + $this->assertSame('test2', $request->getParam('test')); $this->assertEquals('3', $request->getParam('id')); $this->assertEquals('3', $request->getParams()['id']); } @@ -497,6 +518,57 @@ class RequestTest extends \Test\TestCase { $this->assertSame('192.168.0.233', $request->getRemoteAddress()); } + /** + * @return array + */ + public function httpProtocolProvider() { + return [ + // Valid HTTP 1.0 + ['HTTP/1.0', 'HTTP/1.0'], + ['http/1.0', 'HTTP/1.0'], + ['HTTp/1.0', 'HTTP/1.0'], + + // Valid HTTP 1.1 + ['HTTP/1.1', 'HTTP/1.1'], + ['http/1.1', 'HTTP/1.1'], + ['HTTp/1.1', 'HTTP/1.1'], + + // Valid HTTP 2.0 + ['HTTP/2', 'HTTP/2'], + ['http/2', 'HTTP/2'], + ['HTTp/2', 'HTTP/2'], + + // Invalid + ['HTTp/394', 'HTTP/1.1'], + ['InvalidProvider/1.1', 'HTTP/1.1'], + [null, 'HTTP/1.1'], + ['', 'HTTP/1.1'], + + ]; + } + + /** + * @dataProvider httpProtocolProvider + * + * @param mixed $input + * @param string $expected + */ + public function testGetHttpProtocol($input, $expected) { + $request = new Request( + [ + 'server' => [ + 'SERVER_PROTOCOL' => $input, + ], + ], + $this->secureRandom, + $this->getMock('\OCP\Security\ICrypto'), + $this->config, + $this->stream + ); + + $this->assertSame($expected, $request->getHttpProtocol()); + } + public function testGetServerProtocolWithOverride() { $this->config ->expects($this->at(0)) @@ -660,7 +732,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals($matches, $request->isUserAgent($userAgent)); + $this->assertSame($matches, $request->isUserAgent($userAgent)); } /** @@ -749,7 +821,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('from.server.name:8080', $request->getInsecureServerHost()); + $this->assertSame('from.server.name:8080', $request->getInsecureServerHost()); } public function testInsecureServerHostHttpHostHeader() { @@ -766,7 +838,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('from.host.header:8080', $request->getInsecureServerHost()); + $this->assertSame('from.host.header:8080', $request->getInsecureServerHost()); } public function testInsecureServerHostHttpFromForwardedHeaderSingle() { @@ -784,7 +856,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('from.forwarded.host:8080', $request->getInsecureServerHost()); + $this->assertSame('from.forwarded.host:8080', $request->getInsecureServerHost()); } public function testInsecureServerHostHttpFromForwardedHeaderStacked() { @@ -802,7 +874,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('from.forwarded.host2:8080', $request->getInsecureServerHost()); + $this->assertSame('from.forwarded.host2:8080', $request->getInsecureServerHost()); } public function testGetServerHostWithOverwriteHost() { @@ -830,7 +902,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('my.overwritten.host', $request->getServerHost()); + $this->assertSame('my.overwritten.host', $request->getServerHost()); } public function testGetServerHostWithTrustedDomain() { @@ -852,7 +924,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('my.trusted.host', $request->getServerHost()); + $this->assertSame('my.trusted.host', $request->getServerHost()); } public function testGetServerHostWithUntrustedDomain() { @@ -879,7 +951,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('my.trusted.host', $request->getServerHost()); + $this->assertSame('my.trusted.host', $request->getServerHost()); } public function testGetServerHostWithNoTrustedDomain() { @@ -906,7 +978,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('', $request->getServerHost()); + $this->assertSame('', $request->getServerHost()); } public function testGetOverwriteHostDefaultNull() { @@ -967,7 +1039,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals('apps/files/', $request->getPathInfo()); + $this->assertSame('apps/files/', $request->getPathInfo()); } /** @@ -1032,7 +1104,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals($expected, $request->getPathInfo()); + $this->assertSame($expected, $request->getPathInfo()); } /** @@ -1055,7 +1127,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals($expected, $request->getRawPathInfo()); + $this->assertSame($expected, $request->getRawPathInfo()); } /** @@ -1078,7 +1150,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals($expected, $request->getRawPathInfo()); + $this->assertSame($expected, $request->getRawPathInfo()); } /** @@ -1101,7 +1173,7 @@ class RequestTest extends \Test\TestCase { $this->stream ); - $this->assertEquals($expected, $request->getPathInfo()); + $this->assertSame($expected, $request->getPathInfo()); } /** @@ -1109,6 +1181,7 @@ class RequestTest extends \Test\TestCase { */ public function genericPathInfoProvider() { return [ + ['/core/index.php?XDEBUG_SESSION_START=14600', '/core/index.php', ''], ['/index.php/apps/files/', 'index.php', '/apps/files/'], ['/index.php/apps/files/../&/&?someQueryParameter=QueryParam', 'index.php', '/apps/files/../&/&'], ['/remote.php/漢字編碼方法 / 汉字编码方法', 'remote.php', '/漢字編碼方法 / 汉字编码方法'], diff --git a/tests/lib/appframework/http/ResponseTest.php b/tests/lib/appframework/http/ResponseTest.php index 61dd95e5948..f845f02d984 100644 --- a/tests/lib/appframework/http/ResponseTest.php +++ b/tests/lib/appframework/http/ResponseTest.php @@ -58,7 +58,7 @@ class ResponseTest extends \Test\TestCase { $this->childResponse->setHeaders($expected); $headers = $this->childResponse->getHeaders(); - $expected['Content-Security-Policy'] = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'"; + $expected['Content-Security-Policy'] = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'"; $this->assertEquals($expected, $headers); } diff --git a/tests/lib/cache/file.php b/tests/lib/cache/file.php index 94001291d86..b5f186c5416 100644 --- a/tests/lib/cache/file.php +++ b/tests/lib/cache/file.php @@ -60,7 +60,7 @@ class FileCache extends \Test_Cache { \OC_Config::setValue('cachedirectory', $datadir); \OC_User::clearBackends(); - \OC_User::useBackend(new \OC_User_Dummy()); + \OC_User::useBackend(new \Test\Util\User\Dummy()); //login \OC_User::createUser('test', 'test'); diff --git a/tests/lib/config.php b/tests/lib/configtests.php index 91154579ab5..0269ae542f4 100644 --- a/tests/lib/config.php +++ b/tests/lib/configtests.php @@ -6,7 +6,9 @@ * See the COPYING-README file. */ -class Test_Config extends \Test\TestCase { +namespace Test; + +class ConfigTests extends TestCase { const TESTCONTENT = '<?php $CONFIG=array("foo"=>"bar", "beers" => array("Appenzeller", "Guinness", "Kölsch"), "alcohol_free" => false);'; /** @var array */ @@ -24,7 +26,7 @@ class Test_Config extends \Test\TestCase { $this->randomTmpDir = \OC_Helper::tmpFolder(); $this->configFile = $this->randomTmpDir.'testconfig.php'; file_put_contents($this->configFile, self::TESTCONTENT); - $this->config = new OC\Config($this->randomTmpDir, 'testconfig.php'); + $this->config = new \OC\Config($this->randomTmpDir, 'testconfig.php'); } protected function tearDown() { diff --git a/tests/lib/db/querybuilder/quotehelpertest.php b/tests/lib/db/querybuilder/quotehelpertest.php index 904b4c500db..b83d9eed2df 100644 --- a/tests/lib/db/querybuilder/quotehelpertest.php +++ b/tests/lib/db/querybuilder/quotehelpertest.php @@ -43,6 +43,10 @@ class QuoteHelperTest extends \Test\TestCase { [new Literal('literal'), 'literal'], [new Literal(1), '1'], [new Parameter(':param'), ':param'], + + // (string) 'null' is Doctrines way to set columns to null + // See https://github.com/owncloud/core/issues/19314 + ['null', 'null'], ]; } diff --git a/tests/lib/encryption/decryptalltest.php b/tests/lib/encryption/decryptalltest.php index eb3bc721f86..ce5bcf1e5ae 100644 --- a/tests/lib/encryption/decryptalltest.php +++ b/tests/lib/encryption/decryptalltest.php @@ -80,11 +80,15 @@ class DecryptAllTest extends TestCase { /** * @dataProvider dataTrueFalse + * @param bool $prepareResult */ - public function testDecryptAll($prepareResult) { - - $user = 'user1'; + public function testDecryptAll($prepareResult, $user) { + if (!empty($user)) { + $this->userManager->expects($this->once())->method('userExists')->willReturn(true); + } else { + $this->userManager->expects($this->never())->method('userExists'); + } /** @var DecryptAll | \PHPUnit_Framework_MockObject_MockObject | $instance */ $instance = $this->getMockBuilder('OC\Encryption\DecryptAll') ->setConstructorArgs( @@ -115,12 +119,27 @@ class DecryptAllTest extends TestCase { public function dataTrueFalse() { return [ - [true], - [false] + [true, 'user1'], + [false, 'user1'], + [true, ''], + [true, null] ]; } /** + * test decrypt all call with a user who doesn't exists + */ + public function testDecryptAllWrongUser() { + $this->userManager->expects($this->once())->method('userExists')->willReturn(false); + $this->outputInterface->expects($this->once())->method('writeln') + ->with('User "user1" does not exist. Please check the username and try again'); + + $this->assertFalse( + $this->instance->decryptAll($this->inputInterface, $this->outputInterface, 'user1') + ); + } + + /** * @dataProvider dataTrueFalse */ public function testPrepareEncryptionModules($success) { diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php index b44cf0a49df..871b12bac3a 100644 --- a/tests/lib/files/cache/scanner.php +++ b/tests/lib/files/cache/scanner.php @@ -284,4 +284,27 @@ class Scanner extends \Test\TestCase { $cachedData = $this->cache->get('folder/bar.txt'); $this->assertEquals($newFolderId, $cachedData['parent']); } + + /** + * @dataProvider dataTestIsPartialFile + * + * @param string $path + * @param bool $expected + */ + public function testIsPartialFile($path, $expected) { + $this->assertSame($expected, + $this->scanner->isPartialFile($path) + ); + } + + public function dataTestIsPartialFile() { + return [ + ['foo.txt.part', true], + ['/sub/folder/foo.txt.part', true], + ['/sub/folder.part/foo.txt', true], + ['foo.txt', false], + ['/sub/folder/foo.txt', false], + ]; + } + } diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php index ea75c8dcd72..e3fa26829b4 100644 --- a/tests/lib/files/cache/updater.php +++ b/tests/lib/files/cache/updater.php @@ -143,6 +143,24 @@ class Updater extends \Test\TestCase { $this->assertEquals($cached['fileid'], $cachedTarget['fileid']); } + public function testMoveNonExistingOverwrite() { + $this->storage->file_put_contents('bar.txt', 'qwerty'); + $this->updater->update('bar.txt'); + + $cached = $this->cache->get('bar.txt'); + + $this->updater->rename('foo.txt', 'bar.txt'); + + $this->assertFalse($this->cache->inCache('foo.txt')); + $this->assertTrue($this->cache->inCache('bar.txt')); + + $cachedTarget = $this->cache->get('bar.txt'); + $this->assertEquals($cached['etag'], $cachedTarget['etag']); + $this->assertEquals($cached['mtime'], $cachedTarget['mtime']); + $this->assertEquals($cached['size'], $cachedTarget['size']); + $this->assertEquals($cached['fileid'], $cachedTarget['fileid']); + } + public function testNewFileDisabled() { $this->storage->file_put_contents('foo.txt', 'bar'); $this->assertFalse($this->cache->inCache('foo.txt')); diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php index c3d364d6800..1a11b29cf00 100644 --- a/tests/lib/files/etagtest.php +++ b/tests/lib/files/etagtest.php @@ -17,7 +17,7 @@ class EtagTest extends \Test\TestCase { private $tmpDir; /** - * @var \OC_User_Dummy $userBackend + * @var \Test\Util\User\Dummy $userBackend */ private $userBackend; @@ -35,7 +35,7 @@ class EtagTest extends \Test\TestCase { $this->tmpDir = \OC_Helper::tmpFolder(); \OC_Config::setValue('datadirectory', $this->tmpDir); - $this->userBackend = new \OC_User_Dummy(); + $this->userBackend = new \Test\Util\User\Dummy(); \OC_User::useBackend($this->userBackend); } diff --git a/tests/lib/files/filesystem.php b/tests/lib/files/filesystem.php index b7061bd19a0..15a7c235405 100644 --- a/tests/lib/files/filesystem.php +++ b/tests/lib/files/filesystem.php @@ -72,7 +72,7 @@ class Filesystem extends \Test\TestCase { protected function setUp() { parent::setUp(); - $userBackend = new \OC_User_Dummy(); + $userBackend = new \Test\Util\User\Dummy(); $userBackend->createUser(self::TEST_FILESYSTEM_USER1, self::TEST_FILESYSTEM_USER1); $userBackend->createUser(self::TEST_FILESYSTEM_USER2, self::TEST_FILESYSTEM_USER2); \OC::$server->getUserManager()->registerBackend($userBackend); @@ -274,7 +274,7 @@ class Filesystem extends \Test\TestCase { $user = \OC_User::getUser(); } else { $user = self::TEST_FILESYSTEM_USER1; - $backend = new \OC_User_Dummy(); + $backend = new \Test\Util\User\Dummy(); \OC_User::useBackend($backend); $backend->createUser($user, $user); $userObj = \OC::$server->getUserManager()->get($user); @@ -325,8 +325,14 @@ class Filesystem extends \Test\TestCase { $homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/'); - $this->assertTrue($homeMount->instanceOfStorage('\OC\Files\Storage\Home')); - $this->assertEquals('home::' . $userId, $homeMount->getId()); + $this->assertTrue($homeMount->instanceOfStorage('\OCP\Files\IHomeStorage')); + if (getenv('RUN_OBJECTSTORE_TESTS')) { + $this->assertTrue($homeMount->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')); + $this->assertEquals('object::user:' . $userId, $homeMount->getId()); + } else { + $this->assertTrue($homeMount->instanceOfStorage('\OC\Files\Storage\Home')); + $this->assertEquals('home::' . $userId, $homeMount->getId()); + } \OC_User::deleteUser($userId); } @@ -336,6 +342,9 @@ class Filesystem extends \Test\TestCase { * for the user's mount point */ public function testLegacyHomeMount() { + if (getenv('RUN_OBJECTSTORE_TESTS')) { + $this->markTestSkipped('legacy storage unrelated to objectstore environments'); + } $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data"); $userId = $this->getUniqueID('user_'); @@ -380,7 +389,7 @@ class Filesystem extends \Test\TestCase { \OC\Files\Filesystem::getMountPoint('/' . $userId . '/cache') ); list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath('/' . $userId . '/cache'); - $this->assertTrue($storage->instanceOfStorage('\OC\Files\Storage\Home')); + $this->assertTrue($storage->instanceOfStorage('\OCP\Files\IHomeStorage')); $this->assertEquals('cache', $internalPath); \OC_User::deleteUser($userId); diff --git a/tests/lib/files/node/file.php b/tests/lib/files/node/file.php index e3b8019b4ca..c431a2eb366 100644 --- a/tests/lib/files/node/file.php +++ b/tests/lib/files/node/file.php @@ -18,7 +18,7 @@ class File extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->user = new \OC\User\User('', new \OC_User_Dummy); + $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } protected function getFileInfo($data) { diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php index 96795cb02ef..8c98256575e 100644 --- a/tests/lib/files/node/folder.php +++ b/tests/lib/files/node/folder.php @@ -21,7 +21,7 @@ class Folder extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->user = new \OC\User\User('', new \OC_User_Dummy); + $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } protected function getFileInfo($data) { @@ -421,6 +421,45 @@ class Folder extends \Test\TestCase { $this->assertEquals('/foo', $result[0]->getPath()); } + public function testSearchInStorageRoot() { + $manager = $this->getMock('\OC\Files\Mount\Manager'); + /** + * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view + */ + $view = $this->getMock('\OC\Files\View'); + $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); + $root->expects($this->any()) + ->method('getUser') + ->will($this->returnValue($this->user)); + $storage = $this->getMock('\OC\Files\Storage\Storage'); + $cache = $this->getMock('\OC\Files\Cache\Cache', array(), array('')); + + $storage->expects($this->once()) + ->method('getCache') + ->will($this->returnValue($cache)); + + $cache->expects($this->once()) + ->method('search') + ->with('%qw%') + ->will($this->returnValue(array( + array('fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain') + ))); + + $root->expects($this->once()) + ->method('getMountsIn') + ->with('/bar') + ->will($this->returnValue(array())); + + $view->expects($this->once()) + ->method('resolvePath') + ->will($this->returnValue(array($storage, ''))); + + $node = new \OC\Files\Node\Folder($root, $view, '/bar'); + $result = $node->search('qw'); + $this->assertEquals(1, count($result)); + $this->assertEquals('/bar/foo/qwerty', $result[0]->getPath()); + } + public function testSearchByTag() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** diff --git a/tests/lib/files/node/hookconnector.php b/tests/lib/files/node/hookconnector.php new file mode 100644 index 00000000000..10566cf5fb1 --- /dev/null +++ b/tests/lib/files/node/hookconnector.php @@ -0,0 +1,176 @@ +<?php +/** + * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Files\Node; + +use OC\Files\Filesystem; +use OC\Files\Node\Root; +use OC\Files\Storage\Temporary; +use OC\Files\View; +use OCP\Files\Node; +use Test\TestCase; +use Test\Traits\MountProviderTrait; +use Test\Traits\UserTrait; + +class HookConnector extends TestCase { + use UserTrait; + use MountProviderTrait; + + /** + * @var View + */ + private $view; + + /** + * @var Root + */ + private $root; + + /** + * @var string + */ + private $userId; + + public function setUp() { + parent::setUp(); + $this->userId = $this->getUniqueID(); + $this->createUser($this->userId, 'pass'); + $this->registerMount($this->userId, new Temporary(), '/' . $this->userId . '/files/'); + \OC_Util::setupFS($this->userId); + $this->view = new View(); + $this->root = new Root(Filesystem::getMountManager(), $this->view, \OC::$server->getUserManager()->get($this->userId)); + } + + public function tearDown() { + parent::tearDown(); + \OC_Hook::clear('OC_Filesystem'); + \OC_Util::tearDownFS(); + } + + public function viewToNodeProvider() { + return [ + [function () { + Filesystem::file_put_contents('test.txt', 'asd'); + }, 'preWrite'], + [function () { + Filesystem::file_put_contents('test.txt', 'asd'); + }, 'postWrite'], + [function () { + Filesystem::file_put_contents('test.txt', 'asd'); + }, 'preCreate'], + [function () { + Filesystem::file_put_contents('test.txt', 'asd'); + }, 'postCreate'], + [function () { + Filesystem::mkdir('test.txt'); + }, 'preCreate'], + [function () { + Filesystem::mkdir('test.txt'); + }, 'postCreate'], + [function () { + Filesystem::touch('test.txt'); + }, 'preTouch'], + [function () { + Filesystem::touch('test.txt'); + }, 'postTouch'], + [function () { + Filesystem::touch('test.txt'); + }, 'preCreate'], + [function () { + Filesystem::touch('test.txt'); + }, 'postCreate'], + [function () { + Filesystem::file_put_contents('test.txt', 'asd'); + Filesystem::unlink('test.txt'); + }, 'preDelete'], + [function () { + Filesystem::file_put_contents('test.txt', 'asd'); + Filesystem::unlink('test.txt'); + }, 'postDelete'], + [function () { + Filesystem::mkdir('test.txt'); + Filesystem::rmdir('test.txt'); + }, 'preDelete'], + [function () { + Filesystem::mkdir('test.txt'); + Filesystem::rmdir('test.txt'); + }, 'postDelete'], + ]; + } + + /** + * @param callable $operation + * @param string $expectedHook + * @dataProvider viewToNodeProvider + */ + public function testViewToNode(callable $operation, $expectedHook) { + $connector = new \OC\Files\Node\HookConnector($this->root, $this->view); + $connector->viewToNode(); + $hookCalled = false; + /** @var Node $hookNode */ + $hookNode = null; + + $this->root->listen('\OC\Files', $expectedHook, function ($node) use (&$hookNode, &$hookCalled) { + $hookCalled = true; + $hookNode = $node; + }); + + $operation(); + + $this->assertTrue($hookCalled); + $this->assertEquals('/' . $this->userId . '/files/test.txt', $hookNode->getPath()); + } + + public function viewToNodeProviderCopyRename() { + return [ + [function () { + Filesystem::file_put_contents('source', 'asd'); + Filesystem::rename('source', 'target'); + }, 'preRename'], + [function () { + Filesystem::file_put_contents('source', 'asd'); + Filesystem::rename('source', 'target'); + }, 'postRename'], + [function () { + Filesystem::file_put_contents('source', 'asd'); + Filesystem::copy('source', 'target'); + }, 'preCopy'], + [function () { + Filesystem::file_put_contents('source', 'asd'); + Filesystem::copy('source', 'target'); + }, 'postCopy'], + ]; + } + + /** + * @param callable $operation + * @param string $expectedHook + * @dataProvider viewToNodeProviderCopyRename + */ + public function testViewToNodeCopyRename(callable $operation, $expectedHook) { + $connector = new \OC\Files\Node\HookConnector($this->root, $this->view); + $connector->viewToNode(); + $hookCalled = false; + /** @var Node $hookSourceNode */ + $hookSourceNode = null; + /** @var Node $hookTargetNode */ + $hookTargetNode = null; + + $this->root->listen('\OC\Files', $expectedHook, function ($sourceNode, $targetNode) use (&$hookCalled, &$hookSourceNode, &$hookTargetNode) { + $hookCalled = true; + $hookSourceNode = $sourceNode; + $hookTargetNode = $targetNode; + }); + + $operation(); + + $this->assertTrue($hookCalled); + $this->assertEquals('/' . $this->userId . '/files/source', $hookSourceNode->getPath()); + $this->assertEquals('/' . $this->userId . '/files/target', $hookTargetNode->getPath()); + } +} diff --git a/tests/lib/files/node/integration.php b/tests/lib/files/node/integration.php index 2d5ccd1fb85..5580b40a126 100644 --- a/tests/lib/files/node/integration.php +++ b/tests/lib/files/node/integration.php @@ -36,7 +36,7 @@ class IntegrationTests extends \Test\TestCase { \OC_Hook::clear('OC_Filesystem'); - $user = new User($this->getUniqueID('user'), new \OC_User_Dummy); + $user = new User($this->getUniqueID('user'), new \Test\Util\User\Dummy); $this->loginAsUser($user->getUID()); $this->view = new View(); diff --git a/tests/lib/files/node/node.php b/tests/lib/files/node/node.php index 01ed84c4a06..afcf4cbabaa 100644 --- a/tests/lib/files/node/node.php +++ b/tests/lib/files/node/node.php @@ -15,7 +15,7 @@ class Node extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->user = new \OC\User\User('', new \OC_User_Dummy); + $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } protected function getFileInfo($data) { diff --git a/tests/lib/files/node/root.php b/tests/lib/files/node/root.php index a763428209c..4b1aea1da4e 100644 --- a/tests/lib/files/node/root.php +++ b/tests/lib/files/node/root.php @@ -17,7 +17,7 @@ class Root extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->user = new \OC\User\User('', new \OC_User_Dummy); + $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } protected function getFileInfo($data) { diff --git a/tests/lib/files/objectstore/swift.php b/tests/lib/files/objectstore/swift.php index 0aaf7d906dd..6d59078aa7c 100644 --- a/tests/lib/files/objectstore/swift.php +++ b/tests/lib/files/objectstore/swift.php @@ -23,9 +23,11 @@ namespace OCA\ObjectStore\Tests\Unit; use OC\Files\ObjectStore\ObjectStoreStorage; use OC\Files\ObjectStore\Swift as ObjectStoreToTest; -//class Swift extends PHPUnit_Framework_TestCase { class Swift extends \Test\Files\Storage\Storage { + /** + * @var ObjectStoreToTest + */ private $objectStorage; protected function setUp() { @@ -35,9 +37,6 @@ class Swift extends \Test\Files\Storage\Storage { $this->markTestSkipped('objectstore tests are unreliable in some environments'); } - \OC_App::disable('files_sharing'); - \OC_App::disable('files_versions'); - // reset backend \OC_User::clearBackends(); \OC_User::useBackend('database'); @@ -50,28 +49,15 @@ class Swift extends \Test\Files\Storage\Storage { } // main test user - $userName = 'test'; \OC_Util::tearDownFS(); \OC_User::setUserId(''); \OC\Files\Filesystem::tearDown(); \OC_User::setUserId('test'); - $testContainer = 'oc-test-container-'.substr( md5(rand()), 0, 7); - - $params = array( - 'username' => 'facebook100000330192569', - 'password' => 'Dbdj1sXnRSHxIGc4', - 'container' => $testContainer, - 'autocreate' => true, - 'region' => 'RegionOne', //required, trystack defaults to 'RegionOne' - 'url' => 'http://8.21.28.222:5000/v2.0', // The Identity / Keystone endpoint - 'tenantName' => 'facebook100000330192569', // required on trystack - 'serviceName' => 'swift', //trystack uses swift by default, the lib defaults to 'cloudFiles' if omitted - 'user' => \OC_User::getManager()->get($userName) - ); - $this->objectStorage = new ObjectStoreToTest($params); - $params['objectstore'] = $this->objectStorage; - $this->instance = new ObjectStoreStorage($params); + $config = \OC::$server->getConfig()->getSystemValue('objectstore'); + $this->objectStorage = new ObjectStoreToTest($config['arguments']); + $config['objectstore'] = $this->objectStorage; + $this->instance = new ObjectStoreStorage($config); } protected function tearDown() { @@ -81,6 +67,10 @@ class Swift extends \Test\Files\Storage\Storage { $this->objectStorage->deleteContainer(true); $this->instance->getCache()->clear(); + $users = array('test'); + foreach($users as $userName) { + \OC_User::deleteUser($userName); + } parent::tearDown(); } @@ -109,6 +99,10 @@ class Swift extends \Test\Files\Storage\Storage { } } + public function testCheckUpdate() { + $this->markTestSkipped('Detecting external changes is not supported on object storages'); + } + /** * @dataProvider copyAndMoveProvider */ diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php index fcd7f73dcde..d381b4cdf40 100644 --- a/tests/lib/files/storage/storage.php +++ b/tests/lib/files/storage/storage.php @@ -573,4 +573,29 @@ abstract class Storage extends \Test\TestCase { $this->assertSameAsLorem($target); $this->assertTrue($this->instance->file_exists($source), $source . ' was deleted'); } + + public function testIsCreatable() { + $this->instance->mkdir('source'); + $this->assertTrue($this->instance->isCreatable('source')); + } + + public function testIsReadable() { + $this->instance->mkdir('source'); + $this->assertTrue($this->instance->isReadable('source')); + } + + public function testIsUpdatable() { + $this->instance->mkdir('source'); + $this->assertTrue($this->instance->isUpdatable('source')); + } + + public function testIsDeletable() { + $this->instance->mkdir('source'); + $this->assertTrue($this->instance->isDeletable('source')); + } + + public function testIsShareable() { + $this->instance->mkdir('source'); + $this->assertTrue($this->instance->isSharable('source')); + } } diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php index 44e910b901f..095405462df 100644 --- a/tests/lib/files/storage/wrapper/encryption.php +++ b/tests/lib/files/storage/wrapper/encryption.php @@ -558,4 +558,27 @@ class Encryption extends \Test\Files\Storage\Storage { $this->assertFalse(false); } + + /** + * @dataProvider dataTestIsVersion + * @param string $path + * @param bool $expected + */ + public function testIsVersion($path, $expected) { + $this->assertSame($expected, + $this->invokePrivate($this->instance, 'isVersion', [$path]) + ); + } + + public function dataTestIsVersion() { + return [ + ['files_versions/foo', true], + ['/files_versions/foo', true], + ['//files_versions/foo', true], + ['files/versions/foo', false], + ['files/files_versions/foo', false], + ['files_versions_test/foo', false], + ]; + } + } diff --git a/tests/lib/files/storage/wrapper/jail.php b/tests/lib/files/storage/wrapper/jail.php index a7bd684df44..9b16bc5a321 100644 --- a/tests/lib/files/storage/wrapper/jail.php +++ b/tests/lib/files/storage/wrapper/jail.php @@ -30,7 +30,7 @@ class Jail extends \Test\Files\Storage\Storage { $contents = array(); $dh = $this->sourceStorage->opendir(''); while ($file = readdir($dh)) { - if ($file !== '.' and $file !== '..') { + if (!\OC\Files\Filesystem::isIgnoredDir($file)) { $contents[] = $file; } } diff --git a/tests/lib/files/type/detection.php b/tests/lib/files/type/detection.php index 1997fa4dfd6..5800f4eb8e3 100644 --- a/tests/lib/files/type/detection.php +++ b/tests/lib/files/type/detection.php @@ -19,58 +19,64 @@ * */ -namespace OC\Files\Type; +namespace Test\Files\Type; use \OC\Files\Type\Detection; class DetectionTest extends \Test\TestCase { + /** @var Detection */ + private $detection; + + public function setUp() { + parent::setUp(); + $this->detection = new Detection( + \OC::$server->getURLGenerator(), + \OC::$SERVERROOT . '/config/', + \OC::$SERVERROOT . '/resources/config/' + ); + } public function testDetect() { - $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); $dir = \OC::$SERVERROOT.'/tests/data'; - $result = $detection->detect($dir."/"); + $result = $this->detection->detect($dir."/"); $expected = 'httpd/unix-directory'; $this->assertEquals($expected, $result); - $result = $detection->detect($dir."/data.tar.gz"); + $result = $this->detection->detect($dir."/data.tar.gz"); $expected = 'application/x-gzip'; $this->assertEquals($expected, $result); - $result = $detection->detect($dir."/data.zip"); + $result = $this->detection->detect($dir."/data.zip"); $expected = 'application/zip'; $this->assertEquals($expected, $result); - $result = $detection->detect($dir."/testimagelarge.svg"); + $result = $this->detection->detect($dir."/testimagelarge.svg"); $expected = 'image/svg+xml'; $this->assertEquals($expected, $result); - $result = $detection->detect($dir."/testimage.png"); + $result = $this->detection->detect($dir."/testimage.png"); $expected = 'image/png'; $this->assertEquals($expected, $result); } public function testGetSecureMimeType() { - $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); - - $result = $detection->getSecureMimeType('image/svg+xml'); + $result = $this->detection->getSecureMimeType('image/svg+xml'); $expected = 'text/plain'; $this->assertEquals($expected, $result); - $result = $detection->getSecureMimeType('image/png'); + $result = $this->detection->getSecureMimeType('image/png'); $expected = 'image/png'; $this->assertEquals($expected, $result); } public function testDetectPath() { - $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); - - $this->assertEquals('text/plain', $detection->detectPath('foo.txt')); - $this->assertEquals('image/png', $detection->detectPath('foo.png')); - $this->assertEquals('image/png', $detection->detectPath('foo.bar.png')); - $this->assertEquals('application/octet-stream', $detection->detectPath('.png')); - $this->assertEquals('application/octet-stream', $detection->detectPath('foo')); - $this->assertEquals('application/octet-stream', $detection->detectPath('')); + $this->assertEquals('text/plain', $this->detection->detectPath('foo.txt')); + $this->assertEquals('image/png', $this->detection->detectPath('foo.png')); + $this->assertEquals('image/png', $this->detection->detectPath('foo.bar.png')); + $this->assertEquals('application/octet-stream', $this->detection->detectPath('.png')); + $this->assertEquals('application/octet-stream', $this->detection->detectPath('foo')); + $this->assertEquals('application/octet-stream', $this->detection->detectPath('')); } public function testDetectString() { @@ -78,16 +84,14 @@ class DetectionTest extends \Test\TestCase { $this->markTestSkipped('[Windows] Strings have mimetype application/octet-stream on Windows'); } - $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); - - $result = $detection->detectString("/data/data.tar.gz"); + $result = $this->detection->detectString("/data/data.tar.gz"); $expected = 'text/plain; charset=us-ascii'; $this->assertEquals($expected, $result); } public function testMimeTypeIcon() { if (!class_exists('org\\bovigo\\vfs\\vfsStream')) { - $this->markTestSkipped('Pacakge vfsStream not installed'); + $this->markTestSkipped('Package vfsStream not installed'); } $confDir = \org\bovigo\vfs\vfsStream::setup(); $mimetypealiases_dist = \org\bovigo\vfs\vfsStream::newFile('mimetypealiases.dist.json')->at($confDir); @@ -111,7 +115,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/folder.png')) ->willReturn('folder.svg'); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('dir'); $this->assertEquals('folder.svg', $mimeType); @@ -130,7 +134,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-shared.png')) ->willReturn('folder-shared.svg'); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('dir-shared'); $this->assertEquals('folder-shared.svg', $mimeType); @@ -150,7 +154,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-external.png')) ->willReturn('folder-external.svg'); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('dir-external'); $this->assertEquals('folder-external.svg', $mimeType); @@ -170,7 +174,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/my-type.png')) ->willReturn('my-type.svg'); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('my-type'); $this->assertEquals('my-type.svg', $mimeType); @@ -200,7 +204,7 @@ class DetectionTest extends \Test\TestCase { } )); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('my-type'); $this->assertEquals('my.svg', $mimeType); @@ -231,7 +235,7 @@ class DetectionTest extends \Test\TestCase { } )); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('foo-bar'); $this->assertEquals('file.svg', $mimeType); @@ -250,7 +254,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/foo-bar.png')) ->willReturn('foo-bar.svg'); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('foo-bar'); $this->assertEquals('foo-bar.svg', $mimeType); $mimeType = $detection->mimeTypeIcon('foo-bar'); @@ -276,7 +280,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/foobar-baz.png')) ->willReturn('foobar-baz.svg'); - $detection = new Detection($urlGenerator, $confDir->url()); + $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('foo'); $this->assertEquals('foobar-baz.svg', $mimeType); } diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php index 75cd75ee3f5..5492774f42e 100644 --- a/tests/lib/files/utils/scanner.php +++ b/tests/lib/files/utils/scanner.php @@ -42,14 +42,14 @@ class TestScanner extends \OC\Files\Utils\Scanner { class Scanner extends \Test\TestCase { /** - * @var \OC_User_Dummy + * @var \Test\Util\User\Dummy */ private $userBackend; protected function setUp() { parent::setUp(); - $this->userBackend = new \OC_User_Dummy(); + $this->userBackend = new \Test\Util\User\Dummy(); \OC::$server->getUserManager()->registerBackend($this->userBackend); $this->loginAsUser(); } diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index bb42f385fc5..c0845a5613c 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -68,7 +68,7 @@ class View extends \Test\TestCase { \OC_Hook::clear(); \OC_User::clearBackends(); - \OC_User::useBackend(new \OC_User_Dummy()); + \OC_User::useBackend(new \Test\Util\User\Dummy()); //login $userManager = \OC::$server->getUserManager(); @@ -104,6 +104,9 @@ class View extends \Test\TestCase { $this->userObject->delete(); $this->groupObject->delete(); + $mountProviderCollection = \OC::$server->getMountProviderCollection(); + \Test\TestCase::invokePrivate($mountProviderCollection, 'providers', [[]]); + parent::tearDown(); } @@ -193,7 +196,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testGetPath() { + public function testGetPath() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $storage3 = $this->getTestStorage(); @@ -219,7 +222,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testMountPointOverwrite() { + public function testMountPointOverwrite() { $storage1 = $this->getTestStorage(false); $storage2 = $this->getTestStorage(); $storage1->mkdir('substorage'); @@ -265,7 +268,7 @@ class View extends \Test\TestCase { $appConfig->setValue('core', 'shareapi_exclude_groups_list', $oldExcludeGroupsList); } - function testCacheIncompleteFolder() { + public function testCacheIncompleteFolder() { $storage1 = $this->getTestStorage(false); \OC\Files\Filesystem::clearMounts(); \OC\Files\Filesystem::mount($storage1, array(), '/incomplete'); @@ -300,7 +303,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testSearch() { + public function testSearch() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $storage3 = $this->getTestStorage(); @@ -350,7 +353,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testWatcher() { + public function testWatcher() { $storage1 = $this->getTestStorage(); \OC\Files\Filesystem::mount($storage1, array(), '/'); $storage1->getWatcher()->setPolicy(Watcher::CHECK_ALWAYS); @@ -371,7 +374,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testCopyBetweenStorageNoCross() { + public function testCopyBetweenStorageNoCross() { $storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross'); $storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross'); $this->copyBetweenStorages($storage1, $storage2); @@ -380,7 +383,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testCopyBetweenStorageCross() { + public function testCopyBetweenStorageCross() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $this->copyBetweenStorages($storage1, $storage2); @@ -389,7 +392,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testCopyBetweenStorageCrossNonLocal() { + public function testCopyBetweenStorageCrossNonLocal() { $storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal'); $storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal'); $this->copyBetweenStorages($storage1, $storage2); @@ -417,7 +420,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testMoveBetweenStorageNoCross() { + public function testMoveBetweenStorageNoCross() { $storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross'); $storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross'); $this->moveBetweenStorages($storage1, $storage2); @@ -426,7 +429,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testMoveBetweenStorageCross() { + public function testMoveBetweenStorageCross() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $this->moveBetweenStorages($storage1, $storage2); @@ -435,7 +438,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testMoveBetweenStorageCrossNonLocal() { + public function testMoveBetweenStorageCrossNonLocal() { $storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal'); $storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal'); $this->moveBetweenStorages($storage1, $storage2); @@ -458,7 +461,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testUnlink() { + public function testUnlink() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); \OC\Files\Filesystem::mount($storage1, array(), '/'); @@ -481,7 +484,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testUnlinkRootMustFail() { + public function testUnlinkRootMustFail() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); \OC\Files\Filesystem::mount($storage1, array(), '/'); @@ -500,7 +503,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testTouch() { + public function testTouch() { $storage = $this->getTestStorage(true, '\Test\Files\TemporaryNoTouch'); \OC\Files\Filesystem::mount($storage, array(), '/'); @@ -524,7 +527,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testViewHooks() { + public function testViewHooks() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $defaultRoot = \OC\Files\Filesystem::getRoot(); @@ -590,7 +593,7 @@ class View extends \Test\TestCase { /** * @medium */ - function testViewHooksIfRootStartsTheSame() { + public function testViewHooksIfRootStartsTheSame() { $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $defaultRoot = \OC\Files\Filesystem::getRoot(); @@ -851,24 +854,98 @@ class View extends \Test\TestCase { } /** - * @dataProvider relativePathProvider + * @dataProvider chrootRelativePathProvider */ - function testGetRelativePath($absolutePath, $expectedPath) { + function testChrootGetRelativePath($root, $absolutePath, $expectedPath) { $view = new \OC\Files\View('/files'); - // simulate a external storage mount point which has a trailing slash - $view->chroot('/files/'); + $view->chroot($root); + $this->assertEquals($expectedPath, $view->getRelativePath($absolutePath)); + } + + public function chrootRelativePathProvider() { + return $this->relativePathProvider('/'); + } + + /** + * @dataProvider initRelativePathProvider + */ + public function testInitGetRelativePath($root, $absolutePath, $expectedPath) { + $view = new \OC\Files\View($root); $this->assertEquals($expectedPath, $view->getRelativePath($absolutePath)); } - function relativePathProvider() { + public function initRelativePathProvider() { + return $this->relativePathProvider(null); + } + + public function relativePathProvider($missingRootExpectedPath) { return array( - array('/files/', '/'), - array('/files', '/'), - array('/files/0', '0'), - array('/files/false', 'false'), - array('/files/true', 'true'), - array('/files/test', 'test'), - array('/files/test/foo', 'test/foo'), + // No root - returns the path + array('', '/files', '/files'), + array('', '/files/', '/files/'), + + // Root equals path - / + array('/files/', '/files/', '/'), + array('/files/', '/files', '/'), + array('/files', '/files/', '/'), + array('/files', '/files', '/'), + + // False negatives: chroot fixes those by adding the leading slash. + // But setting them up with this root (instead of chroot($root)) + // will fail them, although they should be the same. + // TODO init should be fixed, so it also adds the leading slash + array('files/', '/files/', $missingRootExpectedPath), + array('files', '/files/', $missingRootExpectedPath), + array('files/', '/files', $missingRootExpectedPath), + array('files', '/files', $missingRootExpectedPath), + + // False negatives: Paths provided to the method should have a leading slash + // TODO input should be checked to have a leading slash + array('/files/', 'files/', null), + array('/files', 'files/', null), + array('/files/', 'files', null), + array('/files', 'files', null), + + // with trailing slashes + array('/files/', '/files/0', '0'), + array('/files/', '/files/false', 'false'), + array('/files/', '/files/true', 'true'), + array('/files/', '/files/test', 'test'), + array('/files/', '/files/test/foo', 'test/foo'), + + // without trailing slashes + // TODO false expectation: Should match "with trailing slashes" + array('/files', '/files/0', '/0'), + array('/files', '/files/false', '/false'), + array('/files', '/files/true', '/true'), + array('/files', '/files/test', '/test'), + array('/files', '/files/test/foo', '/test/foo'), + + // leading slashes + array('/files/', '/files_trashbin/', null), + array('/files', '/files_trashbin/', null), + array('/files/', '/files_trashbin', null), + array('/files', '/files_trashbin', null), + + // no leading slashes + array('files/', 'files_trashbin/', null), + array('files', 'files_trashbin/', null), + array('files/', 'files_trashbin', null), + array('files', 'files_trashbin', null), + + // mixed leading slashes + array('files/', '/files_trashbin/', null), + array('/files/', 'files_trashbin/', null), + array('files', '/files_trashbin/', null), + array('/files', 'files_trashbin/', null), + array('files/', '/files_trashbin', null), + array('/files/', 'files_trashbin', null), + array('files', '/files_trashbin', null), + array('/files', 'files_trashbin', null), + + array('files', 'files_trashbin/test', null), + array('/files', '/files_trashbin/test', null), + array('/files', 'files_trashbin/test', null), ); } @@ -1012,6 +1089,7 @@ class View extends \Test\TestCase { $storage2->expects($this->any()) ->method('fopen') ->will($this->returnCallback(function ($path, $mode) use ($storage2) { + /** @var \PHPUnit_Framework_MockObject_MockObject | \OC\Files\Storage\Temporary $storage2 */ $source = fopen($storage2->getSourcePath($path), $mode); return \OC\Files\Stream\Quota::wrap($source, 9); })); @@ -1020,7 +1098,7 @@ class View extends \Test\TestCase { $storage1->file_put_contents('foo.txt', '0123456789ABCDEFGH'); $storage1->mkdir('dirtomove'); $storage1->file_put_contents('dirtomove/indir1.txt', '0123456'); // fits - $storage1->file_put_contents('dirtomove/indir2.txt', '0123456789ABCDEFGH'); // doesn't fit + $storage1->file_put_contents('dirtomove/indir2.txt', '0123456789ABCDEFGH'); // doesn't fit $storage2->file_put_contents('existing.txt', '0123'); $storage1->getScanner()->scan(''); $storage2->getScanner()->scan(''); @@ -1296,7 +1374,7 @@ class View extends \Test\TestCase { $thrown = false; try { - // this actually acquires two locks, one on the mount point and one no the storage root, + // this actually acquires two locks, one on the mount point and one on the storage root, // but the one on the storage root will fail $view->lockFile('/mountpoint.txt', ILockingProvider::LOCK_SHARED); } catch (\OCP\Lock\LockedException $e) { @@ -1411,6 +1489,112 @@ class View extends \Test\TestCase { $this->assertEquals($shouldEmit, $result); } + /** + * Create test movable mount points + * + * @param array $mountPoints array of mount point locations + * @return array array of MountPoint objects + */ + private function createTestMovableMountPoints($mountPoints) { + $mounts = []; + foreach ($mountPoints as $mountPoint) { + $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary') + ->setMethods([]) + ->getMock(); + + $mounts[] = $this->getMock( + '\Test\TestMoveableMountPoint', + ['moveMount'], + [$storage, $mountPoint] + ); + } + + $mountProvider = $this->getMock('\OCP\Files\Config\IMountProvider'); + $mountProvider->expects($this->any()) + ->method('getMountsForUser') + ->will($this->returnValue($mounts)); + + $mountProviderCollection = \OC::$server->getMountProviderCollection(); + $mountProviderCollection->registerProvider($mountProvider); + + return $mounts; + } + + /** + * Test mount point move + */ + public function testMountPointMove() { + $this->loginAsUser($this->user); + + list($mount1, $mount2) = $this->createTestMovableMountPoints([ + $this->user . '/files/mount1', + $this->user . '/files/mount2', + ]); + $mount1->expects($this->once()) + ->method('moveMount') + ->will($this->returnValue(true)); + + $mount2->expects($this->once()) + ->method('moveMount') + ->will($this->returnValue(true)); + + $view = new \OC\Files\View('/' . $this->user . '/files/'); + $view->mkdir('sub'); + + $this->assertTrue($view->rename('mount1', 'renamed_mount'), 'Can rename mount point'); + $this->assertTrue($view->rename('mount2', 'sub/moved_mount'), 'Can move a mount point into a subdirectory'); + } + /** + * Test that moving a mount point into another is forbidden + */ + public function testMoveMountPointIntoAnother() { + $this->loginAsUser($this->user); + + list($mount1, $mount2) = $this->createTestMovableMountPoints([ + $this->user . '/files/mount1', + $this->user . '/files/mount2', + ]); + + $mount1->expects($this->never()) + ->method('moveMount'); + + $mount2->expects($this->never()) + ->method('moveMount'); + + $view = new \OC\Files\View('/' . $this->user . '/files/'); + + $this->assertFalse($view->rename('mount1', 'mount2'), 'Cannot overwrite another mount point'); + $this->assertFalse($view->rename('mount1', 'mount2/sub'), 'Cannot move a mount point into another'); + } + /** + * Test that moving a mount point into a shared folder is forbidden + */ + public function testMoveMountPointIntoSharedFolder() { + $this->loginAsUser($this->user); + + list($mount1) = $this->createTestMovableMountPoints([ + $this->user . '/files/mount1', + ]); + + $mount1->expects($this->never()) + ->method('moveMount'); + + $view = new \OC\Files\View('/' . $this->user . '/files/'); + $view->mkdir('shareddir'); + $view->mkdir('shareddir/sub'); + $view->mkdir('shareddir/sub2'); + + $fileId = $view->getFileInfo('shareddir')->getId(); + $userObject = \OC::$server->getUserManager()->createUser('test2', 'IHateNonMockableStaticClasses'); + $this->assertTrue(\OCP\Share::shareItem('folder', $fileId, \OCP\Share::SHARE_TYPE_USER, 'test2', \OCP\Constants::PERMISSION_READ)); + + $this->assertFalse($view->rename('mount1', 'shareddir'), 'Cannot overwrite shared folder'); + $this->assertFalse($view->rename('mount1', 'shareddir/sub'), 'Cannot move mount point into shared folder'); + $this->assertFalse($view->rename('mount1', 'shareddir/sub/sub2'), 'Cannot move mount point into shared subfolder'); + + $this->assertTrue(\OCP\Share::unshare('folder', $fileId, \OCP\Share::SHARE_TYPE_USER, 'test2')); + $userObject->delete(); + } public function basicOperationProviderForLocks() { return [ @@ -1818,6 +2002,49 @@ class View extends \Test\TestCase { } /** + * simulate a failed copy operation. + * We expect that we catch the exception, free the lock and re-throw it. + * + * @expectedException \Exception + */ + public function testLockFileCopyException() { + $view = new \OC\Files\View('/' . $this->user . '/files/'); + + $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary') + ->setMethods(['copy']) + ->getMock(); + + $sourcePath = 'original.txt'; + $targetPath = 'target.txt'; + + \OC\Files\Filesystem::mount($storage, array(), $this->user . '/'); + $storage->mkdir('files'); + $view->file_put_contents($sourcePath, 'meh'); + + $storage->expects($this->once()) + ->method('copy') + ->will($this->returnCallback( + function() { + throw new \Exception(); + } + )); + + $this->connectMockHooks('copy', $view, $sourcePath, $lockTypeSourcePre, $lockTypeSourcePost); + $this->connectMockHooks('copy', $view, $targetPath, $lockTypeTargetPre, $lockTypeTargetPost); + + $this->assertNull($this->getFileLockType($view, $sourcePath), 'Source file not locked before operation'); + $this->assertNull($this->getFileLockType($view, $targetPath), 'Target file not locked before operation'); + + try { + $view->copy($sourcePath, $targetPath); + } catch (\Exception $e) { + $this->assertNull($this->getFileLockType($view, $sourcePath), 'Source file not locked after operation'); + $this->assertNull($this->getFileLockType($view, $targetPath), 'Target file not locked after operation'); + throw $e; + } + } + + /** * Test rename operation: unlock first path when second path was locked */ public function testLockFileRenameUnlockOnException() { @@ -1924,23 +2151,9 @@ class View extends \Test\TestCase { public function testLockMoveMountPoint() { $this->loginAsUser('test'); - $subStorage = $this->getMockBuilder('\OC\Files\Storage\Temporary') - ->setMethods([]) - ->getMock(); - - $mount = $this->getMock( - '\Test\TestMoveableMountPoint', - ['moveMount'], - [$subStorage, $this->user . '/files/substorage'] - ); - - $mountProvider = $this->getMock('\OCP\Files\Config\IMountProvider'); - $mountProvider->expects($this->once()) - ->method('getMountsForUser') - ->will($this->returnValue([$mount])); - - $mountProviderCollection = \OC::$server->getMountProviderCollection(); - $mountProviderCollection->registerProvider($mountProvider); + list($mount) = $this->createTestMovableMountPoints([ + $this->user . '/files/substorage', + ]); $view = new \OC\Files\View('/' . $this->user . '/files/'); $view->mkdir('subdir'); @@ -1991,8 +2204,6 @@ class View extends \Test\TestCase { $this->assertNull($this->getFileLockType($view, $sourcePath, false), 'Shared storage root not locked after operation'); $this->assertNull($this->getFileLockType($view, $sourcePath, true), 'Source path not locked after operation'); $this->assertNull($this->getFileLockType($view, $targetPath, true), 'Target path not locked after operation'); - - \Test\TestCase::invokePrivate($mountProviderCollection, 'providers', [[]]); } /** @@ -2064,4 +2275,53 @@ class View extends \Test\TestCase { } return null; } + + + public function testRemoveMoveableMountPoint() { + $mountPoint = '/' . $this->user . '/files/mount/'; + + // Mock the mount point + $mount = $this->getMockBuilder('\Test\TestMoveableMountPoint') + ->disableOriginalConstructor() + ->getMock(); + $mount->expects($this->once()) + ->method('getMountPoint') + ->willReturn($mountPoint); + $mount->expects($this->once()) + ->method('removeMount') + ->willReturn('foo'); + $mount->expects($this->any()) + ->method('getInternalPath') + ->willReturn(''); + + // Register mount + \OC\Files\Filesystem::getMountManager()->addMount($mount); + + // Listen for events + $eventHandler = $this->getMockBuilder('\stdclass') + ->setMethods(['umount', 'post_umount']) + ->getMock(); + $eventHandler->expects($this->once()) + ->method('umount') + ->with([\OC\Files\Filesystem::signal_param_path => '/mount']); + $eventHandler->expects($this->once()) + ->method('post_umount') + ->with([\OC\Files\Filesystem::signal_param_path => '/mount']); + \OCP\Util::connectHook( + \OC\Files\Filesystem::CLASSNAME, + 'umount', + $eventHandler, + 'umount' + ); + \OCP\Util::connectHook( + \OC\Files\Filesystem::CLASSNAME, + 'post_umount', + $eventHandler, + 'post_umount' + ); + + //Delete the mountpoint + $view = new \OC\Files\View('/' . $this->user . '/files'); + $this->assertEquals('foo', $view->rmdir('mount')); + } } diff --git a/tests/lib/group.php b/tests/lib/group.php index 795de695513..066dddc738e 100644 --- a/tests/lib/group.php +++ b/tests/lib/group.php @@ -30,7 +30,7 @@ class Test_Group extends \Test\TestCase { } public function testSingleBackend() { - $userBackend = new \OC_User_Dummy(); + $userBackend = new \Test\Util\User\Dummy(); \OC_User::getManager()->registerBackend($userBackend); OC_Group::useBackend(new OC_Group_Dummy()); @@ -112,7 +112,7 @@ class Test_Group extends \Test\TestCase { public function testUsersInGroup() { OC_Group::useBackend(new OC_Group_Dummy()); - $userBackend = new \OC_User_Dummy(); + $userBackend = new \Test\Util\User\Dummy(); \OC_User::getManager()->registerBackend($userBackend); $group1 = $this->getUniqueID(); @@ -141,7 +141,7 @@ class Test_Group extends \Test\TestCase { } public function testMultiBackend() { - $userBackend = new \OC_User_Dummy(); + $userBackend = new \Test\Util\User\Dummy(); \OC_User::getManager()->registerBackend($userBackend); $backend1 = new OC_Group_Dummy(); $backend2 = new OC_Group_Dummy(); diff --git a/tests/lib/l10n.php b/tests/lib/l10n.php index d5f9a5ca3fa..cb2f4179c4d 100644 --- a/tests/lib/l10n.php +++ b/tests/lib/l10n.php @@ -92,8 +92,7 @@ class Test_L10n extends \Test\TestCase { * @dataProvider localizationDataProvider */ public function testNumericStringLocalization($expectedDate, $lang, $type, $value) { - $l = new OC_L10N('test'); - $l->forceLanguage($lang); + $l = new OC_L10N('test', $lang); $this->assertSame($expectedDate, $l->l($type, $value)); } @@ -110,8 +109,7 @@ class Test_L10n extends \Test\TestCase { * @param $lang */ public function testFirstWeekDay($expected, $lang) { - $l = new OC_L10N('test'); - $l->forceLanguage($lang); + $l = new OC_L10N('test', $lang); $this->assertSame($expected, $l->l('firstday', 'firstday')); } diff --git a/tests/lib/logger.php b/tests/lib/logger.php index c8566988cf4..9c9cd9e6728 100644 --- a/tests/lib/logger.php +++ b/tests/lib/logger.php @@ -63,4 +63,48 @@ class Logger extends TestCase { public static function write($app, $message, $level) { self::$logs[]= "$level $message"; } + + public function userAndPasswordData() { + return [ + ['abc', 'def'], + ['mySpecialUsername', 'MySuperSecretPassword'], + ['my-user', '324324()#ä234'], + ['my-user', ')qwer'], + ['my-user', 'qwer)asdf'], + ['my-user', 'qwer)'], + ['my-user', '(qwer'], + ['my-user', 'qwer(asdf'], + ['my-user', 'qwer('], + ]; + } + + /** + * @dataProvider userAndPasswordData + */ + public function testDetectlogin($user, $password) { + $e = new \Exception('test'); + $this->logger->logException($e); + + $logLines = $this->getLogs(); + foreach($logLines as $logLine) { + $this->assertNotContains($user, $logLine); + $this->assertNotContains($password, $logLine); + $this->assertContains('login(*** username and password replaced ***)', $logLine); + } + } + + /** + * @dataProvider userAndPasswordData + */ + public function testDetectcheckPassword($user, $password) { + $e = new \Exception('test'); + $this->logger->logException($e); + $logLines = $this->getLogs(); + + foreach($logLines as $logLine) { + $this->assertNotContains($user, $logLine); + $this->assertNotContains($password, $logLine); + $this->assertContains('checkPassword(*** username and password replaced ***)', $logLine); + } + } } diff --git a/tests/lib/mail/mailer.php b/tests/lib/mail/mailer.php index 21565f9ffb5..8023cda820e 100644 --- a/tests/lib/mail/mailer.php +++ b/tests/lib/mail/mailer.php @@ -77,7 +77,7 @@ class MailerTest extends TestCase { ->method('getSystemValue') ->will($this->returnValue('sendmail')); - $this->assertInstanceOf('\Swift_SendmailTransport', self::invokePrivate($this->mailer, 'getInstance')); + $this->assertInstanceOf('\Swift_Mailer', self::invokePrivate($this->mailer, 'getInstance')); } public function testCreateMessage() { diff --git a/tests/lib/mail/message.php b/tests/lib/mail/message.php index 8ee3c33627c..339677c0a7c 100644 --- a/tests/lib/mail/message.php +++ b/tests/lib/mail/message.php @@ -39,7 +39,11 @@ class MessageTest extends TestCase { } /** + * @requires function idn_to_ascii * @dataProvider mailAddressProvider + * + * @param string $unconverted + * @param string $expected */ public function testConvertAddresses($unconverted, $expected) { $this->assertSame($expected, self::invokePrivate($this->message, 'convertAddresses', array($unconverted))); diff --git a/tests/lib/preview.php b/tests/lib/preview.php index 82ee8e2eca2..e4c599c66cf 100644 --- a/tests/lib/preview.php +++ b/tests/lib/preview.php @@ -22,7 +22,15 @@ namespace Test; +use OC\Files\FileInfo; +use OC\Files\Storage\Temporary; +use OC\Files\View; +use Test\Traits\MountProviderTrait; +use Test\Traits\UserTrait; + class Preview extends TestCase { + use UserTrait; + use MountProviderTrait; const TEST_PREVIEW_USER1 = "test-preview-user1"; @@ -59,11 +67,7 @@ class Preview extends TestCase { protected function setUp() { parent::setUp(); - $userManager = \OC::$server->getUserManager(); - $userManager->clearBackends(); - $backend = new \OC_User_Dummy(); - $userManager->registerBackend($backend); - $backend->createUser(self::TEST_PREVIEW_USER1, self::TEST_PREVIEW_USER1); + $this->createUser(self::TEST_PREVIEW_USER1, self::TEST_PREVIEW_USER1); $this->loginAsUser(self::TEST_PREVIEW_USER1); $storage = new \OC\Files\Storage\Temporary([]); @@ -75,13 +79,13 @@ class Preview extends TestCase { // We simulate the max dimension set in the config \OC::$server->getConfig() - ->setSystemValue('preview_max_x', $this->configMaxWidth); + ->setSystemValue('preview_max_x', $this->configMaxWidth); \OC::$server->getConfig() - ->setSystemValue('preview_max_y', $this->configMaxHeight); + ->setSystemValue('preview_max_y', $this->configMaxHeight); // Used to test upscaling $this->maxScaleFactor = 2; \OC::$server->getConfig() - ->setSystemValue('preview_max_scale_factor', $this->maxScaleFactor); + ->setSystemValue('preview_max_scale_factor', $this->maxScaleFactor); // We need to enable the providers we're going to use in the tests $providers = [ @@ -92,7 +96,7 @@ class Preview extends TestCase { 'OC\\Preview\\Postscript' ]; \OC::$server->getConfig() - ->setSystemValue('enabledPreviewProviders', $providers); + ->setSystemValue('enabledPreviewProviders', $providers); // Sample is 1680x1050 JPEG $this->prepareSample('testimage.jpg', 1680, 1050); @@ -161,7 +165,7 @@ class Preview extends TestCase { $fileId = $fileInfo['fileid']; $thumbCacheFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . - '/' . $fileId . '/'; + '/' . $fileId . '/'; $this->assertSame(true, $this->rootView->is_dir($thumbCacheFolder), "$thumbCacheFolder \n"); @@ -318,7 +322,7 @@ class Preview extends TestCase { // There should be no cached thumbnails $thumbnailFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . - '/' . $sampleFileId; + '/' . $sampleFileId; $this->assertSame(false, $this->rootView->is_dir($thumbnailFolder)); $image = $preview->getPreview(); @@ -534,10 +538,10 @@ class Preview extends TestCase { // Small thumbnails are always cropped $this->keepAspect = false; // Smaller previews should be based on the previous, larger preview, with the correct aspect ratio - $this->createThumbnailFromBiggerCachedPreview($fileId, 36, 36); + $this->createThumbnailFromBiggerCachedPreview($fileId, 32, 32); // 2nd cache query should indicate that we have a cached copy of the exact dimension - $this->getCachedSmallThumbnail($fileId, 36, 36); + $this->getCachedSmallThumbnail($fileId, 32, 32); // We create a preview in order to be able to delete the cache $preview = $this->createPreview(rand(), rand()); @@ -611,7 +615,7 @@ class Preview extends TestCase { // Need to take care of special postfix added to the dimensions $postfix = ''; $isMaxPreview = ($width === $this->maxPreviewWidth - && $height === $this->maxPreviewHeight) ? true : false; + && $height === $this->maxPreviewHeight) ? true : false; if ($isMaxPreview) { $postfix = '-max'; } @@ -731,7 +735,7 @@ class Preview extends TestCase { } return $userPath . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId - . '/' . $width . '-' . $height . $postfix . '.png'; + . '/' . $width . '-' . $height . $postfix . '.png'; } /** @@ -752,11 +756,11 @@ class Preview extends TestCase { $this->samples[] = [ - 'sampleFileId' => $fileInfo['fileid'], - 'sampleFileName' => $fileName, - 'sampleWidth' => $sampleWidth, - 'sampleHeight' => $sampleHeight, - 'maxPreviewWidth' => $maxPreviewWidth, + 'sampleFileId' => $fileInfo['fileid'], + 'sampleFileName' => $fileName, + 'sampleWidth' => $sampleWidth, + 'sampleHeight' => $sampleHeight, + 'maxPreviewWidth' => $maxPreviewWidth, 'maxPreviewHeight' => $maxPreviewHeight ]; } @@ -874,4 +878,79 @@ class Preview extends TestCase { return [(int)$askedWidth, (int)$askedHeight]; } + + public function testKeepAspectRatio() { + $originalWidth = 1680; + $originalHeight = 1050; + $originalAspectRation = $originalWidth / $originalHeight; + + $preview = new \OC\Preview( + self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg', + 150, + 150 + ); + $preview->setKeepAspect(true); + $image = $preview->getPreview(); + + $aspectRatio = $image->width() / $image->height(); + $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2)); + + $this->assertLessThanOrEqual(150, $image->width()); + $this->assertLessThanOrEqual(150, $image->height()); + } + + public function testKeepAspectRatioCover() { + $originalWidth = 1680; + $originalHeight = 1050; + $originalAspectRation = $originalWidth / $originalHeight; + + $preview = new \OC\Preview( + self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg', + 150, + 150 + ); + $preview->setKeepAspect(true); + $preview->setMode(\OC\Preview::MODE_COVER); + $image = $preview->getPreview(); + + $aspectRatio = $image->width() / $image->height(); + $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2)); + + $this->assertGreaterThanOrEqual(150, $image->width()); + $this->assertGreaterThanOrEqual(150, $image->height()); + } + + public function testSetFileWithInfo() { + $info = new FileInfo('/foo', null, '/foo', ['mimetype' => 'foo/bar'], null); + $preview = new \OC\Preview(); + $preview->setFile('/foo', $info); + $this->assertEquals($info, $this->invokePrivate($preview, 'getFileInfo')); + } + + public function testIsCached() { + $sourceFile = __DIR__ . '/../data/testimage.png'; + $userId = $this->getUniqueID(); + $this->createUser($userId, 'pass'); + + $storage = new Temporary(); + $storage->mkdir('files'); + $this->registerMount($userId, $storage, '/' . $userId); + + \OC_Util::tearDownFS(); + \OC_Util::setupFS($userId); + $preview = new \OC\Preview($userId, 'files'); + $view = new View('/' . $userId . '/files'); + $view->file_put_contents('test.png', file_get_contents($sourceFile)); + $info = $view->getFileInfo('test.png'); + $preview->setFile('test.png', $info); + + $preview->setMaxX(64); + $preview->setMaxY(64); + + $this->assertFalse($preview->isCached($info->getId())); + + $preview->getPreview(); + + $this->assertEquals('thumbnails/' . $info->getId() . '/64-64.png', $preview->isCached($info->getId())); + } } diff --git a/tests/lib/preview/provider.php b/tests/lib/preview/provider.php index 02459b83bb3..5377f30df82 100644 --- a/tests/lib/preview/provider.php +++ b/tests/lib/preview/provider.php @@ -49,7 +49,7 @@ abstract class Provider extends \Test\TestCase { $userManager = \OC::$server->getUserManager(); $userManager->clearBackends(); - $backend = new \OC_User_Dummy(); + $backend = new \Test\Util\User\Dummy(); $userManager->registerBackend($backend); $userId = $this->getUniqueID(); diff --git a/tests/lib/repair/repairinvalidsharestest.php b/tests/lib/repair/repairinvalidsharestest.php new file mode 100644 index 00000000000..89a5ba470e1 --- /dev/null +++ b/tests/lib/repair/repairinvalidsharestest.php @@ -0,0 +1,123 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Repair; + + +use OC\Repair\RepairInvalidShares; +use OC\Share\Constants; +use Test\TestCase; + +/** + * Tests for repairing invalid shares + * + * @see \OC\Repair\RepairInvalidShares + */ +class RepairInvalidSharesTest extends TestCase { + + /** @var \OC\RepairStep */ + private $repair; + + /** @var \OCP\IDBConnection */ + private $connection; + + protected function setUp() { + parent::setUp(); + + $config = $this->getMockBuilder('OCP\IConfig') + ->disableOriginalConstructor() + ->getMock(); + $config->expects($this->any()) + ->method('getSystemValue') + ->with('version') + ->will($this->returnValue('8.0.0.0')); + + $this->connection = \OC::$server->getDatabaseConnection(); + $this->deleteAllShares(); + + /** @var \OCP\IConfig $config */ + $this->repair = new RepairInvalidShares($config, $this->connection); + } + + protected function tearDown() { + $this->deleteAllShares(); + + parent::tearDown(); + } + + protected function deleteAllShares() { + $qb = $this->connection->getQueryBuilder(); + $qb->delete('share')->execute(); + } + + /** + * Test remove expiration date for non-link shares + */ + public function testRemoveExpirationDateForNonLinkShares() { + // user share with bogus expiration date + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(Constants::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('recipientuser1'), + 'uid_owner' => $qb->expr()->literal('user1'), + 'item_type' => $qb->expr()->literal('folder'), + 'item_source' => $qb->expr()->literal(123), + 'item_target' => $qb->expr()->literal('/123'), + 'file_source' => $qb->expr()->literal(123), + 'file_target' => $qb->expr()->literal('/test'), + 'permissions' => $qb->expr()->literal(1), + 'stime' => $qb->expr()->literal(time()), + 'expiration' => $qb->expr()->literal('2015-09-25 00:00:00') + ]) + ->execute(); + + // select because lastInsertId does not work with OCI + $results = $this->connection->getQueryBuilder() + ->select('id') + ->from('share') + ->execute() + ->fetchAll(); + $bogusShareId = $results[0]['id']; + + // link share with expiration date + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(Constants::SHARE_TYPE_LINK), + 'uid_owner' => $qb->expr()->literal('user1'), + 'item_type' => $qb->expr()->literal('folder'), + 'item_source' => $qb->expr()->literal(123), + 'item_target' => $qb->expr()->literal('/123'), + 'file_source' => $qb->expr()->literal(123), + 'file_target' => $qb->expr()->literal('/test'), + 'permissions' => $qb->expr()->literal(1), + 'stime' => $qb->expr()->literal(time()), + 'expiration' => $qb->expr()->literal('2015-09-25 00:00:00'), + 'token' => $qb->expr()->literal('abcdefg') + ])->execute(); + + $this->repair->run(); + + $results = $this->connection->getQueryBuilder() + ->select('*') + ->from('share') + ->orderBy('share_type', 'ASC') + ->execute() + ->fetchAll(); + + $this->assertCount(2, $results); + + $userShare = $results[0]; + $linkShare = $results[1]; + $this->assertEquals($bogusShareId, $userShare['id'], 'sanity check'); + $this->assertNull($userShare['expiration'], 'bogus expiration date was removed'); + $this->assertNotNull($linkShare['expiration'], 'valid link share expiration date still there'); + } +} + diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php index da36e7de58a..a0697776e73 100644 --- a/tests/lib/repair/repairmimetypes.php +++ b/tests/lib/repair/repairmimetypes.php @@ -26,8 +26,17 @@ class RepairMimeTypes extends \Test\TestCase { $this->savedMimetypeLoader = \OC::$server->getMimeTypeLoader(); $this->mimetypeLoader = \OC::$server->getMimeTypeLoader(); + $config = $this->getMockBuilder('OCP\IConfig') + ->disableOriginalConstructor() + ->getMock(); + $config->expects($this->any()) + ->method('getSystemValue') + ->with('version') + ->will($this->returnValue('8.0.0.0')); + $this->storage = new \OC\Files\Storage\Temporary([]); - $this->repair = new \OC\Repair\RepairMimeTypes(); + + $this->repair = new \OC\Repair\RepairMimeTypes($config); } protected function tearDown() { @@ -274,6 +283,68 @@ class RepairMimeTypes extends \Test\TestCase { } /** + * Test renaming the java mime types + */ + public function testRenameJavaMimeType() { + $currentMimeTypes = [ + ['test.java', 'application/octet-stream'], + ['test.class', 'application/octet-stream'], + ]; + + $fixedMimeTypes = [ + ['test.java', 'text/x-java-source'], + ['test.class', 'application/java'], + ]; + + $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes); + } + + /** + * Test renaming the hpp mime type + */ + public function testRenameHppMimeType() { + $currentMimeTypes = [ + ['test.hpp', 'application/octet-stream'], + ]; + + $fixedMimeTypes = [ + ['test.hpp', 'text/x-h'], + ]; + + $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes); + } + + /** + * Test renaming the rss mime type + */ + public function testRenameRssMimeType() { + $currentMimeTypes = [ + ['test.rss', 'application/octet-stream'], + ]; + + $fixedMimeTypes = [ + ['test.rss', 'application/rss+xml'], + ]; + + $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes); + } + + /** + * Test renaming the hpp mime type + */ + public function testRenameRtfMimeType() { + $currentMimeTypes = [ + ['test.rtf', 'application/octet-stream'], + ]; + + $fixedMimeTypes = [ + ['test.rtf', 'text/rtf'], + ]; + + $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes); + } + + /** * Test renaming and splitting old office mime types when * new ones already exist */ @@ -390,6 +461,11 @@ class RepairMimeTypes extends \Test\TestCase { ['test.cnf', 'text/plain'], ['test.yaml', 'application/yaml'], ['test.yml', 'application/yaml'], + ['test.java', 'text/x-java-source'], + ['test.class', 'application/java'], + ['test.hpp', 'text/x-h'], + ['test.rss', 'application/rss+xml'], + ['test.rtf', 'text/rtf'], ]; $fixedMimeTypes = [ @@ -429,6 +505,28 @@ class RepairMimeTypes extends \Test\TestCase { ['test.cnf', 'text/plain'], ['test.yaml', 'application/yaml'], ['test.yml', 'application/yaml'], + ['test.java', 'text/x-java-source'], + ['test.class', 'application/java'], + ['test.hpp', 'text/x-h'], + ['test.rss', 'application/rss+xml'], + ['test.rtf', 'text/rtf'], + ]; + + $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes); + } + + /** + * Test that mime type renaming does not affect folders + */ + public function testDoNotChangeFolderMimeType() { + $currentMimeTypes = [ + ['test.conf', 'httpd/unix-directory'], + ['test.cnf', 'httpd/unix-directory'], + ]; + + $fixedMimeTypes = [ + ['test.conf', 'httpd/unix-directory'], + ['test.cnf', 'httpd/unix-directory'], ]; $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes); diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php index ef0d9822085..e8127aefe8e 100644 --- a/tests/lib/share/share.php +++ b/tests/lib/share/share.php @@ -218,7 +218,7 @@ class Test_Share extends \Test\TestCase { public function testShareWithUser() { // Invalid shares - $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the item owner'; + $message = 'Sharing test.txt failed, because you can not share with yourself'; try { OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ); $this->fail('Exception was expected: '.$message); @@ -255,7 +255,7 @@ class Test_Share extends \Test\TestCase { // Attempt to share back OC_User::setUserId($this->user2); - $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the original sharer'; + $message = 'Sharing failed, because the user '.$this->user1.' is the original sharer'; try { OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ); $this->fail('Exception was expected: '.$message); @@ -405,6 +405,7 @@ class Test_Share extends \Test\TestCase { $view->mkdir('files_trashbin/files'); $fileInfo = $view->getFileInfo('files/test/sub'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); $fileId = $fileInfo->getId(); $this->assertTrue( @@ -509,6 +510,7 @@ class Test_Share extends \Test\TestCase { $view->mkdir('files/test/sub1/sub2'); $fileInfo = $view->getFileInfo('files/test/sub1'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); $fileId = $fileInfo->getId(); $this->assertTrue( @@ -521,6 +523,7 @@ class Test_Share extends \Test\TestCase { $this->assertEquals(\OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_CREATE, $result['permissions']); $fileInfo = $view->getFileInfo('files/test/sub1/sub2'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); $fileId = $fileInfo->getId(); $this->assertTrue( @@ -533,6 +536,41 @@ class Test_Share extends \Test\TestCase { $this->assertEquals(\OCP\Constants::PERMISSION_READ, $result['permissions']); } + public function testSharingAFileInsideAFolderThatIsAlreadyShared() { + OC_User::setUserId($this->user1); + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/test'); + $view->mkdir('files/test/sub1'); + $view->file_put_contents('files/test/sub1/file.txt', 'abc'); + + $folderInfo = $view->getFileInfo('files/test/sub1'); + $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo); + $folderId = $folderInfo->getId(); + + $fileInfo = $view->getFileInfo('files/test/sub1/file.txt'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); + $fileId = $fileInfo->getId(); + + $this->assertTrue( + OCP\Share::shareItem('folder', $folderId, OCP\Share::SHARE_TYPE_GROUP, $this->group2, \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_UPDATE), + 'Failed asserting that user 1 successfully shared "test/sub1" with group 2.' + ); + + $this->assertTrue( + OCP\Share::shareItem('file', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ), + 'Failed asserting that user 1 successfully shared "test/sub1/file.txt" with user 2.' + ); + + $result = \OCP\Share::getItemsSharedWithUser('file', $this->user2); + $this->assertCount(2, $result); + + foreach ($result as $share) { + $itemName = substr($share['path'], strrpos($share['path'], '/')); + $this->assertSame($itemName, $share['file_target'], 'Asserting that the file_target is the last segment of the path'); + $this->assertSame($share['item_target'], '/' . $share['item_source'], 'Asserting that the item is the item that was shared'); + } + } + protected function shareUserOneTestFileWithGroupOne() { OC_User::setUserId($this->user1); $this->assertTrue( @@ -602,7 +640,7 @@ class Test_Share extends \Test\TestCase { // Attempt to share back to owner of group share OC_User::setUserId($this->user2); - $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the original sharer'; + $message = 'Sharing failed, because the user '.$this->user1.' is the original sharer'; try { OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ); $this->fail('Exception was expected: '.$message); @@ -898,6 +936,43 @@ class Test_Share extends \Test\TestCase { $this->assertEmpty($expected, 'did not found all expected values'); } + public function testGetShareSubItemsWhenUserNotInGroup() { + OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ); + + $result = \OCP\Share::getItemsSharedWithUser('test', $this->user2); + $this->assertCount(1, $result); + + $groupShareId = array_keys($result)[0]; + + // remove user from group + $userObject = \OC::$server->getUserManager()->get($this->user2); + \OC::$server->getGroupManager()->get($this->group1)->removeUser($userObject); + + $result = \OCP\Share::getItemsSharedWithUser('test', $this->user2); + $this->assertCount(0, $result); + + // test with buggy data + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(2), // group sub-share + 'share_with' => $qb->expr()->literal($this->user2), + 'parent' => $qb->expr()->literal($groupShareId), + 'uid_owner' => $qb->expr()->literal($this->user1), + 'item_type' => $qb->expr()->literal('test'), + 'item_source' => $qb->expr()->literal('test.txt'), + 'item_target' => $qb->expr()->literal('test.txt'), + 'file_target' => $qb->expr()->literal('test2.txt'), + 'permissions' => $qb->expr()->literal(1), + 'stime' => $qb->expr()->literal(time()), + ])->execute(); + + $result = \OCP\Share::getItemsSharedWithUser('test', $this->user2); + $this->assertCount(0, $result); + + $qb->delete('share')->execute(); + } + public function testShareItemWithLink() { OC_User::setUserId($this->user1); $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ); @@ -1567,6 +1642,140 @@ class Test_Share extends \Test\TestCase { $this->setHttpHelper($oldHttpHelper); } + /** + * Test case for #19119 + */ + public function testReshareWithLinkDefaultExpirationDate() { + $config = \OC::$server->getConfig(); + $config->setAppValue('core', 'shareapi_default_expire_date', 'yes'); + $config->setAppValue('core', 'shareapi_expire_after_n_days', '2'); + + // Expiration date + $expireAt = time() + 2 * 24*60*60; + $date = new DateTime(); + $date->setTimestamp($expireAt); + $date->setTime(0, 0, 0); + + //Share a file from user 1 to user 2 + $this->shareUserTestFileWithUser($this->user1, $this->user2); + + //User 2 shares as link + OC_User::setUserId($this->user2); + $result = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ); + $this->assertTrue(is_string($result)); + + //Check if expire date is correct + $result = OCP\Share::getItemShared('test', 'test.txt'); + $this->assertCount(1, $result); + $result = reset($result); + $this->assertNotEmpty($result['expiration']); + $expireDate = new DateTime($result['expiration']); + $this->assertEquals($date, $expireDate); + + //Unshare + $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt')); + + //Reset config + $config->deleteAppValue('core', 'shareapi_default_expire_date'); + $config->deleteAppValue('core', 'shareapi_expire_after_n_days'); + } + + /** + * Test case for #17560 + */ + public function testAccesToSharedSubFolder() { + OC_User::setUserId($this->user1); + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/folder1'); + + $fileInfo = $view->getFileInfo('files/folder1'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); + $fileId = $fileInfo->getId(); + + $this->assertTrue( + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_ALL), + 'Failed asserting that user 1 successfully shared "test" with user 2.' + ); + $this->assertTrue( + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_ALL), + 'Failed asserting that user 1 successfully shared "test" with user 3.' + ); + + $view->mkdir('files/folder1/folder2'); + + $fileInfo = $view->getFileInfo('files/folder1/folder2'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); + $fileId = $fileInfo->getId(); + + $this->assertTrue( + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_ALL), + 'Failed asserting that user 1 successfully shared "test" with user 4.' + ); + + $res = OCP\Share::getItemShared( + 'folder', + $fileId, + OCP\Share::FORMAT_NONE, + null, + true + ); + $this->assertCount(3, $res); + + $this->assertTrue( + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user5, \OCP\Constants::PERMISSION_ALL), + 'Failed asserting that user 1 successfully shared "test" with user 5.' + ); + + $res = OCP\Share::getItemShared( + 'folder', + $fileId, + OCP\Share::FORMAT_NONE, + null, + true + ); + $this->assertCount(4, $res); + } + + public function testShareWithSelfError() { + OC_User::setUserId($this->user1); + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/folder1'); + + $fileInfo = $view->getFileInfo('files/folder1'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); + $fileId = $fileInfo->getId(); + + try { + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_ALL); + $this->fail(); + } catch (\Exception $e) { + $this->assertEquals('Sharing /folder1 failed, because you can not share with yourself', $e->getMessage()); + } + } + + + public function testShareWithOwnerError() { + OC_User::setUserId($this->user1); + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/folder1'); + + $fileInfo = $view->getFileInfo('files/folder1'); + $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo); + $fileId = $fileInfo->getId(); + + $this->assertTrue( + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_ALL), + 'Failed asserting that user 1 successfully shared "test" with user 2.' + ); + + OC_User::setUserId($this->user2); + try { + OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_ALL); + $this->fail(); + } catch (\Exception $e) { + $this->assertEquals('Sharing failed, because the user ' . $this->user1 . ' is the original sharer', $e->getMessage()); + } + } } class DummyShareClass extends \OC\Share\Share { diff --git a/tests/lib/testcase.php b/tests/lib/testcase.php index 854d5f4f65b..8cfa2a72598 100644 --- a/tests/lib/testcase.php +++ b/tests/lib/testcase.php @@ -24,6 +24,7 @@ namespace Test; use OC\Command\QueueBus; use OC\Files\Filesystem; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Security\ISecureRandom; abstract class TestCase extends \PHPUnit_Framework_TestCase { @@ -129,9 +130,11 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { public static function tearDownAfterClass() { $dataDir = \OC::$server->getConfig()->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data-autotest'); + $queryBuilder = \OC::$server->getDatabaseConnection()->getQueryBuilder(); - self::tearDownAfterClassCleanStorages(); - self::tearDownAfterClassCleanFileCache(); + self::tearDownAfterClassCleanShares($queryBuilder); + self::tearDownAfterClassCleanStorages($queryBuilder); + self::tearDownAfterClassCleanFileCache($queryBuilder); self::tearDownAfterClassCleanStrayDataFiles($dataDir); self::tearDownAfterClassCleanStrayHooks(); self::tearDownAfterClassCleanStrayLocks(); @@ -140,25 +143,33 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { } /** + * Remove all entries from the share table + * + * @param IQueryBuilder $queryBuilder + */ + static protected function tearDownAfterClassCleanShares(IQueryBuilder $queryBuilder) { + $queryBuilder->delete('share') + ->execute(); + } + + /** * Remove all entries from the storages table * - * @throws \OC\DatabaseException + * @param IQueryBuilder $queryBuilder */ - static protected function tearDownAfterClassCleanStorages() { - $sql = 'DELETE FROM `*PREFIX*storages`'; - $query = \OC_DB::prepare($sql); - $query->execute(); + static protected function tearDownAfterClassCleanStorages(IQueryBuilder $queryBuilder) { + $queryBuilder->delete('storages') + ->execute(); } /** * Remove all entries from the filecache table * - * @throws \OC\DatabaseException + * @param IQueryBuilder $queryBuilder */ - static protected function tearDownAfterClassCleanFileCache() { - $sql = 'DELETE FROM `*PREFIX*filecache`'; - $query = \OC_DB::prepare($sql); - $query->execute(); + static protected function tearDownAfterClassCleanFileCache(IQueryBuilder $queryBuilder) { + $queryBuilder->delete('filecache') + ->execute(); } /** @@ -193,7 +204,7 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { static protected function tearDownAfterClassCleanStrayDataUnlinkDir($dir) { if ($dh = @opendir($dir)) { while (($file = readdir($dh)) !== false) { - if ($file === '..' || $file === '.') { + if (\OC\Files\Filesystem::isIgnoredDir($file)) { continue; } $path = $dir . '/' . $file; diff --git a/tests/lib/traits/usertrait.php b/tests/lib/traits/usertrait.php index 401d8b8a832..229087a5200 100644 --- a/tests/lib/traits/usertrait.php +++ b/tests/lib/traits/usertrait.php @@ -13,7 +13,7 @@ namespace Test\Traits; */ trait UserTrait { /** - * @var \OC_User_Dummy|\OCP\UserInterface + * @var \Test\Util\User\Dummy|\OCP\UserInterface */ protected $userBackend; @@ -22,7 +22,7 @@ trait UserTrait { } protected function setUpUserTrait() { - $this->userBackend = new \OC_User_Dummy(); + $this->userBackend = new \Test\Util\User\Dummy(); \OC::$server->getUserManager()->registerBackend($this->userBackend); } diff --git a/tests/lib/updater.php b/tests/lib/updater.php index 763858acf5d..1651fe1759d 100644 --- a/tests/lib/updater.php +++ b/tests/lib/updater.php @@ -161,7 +161,7 @@ class UpdaterTest extends \Test\TestCase { * @param bool $result */ public function testIsUpgradePossible($oldVersion, $newVersion, $allowedVersion, $result) { - $updater = new Updater($this->httpHelper, $this->config); + $updater = new Updater($this->httpHelper, $this->config, $this->logger); $this->assertSame($result, $updater->isUpgradePossible($oldVersion, $newVersion, $allowedVersion)); } diff --git a/tests/lib/user.php b/tests/lib/user.php index cb0c661b2a4..3c068be2826 100644 --- a/tests/lib/user.php +++ b/tests/lib/user.php @@ -18,7 +18,7 @@ class User extends TestCase { protected function setUp(){ parent::setUp(); - $this->backend = $this->getMock('\OC_User_Dummy'); + $this->backend = $this->getMock('\Test\Util\User\Dummy'); $manager = \OC_User::getManager(); $manager->registerBackend($this->backend); } diff --git a/tests/lib/user/avataruserdummy.php b/tests/lib/user/avataruserdummy.php index 738b10492ea..086adb6043f 100644 --- a/tests/lib/user/avataruserdummy.php +++ b/tests/lib/user/avataruserdummy.php @@ -20,7 +20,7 @@ * */ -class Avatar_User_Dummy extends \OC_User_Dummy { +class Avatar_User_Dummy extends \Test\Util\User\Dummy { public function canChangeAvatar($uid) { return true; } diff --git a/tests/lib/user/dummy.php b/tests/lib/user/dummy.php index fcc921de4b1..c6c79d7a860 100644 --- a/tests/lib/user/dummy.php +++ b/tests/lib/user/dummy.php @@ -23,6 +23,6 @@ class Test_User_Dummy extends Test_User_Backend { protected function setUp() { parent::setUp(); - $this->backend=new OC_User_Dummy(); + $this->backend=new \Test\Util\User\Dummy(); } } diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php index cc8bcd65896..df673f581c4 100644 --- a/tests/lib/user/manager.php +++ b/tests/lib/user/manager.php @@ -11,7 +11,7 @@ namespace Test\User; class Manager extends \Test\TestCase { public function testGetBackends() { - $userDummyBackend = $this->getMock('\OC_User_Dummy'); + $userDummyBackend = $this->getMock('\Test\Util\User\Dummy'); $manager = new \OC\User\Manager(); $manager->registerBackend($userDummyBackend); $this->assertEquals([$userDummyBackend], $manager->getBackends()); @@ -23,9 +23,9 @@ class Manager extends \Test\TestCase { public function testUserExistsSingleBackendExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) @@ -39,9 +39,9 @@ class Manager extends \Test\TestCase { public function testUserExistsSingleBackendNotExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) @@ -61,18 +61,18 @@ class Manager extends \Test\TestCase { public function testUserExistsTwoBackendsSecondExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 */ - $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1 = $this->getMock('\Test\Util\User\Dummy'); $backend1->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) ->will($this->returnValue(false)); /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 */ - $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2 = $this->getMock('\Test\Util\User\Dummy'); $backend2->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) @@ -87,18 +87,18 @@ class Manager extends \Test\TestCase { public function testUserExistsTwoBackendsFirstExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 */ - $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1 = $this->getMock('\Test\Util\User\Dummy'); $backend1->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) ->will($this->returnValue(true)); /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 */ - $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2 = $this->getMock('\Test\Util\User\Dummy'); $backend2->expects($this->never()) ->method('userExists'); @@ -113,7 +113,7 @@ class Manager extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('checkPassword') ->with($this->equalTo('foo'), $this->equalTo('bar')) @@ -140,7 +140,7 @@ class Manager extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->never()) ->method('checkPassword'); @@ -156,9 +156,9 @@ class Manager extends \Test\TestCase { public function testGetOneBackendExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) @@ -172,9 +172,9 @@ class Manager extends \Test\TestCase { public function testGetOneBackendNotExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('userExists') ->with($this->equalTo('foo')) @@ -188,9 +188,9 @@ class Manager extends \Test\TestCase { public function testSearchOneBackend() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('getUsers') ->with($this->equalTo('fo')) @@ -207,18 +207,18 @@ class Manager extends \Test\TestCase { public function testSearchTwoBackendLimitOffset() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 */ - $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1 = $this->getMock('\Test\Util\User\Dummy'); $backend1->expects($this->once()) ->method('getUsers') ->with($this->equalTo('fo'), $this->equalTo(3), $this->equalTo(1)) ->will($this->returnValue(array('foo1', 'foo2'))); /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 */ - $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2 = $this->getMock('\Test\Util\User\Dummy'); $backend2->expects($this->once()) ->method('getUsers') ->with($this->equalTo('fo'), $this->equalTo(3), $this->equalTo(1)) @@ -237,9 +237,9 @@ class Manager extends \Test\TestCase { public function testCreateUserSingleBackendNotExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') ->will($this->returnValue(true)); @@ -265,9 +265,9 @@ class Manager extends \Test\TestCase { */ public function testCreateUserSingleBackendExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') ->will($this->returnValue(true)); @@ -288,9 +288,9 @@ class Manager extends \Test\TestCase { public function testCreateUserSingleBackendNotSupported() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') ->will($this->returnValue(false)); @@ -320,9 +320,9 @@ class Manager extends \Test\TestCase { */ public function testCreateUserTwoBackendExists() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 */ - $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1 = $this->getMock('\Test\Util\User\Dummy'); $backend1->expects($this->any()) ->method('implementsActions') ->will($this->returnValue(true)); @@ -336,9 +336,9 @@ class Manager extends \Test\TestCase { ->will($this->returnValue(false)); /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 */ - $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2 = $this->getMock('\Test\Util\User\Dummy'); $backend2->expects($this->any()) ->method('implementsActions') ->will($this->returnValue(true)); @@ -368,9 +368,9 @@ class Manager extends \Test\TestCase { public function testCountUsersOneBackend() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('countUsers') ->will($this->returnValue(7)); @@ -382,14 +382,14 @@ class Manager extends \Test\TestCase { $backend->expects($this->once()) ->method('getBackendName') - ->will($this->returnValue('Mock_OC_User_Dummy')); + ->will($this->returnValue('Mock_Test_Util_User_Dummy')); $manager = new \OC\User\Manager(); $manager->registerBackend($backend); $result = $manager->countUsers(); $keys = array_keys($result); - $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false); + $this->assertTrue(strpos($keys[0], 'Mock_Test_Util_User_Dummy') !== false); $users = array_shift($result); $this->assertEquals(7, $users); @@ -397,9 +397,9 @@ class Manager extends \Test\TestCase { public function testCountUsersTwoBackends() { /** - * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1 = $this->getMock('\Test\Util\User\Dummy'); $backend1->expects($this->once()) ->method('countUsers') ->will($this->returnValue(7)); @@ -410,9 +410,9 @@ class Manager extends \Test\TestCase { ->will($this->returnValue(true)); $backend1->expects($this->once()) ->method('getBackendName') - ->will($this->returnValue('Mock_OC_User_Dummy')); + ->will($this->returnValue('Mock_Test_Util_User_Dummy')); - $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2 = $this->getMock('\Test\Util\User\Dummy'); $backend2->expects($this->once()) ->method('countUsers') ->will($this->returnValue(16)); @@ -423,7 +423,7 @@ class Manager extends \Test\TestCase { ->will($this->returnValue(true)); $backend2->expects($this->once()) ->method('getBackendName') - ->will($this->returnValue('Mock_OC_User_Dummy')); + ->will($this->returnValue('Mock_Test_Util_User_Dummy')); $manager = new \OC\User\Manager(); $manager->registerBackend($backend1); @@ -433,7 +433,7 @@ class Manager extends \Test\TestCase { //because the backends have the same class name, only one value expected $this->assertEquals(1, count($result)); $keys = array_keys($result); - $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false); + $this->assertTrue(strpos($keys[0], 'Mock_Test_Util_User_Dummy') !== false); $users = array_shift($result); //users from backends shall be summed up @@ -442,7 +442,7 @@ class Manager extends \Test\TestCase { public function testDeleteUser() { $manager = new \OC\User\Manager(); - $backend = new \OC_User_Dummy(); + $backend = new \Test\Util\User\Dummy(); $backend->createUser('foo', 'bar'); $manager->registerBackend($backend); diff --git a/tests/lib/user/session.php b/tests/lib/user/session.php index 4dc7f29c5b8..d9dace2ef05 100644 --- a/tests/lib/user/session.php +++ b/tests/lib/user/session.php @@ -20,7 +20,7 @@ class Session extends \Test\TestCase { ->with('user_id') ->will($this->returnValue('foo')); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('userExists') ->with('foo') @@ -41,7 +41,7 @@ class Session extends \Test\TestCase { ->with('user_id') ->will($this->returnValue('foo')); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('userExists') ->with('foo') @@ -62,7 +62,7 @@ class Session extends \Test\TestCase { ->with('user_id') ->will($this->returnValue(null)); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->never()) ->method('userExists'); @@ -82,7 +82,7 @@ class Session extends \Test\TestCase { $manager = $this->getMock('\OC\User\Manager'); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); $user->expects($this->once()) @@ -122,7 +122,7 @@ class Session extends \Test\TestCase { } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); $user->expects($this->once()) @@ -161,7 +161,7 @@ class Session extends \Test\TestCase { } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); $user->expects($this->once()) @@ -196,7 +196,7 @@ class Session extends \Test\TestCase { } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); $user->expects($this->never()) @@ -220,7 +220,7 @@ class Session extends \Test\TestCase { $manager = $this->getMock('\OC\User\Manager'); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $manager->expects($this->once()) ->method('checkPassword') @@ -257,7 +257,7 @@ class Session extends \Test\TestCase { } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); @@ -305,7 +305,7 @@ class Session extends \Test\TestCase { } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); @@ -347,7 +347,7 @@ class Session extends \Test\TestCase { } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php index b1df975b60f..bc1365d35bf 100644 --- a/tests/lib/user/user.php +++ b/tests/lib/user/user.php @@ -74,7 +74,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('setPassword') ->with($this->equalTo('foo'), $this->equalTo('bar')); @@ -97,7 +97,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->never()) ->method('setPassword'); @@ -182,7 +182,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('deleteUser') ->with($this->equalTo('foo')); @@ -195,7 +195,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('getHome') ->with($this->equalTo('foo')) @@ -216,7 +216,7 @@ class User extends \Test\TestCase { } public function testGetBackendClassName() { - $user = new \OC\User\User('foo', new \OC_User_Dummy()); + $user = new \OC\User\User('foo', new \Test\Util\User\Dummy()); $this->assertEquals('Dummy', $user->getBackendClassName()); $user = new \OC\User\User('foo', new \OC_User_Database()); $this->assertEquals('Database', $user->getBackendClassName()); @@ -226,7 +226,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->never()) ->method('getHome'); @@ -253,7 +253,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') @@ -273,7 +273,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') @@ -287,7 +287,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') @@ -307,7 +307,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->any()) ->method('implementsActions') @@ -393,7 +393,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('setPassword'); @@ -434,7 +434,7 @@ class User extends \Test\TestCase { /** * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMock('\OC_User_Dummy'); + $backend = $this->getMock('\Test\Util\User\Dummy'); $backend->expects($this->once()) ->method('deleteUser'); diff --git a/tests/lib/util.php b/tests/lib/util.php index b9b8062653e..eaa3d0795e3 100644 --- a/tests/lib/util.php +++ b/tests/lib/util.php @@ -303,7 +303,7 @@ class Test_Util extends \Test\TestCase { } $appConfig = \OC::$server->getAppConfig(); - $appConfig->setValue('core', 'shareapi_exclude_groups_list', implode(',', $excludedGroups)); + $appConfig->setValue('core', 'shareapi_exclude_groups_list', json_encode($excludedGroups)); $appConfig->setValue('core', 'shareapi_exclude_groups', 'yes'); $result = \OCP\Util::isSharingDisabledForUser(); @@ -406,11 +406,13 @@ class Test_Util extends \Test\TestCase { OC_Config::setValue('version', '7.0.0.0'); \OC::$server->getSession()->set('OC_Version', array(7, 0, 0, 1)); + self::invokePrivate(new \OCP\Util, 'needUpgradeCache', array(null)); $this->assertTrue(\OCP\Util::needUpgrade()); OC_Config::setValue('version', $oldConfigVersion); $oldSessionVersion = \OC::$server->getSession()->set('OC_Version', $oldSessionVersion); + self::invokePrivate(new \OCP\Util, 'needUpgradeCache', array(null)); $this->assertFalse(\OCP\Util::needUpgrade()); } diff --git a/lib/private/user/dummy.php b/tests/lib/util/user/dummy.php index 3779f7b5ddf..6e23e22ab67 100644 --- a/lib/private/user/dummy.php +++ b/tests/lib/util/user/dummy.php @@ -25,10 +25,14 @@ * */ +namespace Test\Util\User; + +use OC_User_Backend; + /** * dummy user backend, does not keep state, only for testing use */ -class OC_User_Dummy extends OC_User_Backend implements \OCP\IUserBackend { +class Dummy extends OC_User_Backend implements \OCP\IUserBackend { private $users = array(); private $displayNames = array(); diff --git a/tests/objectstore/entrypoint.sh b/tests/objectstore/entrypoint.sh new file mode 100755 index 00000000000..6dd6ef23fb6 --- /dev/null +++ b/tests/objectstore/entrypoint.sh @@ -0,0 +1,274 @@ +#!/bin/bash +set -e + +: ${CLUSTER:=ceph} +: ${RGW_NAME:=$(hostname -s)} +: ${MON_NAME:=$(hostname -s)} +: ${RGW_CIVETWEB_PORT:=80} +: ${OSD_SIZE:=100} + +: ${KEYSTONE_ADMIN_TOKEN:=admin} +: ${KEYSTONE_ADMIN_PORT:=35357} +: ${KEYSTONE_PUBLIC_PORT:=5001} + +: ${KEYSTONE_SERVICE:=${CLUSTER}} +: ${KEYSTONE_ENDPOINT_REGION:=region} + +: ${KEYSTONE_ADMIN_USER:=admin} +: ${KEYSTONE_ADMIN_TENANT:=admin} +: ${KEYSTONE_ADMIN_PASS:=admin} + +ip_address=$(head -n1 /etc/hosts | cut -d" " -f1) +: ${MON_IP:=${ip_address}} +subnet=$(ip route | grep "src ${ip_address}" | cut -d" " -f1) +: ${CEPH_NETWORK:=${subnet}} + +####### +# MON # +####### + +if [ ! -n "$CEPH_NETWORK" ]; then + echo "ERROR- CEPH_NETWORK must be defined as the name of the network for the OSDs" + exit 1 +fi + +if [ ! -n "$MON_IP" ]; then + echo "ERROR- MON_IP must be defined as the IP address of the monitor" + exit 1 +fi + +# bootstrap MON +if [ ! -e /etc/ceph/ceph.conf ]; then + fsid=$(uuidgen) + cat <<ENDHERE >/etc/ceph/${CLUSTER}.conf +[global] +fsid = $fsid +mon initial members = ${MON_NAME} +mon host = ${MON_IP} +auth cluster required = cephx +auth service required = cephx +auth client required = cephx +osd crush chooseleaf type = 0 +osd journal size = 100 +osd pool default pg num = 8 +osd pool default pgp num = 8 +osd pool default size = 1 +public network = ${CEPH_NETWORK} +cluster network = ${CEPH_NETWORK} +debug ms = 1 + +[mon] +debug mon = 20 +debug paxos = 20 +debug auth = 20 + +[osd] +debug osd = 20 +debug filestore = 20 +debug journal = 20 +debug monc = 20 + +[mds] +debug mds = 20 +debug mds balancer = 20 +debug mds log = 20 +debug mds migrator = 20 + +[client.radosgw.gateway] +rgw keystone url = http://${MON_IP}:${KEYSTONE_ADMIN_PORT} +rgw keystone admin token = ${KEYSTONE_ADMIN_TOKEN} +rgw keystone accepted roles = _member_ +ENDHERE + + # Generate administrator key + ceph-authtool /etc/ceph/${CLUSTER}.client.admin.keyring --create-keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow' + + # Generate the mon. key + ceph-authtool /etc/ceph/${CLUSTER}.mon.keyring --create-keyring --gen-key -n mon. --cap mon 'allow *' + + # Generate initial monitor map + monmaptool --create --add ${MON_NAME} ${MON_IP} --fsid ${fsid} /etc/ceph/monmap +fi + +# If we don't have a monitor keyring, this is a new monitor +if [ ! -e /var/lib/ceph/mon/${CLUSTER}-${MON_NAME}/keyring ]; then + + if [ ! -e /etc/ceph/${CLUSTER}.client.admin.keyring ]; then + echo "ERROR- /etc/ceph/${CLUSTER}.client.admin.keyring must exist; get it from your existing mon" + exit 2 + fi + + if [ ! -e /etc/ceph/${CLUSTER}.mon.keyring ]; then + echo "ERROR- /etc/ceph/${CLUSTER}.mon.keyring must exist. You can extract it from your current monitor by running 'ceph auth get mon. -o /tmp/${CLUSTER}.mon.keyring'" + exit 3 + fi + + if [ ! -e /etc/ceph/monmap ]; then + echo "ERROR- /etc/ceph/monmap must exist. You can extract it from your current monitor by running 'ceph mon getmap -o /tmp/monmap'" + exit 4 + fi + + # Import the client.admin keyring and the monitor keyring into a new, temporary one + ceph-authtool /tmp/${CLUSTER}.mon.keyring --create-keyring --import-keyring /etc/ceph/${CLUSTER}.client.admin.keyring + ceph-authtool /tmp/${CLUSTER}.mon.keyring --import-keyring /etc/ceph/${CLUSTER}.mon.keyring + + # Make the monitor directory + mkdir -p /var/lib/ceph/mon/${CLUSTER}-${MON_NAME} + + # Prepare the monitor daemon's directory with the map and keyring + ceph-mon --mkfs -i ${MON_NAME} --monmap /etc/ceph/monmap --keyring /tmp/${CLUSTER}.mon.keyring + + # Clean up the temporary key + rm /tmp/${CLUSTER}.mon.keyring +fi + +# start MON +ceph-mon -i ${MON_NAME} --public-addr ${MON_IP}:6789 + +# change replica size +ceph osd pool set rbd size 1 + + +####### +# OSD # +####### + +if [ ! -e /var/lib/ceph/osd/${CLUSTER}-0/keyring ]; then + # bootstrap OSD + mkdir -p /var/lib/ceph/osd/${CLUSTER}-0 + # skip btrfs HACK if btrfs is already in place + if [ "$(stat -f /var/lib/ceph/osd/${CLUSTER}-0 2>/dev/null | grep btrfs | wc -l)" == "0" ]; then + # HACK create btrfs loopback device + echo "creating osd storage image" + dd if=/dev/zero of=/tmp/osddata bs=1M count=${OSD_SIZE} + mkfs.btrfs /tmp/osddata + echo "mounting via loopback" + mount -o loop /tmp/osddata /var/lib/ceph/osd/${CLUSTER}-0 + echo "now mounted:" + mount + # end HACK + fi + echo "creating osd" + ceph osd create + echo "creating osd filesystem" + ceph-osd -i 0 --mkfs + echo "creating osd keyring" + ceph auth get-or-create osd.0 osd 'allow *' mon 'allow profile osd' -o /var/lib/ceph/osd/${CLUSTER}-0/keyring + echo "configuring osd crush" + ceph osd crush add 0 1 root=default host=$(hostname -s) + echo "adding osd keyring" + ceph-osd -i 0 -k /var/lib/ceph/osd/${CLUSTER}-0/keyring +fi + +# start OSD +echo "starting osd" +ceph-osd --cluster=${CLUSTER} -i 0 + +#sleep 10 + +####### +# MDS # +####### + +if [ ! -e /var/lib/ceph/mds/${CLUSTER}-0/keyring ]; then + # create ceph filesystem + echo "creating osd pool" + ceph osd pool create cephfs_data 8 + echo "creating osd pool metadata" + ceph osd pool create cephfs_metadata 8 + echo "creating cephfs" + ceph fs new cephfs cephfs_metadata cephfs_data + + # bootstrap MDS + mkdir -p /var/lib/ceph/mds/${CLUSTER}-0 + echo "creating mds auth" + ceph auth get-or-create mds.0 mds 'allow' osd 'allow *' mon 'allow profile mds' > /var/lib/ceph/mds/${CLUSTER}-0/keyring +fi + +# start MDS +echo "starting mds" +ceph-mds --cluster=${CLUSTER} -i 0 + +#sleep 10 + + +####### +# RGW # +####### + +if [ ! -e /var/lib/ceph/radosgw/${RGW_NAME}/keyring ]; then + # bootstrap RGW + mkdir -p /var/lib/ceph/radosgw/${RGW_NAME} + echo "creating rgw auth" + ceph auth get-or-create client.radosgw.gateway osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/${RGW_NAME}/keyring +fi + +# start RGW +echo "starting rgw" +radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway -k /var/lib/ceph/radosgw/${RGW_NAME}/keyring --rgw-socket-path="" --rgw-frontends="civetweb port=${RGW_CIVETWEB_PORT}" + + +####### +# API # +####### + +# start ceph-rest-api +echo "starting rest api" +ceph-rest-api -n client.admin & + +############ +# Keystone # +############ + +if [ ! -e /etc/keystone/${CLUSTER}.conf ]; then + cat <<ENDHERE > /etc/keystone/${CLUSTER}.conf +[DEFAULT] +admin_token=${KEYSTONE_ADMIN_TOKEN} +admin_port=${KEYSTONE_ADMIN_PORT} +public_port=${KEYSTONE_PUBLIC_PORT} + +[database] +connection = sqlite:////var/lib/keystone/keystone.db +ENDHERE + + # start Keystone + echo "starting keystone" + keystone-all --config-file /etc/keystone/${CLUSTER}.conf & + + # wait until up + while ! nc ${MON_IP} ${KEYSTONE_ADMIN_PORT} </dev/null; do + sleep 1 + done + + export OS_SERVICE_TOKEN=${KEYSTONE_ADMIN_TOKEN} + export OS_SERVICE_ENDPOINT=http://${MON_IP}:${KEYSTONE_ADMIN_PORT}/v2.0 + + echo "creating keystone service ${KEYSTONE_SERVICE}" + keystone service-create --name ${KEYSTONE_SERVICE} --type object-store + echo "creating keystone endpoint ${KEYSTONE_SERVICE}" + keystone endpoint-create --service ${KEYSTONE_SERVICE} \ + --region ${KEYSTONE_ENDPOINT_REGION} \ + --publicurl http://${MON_IP}:${RGW_CIVETWEB_PORT}/swift/v1 \ + --internalurl http://${MON_IP}:${RGW_CIVETWEB_PORT}/swift/v1 \ + --adminurl http://${MON_IP}:${RGW_CIVETWEB_PORT}/swift/v1 + + echo "creating keystone user ${KEYSTONE_ADMIN_USER}" + keystone user-create --name=${KEYSTONE_ADMIN_USER} --pass=${KEYSTONE_ADMIN_PASS} --email=dev@null.com + echo "creating keystone tenant ${KEYSTONE_ADMIN_TENANT}" + keystone tenant-create --name=${KEYSTONE_ADMIN_TENANT} --description=admin + echo "adding keystone role _member_" + keystone user-role-add --user=${KEYSTONE_ADMIN_USER} --tenant=${KEYSTONE_ADMIN_TENANT} --role=_member_ + + echo "creating keystone role admin" + keystone role-create --name=admin + echo "adding keystone role admin" + keystone user-role-add --user=${KEYSTONE_ADMIN_USER} --tenant=${KEYSTONE_ADMIN_TENANT} --role=admin +fi + + +######### +# WATCH # +######### + +echo "watching ceph" +exec ceph -w diff --git a/tests/objectstore/start-swift-ceph.sh b/tests/objectstore/start-swift-ceph.sh new file mode 100755 index 00000000000..91a813f8bb3 --- /dev/null +++ b/tests/objectstore/start-swift-ceph.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# +# ownCloud +# +# This script start a docker container to test the files_external tests +# against. It will also change the files_external config to use the docker +# container as testing environment. This is reverted in the stop step.W +# +# Set environment variable DEBUG to print config file +# +# @author Morris Jobke +# @author Robin McCorkell +# @copyright 2015 ownCloud + +if ! command -v docker >/dev/null 2>&1; then + echo "No docker executable found - skipped docker setup" + exit 0; +fi + +echo "Docker executable found - setup docker" + + +docker_image=xenopathic/ceph-keystone + +echo "Fetch recent ${docker_image} docker image" +docker pull ${docker_image} + +# retrieve current folder to place the config in the parent folder +thisFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +port=5034 + +user=test +pass=testing +tenant=testenant +region=testregion +service=testceph + +container=`docker run -d \ + -e KEYSTONE_PUBLIC_PORT=${port} \ + -e KEYSTONE_ADMIN_USER=${user} \ + -e KEYSTONE_ADMIN_PASS=${pass} \ + -e KEYSTONE_ADMIN_TENANT=${tenant} \ + -e KEYSTONE_ENDPOINT_REGION=${region} \ + -e KEYSTONE_SERVICE=${service} \ + -e OSD_SIZE=300 \ + -v ${thisFolder}/entrypoint.sh:/entrypoint.sh \ + --privileged \ + --entrypoint /entrypoint.sh ${docker_image}` + +host=`docker inspect $container | grep IPAddress | cut -d '"' -f 4` + + +echo "${docker_image} container: $container" + +# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host) +echo $container >> $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift + +echo -n "Waiting for ceph initialization" +starttime=$(date +%s) +# support for GNU netcat and BSD netcat +while ! (nc -c -w 1 ${host} 80 </dev/null >&/dev/null \ + || nc -w 1 ${host} 80 </dev/null >&/dev/null); do + sleep 1 + echo -n '.' + if (( $(date +%s) > starttime + 160 )); then + echo + echo "[ERROR] Waited 120 seconds, no response" >&2 + exit 1 + fi +done +echo +sleep 20 # the keystone server also needs some time to fully initialize + +cat > $thisFolder/swift.config.php <<DELIM +<?php +\$CONFIG = array ( +'objectstore' => array( + 'class' => 'OC\\Files\\ObjectStore\\Swift', + 'arguments' => array( + 'username' => '$user', + 'password' => '$pass', + 'container' => 'owncloud-autotest$EXECUTOR_NUMBER', + 'autocreate' => true, + 'region' => '$region', + 'url' => 'http://$host:$port/v2.0', + 'tenantName' => '$tenant', + 'serviceName' => '$service', + ), +), +); + +DELIM + +if [ -n "$DEBUG" ]; then + echo "############## DEBUG info ###############" + echo "### Docker info" + docker info + echo "### Docker images" + docker images + echo "### current mountpoints" + mount + echo "### contents of $thisFolder/swift.config.php" + cat $thisFolder/swift.config.php + echo "### contents of $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift" + cat $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift + echo "############## DEBUG info end ###########" +fi diff --git a/tests/objectstore/stop-swift-ceph.sh b/tests/objectstore/stop-swift-ceph.sh new file mode 100755 index 00000000000..400db8925e9 --- /dev/null +++ b/tests/objectstore/stop-swift-ceph.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# ownCloud +# +# This script stops the docker container the files_external tests were run +# against. It will also revert the config changes done in start step. +# +# @author Morris Jobke +# @author Robin McCorkell +# @copyright 2015 ownCloud + +if ! command -v docker >/dev/null 2>&1; then + echo "No docker executable found - skipped docker stop" + exit 0; +fi + +echo "Docker executable found - stop and remove docker containers" + +# retrieve current folder to remove the config from the parent folder +thisFolder=`echo $0 | replace "stop-swift-ceph.sh" ""` + +if [ -z "$thisFolder" ]; then + thisFolder="." +fi; + +if [ -e $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift ]; then + # stopping and removing docker containers + for container in `cat $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift`; do + if [ -n "$DEBUG" ]; then + docker logs $container + fi + echo "Stopping and removing docker container $container" + # kills running container and removes it + docker rm -f $container + done; +fi; + +# cleanup +rm -rf $thisFolder/swift.config.php +rm -rf $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift diff --git a/tests/ocs-provider/provider.php b/tests/ocs-provider/provider.php index 34bd6067588..07d66b36258 100644 --- a/tests/ocs-provider/provider.php +++ b/tests/ocs-provider/provider.php @@ -60,9 +60,9 @@ class OcsProviderTest extends \Test\TestCase { 'PRIVATE_DATA' => [ 'version' => 1, 'endpoints' => [ - 'store' => '/ocs/v1.php/privatedata/setattribute', - 'read' => '/ocs/v1.php/privatedata/getattribute', - 'delete' => '/ocs/v1.php/privatedata/deleteattribute', + 'store' => '/ocs/v2.php/privatedata/setattribute', + 'read' => '/ocs/v2.php/privatedata/getattribute', + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', ], ], ] @@ -94,22 +94,22 @@ class OcsProviderTest extends \Test\TestCase { 'PRIVATE_DATA' => [ 'version' => 1, 'endpoints' => [ - 'store' => '/ocs/v1.php/privatedata/setattribute', - 'read' => '/ocs/v1.php/privatedata/getattribute', - 'delete' => '/ocs/v1.php/privatedata/deleteattribute', + 'store' => '/ocs/v2.php/privatedata/setattribute', + 'read' => '/ocs/v2.php/privatedata/getattribute', + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', ], ], 'FEDERATED_SHARING' => [ 'version' => 1, 'endpoints' => [ - 'share' => '/ocs/v1.php/cloud/shares', + 'share' => '/ocs/v2.php/cloud/shares', 'webdav' => '/public.php/webdav/', ], ], 'SHARING' => [ 'version' => 1, 'endpoints' => [ - 'share' => '/ocs/v1.php/apps/files_sharing/api/v1/shares', + 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', ], ], ] @@ -130,36 +130,36 @@ class OcsProviderTest extends \Test\TestCase { 'PRIVATE_DATA' => [ 'version' => 1, 'endpoints' => [ - 'store' => '/ocs/v1.php/privatedata/setattribute', - 'read' => '/ocs/v1.php/privatedata/getattribute', - 'delete' => '/ocs/v1.php/privatedata/deleteattribute', + 'store' => '/ocs/v2.php/privatedata/setattribute', + 'read' => '/ocs/v2.php/privatedata/getattribute', + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', ], ], 'FEDERATED_SHARING' => [ 'version' => 1, 'endpoints' => [ - 'share' => '/ocs/v1.php/cloud/shares', + 'share' => '/ocs/v2.php/cloud/shares', 'webdav' => '/public.php/webdav/', ], ], 'SHARING' => [ 'version' => 1, 'endpoints' => [ - 'share' => '/ocs/v1.php/apps/files_sharing/api/v1/shares', + 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', ], ], 'ACTIVITY' => [ 'version' => 1, 'endpoints' => [ - 'list' => '/ocs/v1.php/cloud/activity', + 'list' => '/ocs/v2.php/cloud/activity', ], ], 'PROVISIONING' => [ 'version' => 1, 'endpoints' => [ - 'user' => '/ocs/v1.php/cloud/users', - 'groups' => '/ocs/v1.php/cloud/groups', - 'apps' => '/ocs/v1.php/cloud/apps', + 'user' => '/ocs/v2.php/cloud/users', + 'groups' => '/ocs/v2.php/cloud/groups', + 'apps' => '/ocs/v2.php/cloud/apps', ], ], ] diff --git a/tests/settings/controller/CheckSetupControllerTest.php b/tests/settings/controller/CheckSetupControllerTest.php index 2a8a6548ebb..ebba18de5fd 100644 --- a/tests/settings/controller/CheckSetupControllerTest.php +++ b/tests/settings/controller/CheckSetupControllerTest.php @@ -293,6 +293,10 @@ class CheckSetupControllerTest extends TestCase { ->will($this->returnValue('SomeProvider')); $this->config->expects($this->at(2)) ->method('getSystemValue') + ->with('has_internet_connection', true) + ->will($this->returnValue(false)); + $this->config->expects($this->at(3)) + ->method('getSystemValue') ->with('trusted_proxies', []) ->willReturn(['1.2.3.4']); @@ -346,6 +350,7 @@ class CheckSetupControllerTest extends TestCase { ], 'forwardedForHeadersWorking' => true, 'reverseProxyDocs' => 'reverse-proxy-doc-link', + 'isCorrectMemcachedPHPModuleInstalled' => true, ] ); $this->assertEquals($expected, $this->checkSetupController->check()); @@ -364,10 +369,13 @@ class CheckSetupControllerTest extends TestCase { ]) ->setMethods(null)->getMock(); - $this->assertArrayHasKey('ssl_version', $checkSetupController->getCurlVersion()); + $this->assertArrayHasKey('ssl_version', $this->invokePrivate($checkSetupController, 'getCurlVersion')); } public function testIsUsedTlsLibOutdatedWithAnotherLibrary() { + $this->config->expects($this->any()) + ->method('getSystemValue') + ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) ->method('getCurlVersion') @@ -376,6 +384,9 @@ class CheckSetupControllerTest extends TestCase { } public function testIsUsedTlsLibOutdatedWithMisbehavingCurl() { + $this->config->expects($this->any()) + ->method('getSystemValue') + ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) ->method('getCurlVersion') @@ -384,10 +395,8 @@ class CheckSetupControllerTest extends TestCase { } public function testIsUsedTlsLibOutdatedWithOlderOpenSsl() { - $this->config - ->expects($this->once()) + $this->config->expects($this->any()) ->method('getSystemValue') - ->with('appstoreenabled', true) ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) @@ -398,10 +407,10 @@ class CheckSetupControllerTest extends TestCase { public function testIsUsedTlsLibOutdatedWithOlderOpenSslAndWithoutAppstore() { $this->config - ->expects($this->once()) + ->expects($this->at(0)) ->method('getSystemValue') - ->with('appstoreenabled', true) - ->will($this->returnValue(false)); + ->with('has_internet_connection', true) + ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) ->method('getCurlVersion') @@ -410,10 +419,8 @@ class CheckSetupControllerTest extends TestCase { } public function testIsUsedTlsLibOutdatedWithOlderOpenSsl1() { - $this->config - ->expects($this->once()) + $this->config->expects($this->any()) ->method('getSystemValue') - ->with('appstoreenabled', true) ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) @@ -423,6 +430,9 @@ class CheckSetupControllerTest extends TestCase { } public function testIsUsedTlsLibOutdatedWithMatchingOpenSslVersion() { + $this->config->expects($this->any()) + ->method('getSystemValue') + ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) ->method('getCurlVersion') @@ -431,6 +441,9 @@ class CheckSetupControllerTest extends TestCase { } public function testIsUsedTlsLibOutdatedWithMatchingOpenSslVersion1() { + $this->config->expects($this->any()) + ->method('getSystemValue') + ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) ->method('getCurlVersion') @@ -439,10 +452,8 @@ class CheckSetupControllerTest extends TestCase { } public function testIsBuggyNss400() { - $this->config - ->expects($this->once()) + $this->config->expects($this->any()) ->method('getSystemValue') - ->with('appstoreenabled', true) ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) @@ -475,6 +486,9 @@ class CheckSetupControllerTest extends TestCase { public function testIsBuggyNss200() { + $this->config->expects($this->any()) + ->method('getSystemValue') + ->will($this->returnValue(true)); $this->checkSetupController ->expects($this->once()) ->method('getCurlVersion') @@ -503,4 +517,83 @@ class CheckSetupControllerTest extends TestCase { $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); } + + public function testIsUsedTlsLibOutdatedWithInternetDisabled() { + $this->config + ->expects($this->at(0)) + ->method('getSystemValue') + ->with('has_internet_connection', true) + ->will($this->returnValue(false)); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithAppstoreDisabledAndServerToServerSharingEnabled() { + // Appstore is disabled by default in EE + $appStoreDefault = false; + if (\OC_Util::getEditionString() === '') { + $appStoreDefault = true; + } + + $this->config + ->expects($this->at(0)) + ->method('getSystemValue') + ->with('has_internet_connection', true) + ->will($this->returnValue(true)); + $this->config + ->expects($this->at(1)) + ->method('getSystemValue') + ->with('appstoreenabled', $appStoreDefault) + ->will($this->returnValue(false)); + $this->config + ->expects($this->at(2)) + ->method('getAppValue') + ->with('files_sharing', 'outgoing_server2server_share_enabled', 'yes') + ->will($this->returnValue('no')); + $this->config + ->expects($this->at(3)) + ->method('getAppValue') + ->with('files_sharing', 'incoming_server2server_share_enabled', 'yes') + ->will($this->returnValue('yes')); + + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue([])); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithAppstoreDisabledAndServerToServerSharingDisabled() { + // Appstore is disabled by default in EE + $appStoreDefault = false; + if (\OC_Util::getEditionString() === '') { + $appStoreDefault = true; + } + + $this->config + ->expects($this->at(0)) + ->method('getSystemValue') + ->with('has_internet_connection', true) + ->will($this->returnValue(true)); + $this->config + ->expects($this->at(1)) + ->method('getSystemValue') + ->with('appstoreenabled', $appStoreDefault) + ->will($this->returnValue(false)); + $this->config + ->expects($this->at(2)) + ->method('getAppValue') + ->with('files_sharing', 'outgoing_server2server_share_enabled', 'yes') + ->will($this->returnValue('no')); + $this->config + ->expects($this->at(3)) + ->method('getAppValue') + ->with('files_sharing', 'incoming_server2server_share_enabled', 'yes') + ->will($this->returnValue('no')); + + $this->checkSetupController + ->expects($this->never()) + ->method('getCurlVersion') + ->will($this->returnValue([])); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } } diff --git a/tests/settings/controller/userscontrollertest.php b/tests/settings/controller/userscontrollertest.php index 06065a8454e..6fab43d6a16 100644 --- a/tests/settings/controller/userscontrollertest.php +++ b/tests/settings/controller/userscontrollertest.php @@ -100,7 +100,7 @@ class UsersControllerTest extends \Test\TestCase { $admin ->expects($this->once()) ->method('getBackendClassName') - ->will($this->returnValue('OC_User_Dummy')); + ->will($this->returnValue('\Test\Util\User\Dummy')); $bar = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $bar @@ -120,7 +120,7 @@ class UsersControllerTest extends \Test\TestCase { $bar ->expects($this->once()) ->method('getBackendClassName') - ->will($this->returnValue('OC_User_Dummy')); + ->will($this->returnValue('\Test\Util\User\Dummy')); $this->container['GroupManager'] ->expects($this->once()) @@ -175,7 +175,7 @@ class UsersControllerTest extends \Test\TestCase { 'quota' => 404, 'storageLocation' => '/home/admin', 'lastLogin' => 12000, - 'backend' => 'OC_User_Dummy', + 'backend' => '\Test\Util\User\Dummy', 'email' => 'admin@bar.com', 'isRestoreDisabled' => false, ), @@ -187,7 +187,7 @@ class UsersControllerTest extends \Test\TestCase { 'quota' => 2323, 'storageLocation' => '/home/bar', 'lastLogin' => 3999000, - 'backend' => 'OC_User_Dummy', + 'backend' => '\Test\Util\User\Dummy', 'email' => 'bar@dummy.com', 'isRestoreDisabled' => false, ), @@ -257,7 +257,7 @@ class UsersControllerTest extends \Test\TestCase { $admin ->expects($this->once()) ->method('getBackendClassName') - ->will($this->returnValue('OC_User_Dummy')); + ->will($this->returnValue('\Test\Util\User\Dummy')); $bar = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $bar @@ -277,7 +277,7 @@ class UsersControllerTest extends \Test\TestCase { $bar ->expects($this->once()) ->method('getBackendClassName') - ->will($this->returnValue('OC_User_Dummy')); + ->will($this->returnValue('\Test\Util\User\Dummy')); $this->container['GroupManager'] ->expects($this->at(0)) @@ -343,7 +343,7 @@ class UsersControllerTest extends \Test\TestCase { 'quota' => 404, 'storageLocation' => '/home/admin', 'lastLogin' => 12000, - 'backend' => 'OC_User_Dummy', + 'backend' => '\Test\Util\User\Dummy', 'email' => 'admin@bar.com', 'isRestoreDisabled' => false, ], @@ -355,7 +355,7 @@ class UsersControllerTest extends \Test\TestCase { 'quota' => 2323, 'storageLocation' => '/home/bar', 'lastLogin' => 3999000, - 'backend' => 'OC_User_Dummy', + 'backend' => '\Test\Util\User\Dummy', 'email' => 'bar@dummy.com', 'isRestoreDisabled' => false, ], @@ -414,7 +414,7 @@ class UsersControllerTest extends \Test\TestCase { $admin ->expects($this->once()) ->method('getBackendClassName') - ->will($this->returnValue('OC_User_Dummy')); + ->will($this->returnValue('\Test\Util\User\Dummy')); $bar = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $bar @@ -434,7 +434,7 @@ class UsersControllerTest extends \Test\TestCase { $bar ->expects($this->once()) ->method('getBackendClassName') - ->will($this->returnValue('OC_User_Dummy')); + ->will($this->returnValue('\Test\Util\User\Dummy')); $this->container['UserManager'] ->expects($this->once()) @@ -474,7 +474,7 @@ class UsersControllerTest extends \Test\TestCase { 'quota' => 404, 'storageLocation' => '/home/admin', 'lastLogin' => 12000, - 'backend' => 'OC_User_Dummy', + 'backend' => '\Test\Util\User\Dummy', 'email' => 'admin@bar.com', 'isRestoreDisabled' => false, ), @@ -486,7 +486,7 @@ class UsersControllerTest extends \Test\TestCase { 'quota' => 2323, 'storageLocation' => '/home/bar', 'lastLogin' => 3999000, - 'backend' => 'OC_User_Dummy', + 'backend' => '\Test\Util\User\Dummy', 'email' => 'bar@dummy.com', 'isRestoreDisabled' => false, ), @@ -522,16 +522,12 @@ class UsersControllerTest extends \Test\TestCase { $this->container['UserManager'] ->expects($this->once()) ->method('getBackends') - ->will($this->returnValue([new \OC_User_Dummy(), new \OC_User_Database()])); + ->will($this->returnValue([new \Test\Util\User\Dummy(), new \OC_User_Database()])); $this->container['UserManager'] ->expects($this->once()) ->method('clearBackends'); $this->container['UserManager'] ->expects($this->once()) - ->method('registerBackend') - ->with(new \OC_User_Dummy()); - $this->container['UserManager'] - ->expects($this->once()) ->method('search') ->with('') ->will($this->returnValue([$user])); @@ -552,7 +548,7 @@ class UsersControllerTest extends \Test\TestCase { ) ) ); - $response = $this->container['UsersController']->index(0, 10, '','', 'OC_User_Dummy'); + $response = $this->container['UsersController']->index(0, 10, '','', '\Test\Util\User\Dummy'); $this->assertEquals($expectedResponse, $response); } @@ -562,7 +558,7 @@ class UsersControllerTest extends \Test\TestCase { $this->container['UserManager'] ->expects($this->once()) ->method('getBackends') - ->will($this->returnValue([new \OC_User_Dummy(), new \OC_User_Database()])); + ->will($this->returnValue([new \Test\Util\User\Dummy(), new \OC_User_Database()])); $this->container['UserManager'] ->expects($this->once()) ->method('search') @@ -570,7 +566,7 @@ class UsersControllerTest extends \Test\TestCase { ->will($this->returnValue([])); $expectedResponse = new DataResponse([]); - $response = $this->container['UsersController']->index(0, 10, '','', 'OC_User_Dummy'); + $response = $this->container['UsersController']->index(0, 10, '','', '\Test\Util\User\Dummy'); $this->assertEquals($expectedResponse, $response); } diff --git a/themes/example/defaults.php b/themes/example/defaults.php index 6fea8fa8a49..3580dc137fb 100644 --- a/themes/example/defaults.php +++ b/themes/example/defaults.php @@ -20,34 +20,106 @@ class OC_Theme { + /** + * Returns the base URL + * @return string URL + */ public function getBaseUrl() { return 'https://owncloud.org'; } + /** + * Returns the URL where the sync clients are listed + * @return string URL + */ public function getSyncClientUrl() { return 'https://owncloud.org/install'; } + /** + * Returns the URL to the App Store for the iOS Client + * @return string URL + */ + public function getiOSClientUrl() { + return 'https://itunes.apple.com/us/app/owncloud/id543672169?mt=8'; + } + + /** + * Returns the AppId for the App Store for the iOS Client + * @return string AppId + */ + public function getiTunesAppId() { + return '543672169'; + } + + /** + * Returns the URL to Google Play for the Android Client + * @return string URL + */ + public function getAndroidClientUrl() { + return 'https://play.google.com/store/apps/details?id=com.owncloud.android'; + } + + /** + * Returns the documentation URL + * @return string URL + */ public function getDocBaseUrl() { return 'https://doc.owncloud.org'; } + /** + * Returns the title + * @return string title + */ public function getTitle() { return 'Custom Cloud'; } + /** + * Returns the short name of the software + * @return string title + */ public function getName() { return 'Custom Cloud'; } + /** + * Returns the short name of the software containing HTML strings + * @return string title + */ + public function getHTMLName() { + return 'Custom Cloud'; + } + + /** + * Returns entity (e.g. company name) - used for footer, copyright + * @return string entity name + */ public function getEntity() { return 'Custom Cloud Co.'; } + /** + * Returns slogan + * @return string slogan + */ public function getSlogan() { return 'Your custom cloud, personalized for you!'; } + /** + * Returns logo claim + * @return string logo claim + */ + public function getLogoClaim() { + return ''; + } + + /** + * Returns short version of the footer + * @return string short footer + */ public function getShortFooter() { $footer = '© 2015 <a href="'.$this->getBaseUrl().'" target="_blank\">'.$this->getEntity().'</a>'. '<br/>' . $this->getSlogan(); @@ -55,6 +127,10 @@ class OC_Theme { return $footer; } + /** + * Returns long version of the footer + * @return string long footer + */ public function getLongFooter() { $footer = '© 2015 <a href="'.$this->getBaseUrl().'" target="_blank\">'.$this->getEntity().'</a>'. '<br/>' . $this->getSlogan(); @@ -66,6 +142,11 @@ class OC_Theme { return $this->getDocBaseUrl() . '/server/8.0/go.php?to=' . $key; } + + /** + * Returns mail header color + * @return string + */ public function getMailHeaderColor() { return '#745bca'; } diff --git a/version.php b/version.php index 711d82f1ca1..cc5a18b1cb3 100644 --- a/version.php +++ b/version.php @@ -1,7 +1,9 @@ <?php /** + * @author C Montero-Luque <cml@owncloud.com> * @author Frank Karlitschek <frank@owncloud.org> * @author Lukas Reschke <lukas@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Vincent Petry <pvince81@owncloud.com> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -23,12 +25,12 @@ // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(8, 2, 0, 6); +$OC_Version = array(9, 0, 0, 0); // The human readable string -$OC_VersionString = '8.2 beta1'; +$OC_VersionString = '9.0 pre alpha'; -$OC_VersionCanBeUpgradedFrom = array(8, 1); +$OC_VersionCanBeUpgradedFrom = array(8, 2); // The ownCloud channel $OC_Channel = 'git'; |