diff --git a/.gitignore b/.gitignore index 43f3cab912..8c8b61d701 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ /apps/inc.php # ignore all apps except core ones -/apps* +/apps*/* !/apps/files !/apps/files_encryption !/apps/files_external @@ -82,8 +82,13 @@ nbproject # Tests /tests/phpunit.xml +# Node Modules +/build/node_modules/ + # Tests - auto-generated files /data-autotest /tests/coverage* /tests/autoconfig* /tests/autotest* +/tests/data/lorem-copy.txt +/tests/data/testimage-copy.png diff --git a/3rdparty b/3rdparty index 2f3ae9f56a..42efd96628 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 2f3ae9f56a9838b45254393e13c14f8a8c380d6b +Subproject commit 42efd966284debadf83b761367e529bc45f806d6 diff --git a/AUTHORS b/AUTHORS index c30a6bf426..7e0d8f6587 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,4 +28,4 @@ With help from many libraries and frameworks including: … "Lock” symbol from thenounproject.com collection -"Clock” symbol by Brandon Hopkins, from thenounproject.com collection \ No newline at end of file +"Clock” symbol by Brandon Hopkins, from thenounproject.com collection diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a79fcc08d6..70bd85fabf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,10 @@ If you have questions about how to install or use ownCloud, please direct these ### Guidelines * Please search the existing issues first, it's likely that your issue was already reported or even fixed. -* This repository is *only* for issues within the ownCloud core code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth + - Go to one of the repositories, click "issues" and type any word in the top search/command bar. + - You can also filter by appending e. g. "state:open" to the search string. + - More info on [search syntax within github](https://help.github.com/articles/searching-issues) +* This repository ([core](https://github.com/owncloud/core/issues)) is *only* for issues within the ownCloud core code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth * The issues in other components should be reported in their respective repositories: - [Android client](https://github.com/owncloud/android/issues) - [iOS client](https://github.com/owncloud/ios-issues/issues) @@ -17,6 +20,7 @@ If you have questions about how to install or use ownCloud, please direct these - [Bookmarks](https://github.com/owncloud/bookmarks/issues) - [Calendar](https://github.com/owncloud/calendar/issues) - [Contacts](https://github.com/owncloud/contacts/issues) + - [Documents](https://github.com/owncloud/documents/issues) - [Mail](https://github.com/owncloud/mail/issues) - [Media/Music](https://github.com/owncloud/media/issues) - [News](https://github.com/owncloud/news/issues) diff --git a/COPYING-README b/COPYING-README index 49e035186e..8c26709d76 100644 --- a/COPYING-README +++ b/COPYING-README @@ -12,4 +12,4 @@ Licensing of components: All unmodified files from these and other sources retain their original copyright and license notices: see the relevant individual files. -Attribution information for ownCloud is contained in the AUTHORS file. \ No newline at end of file +Attribution information for ownCloud is contained in the AUTHORS file. diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php index 5f4856ec79..c69f5a8860 100644 --- a/apps/files/ajax/delete.php +++ b/apps/files/ajax/delete.php @@ -24,7 +24,7 @@ foreach ($files as $file) { } // get array with updated storage stats (e.g. max file size) after upload -$storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir); +$storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir); if ($success) { OCP\JSON::success(array("data" => array_merge(array("dir" => $dir, "files" => $files), $storageStats))); diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php index b2bfd53506..6a34cbe4ef 100644 --- a/apps/files/ajax/download.php +++ b/apps/files/ajax/download.php @@ -39,4 +39,4 @@ if (!is_array($files_list)) { $files_list = array($files); } -OC_Files::get($dir, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false); +OC_Files::get($dir, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD'); diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php index 7a2b642a9b..dd7c7dc557 100644 --- a/apps/files/ajax/getstoragestats.php +++ b/apps/files/ajax/getstoragestats.php @@ -3,7 +3,13 @@ // only need filesystem apps $RUNTIME_APPTYPES = array('filesystem'); +$dir = '/'; + +if (isset($_GET['dir'])) { + $dir = $_GET['dir']; +} + OCP\JSON::checkLoggedIn(); // send back json -OCP\JSON::success(array('data' => \OCA\files\lib\Helper::buildFileStorageStatistics('/'))); +OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir))); diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php index 878e4cb215..0be38c3b96 100644 --- a/apps/files/ajax/list.php +++ b/apps/files/ajax/list.php @@ -10,35 +10,38 @@ OCP\JSON::checkLoggedIn(); // Load the files $dir = isset( $_GET['dir'] ) ? $_GET['dir'] : ''; -$doBreadcrumb = isset( $_GET['breadcrumb'] ) ? true : false; +$dir = \OC\Files\Filesystem::normalizePath($dir); +if (!\OC\Files\Filesystem::is_dir($dir . '/')) { + header("HTTP/1.0 404 Not Found"); + exit(); +} + +$doBreadcrumb = isset($_GET['breadcrumb']); $data = array(); +$baseUrl = OCP\Util::linkTo('files', 'index.php') . '?dir='; + +$permissions = \OCA\Files\Helper::getDirPermissions($dir); // Make breadcrumb if($doBreadcrumb) { - $breadcrumb = array(); - $pathtohere = "/"; - foreach( explode( "/", $dir ) as $i ) { - if( $i != "" ) { - $pathtohere .= "$i/"; - $breadcrumb[] = array( "dir" => $pathtohere, "name" => $i ); - } - } + $breadcrumb = \OCA\Files\Helper::makeBreadcrumb($dir); - $breadcrumbNav = new OCP\Template( "files", "part.breadcrumb", "" ); - $breadcrumbNav->assign( "breadcrumb", $breadcrumb, false ); + $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', ''); + $breadcrumbNav->assign('breadcrumb', $breadcrumb, false); + $breadcrumbNav->assign('baseURL', $baseUrl); $data['breadcrumb'] = $breadcrumbNav->fetchPage(); } // make filelist -$files = array(); -foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $i ) { - $i["date"] = OCP\Util::formatDate($i["mtime"] ); - $files[] = $i; -} +$files = \OCA\Files\Helper::getFiles($dir); -$list = new OCP\Template( "files", "part.list", "" ); -$list->assign( "files", $files, false ); -$data = array('files' => $list->fetchPage()); +$list = new OCP\Template("files", "part.list", ""); +$list->assign('files', $files, false); +$list->assign('baseURL', $baseUrl, false); +$list->assign('downloadURL', OCP\Util::linkToRoute('download', array('file' => '/'))); +$list->assign('isPublic', false); +$data['files'] = $list->fetchPage(); +$data['permissions'] = $permissions; OCP\JSON::success(array('data' => $data)); diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index 8548fc95dd..c327d2b9f9 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -20,15 +20,6 @@ if($source) { OC_JSON::callCheck(); } -if($filename == '') { - OCP\JSON::error(array("data" => array( "message" => "Empty Filename" ))); - exit(); -} -if(strpos($filename, '/')!==false) { - OCP\JSON::error(array("data" => array( "message" => "Invalid Filename" ))); - exit(); -} - function progress($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) { static $filesize = 0; static $lastsize = 0; @@ -44,7 +35,7 @@ function progress($notification_code, $severity, $message, $message_code, $bytes if (!isset($filesize)) { } else { $progress = (int)(($bytes_transferred/$filesize)*100); - if($progress>$lastsize) {//limit the number or messages send + if($progress>$lastsize) { //limit the number or messages send $eventSource->send('progress', $progress); } $lastsize=$progress; @@ -54,41 +45,84 @@ function progress($notification_code, $severity, $message, $message_code, $bytes } } +$l10n = \OC_L10n::get('files'); + +$result = array( + 'success' => false, + 'data' => NULL + ); + +if(trim($filename) === '') { + $result['data'] = array('message' => $l10n->t('File name cannot be empty.')); + OCP\JSON::error($result); + exit(); +} + +if(strpos($filename, '/') !== false) { + $result['data'] = array('message' => $l10n->t('File name must not contain "/". Please choose a different name.')); + OCP\JSON::error($result); + exit(); +} + +//TODO why is stripslashes used on foldername in newfolder.php but not here? +$target = $dir.'/'.$filename; + +if (\OC\Files\Filesystem::file_exists($target)) { + $result['data'] = array('message' => $l10n->t( + 'The name %s is already used in the folder %s. Please choose a different name.', + array($filename, $dir)) + ); + OCP\JSON::error($result); + exit(); +} + if($source) { if(substr($source, 0, 8)!='https://' and substr($source, 0, 7)!='http://') { - OCP\JSON::error(array("data" => array( "message" => "Not a valid source" ))); + OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Not a valid source') ))); exit(); } $ctx = stream_context_create(null, array('notification' =>'progress')); $sourceStream=fopen($source, 'rb', false, $ctx); - $target=$dir.'/'.$filename; $result=\OC\Files\Filesystem::file_put_contents($target, $sourceStream); if($result) { $meta = \OC\Files\Filesystem::getFileInfo($target); $mime=$meta['mimetype']; $id = $meta['fileid']; - $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id)); + $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id, 'etag' => $meta['etag'])); } else { - $eventSource->send('error', "Error while downloading ".$source. ' to '.$target); + $eventSource->send('error', $l10n->t('Error while downloading %s to %s', array($source, $target))); } $eventSource->close(); exit(); } else { + $success = false; + if (!$content) { + $templateManager = OC_Helper::getFileTemplateManager(); + $mimeType = OC_Helper::getMimetypeDetector()->detectPath($target); + $content = $templateManager->getTemplate($mimeType); + } + if($content) { - if(\OC\Files\Filesystem::file_put_contents($dir.'/'.$filename, $content)) { - $meta = \OC\Files\Filesystem::getFileInfo($dir.'/'.$filename); - $id = $meta['fileid']; - OCP\JSON::success(array("data" => array('content'=>$content, 'id' => $id))); - exit(); - } - }elseif(\OC\Files\Filesystem::touch($dir . '/' . $filename)) { - $meta = \OC\Files\Filesystem::getFileInfo($dir.'/'.$filename); + $success = \OC\Files\Filesystem::file_put_contents($target, $content); + } else { + $success = \OC\Files\Filesystem::touch($target); + } + + if($success) { + $meta = \OC\Files\Filesystem::getFileInfo($target); $id = $meta['fileid']; - OCP\JSON::success(array("data" => array('content'=>$content, 'id' => $id, 'mime' => $meta['mimetype']))); + $mime = $meta['mimetype']; + $size = $meta['size']; + OCP\JSON::success(array('data' => array( + 'id' => $id, + 'mime' => $mime, + 'size' => $size, + 'content' => $content, + 'etag' => $meta['etag'], + ))); exit(); } } - -OCP\JSON::error(array("data" => array( "message" => "Error when creating the file" ))); +OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Error when creating the file') ))); diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php index e26e1238bc..2cbc8cfeba 100644 --- a/apps/files/ajax/newfolder.php +++ b/apps/files/ajax/newfolder.php @@ -10,25 +10,47 @@ OCP\JSON::callCheck(); $dir = isset( $_POST['dir'] ) ? stripslashes($_POST['dir']) : ''; $foldername = isset( $_POST['foldername'] ) ? stripslashes($_POST['foldername']) : ''; -if(trim($foldername) == '') { - OCP\JSON::error(array("data" => array( "message" => "Empty Foldername" ))); - exit(); -} -if(strpos($foldername, '/')!==false) { - OCP\JSON::error(array("data" => array( "message" => "Invalid Foldername" ))); +$l10n = \OC_L10n::get('files'); + +$result = array( + 'success' => false, + 'data' => NULL + ); + +if(trim($foldername) === '') { + $result['data'] = array('message' => $l10n->t('Folder name cannot be empty.')); + OCP\JSON::error($result); exit(); } -if(\OC\Files\Filesystem::mkdir($dir . '/' . stripslashes($foldername))) { - if ( $dir != '/') { +if(strpos($foldername, '/') !== false) { + $result['data'] = array('message' => $l10n->t('Folder name must not contain "/". Please choose a different name.')); + OCP\JSON::error($result); + exit(); +} + +//TODO why is stripslashes used on foldername here but not in newfile.php? +$target = $dir . '/' . stripslashes($foldername); + +if (\OC\Files\Filesystem::file_exists($target)) { + $result['data'] = array('message' => $l10n->t( + 'The name %s is already used in the folder %s. Please choose a different name.', + array($foldername, $dir)) + ); + OCP\JSON::error($result); + exit(); +} + +if(\OC\Files\Filesystem::mkdir($target)) { + if ( $dir !== '/') { $path = $dir.'/'.$foldername; } else { $path = '/'.$foldername; } $meta = \OC\Files\Filesystem::getFileInfo($path); $id = $meta['fileid']; - OCP\JSON::success(array("data" => array('id'=>$id))); + OCP\JSON::success(array('data' => array('id' => $id))); exit(); } -OCP\JSON::error(array("data" => array( "message" => "Error when creating the folder" ))); +OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Error when creating the folder') ))); diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php index f568afad4d..40da32b223 100644 --- a/apps/files/ajax/rawlist.php +++ b/apps/files/ajax/rawlist.php @@ -3,30 +3,58 @@ // only need filesystem apps $RUNTIME_APPTYPES=array('filesystem'); -// Init owncloud - -require_once 'lib/template.php'; - OCP\JSON::checkLoggedIn(); // Load the files $dir = isset( $_GET['dir'] ) ? $_GET['dir'] : ''; -$mimetype = isset($_GET['mimetype']) ? $_GET['mimetype'] : ''; +$mimetypes = isset($_GET['mimetypes']) ? json_decode($_GET['mimetypes'], true) : ''; + +// Clean up duplicates from array and deal with non-array requests +if (is_array($mimetypes)) { + $mimetypes = array_unique($mimetypes); +} elseif (is_null($mimetypes)) { + $mimetypes = array($_GET['mimetypes']); +} // make filelist $files = array(); // If a type other than directory is requested first load them. -if($mimetype && strpos($mimetype, 'httpd/unix-directory') === false) { - foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $i ) { - $i["date"] = OCP\Util::formatDate($i["mtime"] ); - $i['mimetype_icon'] = $i['type'] == 'dir' ? \mimetype_icon('dir'): \mimetype_icon($i['mimetype']); - $files[] = $i; +if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) { + foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) { + $file['directory'] = $dir; + $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']); + $file["date"] = OCP\Util::formatDate($file["mtime"]); + $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); + $files[] = $file; } } -foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $i ) { - $i["date"] = OCP\Util::formatDate($i["mtime"] ); - $i['mimetype_icon'] = $i['type'] == 'dir' ? \mimetype_icon('dir'): \mimetype_icon($i['mimetype']); - $files[] = $i; + +if (is_array($mimetypes) && count($mimetypes)) { + foreach ($mimetypes as $mimetype) { + foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) { + $file['directory'] = $dir; + $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']); + $file["date"] = OCP\Util::formatDate($file["mtime"]); + $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); + $files[] = $file; + } + } +} else { + foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) { + $file['directory'] = $dir; + $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']); + $file["date"] = OCP\Util::formatDate($file["mtime"]); + $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); + $files[] = $file; + } } -OCP\JSON::success(array('data' => $files)); +// Sort by name +usort($files, function ($a, $b) { + if ($a['name'] === $b['name']) { + return 0; + } + return ($a['name'] < $b['name']) ? -1 : 1; +}); + +OC_JSON::success(array('data' => $files)); diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php index f455185828..5b07c306af 100644 --- a/apps/files/ajax/rename.php +++ b/apps/files/ajax/rename.php @@ -38,4 +38,4 @@ if($result['success'] === true){ OCP\JSON::success(array('data' => $result['data'])); } else { OCP\JSON::error(array('data' => $result['data'])); -} \ No newline at end of file +} diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index dde5d3c50a..0e905f993a 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -7,6 +7,8 @@ OCP\JSON::setContentTypeHeader('text/plain'); // If not, check the login. // If no token is sent along, rely on login only +$allowedPermissions = OCP\PERMISSION_ALL; + $l = OC_L10N::get('files'); if (empty($_POST['dirToken'])) { // The standard case, files are uploaded through logged in users :) @@ -17,6 +19,9 @@ if (empty($_POST['dirToken'])) { die(); } } else { + // return only read permissions for public upload + $allowedPermissions = OCP\PERMISSION_READ; + $linkItem = OCP\Share::getShareByToken($_POST['dirToken']); if ($linkItem === false) { OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('Invalid Token'))))); @@ -53,7 +58,7 @@ OCP\JSON::callCheck(); // get array with current storage stats (e.g. max file size) -$storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir); +$storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir); if (!isset($_FILES['files'])) { OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('No file was uploaded. Unknown error')), $storageStats))); @@ -78,7 +83,7 @@ foreach ($_FILES['files']['error'] as $error) { } $files = $_FILES['files']; -$error = ''; +$error = false; $maxUploadFileSize = $storageStats['uploadMaxFilesize']; $maxHumanFileSize = OCP\Util::humanFileSize($maxUploadFileSize); @@ -98,29 +103,78 @@ $result = array(); if (strpos($dir, '..') === false) { $fileCount = count($files['name']); for ($i = 0; $i < $fileCount; $i++) { - $target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]); // $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder - $target = \OC\Files\Filesystem::normalizePath($target); - if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) { - $meta = \OC\Files\Filesystem::getFileInfo($target); - // updated max file size after upload - $storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir); + if (isset($_POST['resolution']) && $_POST['resolution']==='autorename') { + // append a number in brackets like 'filename (2).ext' + $target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]); + } else { + $target = \OC\Files\Filesystem::normalizePath(stripslashes($dir).'/'.$files['name'][$i]); + } + + if ( ! \OC\Files\Filesystem::file_exists($target) + || (isset($_POST['resolution']) && $_POST['resolution']==='replace') + ) { + // upload and overwrite file + try + { + if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) { - $result[] = array('status' => 'success', - 'mime' => $meta['mimetype'], - 'size' => $meta['size'], - 'id' => $meta['fileid'], - 'name' => basename($target), - 'originalname' => $files['name'][$i], - 'uploadMaxFilesize' => $maxUploadFileSize, - 'maxHumanFilesize' => $maxHumanFileSize - ); + // updated max file size after upload + $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir); + + $meta = \OC\Files\Filesystem::getFileInfo($target); + if ($meta === false) { + $error = $l->t('Upload failed. Could not get file info.'); + } else { + $result[] = array('status' => 'success', + 'mime' => $meta['mimetype'], + 'mtime' => $meta['mtime'], + 'size' => $meta['size'], + 'id' => $meta['fileid'], + 'name' => basename($target), + 'etag' => $meta['etag'], + 'originalname' => $files['tmp_name'][$i], + 'uploadMaxFilesize' => $maxUploadFileSize, + 'maxHumanFilesize' => $maxHumanFileSize, + 'permissions' => $meta['permissions'] & $allowedPermissions + ); + } + + } else { + $error = $l->t('Upload failed. Could not find uploaded file'); + } + } catch(Exception $ex) { + $error = $ex->getMessage(); + } + + } else { + // file already exists + $meta = \OC\Files\Filesystem::getFileInfo($target); + if ($meta === false) { + $error = $l->t('Upload failed. Could not get file info.'); + } else { + $result[] = array('status' => 'existserror', + 'mime' => $meta['mimetype'], + 'mtime' => $meta['mtime'], + 'size' => $meta['size'], + 'id' => $meta['fileid'], + 'name' => basename($target), + 'etag' => $meta['etag'], + 'originalname' => $files['tmp_name'][$i], + 'uploadMaxFilesize' => $maxUploadFileSize, + 'maxHumanFilesize' => $maxHumanFileSize, + 'permissions' => $meta['permissions'] & $allowedPermissions + ); + } } } - OCP\JSON::encodedPrint($result); - exit(); } else { $error = $l->t('Invalid directory.'); } -OCP\JSON::error(array('data' => array_merge(array('message' => $error), $storageStats))); +if ($error === false) { + OCP\JSON::encodedPrint($result); + exit(); +} else { + OCP\JSON::error(array(array('data' => array_merge(array('message' => $error), $storageStats)))); +} diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php index 99739cb4ce..909baca92e 100644 --- a/apps/files/appinfo/app.php +++ b/apps/files/appinfo/app.php @@ -1,15 +1,14 @@ "files_index", - "order" => 0, - "href" => OCP\Util::linkTo( "files", "index.php" ), - "icon" => OCP\Util::imagePath( "core", "places/files.svg" ), - "name" => $l->t("Files") )); +OCP\App::addNavigationEntry(array("id" => "files_index", + "order" => 0, + "href" => OCP\Util::linkTo("files", "index.php"), + "icon" => OCP\Util::imagePath("core", "places/files.svg"), + "name" => $l->t("Files"))); OC_Search::registerProvider('OC_Search_Provider_File'); @@ -21,3 +20,9 @@ OC_Search::registerProvider('OC_Search_Provider_File'); \OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook'); \OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext'); + +$templateManager = OC_Helper::getFileTemplateManager(); +$templateManager->registerTemplate('text/html', 'core/templates/filetemplates/template.html'); +$templateManager->registerTemplate('application/vnd.oasis.opendocument.presentation', 'core/templates/filetemplates/template.odp'); +$templateManager->registerTemplate('application/vnd.oasis.opendocument.text', 'core/templates/filetemplates/template.odt'); +$templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadsheet', 'core/templates/filetemplates/template.ods'); diff --git a/apps/files/appinfo/register_command.php b/apps/files/appinfo/register_command.php new file mode 100644 index 0000000000..435ce0ab23 --- /dev/null +++ b/apps/files/appinfo/register_command.php @@ -0,0 +1,9 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +$application->add(new OCA\Files\Command\Scan(OC_User::getManager())); diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php index 9b114ca2e3..9f29079620 100644 --- a/apps/files/appinfo/remote.php +++ b/apps/files/appinfo/remote.php @@ -39,7 +39,7 @@ $rootDir = new OC_Connector_Sabre_Directory(''); $objectTree = new \OC\Connector\Sabre\ObjectTree($rootDir); // Fire up server -$server = new Sabre_DAV_Server($objectTree); +$server = new OC_Connector_Sabre_Server($objectTree); $server->httpRequest = $requestBackend; $server->setBaseUri($baseuri); @@ -48,6 +48,8 @@ $defaults = new OC_Defaults(); $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName())); $server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend)); $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload +$server->addPlugin(new OC_Connector_Sabre_FilesPlugin()); +$server->addPlugin(new OC_Connector_Sabre_AbortedUploadDetectionPlugin()); $server->addPlugin(new OC_Connector_Sabre_QuotaPlugin()); $server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin()); diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index fcd5f4b260..f3d8e9a4f4 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -11,4 +11,4 @@ $this->create('download', 'download{file}') ->actionInclude('files/download.php'); // Register with the capabilities API -OC_API::register('get', '/cloud/capabilities', array('OCA\Files\Capabilities', 'getCapabilities'), 'files', OC_API::USER_AUTH); \ No newline at end of file +OC_API::register('get', '/cloud/capabilities', array('OCA\Files\Capabilities', 'getCapabilities'), 'files', OC_API::USER_AUTH); diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php new file mode 100644 index 0000000000..25ab70af36 --- /dev/null +++ b/apps/files/command/scan.php @@ -0,0 +1,73 @@ + + * Copyright (c) 2013 Bart Visscher + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +class Scan extends Command { + + /** + * @var \OC\User\Manager $userManager + */ + private $userManager; + + public function __construct(\OC\User\Manager $userManager) { + $this->userManager = $userManager; + parent::__construct(); + } + + protected function configure() { + $this + ->setName('files:scan') + ->setDescription('rescan filesystem') + ->addArgument( + 'user_id', + InputArgument::OPTIONAL | InputArgument::IS_ARRAY, + 'will rescan all files of the given user(s)' + ) + ->addOption( + 'all', + null, + InputOption::VALUE_NONE, + 'will rescan all files of all known users' + ) + ; + } + + protected function scanFiles($user, OutputInterface $output) { + $scanner = new \OC\Files\Utils\Scanner($user); + $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function($path) use ($output) { + $output->writeln("Scanning $path"); + }); + $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function($path) use ($output) { + $output->writeln("Scanning $path"); + }); + $scanner->scan(''); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + if ($input->getOption('all')) { + $users = $this->userManager->search(''); + } else { + $users = $input->getArgument('user_id'); + } + + foreach ($users as $user) { + if (is_object($user)) { + $user = $user->getUID(); + } + $this->scanFiles($user, $output); + } + } +} diff --git a/apps/files/console/scan.php b/apps/files/console/scan.php deleted file mode 100644 index 70183fc888..0000000000 --- a/apps/files/console/scan.php +++ /dev/null @@ -1,31 +0,0 @@ -" . PHP_EOL; - echo " will rescan all files of the given user" . PHP_EOL; - echo " files:scan --all" . PHP_EOL; - echo " will rescan all files of all known users" . PHP_EOL; - return; -} - -function scanFiles($user) { - $scanner = new \OC\Files\Utils\Scanner($user); - $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function($path) { - echo "Scanning $path" . PHP_EOL; - }); - $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function($path) { - echo "Scanning $path" . PHP_EOL; - }); - $scanner->scan(''); -} - -if ($argv[1] === '--all') { - $users = OC_User::getUsers(); -} else { - $users = array($argv[1]); -} - -foreach ($users as $user) { - scanFiles($user); -} diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 86fb0dc604..2fc86ca537 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -7,176 +7,326 @@ .actions input, .actions button, .actions .button { margin:0; float:left; } .actions .button a { color: #555; } .actions .button a:hover, .actions .button a:active { color: #333; } + #new { - height:17px; margin:0 0 0 1em; z-index:1010; float:left; + z-index: 1010; + float: left; + padding: 0 !important; /* override default control bar button padding */ +} +#trash { + margin-right: 8px; + float: right; + z-index: 1010; + padding: 10px; + font-weight: normal; +} +#new>a { + padding: 14px 10px; + position: relative; + top: 7px; +} +#new.active { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom: none; } -#new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; } -#new>a { padding:.5em 1.2em .3em; } #new>ul { - display:none; position:fixed; min-width:7em; z-index:10; - padding:.5em; padding-bottom:0; margin-top:.075em; margin-left:-.5em; + display: none; + position: fixed; + min-width: 7em; + z-index: 10; + padding: .5em; + padding-bottom: 0; + margin-top: 14px; + margin-left: -1px; text-align:left; - background:#f8f8f8; border:1px solid #ddd; border-radius:10px; border-top-left-radius:0; + background: #f8f8f8; + border: 1px solid #ddd; + border-radius: 5px; + border-top-left-radius: 0; box-shadow:0 2px 7px rgba(170,170,170,.4); } -#new>ul>li { height:20px; margin:.3em; padding-left:2em; padding-bottom:0.1em; +#new>ul>li { height:36px; margin:.3em; padding-left:3em; padding-bottom:0.1em; background-repeat:no-repeat; cursor:pointer; } -#new>ul>li>p { cursor:pointer; } -#new>ul>li>form>input { padding:0.3em; margin:-0.3em; } +#new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;} -#trash { margin: 0 1em; z-index:1010; float: right; } - -#upload { - height:27px; padding:0; margin-left:0.2em; overflow:hidden; -} -#upload a { - position:relative; display:block; width:100%; height:27px; - cursor:pointer; z-index:10; - background-image:url('%webroot%/core/img/actions/upload.svg'); - background-repeat:no-repeat; - background-position:7px 6px; - opacity:0.65; -} -.file_upload_target { display:none; } -.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; } -#file_upload_start { - left:0; top:0; width:28px; height:27px; padding:0; - font-size:1em; - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; - z-index:20; position:relative; cursor:pointer; overflow:hidden; -} - -#uploadprogresswrapper { float: right; position: relative; } -#uploadprogresswrapper #uploadprogressbar { - position:relative; float: right; - margin-left: 12px; width:10em; height:1.5em; top:.4em; - display:inline-block; +#new .error, #fileList .error { + color: #e9322d; + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; } /* FILE TABLE */ -#emptyfolder { - position:absolute; - margin:10em 0 0 10em; - font-size:1.5em; font-weight:bold; - color:#888; text-shadow:#fff 0 1px 0; +#filestable { + position: relative; + top: 44px; + width: 100%; } -#filestable { position: relative; top:37px; width:100%; } -tbody tr { background-color:#fff; height:2.5em; } -tbody tr:hover, tbody tr:active { +#filestable, #controls { + min-width: 680px; +} +#filestable tbody tr { background-color:#fff; height:2.5em; } +#filestable tbody tr:hover, tbody tr:active { background-color: rgb(240,240,240); } -tbody tr.selected { +#filestable tbody tr.selected { background-color: rgb(230,230,230); } +#filestable tbody tr.searchresult { + background-color: rgb(240,240,240); +} tbody a { color:#000; } span.extension, span.uploading, td.date { color:#999; } span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; } tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; color:#777; } table tr.mouseOver td { background-color:#eee; } table th { height:2em; padding:0 .5em; color:#999; } -table th .name { float:left; margin-left:.5em; } +table th .name { + position: absolute; + left: 55px; + top: 15px; +} table th, table td { border-bottom:1px solid #ddd; text-align:left; font-weight:normal; } -table td { border-bottom:1px solid #eee; font-style:normal; background-position:1em .5em; background-repeat:no-repeat; } -table th#headerName { width:100em; /* not really sure why this works better than 100% … table styling */ } -table th#headerSize, table td.filesize { min-width:3em; padding:0 1em; text-align:right; } -table th#headerDate, table td.date { min-width:11em; padding:0 .1em 0 1em; text-align:left; } +table td { + border-bottom: 1px solid #eee; + font-style: normal; + background-position: 8px center; + background-repeat: no-repeat; +} +table th#headerName { + position: relative; + width: 100em; /* not really sure why this works better than 100% … table styling */ + padding: 0; +} +#headerName-container { + position: relative; + height: 50px; +} +table th#headerSize, table td.filesize { + min-width: 3em; + padding: 0 1em; + text-align: right; +} +table th#headerDate, table td.date { + -moz-box-sizing: border-box; + box-sizing: border-box; + position: relative; + min-width: 11em; +} /* Multiselect bar */ -#filestable.multiselect { top:63px; } -table.multiselect thead { position:fixed; top:82px; z-index:1; -moz-box-sizing: border-box; box-sizing: border-box; left: 0; padding-left: 64px; width:100%; } +#filestable.multiselect { + top: 95px; +} +table.multiselect thead { + position: fixed; + top: 89px; + z-index: 10; + -moz-box-sizing: border-box; + box-sizing: border-box; + left: 0; + padding-left: 80px; + width: 100%; +} + table.multiselect thead th { - background-color: rgba(210,210,210,.7); + background-color: rgba(220,220,220,.8); color: #000; font-weight: bold; border-bottom: 0; } -table.multiselect #headerName { width: 100%; } +table.multiselect #headerName { + position: relative; + width: 100%; +} table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; } -table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; } +table td.filename a.name { + position:relative; /* Firefox needs to explicitly have this default set … */ + -moz-box-sizing: border-box; + box-sizing: border-box; + display: block; + height: 50px; + vertical-align: middle; + padding: 0; +} table tr[data-type="dir"] td.filename a.name span.nametext {font-weight:bold; } -table td.filename input.filename { width:100%; cursor:text; } -table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em 0; } +table td.filename input.filename { + width: 80%; + font-size: 14px; + margin-top: 8px; + margin-left: 2px; + cursor: text; +} +table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em .3em; } table td.filename .nametext, .uploadtext, .modified { float:left; padding:.3em 0; } + +#modified { + position: absolute; + top: 15px; +} +.modified { + position: relative; +} + /* TODO fix usability bug (accidental file/folder selection) */ -table td.filename .nametext { overflow:hidden; text-overflow:ellipsis; max-width:800px; } +table td.filename .nametext { + position: absolute; + top: 16px; + left: 55px; + padding: 0; + overflow: hidden; + text-overflow: ellipsis; + max-width: 800px; +} table td.filename .uploadtext { font-weight:normal; margin-left:.5em; } table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; } +.ie8 input[type="checkbox"]{ + padding: 0; +} + /* File checkboxes */ -#fileList tr td.filename>input[type="checkbox"]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; } -#fileList tr td.filename>input[type="checkbox"]:hover:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; filter:alpha(opacity=80); opacity:.8; } -/* Always show checkbox when selected */ -#fileList tr td.filename>input[type="checkbox"]:checked:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } -#fileList tr.selected td.filename>input[type="checkbox"]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } +#fileList tr td.filename>input[type="checkbox"]:first-child { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + float: left; + 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>input[type="checkbox"]:first-child, +#fileList tr td.filename>input[type="checkbox"]:checked:first-child, +#fileList tr.selected td.filename>input[type="checkbox"]:first-child { + opacity: 1; +} +.lte9 #fileList tr:hover td.filename>input[type="checkbox"]:first-child, +.lte9 #fileList tr td.filename>input[type="checkbox"][checked=checked]:first-child, +.lte9 #fileList tr.selected td.filename>input[type="checkbox"]:first-child { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); +} + +/* Use label to have bigger clickable size for checkbox */ +#fileList tr td.filename>input[type="checkbox"] + label, +#select_all + label { + height: 50px; + position: absolute; + width: 50px; + z-index: 5; +} +#fileList tr td.filename>input[type="checkbox"] + label { + left: 0; +} +#select_all + label { + top: 0; +} +#select_all { + position: absolute; + top: 18px; + left: 18px; +} + #fileList tr td.filename { position:relative; width:100%; -webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms; } -#select_all { float:left; margin:.4em 0.6em 0 .5em; } + +#fileList tr td.filename a.name label { + position: absolute; + width: 100%; + height: 50px; +} + #uploadsize-message,#delete-confirm { display:none; } /* File actions */ .fileactions { - position:absolute; top:.6em; right:0; - font-size:.8em; + position: absolute; + top: 14px; + right: 0; } -#fileList .name { position:relative; /* Firefox needs to explicitly have this default set … */ } -#fileList tr:hover .fileactions { /* background to distinguish when overlaying with file names */ - background-color: rgba(240,240,240,0.898); - box-shadow: -5px 0 7px rgba(240,240,240,0.898); -} -#fileList tr.selected:hover .fileactions, #fileList tr.mouseOver .fileactions { /* slightly darker color for selected rows */ - background-color: rgba(230,230,230,.9); - box-shadow: -5px 0 7px rgba(230,230,230,.9); -} -#fileList .fileactions a.action img { position:relative; top:.2em; } -#fileList a.action { display:inline; margin:-.5em 0; padding:1em .5em 1em .5em !important; } + #fileList img.move2trash { display:inline; margin:-.5em 0; padding:1em .5em 1em .5em !important; float:right; } -a.action.delete { float:right; } +#fileList a.action.delete { + position: absolute; + right: 0; + padding: 9px 14px 19px !important; +} a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; } -.selectedActions { display:none; float:right; } -.selectedActions a { display:inline; margin:-.5em 0; padding:.5em !important; } -.selectedActions a img { position:relative; top:.3em; } + +/* Actions for selected files */ +.selectedActions { + display: none; + position: absolute; + top: -1px; + right: 0; + padding: 15px 8px; +} +.selectedActions a { + display: inline; + padding: 17px 5px; +} +.selectedActions a img { + position:relative; + top:.3em; +} + #fileList a.action { + display: inline; + margin: -.5em 0; + padding: 18px 8px !important; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); opacity: 0; display:none; } #fileList tr:hover a.action, #fileList a.action.permanent { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=.5)"; - filter: alpha(opacity=.5); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + filter: alpha(opacity=50); opacity: .5; display:inline; } #fileList tr:hover a.action:hover { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)"; - filter: alpha(opacity=1); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); opacity: 1; display:inline; } .summary { - opacity: .5; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; + filter: alpha(opacity=30); + opacity: .3; + height: 70px; } +.summary:hover, .summary, table tr.summary td { + background-color: transparent; +} + +.summary td { + padding-top: 8px; + padding-bottom: 8px; + border-bottom: none; +} .summary .info { - margin-left: 3em; + margin-left: 55px; } #scanning-message{ top:40%; left:40%; position:absolute; display:none; } -div.crumb a{ padding:0.9em 0 0.7em 0; color:#555; } - table.dragshadow { width:auto; } table.dragshadow td.filename { - padding-left:36px; + padding-left:60px; padding-right:16px; + height: 36px; } table.dragshadow td.size { padding-right:8px; @@ -189,3 +339,24 @@ table.dragshadow td.size { text-align: center; margin-left: -200px; } +.mask { + z-index: 50; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: white; + background-repeat: no-repeat no-repeat; + background-position: 50%; + opacity: 0.7; + filter: alpha(opacity=70); + transition: opacity 100ms; + -moz-transition: opacity 100ms; + -o-transition: opacity 100ms; + -ms-transition: opacity 100ms; + -webkit-transition: opacity 100ms; +} +.mask.transparent{ + opacity: 0; +} diff --git a/apps/files/css/upload.css b/apps/files/css/upload.css new file mode 100644 index 0000000000..ef04356909 --- /dev/null +++ b/apps/files/css/upload.css @@ -0,0 +1,144 @@ +#upload { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: 36px; + width: 39px; + padding: 0 !important; /* override default control bar button padding */ + margin-left: .2em; + overflow: hidden; + vertical-align: top; +} +#upload a { + position: relative; + display: block; + width: 100%; + height: 44px; + width: 44px; + margin: -5px -3px; + cursor: pointer; + z-index: 10; + background-image: url('%webroot%/core/img/actions/upload.svg'); + background-repeat: no-repeat; + background-position: center; + opacity: .65; +} +.file_upload_target { display:none; } +.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; } +#file_upload_start { + position: relative; + left: 0; + top: 0; + width: 44px; + height: 44px; + margin: -5px -3px; + padding: 0; + font-size: 1em; + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; + z-index: 20; + cursor: pointer; + overflow: hidden; +} + +#uploadprogresswrapper { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + vertical-align: top; + height: 36px; + box-sizing: border-box; +} +#uploadprogresswrapper > input[type='button'] { + height: 36px; +} +#uploadprogressbar { + position:relative; + float: left; + margin-left: 12px; + width: 130px; + height: 36px; + display:inline-block; +} +#uploadprogressbar + stop { + font-size: 13px; +} + +.oc-dialog .fileexists table { + width: 100%; +} +.oc-dialog .fileexists th { + padding-left: 0; + padding-right: 0; +} +.oc-dialog .fileexists th input[type='checkbox'] { + margin-right: 3px; +} +.oc-dialog .fileexists th:first-child { + width: 230px; +} +.oc-dialog .fileexists th label { + font-weight: normal; + color:black; +} +.oc-dialog .fileexists th .count { + margin-left: 3px; +} +.oc-dialog .fileexists .conflicts .template { + display: none; +} +.oc-dialog .fileexists .conflict { + width: 100%; + height: 85px; +} +.oc-dialog .fileexists .conflict .filename { + color:#777; + word-break: break-all; + clear: left; +} +.oc-dialog .fileexists .icon { + width: 64px; + height: 64px; + margin: 0px 5px 5px 5px; + background-repeat: no-repeat; + background-size: 64px 64px; + float: left; +} +.oc-dialog .fileexists .replacement { + float: left; + width: 230px; +} +.oc-dialog .fileexists .original { + float: left; + width: 230px; +} +.oc-dialog .fileexists .conflicts { + overflow-y:scroll; + max-height: 225px; +} +.oc-dialog .fileexists .conflict input[type='checkbox'] { + float: left; +} +.oc-dialog .fileexists .toggle { + background-image: url('%webroot%/core/img/actions/triangle-e.png'); + width: 16px; + height: 16px; +} +.oc-dialog .fileexists #allfileslabel { + float:right; +} +.oc-dialog .fileexists #allfiles { + vertical-align: bottom; + position: relative; + top: -3px; +} +.oc-dialog .fileexists #allfiles + span{ + vertical-align: bottom; +} +.oc-dialog .oc-dialog-buttonrow { + width:100%; + text-align:right; +} +.oc-dialog .oc-dialog-buttonrow .cancel { + float:left; +} diff --git a/apps/files/index.php b/apps/files/index.php index 4f9e881eb2..8f6838aa0d 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -26,6 +26,7 @@ OCP\User::checkLoggedIn(); // Load the files we need OCP\Util::addStyle('files', 'files'); +OCP\Util::addStyle('files', 'upload'); OCP\Util::addscript('files', 'file-upload'); OCP\Util::addscript('files', 'jquery.iframe-transport'); OCP\Util::addscript('files', 'jquery.fileupload'); @@ -35,83 +36,65 @@ OCP\Util::addscript('files', 'filelist'); OCP\App::setActiveNavigationEntry('files_index'); // Load the files $dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : ''; +$dir = \OC\Files\Filesystem::normalizePath($dir); // Redirect if directory does not exist if (!\OC\Files\Filesystem::is_dir($dir . '/')) { header('Location: ' . OCP\Util::getScriptName() . ''); exit(); } -function fileCmp($a, $b) { - if ($a['type'] == 'dir' and $b['type'] != 'dir') { - return -1; - } elseif ($a['type'] != 'dir' and $b['type'] == 'dir') { - return 1; - } else { - return strnatcasecmp($a['name'], $b['name']); - } +$isIE8 = false; +preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches); +if (count($matches) > 0 && $matches[1] <= 8){ + $isIE8 = true; } +// if IE8 and "?dir=path" was specified, reformat the URL to use a hash like "#?dir=path" +if ($isIE8 && isset($_GET['dir'])){ + if ($dir === ''){ + $dir = '/'; + } + header('Location: ' . OCP\Util::linkTo('files', 'index.php') . '#?dir=' . \OCP\Util::encodePath($dir)); + exit(); +} + +$ajaxLoad = false; $files = array(); $user = OC_User::getUser(); if (\OC\Files\Cache\Upgrade::needUpgrade($user)) { //dont load anything if we need to upgrade the cache - $content = array(); $needUpgrade = true; $freeSpace = 0; } else { - $content = \OC\Files\Filesystem::getDirectoryContent($dir); + if ($isIE8){ + // after the redirect above, the URL will have a format + // like "files#?dir=path" which means that no path was given + // (dir is not set). In that specific case, we don't return any + // files because the client will take care of switching the dir + // to the one from the hash, then ajax-load the initial file list + $files = array(); + $ajaxLoad = true; + } + else{ + $files = \OCA\Files\Helper::getFiles($dir); + } $freeSpace = \OC\Files\Filesystem::free_space($dir); $needUpgrade = false; } -foreach ($content as $i) { - $i['date'] = OCP\Util::formatDate($i['mtime']); - if ($i['type'] == 'file') { - $fileinfo = pathinfo($i['name']); - $i['basename'] = $fileinfo['filename']; - if (!empty($fileinfo['extension'])) { - $i['extension'] = '.' . $fileinfo['extension']; - } else { - $i['extension'] = ''; - } - } - $i['directory'] = $dir; - $files[] = $i; -} - -usort($files, "fileCmp"); // Make breadcrumb -$breadcrumb = array(); -$pathtohere = ''; -foreach (explode('/', $dir) as $i) { - if ($i != '') { - $pathtohere .= '/' . $i; - $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i); - } -} +$breadcrumb = \OCA\Files\Helper::makeBreadcrumb($dir); // make breadcrumb und filelist markup $list = new OCP\Template('files', 'part.list', ''); $list->assign('files', $files); $list->assign('baseURL', OCP\Util::linkTo('files', 'index.php') . '?dir='); $list->assign('downloadURL', OCP\Util::linkToRoute('download', array('file' => '/'))); -$list->assign('disableSharing', false); +$list->assign('isPublic', false); $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', ''); $breadcrumbNav->assign('breadcrumb', $breadcrumb); $breadcrumbNav->assign('baseURL', OCP\Util::linkTo('files', 'index.php') . '?dir='); -$permissions = OCP\PERMISSION_READ; -if (\OC\Files\Filesystem::isCreatable($dir . '/')) { - $permissions |= OCP\PERMISSION_CREATE; -} -if (\OC\Files\Filesystem::isUpdatable($dir . '/')) { - $permissions |= OCP\PERMISSION_UPDATE; -} -if (\OC\Files\Filesystem::isDeletable($dir . '/')) { - $permissions |= OCP\PERMISSION_DELETE; -} -if (\OC\Files\Filesystem::isSharable($dir . '/')) { - $permissions |= OCP\PERMISSION_SHARE; -} +$permissions = \OCA\Files\Helper::getDirPermissions($dir); if ($needUpgrade) { OCP\Util::addscript('files', 'upgrade'); @@ -119,11 +102,14 @@ if ($needUpgrade) { $tmpl->printPage(); } else { // information about storage capacities - $storageInfo=OC_Helper::getStorageInfo(); + $storageInfo=OC_Helper::getStorageInfo($dir); $maxUploadFilesize=OCP\Util::maxUploadFilesize($dir); $publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes'); + // if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code) + $encryptionInitStatus = 2; if (OC_App::isEnabled('files_encryption')) { - $publicUploadEnabled = 'no'; + $session = new \OCA\Encryption\Session(new \OC\Files\View('/')); + $encryptionInitStatus = $session->getInitialized(); } $trashEnabled = \OCP\App::isEnabled('files_trashbin'); @@ -131,15 +117,19 @@ if ($needUpgrade) { if ($trashEnabled) { $trashEmpty = \OCA\Files_Trashbin\Trashbin::isEmpty($user); } - + + $isCreatable = \OC\Files\Filesystem::isCreatable($dir . '/'); + $fileHeader = (!isset($files) or count($files) > 0); + $emptyContent = ($isCreatable and !$fileHeader) or $ajaxLoad; + OCP\Util::addscript('files', 'fileactions'); OCP\Util::addscript('files', 'files'); OCP\Util::addscript('files', 'keyboardshortcuts'); $tmpl = new OCP\Template('files', 'index', 'user'); $tmpl->assign('fileList', $list->fetchPage()); $tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage()); - $tmpl->assign('dir', \OC\Files\Filesystem::normalizePath($dir)); - $tmpl->assign('isCreatable', \OC\Files\Filesystem::isCreatable($dir . '/')); + $tmpl->assign('dir', $dir); + $tmpl->assign('isCreatable', $isCreatable); $tmpl->assign('permissions', $permissions); $tmpl->assign('files', $files); $tmpl->assign('trash', $trashEnabled); @@ -150,5 +140,14 @@ if ($needUpgrade) { $tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']); $tmpl->assign('isPublic', false); $tmpl->assign('publicUploadEnabled', $publicUploadEnabled); + $tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles()); + $tmpl->assign("mailNotificationEnabled", \OC_Appconfig::getValue('core', 'shareapi_allow_mail_notification', 'yes')); + $tmpl->assign("allowShareWithLink", \OC_Appconfig::getValue('core', 'shareapi_allow_links', 'yes')); + $tmpl->assign("encryptionInitStatus", $encryptionInitStatus); + $tmpl->assign('disableSharing', false); + $tmpl->assign('ajaxLoad', $ajaxLoad); + $tmpl->assign('emptyContent', $emptyContent); + $tmpl->assign('fileHeader', $fileHeader); + $tmpl->printPage(); } diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 942a07dfcc..e9663353f7 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -1,343 +1,681 @@ +/** + * The file upload code uses several hooks to interact with blueimps jQuery file upload library: + * 1. the core upload handling hooks are added when initializing the plugin, + * 2. if the browser supports progress events they are added in a separate set after the initialization + * 3. every app can add it's own triggers for fileupload + * - files adds d'n'd handlers and also reacts to done events to add new rows to the filelist + * - TODO pictures upload button + * - TODO music upload button + */ + +/** + * Function that will allow us to know if Ajax uploads are supported + * @link https://github.com/New-Bamboo/example-ajax-upload/blob/master/public/index.html + * also see article @link http://blog.new-bamboo.co.uk/2012/01/10/ridiculously-simple-ajax-uploads-with-formdata + */ +function supportAjaxUploadWithProgress() { + return supportFileAPI() && supportAjaxUploadProgressEvents() && supportFormData(); + + // Is the File API supported? + function supportFileAPI() { + var fi = document.createElement('INPUT'); + fi.type = 'file'; + return 'files' in fi; + } + + // Are progress events supported? + function supportAjaxUploadProgressEvents() { + var xhr = new XMLHttpRequest(); + return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload)); + } + + // Is FormData supported? + function supportFormData() { + return !! window.FormData; + } +} + +/** + * keeps track of uploads in progress and implements callbacks for the conflicts dialog + * @type {OC.Upload} + */ +OC.Upload = { + _uploads: [], + /** + * deletes the jqHXR object from a data selection + * @param {object} data + */ + deleteUpload:function(data) { + delete data.jqXHR; + }, + /** + * cancels all uploads + */ + cancelUploads:function() { + this.log('canceling uploads'); + jQuery.each(this._uploads,function(i, jqXHR) { + jqXHR.abort(); + }); + this._uploads = []; + }, + rememberUpload:function(jqXHR) { + if (jqXHR) { + this._uploads.push(jqXHR); + } + }, + /** + * Checks the currently known uploads. + * returns true if any hxr has the state 'pending' + * @returns {boolean} + */ + isProcessing:function() { + var count = 0; + + jQuery.each(this._uploads,function(i, data) { + if (data.state() === 'pending') { + count++; + } + }); + return count > 0; + }, + /** + * callback for the conflicts dialog + * @param {object} data + */ + onCancel:function(data) { + this.cancelUploads(); + }, + /** + * callback for the conflicts dialog + * calls onSkip, onReplace or onAutorename for each conflict + * @param {object} conflicts - list of conflict elements + */ + onContinue:function(conflicts) { + var self = this; + //iterate over all conflicts + jQuery.each(conflicts, function (i, conflict) { + conflict = $(conflict); + var keepOriginal = conflict.find('.original input[type="checkbox"]:checked').length === 1; + var keepReplacement = conflict.find('.replacement input[type="checkbox"]:checked').length === 1; + if (keepOriginal && keepReplacement) { + // when both selected -> autorename + self.onAutorename(conflict.data('data')); + } else if (keepReplacement) { + // when only replacement selected -> overwrite + self.onReplace(conflict.data('data')); + } else { + // when only original seleted -> skip + // when none selected -> skip + self.onSkip(conflict.data('data')); + } + }); + }, + /** + * handle skipping an upload + * @param {object} data + */ + onSkip:function(data) { + this.log('skip', null, data); + this.deleteUpload(data); + }, + /** + * handle replacing a file on the server with an uploaded file + * @param {object} data + */ + onReplace:function(data) { + this.log('replace', null, data); + if (data.data) { + data.data.append('resolution', 'replace'); + } else { + data.formData.push({name:'resolution', value:'replace'}); //hack for ie8 + } + data.submit(); + }, + /** + * handle uploading a file and letting the server decide a new name + * @param {object} data + */ + onAutorename:function(data) { + this.log('autorename', null, data); + if (data.data) { + data.data.append('resolution', 'autorename'); + } else { + data.formData.push({name:'resolution', value:'autorename'}); //hack for ie8 + } + data.submit(); + }, + _trace:false, //TODO implement log handler for JS per class? + log:function(caption, e, data) { + if (this._trace) { + console.log(caption); + console.log(data); + } + }, + /** + * TODO 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 + * @param {function} callbacks.onSkipConflicts + * @param {function} callbacks.onReplaceConflicts + * @param {function} callbacks.onChooseConflicts + * @param {function} callbacks.onCancel + */ + checkExistingFiles: function (selection, callbacks) { + // TODO check filelist before uploading and show dialog on conflicts, use callbacks + callbacks.onNoConflicts(selection); + } +}; + $(document).ready(function() { - file_upload_param = { - dropZone: $('#content'), // restrict dropZone to content div - //singleFileUploads is on by default, so the data.files array will always have length 1 - add: function(e, data) { + if ( $('#file_upload_start').exists() ) { - if(data.files[0].type === '' && data.files[0].size == 4096) - { - data.textStatus = 'dirorzero'; - data.errorThrown = t('files','Unable to upload your file as it is a directory or has 0 bytes'); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - return true; //don't upload this file but go on with next in queue - } + var file_upload_param = { + dropZone: $('#content'), // restrict dropZone to content div + autoUpload: false, + sequentialUploads: true, + //singleFileUploads is on by default, so the data.files array will always have length 1 + /** + * on first add of every selection + * - check all files of originalFiles array with files in dir + * - on conflict show dialog + * - skip all -> remember as single skip action for all conflicting files + * - replace all -> remember as single replace action for all conflicting files + * - choose -> show choose dialog + * - mark files to keep + * - when only existing -> remember as single skip action + * - when only new -> remember as single replace action + * - when both -> remember as single autorename action + * - start uploading selection + * @param {object} e + * @param {object} data + * @returns {boolean} + */ + add: function(e, data) { + OC.Upload.log('add', e, data); + var that = $(this); + + // we need to collect all data upload objects before starting the upload so we can check their existence + // and set individual conflict actions. unfortunately there is only one variable that we can use to identify + // the selection a data upload is part of, so we have to collect them in data.originalFiles + // turning singleFileUploads off is not an option because we want to gracefully handle server errors like + // already exists + + // create a container where we can store the data objects + if ( ! data.originalFiles.selection ) { + // initialize selection and remember number of files to upload + data.originalFiles.selection = { + uploads: [], + filesToUpload: data.originalFiles.length, + totalBytes: 0 + }; + } + var selection = data.originalFiles.selection; + + // add uploads + if ( selection.uploads.length < selection.filesToUpload ) { + // remember upload + selection.uploads.push(data); + } + + //examine file + var file = data.files[0]; + + if (file.type === '' && file.size === 4096) { + data.textStatus = 'dirorzero'; + data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes', + {filename: file.name} + ); + } + + // add size + selection.totalBytes += file.size; + + //check max upload size + if (selection.totalBytes > $('#max_upload').val()) { + data.textStatus = 'notenoughspace'; + data.errorThrown = t('files', 'Not enough space available'); + } + + // end upload for whole selection on error + if (data.errorThrown) { + // trigger fileupload fail + var fu = that.data('blueimp-fileupload') || that.data('fileupload'); + fu._trigger('fail', e, data); + return false; //don't upload anything + } - var totalSize=0; - $.each(data.originalFiles, function(i,file){ - totalSize+=file.size; - }); + // check existing files when all is collected + if ( selection.uploads.length >= selection.filesToUpload ) { + + //remove our selection hack: + delete data.originalFiles.selection; - if(totalSize>$('#max_upload').val()){ - data.textStatus = 'notenoughspace'; - data.errorThrown = t('files','Not enough space available'); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - return false; //don't upload anything - } + var callbacks = { + + onNoConflicts: function (selection) { + $.each(selection.uploads, function(i, upload) { + upload.submit(); + }); + }, + onSkipConflicts: function (selection) { + //TODO mark conflicting files as toskip + }, + onReplaceConflicts: function (selection) { + //TODO mark conflicting files as toreplace + }, + onChooseConflicts: function (selection) { + //TODO mark conflicting files as chosen + }, + onCancel: function (selection) { + $.each(selection.uploads, function(i, upload) { + upload.abort(); + }); + } + }; - // start the actual file upload - var jqXHR = data.submit(); + OC.Upload.checkExistingFiles(selection, callbacks); + + } - // remember jqXHR to show warning to user when he navigates away but an upload is still in progress - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - if(typeof uploadingFiles[dirName] === 'undefined') { - uploadingFiles[dirName] = {}; - } - uploadingFiles[dirName][data.files[0].name] = jqXHR; - } else { - uploadingFiles[data.files[0].name] = jqXHR; - } + return true; // continue adding files + }, + /** + * called after the first add, does NOT have the data param + * @param {object} e + */ + start: function(e) { + OC.Upload.log('start', e, null); + }, + submit: function(e, data) { + OC.Upload.rememberUpload(data); + if ( ! data.formData ) { + // noone set update parameters, we set the minimum + data.formData = { + requesttoken: oc_requesttoken, + dir: $('#dir').val() + }; + } + }, + 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.')); + } else { + // HTTP connection problem + OC.Notification.show(data.errorThrown); + } + //hide notification after 10 sec + setTimeout(function() { + OC.Notification.hide(); + }, 10000); + } + OC.Upload.deleteUpload(data); + }, + /** + * called for every successful upload + * @param {object} e + * @param {object} data + */ + done:function(e, data) { + OC.Upload.log('done', e, data); + // handle different responses (json or body from iframe for ie) + var response; + if (typeof data.result === 'string') { + response = data.result; + } else { + //fetch response from iframe + response = data.result[0].body.innerText; + } + var result=$.parseJSON(response); - //show cancel button - if($('html.lte9').length === 0 && data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').show(); - } - }, - /** - * called after the first add, does NOT have the data param - * @param e - */ - start: function(e) { - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - $('#uploadprogressbar').progressbar({value:0}); - $('#uploadprogressbar').fadeIn(); - }, - fail: function(e, data) { - if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) { - if (data.textStatus === 'abort') { - $('#notification').text(t('files', 'Upload cancelled.')); - } else { - // HTTP connection problem - $('#notification').text(data.errorThrown); - } - $('#notification').fadeIn(); - //hide notification after 5 sec - setTimeout(function() { - $('#notification').fadeOut(); - }, 5000); - } - delete uploadingFiles[data.files[0].name]; - }, - progress: function(e, data) { - // TODO: show nice progress bar in file row - }, - progressall: function(e, data) { - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - var progress = (data.loaded/data.total)*100; - $('#uploadprogressbar').progressbar('value',progress); - }, - /** - * called for every successful upload - * @param e - * @param data - */ - done:function(e, data) { - // handle different responses (json or body from iframe for ie) - var response; - if (typeof data.result === 'string') { - response = data.result; - } else { - //fetch response from iframe - response = data.result[0].body.innerText; - } - var result=$.parseJSON(response); + delete data.jqXHR; - if(typeof result[0] !== 'undefined' && result[0].status === 'success') { - var file = result[0]; - } else { - data.textStatus = 'servererror'; - data.errorThrown = t('files', result.data.message); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - } - - var filename = result[0].originalname; - - // delete jqXHR reference - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - delete uploadingFiles[dirName][filename]; - if ($.assocArraySize(uploadingFiles[dirName]) == 0) { - delete uploadingFiles[dirName]; - } - } else { - delete uploadingFiles[filename]; - } - - }, - /** - * called after last upload - * @param e - * @param data - */ - stop: function(e, data) { - if(data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').hide(); - } - - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - - $('#uploadprogressbar').progressbar('value',100); - $('#uploadprogressbar').fadeOut(); - } - } - var file_upload_handler = function() { - $('#file_upload_start').fileupload(file_upload_param); - }; - - - - if ( document.getElementById('data-upload-form') ) { - $(file_upload_handler); - } - $.assocArraySize = function(obj) { - // http://stackoverflow.com/a/6700/11236 - var size = 0, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) size++; - } - return size; - }; - - // warn user not to leave the page while upload is in progress - $(window).bind('beforeunload', function(e) { - if ($.assocArraySize(uploadingFiles) > 0) - return t('files','File upload is in progress. Leaving the page now will cancel the upload.'); - }); - - //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) - if(navigator.userAgent.search(/konqueror/i)==-1){ - $('#file_upload_start').attr('multiple','multiple') - } - - //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder - var crumb=$('div.crumb').first(); - while($('div.controls').height()>40 && crumb.next('div.crumb').length>0){ - crumb.children('a').text('...'); - crumb=crumb.next('div.crumb'); - } - //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent - var crumb=$('div.crumb').first(); - var next=crumb.next('div.crumb'); - while($('div.controls').height()>40 && next.next('div.crumb').length>0){ - crumb.remove(); - crumb=next; - next=crumb.next('div.crumb'); - } - //still not enough, start shorting down the current folder name - var crumb=$('div.crumb>a').last(); - while($('div.controls').height()>40 && crumb.text().length>6){ - var text=crumb.text() - text=text.substr(0,text.length-6)+'...'; - crumb.text(text); - } - - $(document).click(function(){ - $('#new>ul').hide(); - $('#new').removeClass('active'); - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ - $(element).children('form').remove(); - $(element).append('

'+$(element).data('text')+'

'); - } - }); - }); - $('#new li').click(function(){ - if($(this).children('p').length==0){ - return; - } - - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ - $(element).children('form').remove(); - $(element).append('

'+$(element).data('text')+'

'); - } - }); - - var type=$(this).data('type'); - var text=$(this).children('p').text(); - $(this).data('text',text); - $(this).children('p').remove(); - var form=$('
'); - var input=$(''); - form.append(input); - $(this).append(form); - input.focus(); - form.submit(function(event){ - event.stopPropagation(); - event.preventDefault(); - var newname=input.val(); - if(type == 'web' && newname.length == 0) { - OC.Notification.show(t('files', 'URL cannot be empty.')); - return false; - } else if (type != 'web' && !Files.isFileNameValid(newname)) { - return false; - } else if( type == 'folder' && $('#dir').val() == '/' && newname == 'Shared') { - OC.Notification.show(t('files','Invalid folder name. Usage of \'Shared\' is reserved by ownCloud')); - return false; - } - if (FileList.lastAction) { - FileList.lastAction(); - } - var name = getUniqueName(newname); - if (newname != name) { - FileList.checkName(name, newname, true); - var hidden = true; - } else { - var hidden = false; - } - switch(type){ - case 'file': - $.post( - OC.filePath('files','ajax','newfile.php'), - {dir:$('#dir').val(),filename:name}, - function(result){ - if (result.status == 'success') { - var date=new Date(); - FileList.addFile(name,0,date,false,hidden); - var tr=$('tr').filterAttr('data-file',name); - tr.attr('data-mime',result.data.mime); - tr.attr('data-id', result.data.id); - getMimeIcon(result.data.mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); + if (result.status === 'error' && result.data && result.data.message){ + data.textStatus = 'servererror'; + data.errorThrown = result.data.message; + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + fu._trigger('fail', e, data); + } else if (typeof result[0] === 'undefined') { + data.textStatus = 'servererror'; + data.errorThrown = t('files', 'Could not get result from server.'); + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + fu._trigger('fail', e, data); + } else if (result[0].status === 'existserror') { + //show "file already exists" dialog + var original = result[0]; + var replacement = data.files[0]; + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); + } else if (result[0].status !== 'success') { + //delete data.jqXHR; + data.textStatus = 'servererror'; + data.errorThrown = result[0].data.message; // error message has been translated on server + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + fu._trigger('fail', e, data); + } + }, + /** + * called after last upload + * @param {object} e + * @param {object} data + */ + stop: function(e, data) { + OC.Upload.log('stop', e, data); } - } - ); - break; - case 'folder': - $.post( - OC.filePath('files','ajax','newfolder.php'), - {dir:$('#dir').val(),foldername:name}, - function(result){ - if (result.status == 'success') { - var date=new Date(); - FileList.addDir(name,0,date,hidden); - var tr=$('tr').filterAttr('data-file',name); - tr.attr('data-id', result.data.id); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); - } - } - ); - break; - case 'web': - if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){ - name='http://'+name; - } - var localName=name; - if(localName.substr(localName.length-1,1)=='/'){//strip / - localName=localName.substr(0,localName.length-1) - } - if(localName.indexOf('/')){//use last part of url - localName=localName.split('/').pop(); - } else { //or the domain - localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.',''); - } - localName = getUniqueName(localName); - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - } else { - $('#uploadprogressbar').progressbar({value:0}); - $('#uploadprogressbar').fadeIn(); - } + }; - var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName}); - eventSource.listen('progress',function(progress){ - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - } else { - $('#uploadprogressbar').progressbar('value',progress); - } - }); - eventSource.listen('success',function(data){ - var mime=data.mime; - var size=data.size; - var id=data.id; - $('#uploadprogressbar').fadeOut(); - var date=new Date(); - FileList.addFile(localName,size,date,false,hidden); - var tr=$('tr').filterAttr('data-file',localName); - tr.data('mime',mime).data('id',id); - tr.attr('data-id', id); - getMimeIcon(mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); - }); - eventSource.listen('error',function(error){ - $('#uploadprogressbar').fadeOut(); - alert(error); - }); - break; - } - var li=form.parent(); - form.remove(); - li.append('

'+li.data('text')+'

'); - $('#new>a').click(); + // initialize jquery fileupload (blueimp) + var fileupload = $('#file_upload_start').fileupload(file_upload_param); + window.file_upload_param = fileupload; + + if (supportAjaxUploadWithProgress()) { + + // add progress handlers + fileupload.on('fileuploadadd', function(e, data) { + OC.Upload.log('progress handle fileuploadadd', e, data); + //show cancel button + //if (data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie? + // $('#uploadprogresswrapper input.stop').show(); + //} + }); + // add progress handlers + fileupload.on('fileuploadstart', function(e, data) { + OC.Upload.log('progress handle fileuploadstart', e, data); + $('#uploadprogresswrapper input.stop').show(); + $('#uploadprogressbar').progressbar({value:0}); + $('#uploadprogressbar').fadeIn(); + }); + fileupload.on('fileuploadprogress', function(e, data) { + OC.Upload.log('progress handle fileuploadprogress', e, data); + //TODO progressbar in row + }); + fileupload.on('fileuploadprogressall', function(e, data) { + OC.Upload.log('progress handle fileuploadprogressall', e, data); + var progress = (data.loaded / data.total) * 100; + $('#uploadprogressbar').progressbar('value', progress); + }); + fileupload.on('fileuploadstop', function(e, data) { + OC.Upload.log('progress handle fileuploadstop', e, data); + + $('#uploadprogresswrapper input.stop').fadeOut(); + $('#uploadprogressbar').fadeOut(); + Files.updateStorageStatistics(); + }); + fileupload.on('fileuploadfail', function(e, data) { + OC.Upload.log('progress handle fileuploadfail', e, data); + //if user pressed cancel hide upload progress bar and cancel button + if (data.errorThrown === 'abort') { + $('#uploadprogresswrapper input.stop').fadeOut(); + $('#uploadprogressbar').fadeOut(); + } + }); + + } else { + console.log('skipping file progress because your browser is broken'); + } + } + + $.assocArraySize = function(obj) { + // http://stackoverflow.com/a/6700/11236 + var size = 0, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + size++; + } + } + return size; + }; + + // warn user not to leave the page while upload is in progress + $(window).on('beforeunload', function(e) { + if (OC.Upload.isProcessing()) { + return t('files', 'File upload is in progress. Leaving the page now will cancel the upload.'); + } }); - }); + + //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) + if (navigator.userAgent.search(/konqueror/i) === -1) { + $('#file_upload_start').attr('multiple', 'multiple'); + } + + //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder + var crumb=$('div.crumb').first(); + while($('div.controls').height() > 40 && crumb.next('div.crumb').length > 0) { + crumb.children('a').text('...'); + crumb = crumb.next('div.crumb'); + } + //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent + var crumb = $('div.crumb').first(); + var next = crumb.next('div.crumb'); + while($('div.controls').height()>40 && next.next('div.crumb').length > 0) { + crumb.remove(); + crumb = next; + next = crumb.next('div.crumb'); + } + //still not enough, start shorting down the current folder name + var crumb=$('div.crumb>a').last(); + while($('div.controls').height() > 40 && crumb.text().length > 6) { + var text=crumb.text(); + text = text.substr(0,text.length-6)+'...'; + crumb.text(text); + } + + $(document).click(function(ev) { + // do not close when clicking in the dropdown + if ($(ev.target).closest('#new').length){ + return; + } + $('#new>ul').hide(); + $('#new').removeClass('active'); + if ($('#new .error').length > 0) { + $('#new .error').tipsy('hide'); + } + $('#new li').each(function(i,element) { + if ($(element).children('p').length === 0) { + $(element).children('form').remove(); + $(element).append('

'+$(element).data('text')+'

'); + } + }); + }); + $('#new').click(function(event) { + event.stopPropagation(); + }); + $('#new>a').click(function() { + $('#new>ul').toggle(); + $('#new').toggleClass('active'); + }); + $('#new li').click(function() { + if ($(this).children('p').length === 0) { + return; + } + + $('#new .error').tipsy('hide'); + + $('#new li').each(function(i,element) { + if ($(element).children('p').length === 0) { + $(element).children('form').remove(); + $(element).append('

'+$(element).data('text')+'

'); + } + }); + + var type=$(this).data('type'); + var text=$(this).children('p').text(); + $(this).data('text',text); + $(this).children('p').remove(); + + // add input field + var form = $('
'); + var input = $(''); + var newName = $(this).attr('data-newname') || ''; + if (newName) { + input.val(newName); + } + form.append(input); + $(this).append(form); + var lastPos; + var checkInput = function () { + var filename = input.val(); + if (type === 'web' && filename.length === 0) { + throw t('files', 'URL cannot be empty'); + } else if (type !== 'web' && !Files.isFileNameValid(filename)) { + // Files.isFileNameValid(filename) throws an exception itself + } else if ($('#dir').val() === '/' && filename === 'Shared') { + throw t('files', 'In the home folder \'Shared\' is a reserved filename'); + } else if (FileList.inList(filename)) { + throw t('files', '{new_name} already exists', {new_name: filename}); + } else { + return true; + } + }; + + // verify filename on typing + input.keyup(function(event) { + try { + checkInput(); + input.tipsy('hide'); + input.removeClass('error'); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); + } + }); + + input.focus(); + // pre select name up to the extension + lastPos = newName.lastIndexOf('.'); + if (lastPos === -1) { + lastPos = newName.length; + } + input.selectRange(0, lastPos); + form.submit(function(event) { + event.stopPropagation(); + event.preventDefault(); + try { + checkInput(); + var newname = input.val(); + if (FileList.lastAction) { + FileList.lastAction(); + } + var name = getUniqueName(newname); + if (newname !== name) { + FileList.checkName(name, newname, true); + var hidden = true; + } else { + var hidden = false; + } + switch(type) { + case 'file': + $.post( + OC.filePath('files', 'ajax', 'newfile.php'), + {dir:$('#dir').val(), filename:name}, + function(result) { + if (result.status === 'success') { + var date = new Date(); + // TODO: ideally addFile should be able to receive + // all attributes and set them automatically, + // and also auto-load the preview + var tr = FileList.addFile(name, 0, date, false, hidden); + tr.attr('data-size', result.data.size); + tr.attr('data-mime', result.data.mime); + tr.attr('data-id', result.data.id); + tr.attr('data-etag', result.data.etag); + tr.find('.filesize').text(humanFileSize(result.data.size)); + var path = getPathForPreview(name); + Files.lazyLoadPreview(path, result.data.mime, function(previewpath) { + tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + }, null, null, result.data.etag); + FileActions.display(tr.find('td.filename'), true); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Could not create file')); + } + } + ); + break; + case 'folder': + $.post( + OC.filePath('files','ajax','newfolder.php'), + {dir:$('#dir').val(), foldername:name}, + function(result) { + if (result.status === 'success') { + var date=new Date(); + FileList.addDir(name, 0, date, hidden); + var tr=$('tr[data-file="'+name+'"]'); + tr.attr('data-id', result.data.id); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Could not create folder')); + } + } + ); + break; + case 'web': + if (name.substr(0,8) !== 'https://' && name.substr(0,7) !== 'http://') { + name = 'http://' + name; + } + var localName=name; + if (localName.substr(localName.length-1,1)==='/') {//strip / + localName=localName.substr(0,localName.length-1); + } + if (localName.indexOf('/')) {//use last part of url + localName=localName.split('/').pop(); + } else { //or the domain + localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.',''); + } + localName = getUniqueName(localName); + //IE < 10 does not fire the necessary events for the progress bar. + if ($('html.lte9').length === 0) { + $('#uploadprogressbar').progressbar({value:0}); + $('#uploadprogressbar').fadeIn(); + } + + var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName}); + eventSource.listen('progress',function(progress) { + //IE < 10 does not fire the necessary events for the progress bar. + if ($('html.lte9').length === 0) { + $('#uploadprogressbar').progressbar('value',progress); + } + }); + eventSource.listen('success',function(data) { + var mime = data.mime; + var size = data.size; + var id = data.id; + $('#uploadprogressbar').fadeOut(); + var date = new Date(); + FileList.addFile(localName, size, date, false, hidden); + var tr = $('tr[data-file="'+localName+'"]'); + tr.data('mime', mime).data('id', id); + tr.attr('data-id', id); + var path = $('#dir').val()+'/'+localName; + Files.lazyLoadPreview(path, mime, function(previewpath) { + tr.find('td.filename').attr('style', 'background-image:url('+previewpath+')'); + }, null, null, data.etag); + FileActions.display(tr.find('td.filename'), true); + }); + eventSource.listen('error',function(error) { + $('#uploadprogressbar').fadeOut(); + alert(error); + }); + break; + } + var li=form.parent(); + form.remove(); + /* workaround for IE 9&10 click event trap, 2 lines: */ + $('input').first().focus(); + $('#content').focus(); + li.append('

'+li.data('text')+'

'); + $('#new>a').click(); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); + } + }); + }); + window.file_upload_param = file_upload_param; }); diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index aa66a57a7b..03e23189a9 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -61,13 +61,22 @@ var FileActions = { var actions = this.get(mime, type, permissions); return actions[name]; }, - display: function (parent) { + /** + * Display file actions for the given element + * @param parent "td" element of the file for which to display actions + * @param triggerEvent if true, triggers the fileActionsReady on the file + * list afterwards (false by default) + */ + display: function (parent, triggerEvent) { FileActions.currentFile = parent; var actions = FileActions.get(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions()); var file = FileActions.getCurrentFile(); - if ($('tr').filterAttr('data-file', file).data('renaming')) { + if ($('tr[data-file="'+file+'"]').data('renaming')) { return; } + + // recreate fileactions + parent.children('a.name').find('.fileactions').remove(); parent.children('a.name').append(''); var defaultAction = FileActions.getDefault(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions()); @@ -117,24 +126,27 @@ var FileActions = { addAction('Share', actions.Share); } + // remove the existing delete action + parent.parent().children().last().find('.action.delete').remove(); if (actions['Delete']) { var img = FileActions.icons['Delete']; if (img.call) { img = img(file); } if (typeof trashBinApp !== 'undefined' && trashBinApp) { - var html = ''; + var html = ''; } else { - var html = ''; + var html = ''; } var element = $(html); - if (img) { - element.append($('')); - } element.data('action', actions['Delete']); element.on('click', {a: null, elem: parent, actionFunc: actions['Delete']}, actionHandler); parent.parent().children().last().append(element); } + + if (triggerEvent){ + $('#fileList').trigger(jQuery.Event("fileActionsReady")); + } }, getCurrentFile: function () { return FileActions.currentFile.parent().attr('data-file'); @@ -164,30 +176,18 @@ $(document).ready(function () { window.location = OC.filePath('files', 'ajax', 'download.php') + '?files=' + encodeURIComponent(filename) + '&dir=' + encodeURIComponent($('#dir').val()); }); } - $('#fileList tr').each(function () { FileActions.display($(this).children('td.filename')); }); + + $('#fileList').trigger(jQuery.Event("fileActionsReady")); }); FileActions.register('all', 'Delete', OC.PERMISSION_DELETE, function () { return OC.imagePath('core', 'actions/delete'); }, function (filename) { - if (Files.cancelUpload(filename)) { - if (filename.substr) { - filename = [filename]; - } - $.each(filename, function (index, file) { - var filename = $('tr').filterAttr('data-file', file); - filename.hide(); - filename.find('input[type="checkbox"]').removeAttr('checked'); - filename.removeClass('selected'); - }); - procesSelection(); - } else { - FileList.do_delete(filename); - } + FileList.do_delete(filename); $('.tipsy').remove(); }); @@ -198,13 +198,12 @@ FileActions.register('all', 'Rename', OC.PERMISSION_UPDATE, function () { FileList.rename(filename); }); - FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename) { - var dir = $('#dir').val() + var dir = $('#dir').val() || '/'; if (dir !== '/') { dir = dir + '/'; } - window.location = OC.linkTo('files', 'index.php') + '?dir=' + encodeURIComponent(dir + filename); + FileList.changeDirectory(dir + filename); }); FileActions.setDefault('dir', 'Open'); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index b858e2580e..473bcf25f2 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -1,9 +1,28 @@ var FileList={ useUndo:true, - update:function(fileListHtml) { - $('#fileList').empty().html(fileListHtml); + postProcessList: function() { + $('#fileList tr').each(function() { + //little hack to set unescape filenames in attribute + $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); + }); }, - createRow:function(type, name, iconurl, linktarget, size, lastModified, permissions){ + update:function(fileListHtml) { + var $fileList = $('#fileList'); + $fileList.empty().html(fileListHtml); + FileList.updateEmptyContent(); + $fileList.find('tr').each(function () { + FileActions.display($(this).children('td.filename')); + }); + $fileList.trigger(jQuery.Event("fileActionsReady")); + FileList.postProcessList(); + // "Files" might not be loaded in extending apps + if (window.Files) { + Files.setupDragAndDrop(); + } + FileList.updateFileSummary(); + $fileList.trigger(jQuery.Event("updated")); + }, + createRow:function(type, name, iconurl, linktarget, size, lastModified, permissions) { var td, simpleSize, basename, extension; //containing tr var tr = $('').attr({ @@ -15,15 +34,16 @@ var FileList={ // filename td td = $('').attr({ "class": "filename", - "style": 'background-image:url('+iconurl+')' + "style": 'background-image:url('+iconurl+'); background-size: 32px;' }); - td.append(''); + var rand = Math.random().toString(16).slice(2); + td.append(''); var link_elem = $('').attr({ "class": "name", "href": linktarget }); //split extension from filename for non dirs - if (type != 'dir' && name.indexOf('.')!=-1) { + if (type !== 'dir' && name.indexOf('.') !== -1) { basename=name.substr(0,name.lastIndexOf('.')); extension=name.substr(name.lastIndexOf('.')); } else { @@ -32,11 +52,11 @@ var FileList={ } var name_span=$('').addClass('nametext').text(basename); link_elem.append(name_span); - if(extension){ + if (extension) { name_span.append($('').addClass('extension').text(extension)); } //dirs can show the number of uploaded files - if (type == 'dir') { + if (type === 'dir') { link_elem.append($('').attr({ 'class': 'uploadtext', 'currentUploads': 0 @@ -46,9 +66,9 @@ var FileList={ tr.append(td); //size column - if(size!=t('files', 'Pending')){ + if (size !== t('files', 'Pending')) { simpleSize = humanFileSize(size); - }else{ + } else { simpleSize=t('files', 'Pending'); } var sizeColor = Math.round(160-Math.pow((size/(1024*1024)),2)); @@ -70,7 +90,7 @@ var FileList={ tr.append(td); return tr; }, - addFile:function(name,size,lastModified,loading,hidden,param){ + addFile:function(name, size, lastModified, loading, hidden, param) { var imgurl; if (!param) { @@ -100,18 +120,17 @@ var FileList={ ); FileList.insertElement(name, 'file', tr); - if(loading){ - tr.data('loading',true); - }else{ + if (loading) { + tr.data('loading', true); + } else { tr.find('td.filename').draggable(dragOptions); } if (hidden) { tr.hide(); } - FileActions.display(tr.find('td.filename')); return tr; }, - addDir:function(name,size,lastModified,hidden){ + addDir:function(name, size, lastModified, hidden) { var tr = this.createRow( 'dir', @@ -123,83 +142,221 @@ var FileList={ $('#permissions').val() ); - FileList.insertElement(name,'dir',tr); + FileList.insertElement(name, 'dir', tr); var td = tr.find('td.filename'); td.draggable(dragOptions); td.droppable(folderDropOptions); if (hidden) { tr.hide(); } - FileActions.display(tr.find('td.filename')); + FileActions.display(tr.find('td.filename'), true); return tr; }, - refresh:function(data) { - var result = jQuery.parseJSON(data.responseText); - if(typeof(result.data.breadcrumb) != 'undefined'){ - updateBreadcrumb(result.data.breadcrumb); + getCurrentDirectory: function(){ + return $('#dir').val() || '/'; + }, + /** + * @brief Changes the current directory and reload the file list. + * @param targetDir target directory (non URL encoded) + * @param changeUrl false if the URL must not be changed (defaults to true) + * @param {boolean} force set to true to force changing directory + */ + changeDirectory: function(targetDir, changeUrl, force) { + var $dir = $('#dir'), + url, + currentDir = $dir.val() || '/'; + targetDir = targetDir || '/'; + if (!force && currentDir === targetDir) { + return; } + FileList.setCurrentDir(targetDir, changeUrl); + $('#fileList').trigger( + jQuery.Event('changeDirectory', { + dir: targetDir, + previousDir: currentDir + } + )); + FileList.reload(); + }, + linkTo: function(dir) { + return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/'); + }, + setCurrentDir: function(targetDir, changeUrl) { + $('#dir').val(targetDir); + if (changeUrl !== false) { + if (window.history.pushState && changeUrl !== false) { + url = FileList.linkTo(targetDir); + window.history.pushState({dir: targetDir}, '', url); + } + // use URL hash for IE8 + else{ + window.location.hash = '?dir='+ encodeURIComponent(targetDir).replace(/%2F/g, '/'); + } + } + }, + /** + * @brief Reloads the file list using ajax call + */ + reload: function() { + FileList.showMask(); + if (FileList._reloadCall) { + FileList._reloadCall.abort(); + } + FileList._reloadCall = $.ajax({ + url: OC.filePath('files','ajax','list.php'), + data: { + dir : $('#dir').val(), + breadcrumb: true + }, + error: function(result) { + FileList.reloadCallback(result); + }, + success: function(result) { + FileList.reloadCallback(result); + } + }); + }, + reloadCallback: function(result) { + var $controls = $('#controls'); + + delete FileList._reloadCall; + FileList.hideMask(); + + if (!result || result.status === 'error') { + OC.Notification.show(result.data.message); + return; + } + + if (result.status === 404) { + // go back home + FileList.changeDirectory('/'); + return; + } + + // TODO: should rather return upload file size through + // the files list ajax call + Files.updateStorageStatistics(true); + + if (result.data.permissions) { + FileList.setDirectoryPermissions(result.data.permissions); + } + + if (typeof(result.data.breadcrumb) !== 'undefined') { + $controls.find('.crumb').remove(); + $controls.prepend(result.data.breadcrumb); + + var width = $(window).width(); + Files.initBreadCrumbs(); + Files.resizeBreadcrumbs(width, true); + + // in case svg is not supported by the browser we need to execute the fallback mechanism + if (!SVGSupport()) { + replaceSVG(); + } + } + FileList.update(result.data.files); - resetFileActionPanel(); + }, + setDirectoryPermissions: function(permissions) { + var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; + $('#permissions').val(permissions); + $('.creatable').toggleClass('hidden', !isCreatable); + $('.notCreatable').toggleClass('hidden', isCreatable); + }, + /** + * Shows/hides action buttons + * + * @param show true for enabling, false for disabling + */ + showActions: function(show){ + $('.actions,#file_action_panel').toggleClass('hidden', !show); + if (show){ + // make sure to display according to permissions + var permissions = $('#permissions').val(); + var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; + $('.creatable').toggleClass('hidden', !isCreatable); + $('.notCreatable').toggleClass('hidden', isCreatable); + } + else{ + $('.creatable, .notCreatable').addClass('hidden'); + } + }, + /** + * Enables/disables viewer mode. + * In viewer mode, apps can embed themselves under the controls bar. + * In viewer mode, the actions of the file list will be hidden. + * @param show true for enabling, false for disabling + */ + setViewerMode: function(show){ + this.showActions(!show); + $('#filestable').toggleClass('hidden', show); }, remove:function(name){ $('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy'); $('tr').filterAttr('data-file',name).remove(); - if($('tr[data-file]').length==0){ - $('#emptyfolder').show(); + FileList.updateFileSummary(); + if ( ! $('tr[data-file]').exists() ) { + $('#emptycontent').removeClass('hidden'); + $('#filescontent th').addClass('hidden'); } }, - insertElement:function(name,type,element){ + insertElement:function(name, type, element) { //find the correct spot to insert the file or folder var pos, fileElements=$('tr[data-file][data-type="'+type+'"]:visible'); - if(name.localeCompare($(fileElements[0]).attr('data-file'))<0){ - pos=-1; - }else if(name.localeCompare($(fileElements[fileElements.length-1]).attr('data-file'))>0){ - pos=fileElements.length-1; - }else{ - for(pos=0;pos0 && name.localeCompare($(fileElements[pos+1]).attr('data-file'))<0){ + if (name.localeCompare($(fileElements[0]).attr('data-file')) < 0) { + pos = -1; + } else if (name.localeCompare($(fileElements[fileElements.length-1]).attr('data-file')) > 0) { + pos = fileElements.length - 1; + } else { + for(pos = 0; pos 0 + && name.localeCompare($(fileElements[pos+1]).attr('data-file')) < 0) + { break; } } } - if(fileElements.length){ - if(pos==-1){ + if (fileElements.exists()) { + if (pos === -1) { $(fileElements[0]).before(element); - }else{ + } else { $(fileElements[pos]).after(element); } - }else if(type=='dir' && $('tr[data-file]').length>0){ + } else if (type === 'dir' && $('tr[data-file]').exists()) { $('tr[data-file]').first().before(element); - } else if(type=='file' && $('tr[data-file]').length>0) { + } else if (type === 'file' && $('tr[data-file]').exists()) { $('tr[data-file]').last().before(element); - }else{ + } else { $('#fileList').append(element); } - $('#emptyfolder').hide(); + $('#emptycontent').addClass('hidden'); + $('#filestable th').removeClass('hidden'); + FileList.updateFileSummary(); }, - loadingDone:function(name, id){ - var mime, tr=$('tr').filterAttr('data-file',name); - tr.data('loading',false); - mime=tr.data('mime'); - tr.attr('data-mime',mime); - if (id != null) { + loadingDone:function(name, id) { + var mime, tr = $('tr[data-file="'+name+'"]'); + tr.data('loading', false); + mime = tr.data('mime'); + tr.attr('data-mime', mime); + if (id) { tr.attr('data-id', id); } - getMimeIcon(mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); + var path = getPathForPreview(name); + Files.lazyLoadPreview(path, mime, function(previewpath) { + tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + }, null, null, tr.attr('data-etag')); tr.find('td.filename').draggable(dragOptions); }, - isLoading:function(name){ - return $('tr').filterAttr('data-file',name).data('loading'); + isLoading:function(name) { + return $('tr[data-file="'+name+'"]').data('loading'); }, - rename:function(name){ + rename:function(oldname) { var tr, td, input, form; - tr=$('tr').filterAttr('data-file',name); + tr = $('tr[data-file="'+oldname+'"]'); tr.data('renaming',true); - td=tr.children('td.filename'); - input=$('').val(name); - form=$('
'); + td = tr.children('td.filename'); + input = $('').val(oldname); + form = $('
'); form.append(input); td.children('a.name').hide(); td.append(form); @@ -209,18 +366,29 @@ var FileList={ if (len === -1) { len = input.val().length; } - input.selectRange(0,len); + input.selectRange(0, len); - form.submit(function(event){ + var checkInput = function () { + var filename = input.val(); + if (filename !== oldname) { + if (!Files.isFileNameValid(filename)) { + // Files.isFileNameValid(filename) throws an exception itself + } else if($('#dir').val() === '/' && filename === 'Shared') { + throw t('files','In the home folder \'Shared\' is a reserved filename'); + } else if (FileList.inList(filename)) { + throw t('files', '{new_name} already exists', {new_name: filename}); + } + } + return true; + }; + + form.submit(function(event) { event.stopPropagation(); event.preventDefault(); - var newname=input.val(); - if (!Files.isFileNameValid(newname)) { - return false; - } else if (newname != name) { - if (FileList.checkName(name, newname, false)) { - newname = name; - } else { + try { + var newname = input.val(); + if (newname !== oldname) { + checkInput(); // save background image, because it's replaced by a spinner while async request var oldBackgroundImage = td.css('background-image'); // mark as loading @@ -230,16 +398,16 @@ var FileList={ data: { dir : $('#dir').val(), newname: newname, - file: name + file: oldname }, success: function(result) { if (!result || result.status === 'error') { - OC.Notification.show(result.data.message); - newname = name; + OC.dialogs.alert(result.data.message, t('core', 'Could not rename file')); // revert changes + newname = oldname; tr.attr('data-file', newname); var path = td.children('a.name').attr('href'); - td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname))); + td.children('a.name').attr('href', path.replace(encodeURIComponent(oldname), encodeURIComponent(newname))); if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { var basename=newname.substr(0,newname.lastIndexOf('.')); } else { @@ -247,78 +415,99 @@ var FileList={ } td.find('a.name span.nametext').text(basename); if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { - if (td.find('a.name span.extension').length === 0 ) { + if ( ! td.find('a.name span.extension').exists() ) { td.find('a.name span.nametext').append(''); } td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); } tr.find('.fileactions').effect('highlight', {}, 5000); tr.effect('highlight', {}, 5000); + // remove loading mark and recover old image + td.css('background-image', oldBackgroundImage); } - // remove loading mark and recover old image - td.css('background-image', oldBackgroundImage); + else { + var fileInfo = result.data; + tr.attr('data-mime', fileInfo.mime); + tr.attr('data-etag', fileInfo.etag); + if (fileInfo.isPreviewAvailable) { + Files.lazyLoadPreview(fileInfo.directory + '/' + fileInfo.name, result.data.mime, function(previewpath) { + tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + }, null, null, result.data.etag); + } + else { + tr.find('td.filename').removeClass('preview').attr('style','background-image:url('+fileInfo.icon+')'); + } + } + // reinsert row + tr.detach(); + FileList.insertElement( tr.attr('data-file'), tr.attr('data-type'),tr ); + // update file actions in case the extension changed + FileActions.display( tr.find('td.filename'), true); } }); } - } - tr.data('renaming',false); - tr.attr('data-file', newname); - var path = td.children('a.name').attr('href'); - td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname))); - if (newname.indexOf('.') > 0 && tr.data('type') != 'dir') { - var basename=newname.substr(0,newname.lastIndexOf('.')); - } else { - var basename=newname; - } - td.find('a.name span.nametext').text(basename); - if (newname.indexOf('.') > 0 && tr.data('type') != 'dir') { - if (td.find('a.name span.extension').length == 0 ) { - td.find('a.name span.nametext').append(''); + input.tipsy('hide'); + tr.data('renaming',false); + tr.attr('data-file', newname); + var path = td.children('a.name').attr('href'); + // FIXME this will fail if the path contains the filename. + td.children('a.name').attr('href', path.replace(encodeURIComponent(oldname), encodeURIComponent(newname))); + var basename = newname; + if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { + basename = newname.substr(0, newname.lastIndexOf('.')); + } + td.find('a.name span.nametext').text(basename); + if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { + if ( ! td.find('a.name span.extension').exists() ) { + td.find('a.name span.nametext').append(''); + } + td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); } - td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); + form.remove(); + td.children('a.name').show(); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); } - form.remove(); - td.children('a.name').show(); return false; }); - input.keyup(function(event){ - if (event.keyCode == 27) { + input.keyup(function(event) { + // verify filename on typing + try { + checkInput(); + input.tipsy('hide'); + input.removeClass('error'); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); + } + if (event.keyCode === 27) { + input.tipsy('hide'); tr.data('renaming',false); form.remove(); td.children('a.name').show(); } }); - input.click(function(event){ + input.click(function(event) { event.stopPropagation(); event.preventDefault(); }); - input.blur(function(){ + input.blur(function() { form.trigger('submit'); }); }, - checkName:function(oldName, newName, isNewFile) { - if (isNewFile || $('tr').filterAttr('data-file', newName).length > 0) { - var html; - if(isNewFile){ - html = t('files', '{new_name} already exists', {new_name: escapeHTML(newName)})+''+t('files', 'replace')+''+t('files', 'suggest name')+' '+t('files', 'cancel')+''; - }else{ - html = t('files', '{new_name} already exists', {new_name: escapeHTML(newName)})+''+t('files', 'replace')+''+t('files', 'cancel')+''; - } - html = $('' + html + ''); - html.attr('data-oldName', oldName); - html.attr('data-newName', newName); - html.attr('data-isNewFile', isNewFile); - OC.Notification.showHtml(html); - return true; - } else { - return false; - } + inList:function(filename) { + return $('#fileList tr[data-file="'+filename+'"]').length; }, replace:function(oldName, newName, isNewFile) { // Finish any existing actions - $('tr').filterAttr('data-file', oldName).hide(); - $('tr').filterAttr('data-file', newName).hide(); - var tr = $('tr').filterAttr('data-file', oldName).clone(); + $('tr[data-file="'+oldName+'"]').hide(); + $('tr[data-file="'+newName+'"]').hide(); + var tr = $('tr[data-file="'+oldName+'"]').clone(); tr.attr('data-replace', 'true'); tr.attr('data-file', newName); var td = tr.children('td.filename'); @@ -347,14 +536,14 @@ var FileList={ FileList.finishReplace(); }; if (!isNewFile) { - OC.Notification.showHtml(t('files', 'replaced {new_name} with {old_name}', {new_name: newName}, {old_name: oldName})+''+t('files', 'undo')+''); + OC.Notification.showHtml(t('files', 'replaced {new_name} with {old_name}', {new_name: newName}, {old_name: oldName})+''+t('files', 'undo')+''); } }, finishReplace:function() { if (!FileList.replaceCanceled && FileList.replaceOldName && FileList.replaceNewName) { $.ajax({url: OC.filePath('files', 'ajax', 'rename.php'), async: false, data: { dir: $('#dir').val(), newname: FileList.replaceNewName, file: FileList.replaceOldName }, success: function(result) { - if (result && result.status == 'success') { - $('tr').filterAttr('data-replace', 'true').removeAttr('data-replace'); + if (result && result.status === 'success') { + $('tr[data-replace="true"').removeAttr('data-replace'); } else { OC.dialogs.alert(result.data.message, 'Error moving file'); } @@ -365,15 +554,13 @@ var FileList={ }}); } }, - do_delete:function(files){ - if(files.substr){ + do_delete:function(files) { + if (files.substr) { files=[files]; } for (var i=0; i'; - deleteAction.html(newHTML); + var deleteAction = $('tr[data-file="'+files[i]+'"]').children("td.date").children(".action.delete"); + deleteAction.removeClass('delete-icon').addClass('progress-icon'); } // Finish any existing actions if (FileList.lastAction) { @@ -383,178 +570,386 @@ var FileList={ var fileNames = JSON.stringify(files); $.post(OC.filePath('files', 'ajax', 'delete.php'), {dir:$('#dir').val(),files:fileNames}, - function(result){ - if (result.status == 'success') { - $.each(files,function(index,file){ - var files = $('tr').filterAttr('data-file',file); + function(result) { + if (result.status === 'success') { + $.each(files,function(index,file) { + var files = $('tr[data-file="'+file+'"]'); files.remove(); files.find('input[type="checkbox"]').removeAttr('checked'); files.removeClass('selected'); }); procesSelection(); checkTrashStatus(); + FileList.updateFileSummary(); + FileList.updateEmptyContent(); + Files.updateStorageStatistics(); } else { + if (result.status === 'error' && result.data.message) { + OC.Notification.show(result.data.message); + } + else { + OC.Notification.show(t('files', 'Error deleting file.')); + } + // hide notification after 10 sec + setTimeout(function() { + OC.Notification.hide(); + }, 10000); $.each(files,function(index,file) { - var deleteAction = $('tr').filterAttr('data-file',file).children("td.date").children(".move2trash"); - deleteAction.html(oldHTML); + var deleteAction = $('tr[data-file="' + file + '"] .action.delete'); + deleteAction.removeClass('progress-icon').addClass('delete-icon'); }); } }); + }, + createFileSummary: function() { + if( $('#fileList tr').exists() ) { + var summary = this._calculateFileSummary(); + + // Get translations + var directoryInfo = n('files', '%n folder', '%n folders', summary.totalDirs); + var fileInfo = n('files', '%n file', '%n files', summary.totalFiles); + + var infoVars = { + dirs: ''+directoryInfo+'', + files: ''+fileInfo+'' + }; + + var info = t('files', '{dirs} and {files}', infoVars); + + // don't show the filesize column, if filesize is NaN (e.g. in trashbin) + if (isNaN(summary.totalSize)) { + var fileSize = ''; + } else { + var fileSize = ''+humanFileSize(summary.totalSize)+''; + } + + var $summary = $(''+info+''+fileSize+''); + $('#fileList').append($summary); + + var $dirInfo = $summary.find('.dirinfo'); + var $fileInfo = $summary.find('.fileinfo'); + var $connector = $summary.find('.connector'); + + // Show only what's necessary, e.g.: no files: don't show "0 files" + if (summary.totalDirs === 0) { + $dirInfo.hide(); + $connector.hide(); + } + if (summary.totalFiles === 0) { + $fileInfo.hide(); + $connector.hide(); + } + } + }, + _calculateFileSummary: function() { + var result = { + totalDirs: 0, + totalFiles: 0, + totalSize: 0 + }; + $.each($('tr[data-file]'), function(index, value) { + var $value = $(value); + if ($value.data('type') === 'dir') { + result.totalDirs++; + } else if ($value.data('type') === 'file') { + result.totalFiles++; + } + if ($value.data('size') !== undefined && $value.data('id') !== -1) { + //Skip shared as it does not count toward quota + result.totalSize += parseInt($value.data('size')); + } + }); + return result; + }, + updateFileSummary: function() { + var $summary = $('.summary'); + + // Check if we should remove the summary to show "Upload something" + if ($('#fileList tr').length === 1 && $summary.length === 1) { + $summary.remove(); + } + // If there's no summary create one (createFileSummary checks if there's data) + else if ($summary.length === 0) { + FileList.createFileSummary(); + } + // There's a summary and data -> Update the summary + else if ($('#fileList tr').length > 1 && $summary.length === 1) { + var fileSummary = this._calculateFileSummary(); + var $dirInfo = $('.summary .dirinfo'); + var $fileInfo = $('.summary .fileinfo'); + var $connector = $('.summary .connector'); + + // Substitute old content with new translations + $dirInfo.html(n('files', '%n folder', '%n folders', fileSummary.totalDirs)); + $fileInfo.html(n('files', '%n file', '%n files', fileSummary.totalFiles)); + $('.summary .filesize').html(humanFileSize(fileSummary.totalSize)); + + // Show only what's necessary (may be hidden) + if (fileSummary.totalDirs === 0) { + $dirInfo.hide(); + $connector.hide(); + } else { + $dirInfo.show(); + } + if (fileSummary.totalFiles === 0) { + $fileInfo.hide(); + $connector.hide(); + } else { + $fileInfo.show(); + } + if (fileSummary.totalDirs > 0 && fileSummary.totalFiles > 0) { + $connector.show(); + } + } + }, + updateEmptyContent: function() { + var $fileList = $('#fileList'); + var permissions = $('#permissions').val(); + var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; + var exists = $fileList.find('tr:first').exists(); + $('#emptycontent').toggleClass('hidden', !isCreatable || exists); + $('#filestable th').toggleClass('hidden', !exists); + }, + showMask: function() { + // in case one was shown before + var $mask = $('#content .mask'); + if ($mask.exists()) { + return; + } + + $mask = $('
'); + + $mask.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); + $mask.css('background-repeat', 'no-repeat'); + $('#content').append($mask); + + // block UI, but only make visible in case loading takes longer + FileList._maskTimeout = window.setTimeout(function() { + // reset opacity + $mask.removeClass('transparent'); + }, 250); + }, + hideMask: function() { + var $mask = $('#content .mask').remove(); + if (FileList._maskTimeout) { + window.clearTimeout(FileList._maskTimeout); + } + }, + scrollTo:function(file) { + //scroll to and highlight preselected file + var $scrolltorow = $('tr[data-file="'+file+'"]'); + if ($scrolltorow.exists()) { + $scrolltorow.addClass('searchresult'); + $(window).scrollTop($scrolltorow.position().top); + //remove highlight when hovered over + $scrolltorow.one('hover', function() { + $scrolltorow.removeClass('searchresult'); + }); + } + }, + filter:function(query) { + $('#fileList tr:not(.summary)').each(function(i,e) { + if ($(e).data('file').toString().toLowerCase().indexOf(query.toLowerCase()) !== -1) { + $(e).addClass("searchresult"); + } else { + $(e).removeClass("searchresult"); + } + }); + //do not use scrollto to prevent removing searchresult css class + var first = $('#fileList tr.searchresult').first(); + if (first.exists()) { + $(window).scrollTop(first.position().top); + } + }, + unfilter:function() { + $('#fileList tr.searchresult').each(function(i,e) { + $(e).removeClass("searchresult"); + }); } }; -$(document).ready(function(){ +$(document).ready(function() { + var isPublic = !!$('#isPublic').val(); // handle upload events var file_upload_start = $('#file_upload_start'); + file_upload_start.on('fileuploaddrop', function(e, data) { - // only handle drop to dir if fileList exists - if ($('#fileList').length > 0) { - var dropTarget = $(e.originalEvent.target).closest('tr'); - if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder - var dirName = dropTarget.data('file'); - // update folder in form - data.formData = function(form) { - var formArray = form.serializeArray(); - // array index 0 contains the max files size - // array index 1 contains the request token - // array index 2 contains the directory - var parentDir = formArray[2]['value']; - if (parentDir === '/') { - formArray[2]['value'] += dirName; - } else { - formArray[2]['value'] += '/'+dirName; - } - return formArray; + OC.Upload.log('filelist handle fileuploaddrop', e, data); + + var dropTarget = $(e.originalEvent.target).closest('tr, .crumb'); + if (dropTarget && (dropTarget.data('type') === 'dir' || dropTarget.hasClass('crumb'))) { // drag&drop upload to folder + + // remember as context + data.context = dropTarget; + + var dir = dropTarget.data('file'); + // if from file list, need to prepend parent dir + if (dir) { + var parentDir = $('#dir').val() || '/'; + if (parentDir[parentDir.length - 1] !== '/') { + parentDir += '/'; } + dir = parentDir + dir; } - } + else{ + // read full path from crumb + dir = dropTarget.data('dir') || '/'; + } + + // update folder in form + data.formData = function(form) { + return [ + {name: 'dir', value: dir}, + {name: 'requesttoken', value: oc_requesttoken} + ]; + }; + } + }); file_upload_start.on('fileuploadadd', function(e, data) { - // only add to fileList if it exists - if ($('#fileList').length > 0) { + OC.Upload.log('filelist handle fileuploadadd', e, data); - if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!=-1){//finish delete if we are uploading a deleted file - FileList.finishDelete(null, true); //delete file before continuing + //finish delete if we are uploading a deleted file + if (FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1) { + FileList.finishDelete(null, true); //delete file before continuing + } + + // add ui visualization to existing folder + if (data.context && data.context.data('type') === 'dir') { + // add to existing folder + + // update upload counter ui + var uploadtext = data.context.find('.uploadtext'); + var currentUploads = parseInt(uploadtext.attr('currentUploads')); + currentUploads += 1; + uploadtext.attr('currentUploads', currentUploads); + + var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); + if (currentUploads === 1) { + var img = OC.imagePath('core', 'loading.gif'); + data.context.find('td.filename').attr('style','background-image:url('+img+')'); + uploadtext.text(translatedText); + uploadtext.show(); + } else { + uploadtext.text(translatedText); } + } - // add ui visualization to existing folder or as new stand-alone file? - var dropTarget = $(e.originalEvent.target).closest('tr'); - if(dropTarget && dropTarget.data('type') === 'dir') { - // add to existing folder - var dirName = dropTarget.data('file'); + }); + /* + * when file upload done successfully add row to filelist + * update counter when uploading to sub folder + */ + file_upload_start.on('fileuploaddone', function(e, data) { + OC.Upload.log('filelist handle fileuploaddone', e, data); + + var response; + if (typeof data.result === 'string') { + response = data.result; + } else { + // fetch response from iframe + response = data.result[0].body.innerText; + } + var result=$.parseJSON(response); - // set dir context - data.context = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName); + if (typeof result[0] !== 'undefined' && result[0].status === 'success') { + var file = result[0]; + + if (data.context && data.context.data('type') === 'dir') { // update upload counter ui var uploadtext = data.context.find('.uploadtext'); var currentUploads = parseInt(uploadtext.attr('currentUploads')); - currentUploads += 1; + currentUploads -= 1; uploadtext.attr('currentUploads', currentUploads); - if(currentUploads === 1) { - var img = OC.imagePath('core', 'loading.gif'); + var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); + if (currentUploads === 0) { + var img = OC.imagePath('core', 'filetypes/folder.png'); data.context.find('td.filename').attr('style','background-image:url('+img+')'); - uploadtext.text(t('files', '1 file uploading')); - uploadtext.show(); + uploadtext.text(translatedText); + uploadtext.hide(); } else { - uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); + uploadtext.text(translatedText); } + + // update folder size + var size = parseInt(data.context.data('size')); + size += parseInt(file.size); + data.context.attr('data-size', size); + data.context.find('td.filesize').text(humanFileSize(size)); + } else { + // only append new file if dragged onto current dir's crumb (last) + if (data.context && data.context.hasClass('crumb') && !data.context.hasClass('last')) { + return; + } + // add as stand-alone row to filelist - var uniqueName = getUniqueName(data.files[0].name); - var size=t('files','Pending'); - if(data.files[0].size>=0){ + var size=t('files', 'Pending'); + if (data.files[0].size>=0) { size=data.files[0].size; } var date=new Date(); var param = {}; - if ($('#publicUploadRequestToken').length) { - param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + uniqueName; + if ($('#publicUploadRequestToken').exists()) { + param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + file.name; } - // create new file context - data.context = FileList.addFile(uniqueName,size,date,true,false,param); + //should the file exist in the list remove it + FileList.remove(file.name); + // create new file context + data.context = FileList.addFile(file.name, file.size, date, false, false, param); + + // update file data + data.context.attr('data-mime',file.mime).attr('data-id',file.id).attr('data-etag', file.etag); + + var permissions = data.context.data('permissions'); + if (permissions !== file.permissions) { + data.context.attr('data-permissions', file.permissions); + data.context.data('permissions', file.permissions); + } + FileActions.display(data.context.find('td.filename'), true); + + var path = getPathForPreview(file.name); + Files.lazyLoadPreview(path, file.mime, function(previewpath) { + data.context.find('td.filename').attr('style','background-image:url('+previewpath+')'); + }, null, null, file.etag); } } }); - file_upload_start.on('fileuploaddone', function(e, data) { - // only update the fileList if it exists - if ($('#fileList').length > 0) { - var response; - if (typeof data.result === 'string') { - response = data.result; - } else { - // fetch response from iframe - response = data.result[0].body.innerText; - } - var result=$.parseJSON(response); + file_upload_start.on('fileuploadstop', function(e, data) { + OC.Upload.log('filelist handle fileuploadstop', e, data); - if(typeof result[0] !== 'undefined' && result[0].status === 'success') { - var file = result[0]; - - if (data.context.data('type') === 'file') { - // update file data - data.context.attr('data-mime',file.mime).attr('data-id',file.id); - var size = data.context.data('size'); - if(size!=file.size){ - data.context.attr('data-size', file.size); - data.context.find('td.filesize').text(humanFileSize(file.size)); - } - if (FileList.loadingDone) { - FileList.loadingDone(file.name, file.id); - } - } else { - // update upload counter ui - var uploadtext = data.context.find('.uploadtext'); - var currentUploads = parseInt(uploadtext.attr('currentUploads')); - currentUploads -= 1; - uploadtext.attr('currentUploads', currentUploads); - if(currentUploads === 0) { - var img = OC.imagePath('core', 'filetypes/folder.png'); - data.context.find('td.filename').attr('style','background-image:url('+img+')'); - uploadtext.text(''); - uploadtext.hide(); - } else { - uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); - } - - // update folder size - var size = parseInt(data.context.data('size')); - size += parseInt(file.size) ; - data.context.attr('data-size', size); - data.context.find('td.filesize').text(humanFileSize(size)); - - } - } + //if user pressed cancel hide upload chrome + if (data.errorThrown === 'abort') { + //cleanup uploading to a dir + var uploadtext = $('tr .uploadtext'); + var img = OC.imagePath('core', 'filetypes/folder.png'); + uploadtext.parents('td.filename').attr('style','background-image:url('+img+')'); + uploadtext.fadeOut(); + uploadtext.attr('currentUploads', 0); } }); file_upload_start.on('fileuploadfail', function(e, data) { - // only update the fileList if it exists - // cleanup files, error notification has been shown by fileupload code - var tr = data.context; - if (typeof tr === 'undefined') { - tr = $('tr').filterAttr('data-file', data.files[0].name); - } - if (tr.attr('data-type') === 'dir') { + OC.Upload.log('filelist handle fileuploadfail', e, data); + + //if user pressed cancel hide upload chrome + if (data.errorThrown === 'abort') { //cleanup uploading to a dir - var uploadtext = tr.find('.uploadtext'); + var uploadtext = $('tr .uploadtext'); var img = OC.imagePath('core', 'filetypes/folder.png'); - tr.find('td.filename').attr('style','background-image:url('+img+')'); - uploadtext.text(''); - uploadtext.hide(); //TODO really hide already - } else { - //remove file - tr.fadeOut(); - tr.remove(); + uploadtext.parents('td.filename').attr('style','background-image:url('+img+')'); + uploadtext.fadeOut(); + uploadtext.attr('currentUploads', 0); } }); $('#notification').hide(); - $('#notification').on('click', '.undo', function(){ + $('#notification').on('click', '.undo', function() { if (FileList.deleteFiles) { - $.each(FileList.deleteFiles,function(index,file){ - $('tr').filterAttr('data-file',file).show(); + $.each(FileList.deleteFiles,function(index,file) { + $('tr[data-file="'+file+'"]').show(); }); FileList.deleteCanceled=true; FileList.deleteFiles=null; @@ -564,26 +959,26 @@ $(document).ready(function(){ FileList.deleteCanceled = false; FileList.deleteFiles = [FileList.replaceOldName]; } else { - $('tr').filterAttr('data-file', FileList.replaceOldName).show(); + $('tr[data-file="'+FileList.replaceOldName+'"]').show(); } - $('tr').filterAttr('data-replace', 'true').remove(); - $('tr').filterAttr('data-file', FileList.replaceNewName).show(); + $('tr[data-replace="true"').remove(); + $('tr[data-file="'+FileList.replaceNewName+'"]').show(); FileList.replaceCanceled = true; FileList.replaceOldName = null; FileList.replaceNewName = null; FileList.replaceIsNewFile = null; } FileList.lastAction = null; - OC.Notification.hide(); + OC.Notification.hide(); }); $('#notification:first-child').on('click', '.replace', function() { - OC.Notification.hide(function() { - FileList.replace($('#notification > span').attr('data-oldName'), $('#notification > span').attr('data-newName'), $('#notification > span').attr('data-isNewFile')); - }); + OC.Notification.hide(function() { + FileList.replace($('#notification > span').attr('data-oldName'), $('#notification > span').attr('data-newName'), $('#notification > span').attr('data-isNewFile')); + }); }); $('#notification:first-child').on('click', '.suggest', function() { - $('tr').filterAttr('data-file', $('#notification > span').attr('data-oldName')).show(); - OC.Notification.hide(); + $('tr[data-file="'+$('#notification > span').attr('data-oldName')+'"]').show(); + OC.Notification.hide(); }); $('#notification:first-child').on('click', '.cancel', function() { if ($('#notification > span').attr('data-isNewFile')) { @@ -592,12 +987,71 @@ $(document).ready(function(){ } }); FileList.useUndo=(window.onbeforeunload)?true:false; - $(window).bind('beforeunload', function (){ + $(window).bind('beforeunload', function () { if (FileList.lastAction) { FileList.lastAction(); } }); - $(window).unload(function (){ + $(window).unload(function () { $(window).trigger('beforeunload'); }); + + function decodeQuery(query) { + return query.replace(/\+/g, ' '); + } + + function parseHashQuery() { + var hash = window.location.hash, + pos = hash.indexOf('?'), + query; + if (pos >= 0) { + return hash.substr(pos + 1); + } + return ''; + } + + function parseCurrentDirFromUrl() { + var query = parseHashQuery(), + params, + dir = '/'; + // try and parse from URL hash first + if (query) { + params = OC.parseQueryString(decodeQuery(query)); + } + // else read from query attributes + if (!params) { + params = OC.parseQueryString(decodeQuery(location.search)); + } + return (params && params.dir) || '/'; + } + + // disable ajax/history API for public app (TODO: until it gets ported) + if (!isPublic) { + // fallback to hashchange when no history support + if (!window.history.pushState) { + $(window).on('hashchange', function() { + FileList.changeDirectory(parseCurrentDirFromUrl(), false); + }); + } + window.onpopstate = function(e) { + var targetDir; + if (e.state && e.state.dir) { + targetDir = e.state.dir; + } + else{ + // read from URL + targetDir = parseCurrentDirFromUrl(); + } + if (targetDir) { + FileList.changeDirectory(targetDir, false); + } + }; + + if (parseInt($('#ajaxLoad').val(), 10) === 1) { + // need to initially switch the dir to the one from the hash (IE8) + FileList.changeDirectory(parseCurrentDirFromUrl(), false, true); + } + } + + FileList.createFileSummary(); }); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 3fad3fae7d..fdaa3aa334 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -1,45 +1,54 @@ -var uploadingFiles = {}; Files={ - cancelUpload:function(filename) { - if(uploadingFiles[filename]) { - uploadingFiles[filename].abort(); - delete uploadingFiles[filename]; - return true; - } - return false; - }, - cancelUploads:function() { - $.each(uploadingFiles,function(index,file) { - if(typeof file['abort'] === 'function') { - file.abort(); - var filename = $('tr').filterAttr('data-file',index); - filename.hide(); - filename.find('input[type="checkbox"]').removeAttr('checked'); - filename.removeClass('selected'); - } else { - $.each(file,function(i,f) { - f.abort(); - delete file[i]; - }); + // file space size sync + _updateStorageStatistics: function() { + Files._updateStorageStatisticsTimeout = null; + var currentDir = FileList.getCurrentDirectory(), + state = Files.updateStorageStatistics; + if (state.dir){ + if (state.dir === currentDir) { + return; } - delete uploadingFiles[index]; + // cancel previous call, as it was for another dir + state.call.abort(); + } + state.dir = currentDir; + state.call = $.getJSON(OC.filePath('files','ajax','getstoragestats.php') + '?dir=' + encodeURIComponent(currentDir),function(response) { + state.dir = null; + state.call = null; + Files.updateMaxUploadFilesize(response); }); - procesSelection(); }, - updateMaxUploadFilesize:function(response) { - if(response == undefined) { + updateStorageStatistics: function(force) { + if (!OC.currentUser) { return; } - if(response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { + + // debounce to prevent calling too often + if (Files._updateStorageStatisticsTimeout) { + clearTimeout(Files._updateStorageStatisticsTimeout); + } + if (force) { + Files._updateStorageStatistics(); + } + else { + Files._updateStorageStatisticsTimeout = setTimeout(Files._updateStorageStatistics, 250); + } + }, + + updateMaxUploadFilesize:function(response) { + if (response === undefined) { + return; + } + if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { $('#max_upload').val(response.data.uploadMaxFilesize); $('#upload.button').attr('original-title', response.data.maxHumanFilesize); $('#usedSpacePercent').val(response.data.usedSpacePercent); Files.displayStorageWarnings(); } - if(response[0] == undefined) { + if (response[0] === undefined) { return; } - if(response[0].uploadMaxFilesize !== undefined) { + if (response[0].uploadMaxFilesize !== undefined) { $('#max_upload').val(response[0].uploadMaxFilesize); $('#upload.button').attr('original-title', response[0].maxHumanFilesize); $('#usedSpacePercent').val(response[0].usedSpacePercent); @@ -47,25 +56,31 @@ Files={ } }, + + /** + * Fix path name by removing double slash at the beginning, if any + */ + fixPath: function(fileName) { + if (fileName.substr(0, 2) == '//') { + return fileName.substr(1); + } + return fileName; + }, + isFileNameValid:function (name) { if (name === '.') { - OC.Notification.show(t('files', '\'.\' is an invalid file name.')); - return false; - } - if (name.length == 0) { - OC.Notification.show(t('files', 'File name cannot be empty.')); - return false; + throw t('files', '\'.\' is an invalid file name.'); + } else if (name.length === 0) { + throw t('files', 'File name cannot be empty.'); } // check for invalid characters var invalid_characters = ['\\', '/', '<', '>', ':', '"', '|', '?', '*']; for (var i = 0; i < invalid_characters.length; i++) { - if (name.indexOf(invalid_characters[i]) != -1) { - OC.Notification.show(t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.")); - return false; + if (name.indexOf(invalid_characters[i]) !== -1) { + throw t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."); } } - OC.Notification.hide(); return true; }, displayStorageWarnings: function() { @@ -81,33 +96,135 @@ Files={ if (usedSpacePercent > 90) { OC.Notification.show(t('files', 'Your storage is almost full ({usedSpacePercent}%)', {usedSpacePercent: usedSpacePercent})); } + }, + + displayEncryptionWarning: function() { + + if (!OC.Notification.isHidden()) { + return; + } + + var encryptedFiles = $('#encryptedFiles').val(); + var initStatus = $('#encryptionInitStatus').val(); + if (initStatus === '0') { // enc not initialized, but should be + OC.Notification.show(t('files_encryption', 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again')); + return; + } + if (initStatus === '1') { // encryption tried to init but failed + OC.Notification.showHtml(t('files_encryption', 'Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.')); + return; + } + if (encryptedFiles === '1') { + OC.Notification.show(t('files_encryption', 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.')); + return; + } + }, + + setupDragAndDrop: function() { + var $fileList = $('#fileList'); + + //drag/drop of files + $fileList.find('tr td.filename').each(function(i,e) { + if ($(e).parent().data('permissions') & OC.PERMISSION_DELETE) { + $(e).draggable(dragOptions); + } + }); + + $fileList.find('tr[data-type="dir"] td.filename').each(function(i,e) { + if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE) { + $(e).droppable(folderDropOptions); + } + }); + }, + + lastWidth: 0, + + initBreadCrumbs: function () { + var $controls = $('#controls'); + + Files.lastWidth = 0; + Files.breadcrumbs = []; + + // initialize with some extra space + Files.breadcrumbsWidth = 64; + if ( document.getElementById("navigation") ) { + Files.breadcrumbsWidth += $('#navigation').get(0).offsetWidth; + } + Files.hiddenBreadcrumbs = 0; + + $.each($('.crumb'), function(index, breadcrumb) { + Files.breadcrumbs[index] = breadcrumb; + Files.breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth; + }); + + $.each($('#controls .actions>div'), function(index, action) { + Files.breadcrumbsWidth += $(action).get(0).offsetWidth; + }); + + // event handlers for breadcrumb items + $controls.find('.crumb a').on('click', onClickBreadcrumb); + + // setup drag and drop + $controls.find('.crumb:not(.last)').droppable(crumbDropOptions); + }, + + resizeBreadcrumbs: function (width, firstRun) { + if (width !== Files.lastWidth) { + if ((width < Files.lastWidth || firstRun) && width < Files.breadcrumbsWidth) { + if (Files.hiddenBreadcrumbs === 0) { + Files.breadcrumbsWidth -= $(Files.breadcrumbs[1]).get(0).offsetWidth; + $(Files.breadcrumbs[1]).find('a').hide(); + $(Files.breadcrumbs[1]).append('...'); + Files.breadcrumbsWidth += $(Files.breadcrumbs[1]).get(0).offsetWidth; + Files.hiddenBreadcrumbs = 2; + } + var i = Files.hiddenBreadcrumbs; + while (width < Files.breadcrumbsWidth && i > 1 && i < Files.breadcrumbs.length - 1) { + Files.breadcrumbsWidth -= $(Files.breadcrumbs[i]).get(0).offsetWidth; + $(Files.breadcrumbs[i]).hide(); + Files.hiddenBreadcrumbs = i; + i++; + } + } else if (width > Files.lastWidth && Files.hiddenBreadcrumbs > 0) { + var i = Files.hiddenBreadcrumbs; + while (width > Files.breadcrumbsWidth && i > 0) { + if (Files.hiddenBreadcrumbs === 1) { + Files.breadcrumbsWidth -= $(Files.breadcrumbs[1]).get(0).offsetWidth; + $(Files.breadcrumbs[1]).find('span').remove(); + $(Files.breadcrumbs[1]).find('a').show(); + Files.breadcrumbsWidth += $(Files.breadcrumbs[1]).get(0).offsetWidth; + } else { + $(Files.breadcrumbs[i]).show(); + Files.breadcrumbsWidth += $(Files.breadcrumbs[i]).get(0).offsetWidth; + if (Files.breadcrumbsWidth > width) { + Files.breadcrumbsWidth -= $(Files.breadcrumbs[i]).get(0).offsetWidth; + $(Files.breadcrumbs[i]).hide(); + break; + } + } + i--; + Files.hiddenBreadcrumbs = i; + } + } + Files.lastWidth = width; + } } }; $(document).ready(function() { + // FIXME: workaround for trashbin app + if (window.trashBinApp) { + return; + } + Files.displayEncryptionWarning(); Files.bindKeyboardShortcuts(document, jQuery); - $('#fileList tr').each(function(){ - //little hack to set unescape filenames in attribute - $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); - }); + + FileList.postProcessList(); + Files.setupDragAndDrop(); $('#file_action_panel').attr('activeAction', false); - //drag/drop of files - $('#fileList tr td.filename').each(function(i,e){ - if ($(e).parent().data('permissions') & OC.PERMISSION_DELETE) { - $(e).draggable(dragOptions); - } - }); - $('#fileList tr[data-type="dir"] td.filename').each(function(i,e){ - if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE){ - $(e).droppable(folderDropOptions); - } - }); - $('div.crumb:not(.last)').droppable(crumbDropOptions); - $('ul#apps>li:first-child').data('dir',''); - if($('div.crumb').length){ - $('ul#apps>li:first-child').droppable(crumbDropOptions); - } + // allow dropping on the "files" app icon + $('ul#apps li:first-child').data('dir','').droppable(crumbDropOptions); // Triggers invisible file input $('#upload a').on('click', function() { @@ -117,7 +234,8 @@ $(document).ready(function() { // Trigger cancelling of file upload $('#uploadprogresswrapper .stop').on('click', function() { - Files.cancelUploads(); + OC.Upload.cancelUploads(); + procesSelection(); }); // Show trash bin @@ -139,7 +257,7 @@ $(document).ready(function() { var rows = $(this).parent().parent().parent().children('tr'); for (var i = start; i < end; i++) { $(rows).each(function(index) { - if (index == i) { + if (index === i) { var checkbox = $(this).children().children('input:checkbox'); $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().addClass('selected'); @@ -156,23 +274,23 @@ $(document).ready(function() { } else { $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().toggleClass('selected'); - var selectedCount=$('td.filename input:checkbox:checked').length; - if (selectedCount == $('td.filename input:checkbox').length) { + var selectedCount = $('td.filename input:checkbox:checked').length; + if (selectedCount === $('td.filename input:checkbox').length) { $('#select_all').attr('checked', 'checked'); } } procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - var tr=$('tr').filterAttr('data-file',filename); + var tr=$('tr[data-file="'+filename+'"]'); var renaming=tr.data('renaming'); - if(!renaming && !FileList.isLoading(filename)){ + if (!renaming && !FileList.isLoading(filename)) { FileActions.currentFile = $(this).parent(); var mime=FileActions.getCurrentMimeType(); var type=FileActions.getCurrentType(); var permissions = FileActions.getCurrentPermissions(); var action=FileActions.getDefault(mime,type, permissions); - if(action){ + if (action) { event.preventDefault(); action(filename); } @@ -183,11 +301,11 @@ $(document).ready(function() { // Sets the select_all checkbox behaviour : $('#select_all').click(function() { - if($(this).attr('checked')){ + if ($(this).attr('checked')) { // Check all $('td.filename input:checkbox').attr('checked', true); $('td.filename input:checkbox').parent().parent().addClass('selected'); - }else{ + } else { // Uncheck all $('td.filename input:checkbox').attr('checked', false); $('td.filename input:checkbox').parent().parent().removeClass('selected'); @@ -204,7 +322,7 @@ $(document).ready(function() { var rows = $(this).parent().parent().parent().children('tr'); for (var i = start; i < end; i++) { $(rows).each(function(index) { - if (index == i) { + if (index === i) { var checkbox = $(this).children().children('input:checkbox'); $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().addClass('selected'); @@ -214,10 +332,10 @@ $(document).ready(function() { } var selectedCount=$('td.filename input:checkbox:checked').length; $(this).parent().parent().toggleClass('selected'); - if(!$(this).attr('checked')){ + if (!$(this).attr('checked')) { $('#select_all').attr('checked',false); - }else{ - if(selectedCount==$('td.filename input:checkbox').length){ + } else { + if (selectedCount===$('td.filename input:checkbox').length) { $('#select_all').attr('checked',true); } } @@ -225,21 +343,22 @@ $(document).ready(function() { }); $('.download').click('click',function(event) { - var files=getSelectedFiles('name'); + var files=getSelectedFilesTrash('name'); var fileslist = JSON.stringify(files); var dir=$('#dir').val()||'/'; OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.')); // use special download URL if provided, e.g. for public shared files - if ( (downloadURL = document.getElementById("downloadURL")) ) { - window.location=downloadURL.value+"&download&files="+encodeURIComponent(fileslist); + var downloadURL = document.getElementById("downloadURL"); + if ( downloadURL ) { + window.location = downloadURL.value+"&download&files=" + encodeURIComponent(fileslist); } else { - window.location=OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist }); + window.location = OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist }); } return false; }); $('.delete-selected').click(function(event) { - var files=getSelectedFiles('name'); + var files=getSelectedFilesTrash('name'); event.preventDefault(); FileList.do_delete(files); return false; @@ -251,309 +370,57 @@ $(document).ready(function() { e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone }); - $.assocArraySize = function(obj) { - // http://stackoverflow.com/a/6700/11236 - var size = 0, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) size++; - } - return size; - }; - - // warn user not to leave the page while upload is in progress - $(window).bind('beforeunload', function(e) { - if ($.assocArraySize(uploadingFiles) > 0) - return t('files','File upload is in progress. Leaving the page now will cancel the upload.'); - }); - - //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) - if(navigator.userAgent.search(/konqueror/i)==-1){ - $('#file_upload_start').attr('multiple','multiple') - } - - //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder - var crumb=$('div.crumb').first(); - while($('div.controls').height()>40 && crumb.next('div.crumb').length>0){ - crumb.children('a').text('...'); - crumb=crumb.next('div.crumb'); - } - //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent - var crumb=$('div.crumb').first(); - var next=crumb.next('div.crumb'); - while($('div.controls').height()>40 && next.next('div.crumb').length>0){ - crumb.remove(); - crumb=next; - next=crumb.next('div.crumb'); - } - //still not enough, start shorting down the current folder name - var crumb=$('div.crumb>a').last(); - while($('div.controls').height()>40 && crumb.text().length>6){ - var text=crumb.text() - text=text.substr(0,text.length-6)+'...'; - crumb.text(text); - } - - $(document).click(function(){ - $('#new>ul').hide(); - $('#new').removeClass('active'); - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ - $(element).children('form').remove(); - $(element).append('

'+$(element).data('text')+'

'); - } - }); - }); - $('#new').click(function(event){ - event.stopPropagation(); - }); - $('#new>a').click(function(){ - $('#new>ul').toggle(); - $('#new').toggleClass('active'); - }); - $('#new li').click(function(){ - if($(this).children('p').length==0){ - return; - } - - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ - $(element).children('form').remove(); - $(element).append('

'+$(element).data('text')+'

'); - } - }); - - var type=$(this).data('type'); - var text=$(this).children('p').text(); - $(this).data('text',text); - $(this).children('p').remove(); - var form=$('
'); - var input=$(''); - form.append(input); - $(this).append(form); - input.focus(); - form.submit(function(event){ - event.stopPropagation(); - event.preventDefault(); - var newname=input.val(); - if(type == 'web' && newname.length == 0) { - OC.Notification.show(t('files', 'URL cannot be empty.')); - return false; - } else if (type != 'web' && !Files.isFileNameValid(newname)) { - return false; - } else if( type == 'folder' && $('#dir').val() == '/' && newname == 'Shared') { - OC.Notification.show(t('files','Invalid folder name. Usage of \'Shared\' is reserved by Owncloud')); - return false; - } - if (FileList.lastAction) { - FileList.lastAction(); - } - var name = getUniqueName(newname); - if (newname != name) { - FileList.checkName(name, newname, true); - var hidden = true; - } else { - var hidden = false; - } - switch(type){ - case 'file': - $.post( - OC.filePath('files','ajax','newfile.php'), - {dir:$('#dir').val(),filename:name}, - function(result){ - if (result.status == 'success') { - var date=new Date(); - FileList.addFile(name,0,date,false,hidden); - var tr=$('tr').filterAttr('data-file',name); - tr.attr('data-mime',result.data.mime); - tr.attr('data-id', result.data.id); - getMimeIcon(result.data.mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); - } - } - ); - break; - case 'folder': - $.post( - OC.filePath('files','ajax','newfolder.php'), - {dir:$('#dir').val(),foldername:name}, - function(result){ - if (result.status == 'success') { - var date=new Date(); - FileList.addDir(name,0,date,hidden); - var tr=$('tr').filterAttr('data-file',name); - tr.attr('data-id', result.data.id); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); - } - } - ); - break; - case 'web': - if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){ - name='http://'+name; - } - var localName=name; - if(localName.substr(localName.length-1,1)=='/'){//strip / - localName=localName.substr(0,localName.length-1) - } - if(localName.indexOf('/')){//use last part of url - localName=localName.split('/').pop(); - }else{//or the domain - localName=(localName.match(/:\/\/(.[^/]+)/)[1]).replace('www.',''); - } - localName = getUniqueName(localName); - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - } else { - $('#uploadprogressbar').progressbar({value:0}); - $('#uploadprogressbar').fadeIn(); - } - - var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName}); - eventSource.listen('progress',function(progress){ - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - } else { - $('#uploadprogressbar').progressbar('value',progress); - } - }); - eventSource.listen('success',function(data){ - var mime=data.mime; - var size=data.size; - var id=data.id; - $('#uploadprogressbar').fadeOut(); - var date=new Date(); - FileList.addFile(localName,size,date,false,hidden); - var tr=$('tr').filterAttr('data-file',localName); - tr.data('mime',mime).data('id',id); - tr.attr('data-id', id); - getMimeIcon(mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); - }); - eventSource.listen('error',function(error){ - $('#uploadprogressbar').fadeOut(); - alert(error); - }); - break; - } - var li=form.parent(); - form.remove(); - li.append('

'+li.data('text')+'

'); - $('#new>a').click(); - }); - }); - //do a background scan if needed scanFiles(); - var lastWidth = 0; - var breadcrumbs = []; - var breadcrumbsWidth = 0; - if ( document.getElementById("navigation") ) { - breadcrumbsWidth = $('#navigation').get(0).offsetWidth; - } - var hiddenBreadcrumbs = 0; - - $.each($('.crumb'), function(index, breadcrumb) { - breadcrumbs[index] = breadcrumb; - breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth; - }); - - - $.each($('#controls .actions>div'), function(index, action) { - breadcrumbsWidth += $(action).get(0).offsetWidth; - }); - - function resizeBreadcrumbs(firstRun) { - var width = $(this).width(); - if (width != lastWidth) { - if ((width < lastWidth || firstRun) && width < breadcrumbsWidth) { - if (hiddenBreadcrumbs == 0) { - breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; - $(breadcrumbs[1]).find('a').hide(); - $(breadcrumbs[1]).append('...'); - breadcrumbsWidth += $(breadcrumbs[1]).get(0).offsetWidth; - hiddenBreadcrumbs = 2; - } - var i = hiddenBreadcrumbs; - while (width < breadcrumbsWidth && i > 1 && i < breadcrumbs.length - 1) { - breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth; - $(breadcrumbs[i]).hide(); - hiddenBreadcrumbs = i; - i++ - } - } else if (width > lastWidth && hiddenBreadcrumbs > 0) { - var i = hiddenBreadcrumbs; - while (width > breadcrumbsWidth && i > 0) { - if (hiddenBreadcrumbs == 1) { - breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; - $(breadcrumbs[1]).find('span').remove(); - $(breadcrumbs[1]).find('a').show(); - breadcrumbsWidth += $(breadcrumbs[1]).get(0).offsetWidth; - } else { - $(breadcrumbs[i]).show(); - breadcrumbsWidth += $(breadcrumbs[i]).get(0).offsetWidth; - if (breadcrumbsWidth > width) { - breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth; - $(breadcrumbs[i]).hide(); - break; - } - } - i--; - hiddenBreadcrumbs = i; - } - } - lastWidth = width; - } - } + Files.initBreadCrumbs(); $(window).resize(function() { - resizeBreadcrumbs(false); + var width = $(this).width(); + Files.resizeBreadcrumbs(width, false); }); - resizeBreadcrumbs(true); + var width = $(this).width(); + Files.resizeBreadcrumbs(width, true); // display storage warnings setTimeout ( "Files.displayStorageWarnings()", 100 ); OC.Notification.setDefault(Files.displayStorageWarnings); - // file space size sync - function update_storage_statistics() { - $.getJSON(OC.filePath('files','ajax','getstoragestats.php'),function(response) { - Files.updateMaxUploadFilesize(response); - }); + // only possible at the moment if user is logged in + if (OC.currentUser) { + // start on load - we ask the server every 5 minutes + var updateStorageStatisticsInterval = 5*60*1000; + var updateStorageStatisticsIntervalId = setInterval(Files.updateStorageStatistics, updateStorageStatisticsInterval); + + // Use jquery-visibility to de-/re-activate file stats sync + if ($.support.pageVisibility) { + $(document).on({ + 'show.visibility': function() { + if (!updateStorageStatisticsIntervalId) { + updateStorageStatisticsIntervalId = setInterval(Files.updateStorageStatistics, updateStorageStatisticsInterval); + } + }, + 'hide.visibility': function() { + clearInterval(updateStorageStatisticsIntervalId); + updateStorageStatisticsIntervalId = 0; + } + }); + } } - // start on load - we ask the server every 5 minutes - var update_storage_statistics_interval = 5*60*1000; - var update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); - - // Use jquery-visibility to de-/re-activate file stats sync - if ($.support.pageVisibility) { - $(document).on({ - 'show.visibility': function() { - if (!update_storage_statistics_interval_id) { - update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); - } - }, - 'hide.visibility': function() { - clearInterval(update_storage_statistics_interval_id); - update_storage_statistics_interval_id = 0; - } - }); + //scroll to and highlight preselected file + if (getURLParameter('scrollto')) { + FileList.scrollTo(getURLParameter('scrollto')); } }); -function scanFiles(force, dir, users){ +function scanFiles(force, dir, users) { if (!OC.currentUser) { return; } - if(!dir){ + if (!dir) { dir = ''; } force = !!force; //cast to bool @@ -571,17 +438,18 @@ function scanFiles(force, dir, users){ scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir}); } scanFiles.cancel = scannerEventSource.close.bind(scannerEventSource); - scannerEventSource.listen('count',function(count){ - console.log(count + ' files scanned') + scannerEventSource.listen('count',function(count) { + console.log(count + ' files scanned'); }); - scannerEventSource.listen('folder',function(path){ - console.log('now scanning ' + path) + scannerEventSource.listen('folder',function(path) { + console.log('now scanning ' + path); }); - scannerEventSource.listen('done',function(count){ + scannerEventSource.listen('done',function(count) { scanFiles.scanning=false; console.log('done after ' + count + ' files'); + Files.updateStorageStatistics(); }); - scannerEventSource.listen('user',function(user){ + scannerEventSource.listen('user',function(user) { console.log('scanning files for ' + user); }); } @@ -590,18 +458,14 @@ scanFiles.scanning=false; function boolOperationFinished(data, callback) { result = jQuery.parseJSON(data.responseText); Files.updateMaxUploadFilesize(result); - if(result.status == 'success'){ + if (result.status === 'success') { callback.call(); } else { alert(result.data.message); } } -function updateBreadcrumb(breadcrumbHtml) { - $('p.nav').empty().html(breadcrumbHtml); -} - -var createDragShadow = function(event){ +var createDragShadow = function(event) { //select dragged file var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked'); if (!isDragSelected) { @@ -609,9 +473,9 @@ var createDragShadow = function(event){ $(event.target).parents('tr').find('td input:first').prop('checked',true); } - var selectedFiles = getSelectedFiles(); + var selectedFiles = getSelectedFilesTrash(); - if (!isDragSelected && selectedFiles.length == 1) { + if (!isDragSelected && selectedFiles.length === 1) { //revert the selection $(event.target).parents('tr').find('td input:first').prop('checked',false); } @@ -628,7 +492,7 @@ var createDragShadow = function(event){ var dir=$('#dir').val(); - $(selectedFiles).each(function(i,elem){ + $(selectedFiles).each(function(i,elem) { var newtr = $('').attr('data-dir', dir).attr('data-filename', elem.name); newtr.append($('').addClass('filename').text(elem.name)); newtr.append($('').addClass('size').text(humanFileSize(elem.size))); @@ -636,24 +500,25 @@ var createDragShadow = function(event){ if (elem.type === 'dir') { newtr.find('td.filename').attr('style','background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')'); } else { - getMimeIcon(elem.mime,function(path){ - newtr.find('td.filename').attr('style','background-image:url('+path+')'); - }); + var path = getPathForPreview(elem.name); + Files.lazyLoadPreview(path, elem.mime, function(previewpath) { + newtr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + }, null, null, elem.etag); } }); return dragshadow; -} +}; //options for file drag/drop var dragOptions={ revert: 'invalid', revertDuration: 300, - opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: -5, top: -5 }, + opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: 24, top: 18 }, helper: createDragShadow, cursor: 'move', stop: function(event, ui) { $('#fileList tr td.filename').addClass('ui-draggable'); } -} +}; // sane browsers support using the distance option if ( $('html.ie').length === 0) { dragOptions['distance'] = 20; @@ -666,20 +531,20 @@ var folderDropOptions={ return false; } - var target=$.trim($(this).find('.nametext').text()); + var target = $(this).closest('tr').data('file'); var files = ui.helper.find('tr'); - $(files).each(function(i,row){ + $(files).each(function(i,row) { var dir = $(row).data('dir'); var file = $(row).data('filename'); $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: dir+'/'+target }, function(result) { if (result) { if (result.status === 'success') { //recalculate folder size - var oldSize = $('#fileList tr').filterAttr('data-file',target).data('size'); - var newSize = oldSize + $('#fileList tr').filterAttr('data-file',file).data('size'); - $('#fileList tr').filterAttr('data-file',target).data('size', newSize); - $('#fileList tr').filterAttr('data-file',target).find('td.filesize').text(humanFileSize(newSize)); + var oldSize = $('#fileList tr[data-file="'+target+'"]').data('size'); + var newSize = oldSize + $('#fileList tr[data-file="'+file+'"]').data('size'); + $('#fileList tr[data-file="'+target+'"]').data('size', newSize); + $('#fileList tr[data-file="'+target+'"]').find('td.filesize').text(humanFileSize(newSize)); FileList.remove(file); procesSelection(); @@ -690,30 +555,30 @@ var folderDropOptions={ $('#notification').fadeIn(); } } else { - OC.dialogs.alert(t('Error moving file'), t('core', 'Error')); + OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); } }); }); }, tolerance: 'pointer' -} +}; var crumbDropOptions={ drop: function( event, ui ) { var target=$(this).data('dir'); - var dir=$('#dir').val(); - while(dir.substr(0,1)=='/'){//remove extra leading /'s + var dir = $('#dir').val(); + while(dir.substr(0,1) === '/') {//remove extra leading /'s dir=dir.substr(1); } - dir='/'+dir; - if(dir.substr(-1,1)!='/'){ - dir=dir+'/'; + dir = '/' + dir; + if (dir.substr(-1,1) !== '/') { + dir = dir + '/'; } - if(target==dir || target+'/'==dir){ + if (target === dir || target+'/' === dir) { return; } var files = ui.helper.find('tr'); - $(files).each(function(i,row){ + $(files).each(function(i,row) { var dir = $(row).data('dir'); var file = $(row).data('filename'); $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: target }, function(result) { @@ -728,19 +593,23 @@ var crumbDropOptions={ $('#notification').fadeIn(); } } else { - OC.dialogs.alert(t('Error moving file'), t('core', 'Error')); + OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); } }); }); }, tolerance: 'pointer' -} +}; -function procesSelection(){ - var selected=getSelectedFiles(); - var selectedFiles=selected.filter(function(el){return el.type=='file'}); - var selectedFolders=selected.filter(function(el){return el.type=='dir'}); - if(selectedFiles.length==0 && selectedFolders.length==0) { +function procesSelection() { + var selected = getSelectedFilesTrash(); + var selectedFiles = selected.filter(function(el) { + return el.type==='file'; + }); + var selectedFolders = selected.filter(function(el) { + return el.type==='dir'; + }); + if (selectedFiles.length === 0 && selectedFolders.length === 0) { $('#headerName>span.name').text(t('files','Name')); $('#headerSize').text(t('files','Size')); $('#modified').text(t('files','Modified')); @@ -749,33 +618,25 @@ function procesSelection(){ } else { $('.selectedActions').show(); - var totalSize=0; - for(var i=0;i0){ - if(selectedFolders.length==1){ - selection+=t('files','1 folder'); - }else{ - selection+=t('files','{count} folders',{count: selectedFolders.length}); - } - if(selectedFiles.length>0){ - selection+=' & '; + var selection = ''; + if (selectedFolders.length > 0) { + selection += n('files', '%n folder', '%n folders', selectedFolders.length); + if (selectedFiles.length > 0) { + selection += ' & '; } } - if(selectedFiles.length>0){ - if(selectedFiles.length==1){ - selection+=t('files','1 file'); - }else{ - selection+=t('files','{count} files',{count: selectedFiles.length}); - } + if (selectedFiles.length>0) { + selection += n('files', '%n file', '%n files', selectedFiles.length); } - $('#headerName>span.name').text(selection); + $('#headerName span.name').text(selection); $('#modified').text(''); $('table').addClass('multiselect'); } @@ -783,46 +644,101 @@ function procesSelection(){ /** * @brief get a list of selected files - * @param string property (option) the property of the file requested - * @return array + * @param {string} property (option) the property of the file requested + * @return {array} * * possible values for property: name, mime, size and type * if property is set, an array with that property for each file is returnd * if it's ommited an array of objects with all properties is returned */ -function getSelectedFiles(property){ +function getSelectedFilesTrash(property) { var elements=$('td.filename input:checkbox:checked').parent().parent(); var files=[]; - elements.each(function(i,element){ + elements.each(function(i,element) { var file={ name:$(element).attr('data-file'), mime:$(element).data('mime'), type:$(element).data('type'), - size:$(element).data('size') + size:$(element).data('size'), + etag:$(element).data('etag') }; - if(property){ + if (property) { files.push(file[property]); - }else{ + } else { files.push(file); } }); return files; } -function getMimeIcon(mime, ready){ - if(getMimeIcon.cache[mime]){ - ready(getMimeIcon.cache[mime]); - }else{ - $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path){ - getMimeIcon.cache[mime]=path; - ready(getMimeIcon.cache[mime]); +Files.getMimeIcon = function(mime, ready) { + if (Files.getMimeIcon.cache[mime]) { + ready(Files.getMimeIcon.cache[mime]); + } else { + $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path) { + Files.getMimeIcon.cache[mime]=path; + ready(Files.getMimeIcon.cache[mime]); }); } } -getMimeIcon.cache={}; +Files.getMimeIcon.cache={}; -function getUniqueName(name){ - if($('tr').filterAttr('data-file',name).length>0){ +function getPathForPreview(name) { + var path = $('#dir').val() + '/' + name; + return path; +} + +Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) { + // get mime icon url + Files.getMimeIcon(mime, function(iconURL) { + var urlSpec = {}; + var previewURL; + ready(iconURL); // set mimeicon URL + + // now try getting a preview thumbnail URL + if ( ! width ) { + width = $('#filestable').data('preview-x'); + } + if ( ! height ) { + height = $('#filestable').data('preview-y'); + } + // note: the order of arguments must match the one + // from the server's template so that the browser + // knows it's the same file for caching + urlSpec.x = width; + urlSpec.y = height; + urlSpec.file = Files.fixPath(path); + + if (etag){ + // use etag as cache buster + urlSpec.c = etag; + } + else { + console.warn('Files.lazyLoadPreview(): missing etag argument'); + } + + if ( $('#publicUploadButtonMock').length ) { + urlSpec.t = $('#dirToken').val(); + previewURL = OC.Router.generate('core_ajax_public_preview', urlSpec); + } else { + previewURL = OC.Router.generate('core_ajax_preview', urlSpec); + } + previewURL = previewURL.replace('(', '%28'); + previewURL = previewURL.replace(')', '%29'); + + // preload image to prevent delay + // this will make the browser cache the image + var img = new Image(); + img.onload = function(){ + //set preview thumbnail URL + ready(previewURL); + } + img.src = previewURL; + }); +} + +function getUniqueName(name) { + if ($('tr[data-file="'+name+'"]').exists()) { var parts=name.split('.'); var extension = ""; if (parts.length > 1) { @@ -831,9 +747,9 @@ function getUniqueName(name){ var base=parts.join('.'); numMatch=base.match(/\((\d+)\)/); var num=2; - if(numMatch && numMatch.length>0){ + if (numMatch && numMatch.length>0) { num=parseInt(numMatch[numMatch.length-1])+1; - base=base.split('(') + base=base.split('('); base.pop(); base=$.trim(base.join('(')); } @@ -847,9 +763,20 @@ function getUniqueName(name){ } function checkTrashStatus() { - $.post(OC.filePath('files_trashbin', 'ajax', 'isEmpty.php'), function(result){ + $.post(OC.filePath('files_trashbin', 'ajax', 'isEmpty.php'), function(result) { if (result.data.isEmpty === false) { $("input[type=button][id=trash]").removeAttr("disabled"); } }); -} \ No newline at end of file +} + +function onClickBreadcrumb(e) { + var $el = $(e.target).closest('.crumb'), + $targetDir = $el.data('dir'); + isPublic = !!$('#isPublic').val(); + + if ($targetDir !== undefined && !isPublic) { + e.preventDefault(); + FileList.changeDirectory(decodeURIComponent($targetDir)); + } +} diff --git a/apps/files/js/jquery.fileupload.js b/apps/files/js/jquery.fileupload.js index a89e9dc2c4..f9f6cc3a38 100644 --- a/apps/files/js/jquery.fileupload.js +++ b/apps/files/js/jquery.fileupload.js @@ -1,5 +1,5 @@ /* - * jQuery File Upload Plugin 5.9 + * jQuery File Upload Plugin 5.32.2 * https://github.com/blueimp/jQuery-File-Upload * * Copyright 2010, Sebastian Tschan @@ -10,7 +10,7 @@ */ /*jslint nomen: true, unparam: true, regexp: true */ -/*global define, window, document, Blob, FormData, location */ +/*global define, window, document, location, File, Blob, FormData */ (function (factory) { 'use strict'; @@ -27,12 +27,28 @@ }(function ($) { 'use strict'; + // Detect file input support, based on + // http://viljamis.com/blog/2012/file-upload-support-on-mobile/ + $.support.fileInput = !(new RegExp( + // Handle devices which give false positives for the feature detection: + '(Android (1\\.[0156]|2\\.[01]))' + + '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' + + '|(w(eb)?OSBrowser)|(webOS)' + + '|(Kindle/(1\\.0|2\\.[05]|3\\.0))' + ).test(window.navigator.userAgent) || + // Feature detection for all other devices: + $('').prop('disabled')); + // The FileReader API is not actually used, but works as feature detection, // as e.g. Safari supports XHR file uploads via the FormData API, // but not non-multipart XHR file uploads: $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader); $.support.xhrFormDataFileUpload = !!window.FormData; + // Detect support for Blob slicing (required for chunked uploads): + $.support.blobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice); + // The fileupload widget listens for change events on file input fields defined // via fileInput setting and paste or drop events of the given dropZone. // In addition to the default jQuery Widget methods, the fileupload widget @@ -44,17 +60,16 @@ $.widget('blueimp.fileupload', { options: { - // The namespace used for event handler binding on the dropZone and - // fileInput collections. - // If not set, the name of the widget ("fileupload") is used. - namespace: undefined, - // The drop target collection, by the default the complete document. - // Set to null or an empty collection to disable drag & drop support: + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: dropZone: $(document), - // The file input field collection, that is listened for change events. + // The paste target element(s), by the default the complete document. + // Set to null to disable paste support: + pasteZone: $(document), + // The file input field(s), that are listened to for change events. // If undefined, it is set to the file input fields inside // of the widget element on plugin initialization. - // Set to null or an empty collection to disable the change listener. + // Set to null to disable the change listener. fileInput: undefined, // By default, the file input field is replaced with a clone after // each input field change event. This is required for iframe transport @@ -63,7 +78,8 @@ replaceFileInput: true, // The parameter name for the file form data (the request argument name). // If undefined or empty, the name property of the file input field is - // used, or "files[]" if the file input name property is also empty: + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: paramName: undefined, // By default, each file of a selection is uploaded using an individual // request for XHR type uploads. Set to false to upload file @@ -108,6 +124,29 @@ // global progress calculation. Set the following option to false to // prevent recalculating the global progress data: recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, // Additional form data to be sent along with the file uploads can be set // using this option, which accepts an array of objects with name and @@ -121,48 +160,81 @@ // The add callback is invoked as soon as files are added to the fileupload // widget (via file input selection, drag & drop, paste or add API call). // If the singleFileUploads option is enabled, this callback will be - // called once for each file in the selection for XHR file uplaods, else + // called once for each file in the selection for XHR file uploads, else // once for each file selection. + // // The upload starts when the submit method is invoked on the data parameter. // The data object contains a files property holding the added files - // and allows to override plugin options as well as define ajax settings. + // and allows you to override plugin options as well as define ajax settings. + // // Listeners for this callback can also be bound the following way: // .bind('fileuploadadd', func); + // // data.submit() returns a Promise object and allows to attach additional // handlers using jQuery's Deferred callbacks: // data.submit().done(func).fail(func).always(func); add: function (e, data) { - data.submit(); + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } }, // Other callbacks: + // Callback for the submit event of each file upload: // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + // Callback for the start of each file upload request: // send: function (e, data) {}, // .bind('fileuploadsend', func); + // Callback for successful uploads: // done: function (e, data) {}, // .bind('fileuploaddone', func); + // Callback for failed (abort or error) uploads: // fail: function (e, data) {}, // .bind('fileuploadfail', func); + // Callback for completed (success, abort or error) requests: // always: function (e, data) {}, // .bind('fileuploadalways', func); + // Callback for upload progress events: // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + // Callback for global upload progress events: // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + // Callback for uploads start, equivalent to the global ajaxStart event: // start: function (e) {}, // .bind('fileuploadstart', func); + // Callback for uploads stop, equivalent to the global ajaxStop event: // stop: function (e) {}, // .bind('fileuploadstop', func); - // Callback for change events of the fileInput collection: + + // Callback for change events of the fileInput(s): // change: function (e, data) {}, // .bind('fileuploadchange', func); - // Callback for paste events to the dropZone collection: + + // Callback for paste events to the pasteZone(s): // paste: function (e, data) {}, // .bind('fileuploadpaste', func); - // Callback for drop events of the dropZone collection: + + // Callback for drop events of the dropZone(s): // drop: function (e, data) {}, // .bind('fileuploaddrop', func); - // Callback for dragover events of the dropZone collection: + + // Callback for dragover events of the dropZone(s): // dragover: function (e) {}, // .bind('fileuploaddragover', func); + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + // The plugin options are used as settings object for the ajax calls. // The following are jQuery ajax settings required for the file uploads: processData: false, @@ -170,15 +242,36 @@ cache: false }, - // A list of options that require a refresh after assigning a new value: - _refreshOptionsList: [ - 'namespace', - 'dropZone', + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ 'fileInput', + 'dropZone', + 'pasteZone', 'multipart', 'forceIframeTransport' ], + _blobSlice: $.support.blobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice; + return slice.apply(this, arguments); + }, + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + _isXHRUpload: function (options) { return !options.forceIframeTransport && ((!options.multipart && $.support.xhrFileUpload) || @@ -189,9 +282,11 @@ var formData; if (typeof options.formData === 'function') { return options.formData(options.form); - } else if ($.isArray(options.formData)) { + } + if ($.isArray(options.formData)) { return options.formData; - } else if (options.formData) { + } + if ($.type(options.formData) === 'object') { formData = []; $.each(options.formData, function (name, value) { formData.push({name: name, value: value}); @@ -209,28 +304,66 @@ return total; }, + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + _onProgress: function (e, data) { if (e.lengthComputable) { - var total = data.total || this._getTotal(data.files), - loaded = parseInt( - e.loaded / e.total * (data.chunkSize || total), - 10 - ) + (data.uploadedBytes || 0); - this._loaded += loaded - (data.loaded || data.uploadedBytes || 0); - data.lengthComputable = true; - data.loaded = loaded; - data.total = total; + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); // Trigger a custom progress event with a total data property set // to the file size(s) of the current upload and a loaded data // property calculated accordingly: this._trigger('progress', e, data); // Trigger a global progress event for all current file uploads, // including ajax calls queued for sequential file uploads: - this._trigger('progressall', e, { - lengthComputable: true, - loaded: this._loaded, - total: this._total - }); + this._trigger('progressall', e, this._progress); } }, @@ -254,34 +387,30 @@ } }, + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + _initXHRData: function (options) { - var formData, + var that = this, + formData, file = options.files[0], // Ignore non-multipart setting if not supported: - multipart = options.multipart || !$.support.xhrFileUpload; - if (!multipart || options.blob) { - // For non-multipart uploads and chunked uploads, - // file meta data is not part of the request body, - // so we transmit this data as part of the HTTP headers. - // For cross domain requests, these headers must be allowed - // via Access-Control-Allow-Headers or removed using - // the beforeSend callback: - options.headers = $.extend(options.headers, { - 'X-File-Name': file.name, - 'X-File-Type': file.type, - 'X-File-Size': file.size - }); - if (!options.blob) { - // Non-chunked non-multipart upload: - options.contentType = file.type; - options.data = file; - } else if (!multipart) { - // Chunked non-multipart upload: - options.contentType = 'application/octet-stream'; - options.data = options.blob; - } + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = options.paramName[0]; + options.headers = options.headers || {}; + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; } - if (multipart && $.support.xhrFormDataFileUpload) { + if (!multipart || options.blob || !this._isInstanceOf('File', file)) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + } + if (!multipart) { + options.contentType = file.type; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { if (options.postMessage) { // window.postMessage does not allow sending FormData // objects, so we just add the File/Blob objects to @@ -290,19 +419,19 @@ formData = this._getFormData(options); if (options.blob) { formData.push({ - name: options.paramName, + name: paramName, value: options.blob }); } else { $.each(options.files, function (index, file) { formData.push({ - name: options.paramName, + name: options.paramName[index] || paramName, value: file }); }); } } else { - if (options.formData instanceof FormData) { + if (that._isInstanceOf('FormData', options.formData)) { formData = options.formData; } else { formData = new FormData(); @@ -311,14 +440,18 @@ }); } if (options.blob) { - formData.append(options.paramName, options.blob, file.name); + formData.append(paramName, options.blob, file.name); } else { $.each(options.files, function (index, file) { - // File objects are also Blob instances. // This check allows the tests to run with // dummy objects: - if (file instanceof Blob) { - formData.append(options.paramName, file, file.name); + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + options.paramName[index] || paramName, + file, + file.name + ); } }); } @@ -330,13 +463,13 @@ }, _initIframeSettings: function (options) { + var targetHost = $('').prop('href', options.url).prop('host'); // Setting the dataType to iframe enables the iframe transport: options.dataType = 'iframe ' + (options.dataType || ''); // The iframe transport accepts a serialized array as form data: options.formData = this._getFormData(options); // Add redirect url to form data on cross-domain uploads: - if (options.redirect && $('').prop('href', options.url) - .prop('host') !== location.host) { + if (options.redirect && targetHost && targetHost !== location.host) { options.formData.push({ name: options.redirectParamName || 'redirect', value: options.redirect @@ -358,29 +491,58 @@ options.dataType = 'postmessage ' + (options.dataType || ''); } } else { - this._initIframeSettings(options, 'iframe'); + this._initIframeSettings(options); } }, + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + _initFormSettings: function (options) { // Retrieve missing options from the input field and the // associated form, if available: if (!options.form || !options.form.length) { options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } } - if (!options.paramName) { - options.paramName = options.fileInput.prop('name') || - 'files[]'; - } + options.paramName = this._getParamName(options); if (!options.url) { options.url = options.form.prop('action') || location.href; } // The HTTP request method must be "POST" or "PUT": options.type = (options.type || options.form.prop('method') || '') .toUpperCase(); - if (options.type !== 'POST' && options.type !== 'PUT') { + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { options.type = 'POST'; } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } }, _getAJAXSettings: function (data) { @@ -390,6 +552,21 @@ return options; }, + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + // Maps jqXHR callbacks to the equivalent // methods of the given Promise object: _enhancePromise: function (promise) { @@ -414,24 +591,77 @@ return this._enhancePromise(promise); }, + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (data) { + return $.Deferred().resolveWith(that, [data]).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise(this)) + .pipe(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise(this); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger('submit', e, this) !== false) && + that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + return that._getXHRPromise(); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + // Uploads a file in multiple, sequential requests // by splitting the file up in multiple blob chunks. // If the second parameter is true, only tests if the file // should be uploaded in chunks, but does not invoke any // upload requests: _chunkedUpload: function (options, testOnly) { + options.uploadedBytes = options.uploadedBytes || 0; var that = this, file = options.files[0], fs = file.size, - ub = options.uploadedBytes = options.uploadedBytes || 0, + ub = options.uploadedBytes, mcs = options.maxChunkSize || fs, - // Use the Blob methods with the slice implementation - // according to the W3C Blob API specification: - slice = file.webkitSlice || file.mozSlice || file.slice, - upload, - n, + slice = this._blobSlice, + dfd = $.Deferred(), + promise = dfd.promise(), jqXHR, - pipe; + upload; if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || options.data) { return false; @@ -440,62 +670,84 @@ return true; } if (ub >= fs) { - file.error = 'uploadedBytes'; + file.error = options.i18n('uploadedBytes'); return this._getXHRPromise( false, options.context, [null, 'error', file.error] ); } - // n is the number of blobs to upload, - // calculated via filesize, uploaded bytes and max chunk size: - n = Math.ceil((fs - ub) / mcs); - // The chunk upload method accepting the chunk number as parameter: - upload = function (i) { - if (!i) { - return that._getXHRPromise(true, options.context); - } - // Upload the blobs in sequential order: - return upload(i -= 1).pipe(function () { - // Clone the options object for each chunk upload: - var o = $.extend({}, options); - o.blob = slice.call( - file, - ub + i * mcs, - ub + (i + 1) * mcs - ); - // Store the current chunk size, as the blob itself - // will be dereferenced after data processing: - o.chunkSize = o.blob.size; - // Process the upload data (the blob and potential form data): - that._initXHRData(o); - // Add progress listeners for this chunk upload: - that._initProgressListener(o); - jqXHR = ($.ajax(o) || that._getXHRPromise(false, o.context)) - .done(function () { - // Create a progress event if upload is done and - // no progress event has been invoked for this chunk: - if (!o.loaded) { - that._onProgress($.Event('progress', { - lengthComputable: true, - loaded: o.chunkSize, - total: o.chunkSize - }), o); - } - options.uploadedBytes = o.uploadedBytes += - o.chunkSize; - }); - return jqXHR; - }); + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + mcs, + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }); }; - // Return the piped Promise object, enhanced with an abort method, - // which is delegated to the jqXHR object of the current upload, - // and jqXHR callbacks mapped to the equivalent Promise methods: - pipe = upload(n); - pipe.abort = function () { + this._enhancePromise(promise); + promise.abort = function () { return jqXHR.abort(); }; - return this._enhancePromise(pipe); + upload(); + return promise; }, _beforeSend: function (e, data) { @@ -504,99 +756,113 @@ // and no other uploads are currently running, // equivalent to the global ajaxStart event: this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; this._active += 1; // Initialize the global progress values: - this._loaded += data.uploadedBytes || 0; - this._total += this._getTotal(data.files); + this._progress.loaded += data.loaded; + this._progress.total += data.total; }, _onDone: function (result, textStatus, jqXHR, options) { - if (!this._isXHRUpload(options)) { - // Create a progress event for each iframe load: + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: this._onProgress($.Event('progress', { lengthComputable: true, - loaded: 1, - total: 1 + loaded: total, + total: total }), options); } - options.result = result; - options.textStatus = textStatus; - options.jqXHR = jqXHR; + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; this._trigger('done', null, options); }, _onFail: function (jqXHR, textStatus, errorThrown, options) { - options.jqXHR = jqXHR; - options.textStatus = textStatus; - options.errorThrown = errorThrown; - this._trigger('fail', null, options); + var response = options._response; if (options.recalculateProgress) { // Remove the failed (error or abort) file upload from // the global progress calculation: - this._loaded -= options.loaded || options.uploadedBytes || 0; - this._total -= options.total || this._getTotal(options.files); + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); }, _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { - this._active -= 1; - options.textStatus = textStatus; - if (jqXHRorError && jqXHRorError.always) { - options.jqXHR = jqXHRorError; - options.result = jqXHRorResult; - } else { - options.jqXHR = jqXHRorResult; - options.errorThrown = jqXHRorError; - } + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks this._trigger('always', null, options); - if (this._active === 0) { - // The stop callback is triggered when all uploads have - // been completed, equivalent to the global ajaxStop event: - this._trigger('stop'); - // Reset the global progress values: - this._loaded = this._total = 0; - } }, _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } var that = this, jqXHR, + aborted, slot, pipe, options = that._getAJAXSettings(data), - send = function (resolve, args) { + send = function () { that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); jqXHR = jqXHR || ( - (resolve !== false && - that._trigger('send', e, options) !== false && - (that._chunkedUpload(options) || $.ajax(options))) || - that._getXHRPromise(false, options.context, args) + ((aborted || that._trigger('send', e, options) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) ).done(function (result, textStatus, jqXHR) { that._onDone(result, textStatus, jqXHR, options); }).fail(function (jqXHR, textStatus, errorThrown) { that._onFail(jqXHR, textStatus, errorThrown, options); }).always(function (jqXHRorResult, textStatus, jqXHRorError) { - that._sending -= 1; that._onAlways( jqXHRorResult, textStatus, jqXHRorError, options ); + that._sending -= 1; + that._active -= 1; if (options.limitConcurrentUploads && options.limitConcurrentUploads > that._sending) { // Start the next queued upload, // that has not been aborted: var nextSlot = that._slots.shift(); while (nextSlot) { - if (!nextSlot.isRejected()) { + if (that._getDeferredState(nextSlot) === 'pending') { nextSlot.resolve(); break; } nextSlot = that._slots.shift(); } } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } }); return jqXHR; }; @@ -609,18 +875,19 @@ this._slots.push(slot); pipe = slot.pipe(send); } else { - pipe = (this._sequence = this._sequence.pipe(send, send)); + this._sequence = this._sequence.pipe(send, send); + pipe = this._sequence; } // Return the piped Promise object, enhanced with an abort method, // which is delegated to the jqXHR object of the current upload, // and jqXHR callbacks mapped to the equivalent Promise methods: pipe.abort = function () { - var args = [undefined, 'abort', 'abort']; + aborted = [undefined, 'abort', 'abort']; if (!jqXHR) { if (slot) { - slot.rejectWith(args); + slot.rejectWith(options.context, aborted); } - return send(false, args); + return send(); } return jqXHR.abort(); }; @@ -634,40 +901,43 @@ result = true, options = $.extend({}, this.options, data), limit = options.limitMultiFileUploads, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, fileSet, i; if (!(options.singleFileUploads || limit) || !this._isXHRUpload(options)) { fileSet = [data.files]; + paramNameSet = [paramName]; } else if (!options.singleFileUploads && limit) { fileSet = []; + paramNameSet = []; for (i = 0; i < data.files.length; i += limit) { fileSet.push(data.files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); } + } else { + paramNameSet = paramName; } data.originalFiles = data.files; $.each(fileSet || data.files, function (index, element) { - var files = fileSet ? element : [element], - newData = $.extend({}, data, {files: files}); - newData.submit = function () { - newData.jqXHR = this.jqXHR = - (that._trigger('submit', e, this) !== false) && - that._onSend(e, this); - return this.jqXHR; - }; - return (result = that._trigger('add', e, newData)); + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger('add', e, newData); + return result; }); return result; }, - // File Normalization for Gecko 1.9.1 (Firefox 3.5) support: - _normalizeFile: function (index, file) { - if (file.name === undefined && file.size === undefined) { - file.name = file.fileName; - file.size = file.fileSize; - } - }, - _replaceFileInput: function (input) { var inputClone = input.clone(true); $('
').append(inputClone)[0].reset(); @@ -677,7 +947,7 @@ // Avoid memory leaks with the detached file input: $.cleanData(input.unbind('remove')); // Replace the original file input element in the fileInput - // collection with the clone, which has been copied including + // elements set with the clone, which has been copied including // event handlers: this.options.fileInput = this.options.fileInput.map(function (i, el) { if (el === input[0]) { @@ -692,102 +962,229 @@ } }, - _onChange: function (e) { - var that = e.data.fileupload, - data = { - files: $.each($.makeArray(e.target.files), that._normalizeFile), - fileInput: $(e.target), - form: $(e.target.form) - }; - if (!data.files.length) { + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + dirReader; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + dirReader.readEntries(function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, errorHandler); + } else { + // Return an empy list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } // If the files property is not available, the browser does not // support the File API and we add a pseudo File object with // the input value as name with path information removed: - data.files = [{name: e.target.value.replace(/^.*\\/, '')}]; + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); } - if (that.options.replaceFileInput) { - that._replaceFileInput(data.fileInput); - } - if (that._trigger('change', e, data) === false || - that._onAdd(e, data) === false) { - return false; + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data.fileInput); + } + if (that._trigger('change', e, data) !== false) { + that._onAdd(e, data); + } + }); }, _onPaste: function (e) { - var that = e.data.fileupload, - cbd = e.originalEvent.clipboardData, - items = (cbd && cbd.items) || [], + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, data = {files: []}; - $.each(items, function (index, item) { - var file = item.getAsFile && item.getAsFile(); - if (file) { - data.files.push(file); + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger('paste', e, data) === false || + this._onAdd(e, data) === false) { + return false; } - }); - if (that._trigger('paste', e, data) === false || - that._onAdd(e, data) === false) { - return false; } }, _onDrop: function (e) { - var that = e.data.fileupload, - dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer, - data = { - files: $.each( - $.makeArray(dataTransfer && dataTransfer.files), - that._normalizeFile - ) - }; - if (that._trigger('drop', e, data) === false || - that._onAdd(e, data) === false) { - return false; + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var that = this, + dataTransfer = e.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger('drop', e, data) !== false) { + that._onAdd(e, data); + } + }); } - e.preventDefault(); }, _onDragOver: function (e) { - var that = e.data.fileupload, - dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer; - if (that._trigger('dragover', e) === false) { - return false; - } + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var dataTransfer = e.dataTransfer; if (dataTransfer) { - dataTransfer.dropEffect = dataTransfer.effectAllowed = 'copy'; + if (this._trigger('dragover', e) === false) { + return false; + } + if ($.inArray('Files', dataTransfer.types) !== -1) { + dataTransfer.dropEffect = 'copy'; + e.preventDefault(); + } } - e.preventDefault(); }, _initEventHandlers: function () { - var ns = this.options.namespace; if (this._isXHRUpload(this.options)) { - this.options.dropZone - .bind('dragover.' + ns, {fileupload: this}, this._onDragOver) - .bind('drop.' + ns, {fileupload: this}, this._onDrop) - .bind('paste.' + ns, {fileupload: this}, this._onPaste); + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + if ($.support.fileInput) { + this._on(this.options.fileInput, { + change: this._onChange + }); } - this.options.fileInput - .bind('change.' + ns, {fileupload: this}, this._onChange); }, _destroyEventHandlers: function () { - var ns = this.options.namespace; - this.options.dropZone - .unbind('dragover.' + ns, this._onDragOver) - .unbind('drop.' + ns, this._onDrop) - .unbind('paste.' + ns, this._onPaste); - this.options.fileInput - .unbind('change.' + ns, this._onChange); + this._off(this.options.dropZone, 'dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); }, _setOption: function (key, value) { - var refresh = $.inArray(key, this._refreshOptionsList) !== -1; - if (refresh) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { this._destroyEventHandlers(); } - $.Widget.prototype._setOption.call(this, key, value); - if (refresh) { + this._super(key, value); + if (reinit) { this._initSpecialOptions(); this._initEventHandlers(); } @@ -796,42 +1193,68 @@ _initSpecialOptions: function () { var options = this.options; if (options.fileInput === undefined) { - options.fileInput = this.element.is('input:file') ? - this.element : this.element.find('input:file'); + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); } else if (!(options.fileInput instanceof $)) { options.fileInput = $(options.fileInput); } if (!(options.dropZone instanceof $)) { options.dropZone = $(options.dropZone); } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options; + // Initialize options set via HTML5 data-attributes: + $.each( + $(this.element[0].cloneNode(false)).data(), + function (key, value) { + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + ); }, _create: function () { - var options = this.options, - dataOpts = $.extend({}, this.element.data()); - dataOpts[this.widgetName] = undefined; - $.extend(options, dataOpts); - options.namespace = options.namespace || this.widgetName; + this._initDataAttributes(); this._initSpecialOptions(); this._slots = []; this._sequence = this._getXHRPromise(true); - this._sending = this._active = this._loaded = this._total = 0; + this._sending = this._active = 0; + this._initProgressObject(this); this._initEventHandlers(); }, - destroy: function () { - this._destroyEventHandlers(); - $.Widget.prototype.destroy.call(this); + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; }, - enable: function () { - $.Widget.prototype.enable.call(this); - this._initEventHandlers(); - }, - - disable: function () { - this._destroyEventHandlers(); - $.Widget.prototype.disable.call(this); + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; }, // This method is exposed to the widget API and allows adding files @@ -839,21 +1262,65 @@ // must have a files property and can contain additional options: // .fileupload('add', {files: filesList}); add: function (data) { + var that = this; if (!data || this.options.disabled) { return; } - data.files = $.each($.makeArray(data.files), this._normalizeFile); - this._onAdd(null, data); + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } }, // This method is exposed to the widget API and allows sending files // using the fileupload API. The data parameter accepts an object which - // must have a files property and can contain additional options: + // must have a files or fileInput property and can contain additional options: // .fileupload('send', {files: filesList}); // The method returns a Promise object for the file upload call. send: function (data) { if (data && !this.options.disabled) { - data.files = $.each($.makeArray(data.files), this._normalizeFile); + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + if (!files.length) { + dfd.reject(); + return; + } + data.files = files; + jqXHR = that._onSend(null, data).then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); if (data.files.length) { return this._onSend(null, data); } @@ -863,4 +1330,4 @@ }); -})); +})); \ No newline at end of file diff --git a/apps/files/js/jquery.iframe-transport.js b/apps/files/js/jquery.iframe-transport.js index d85c0c1129..5c9df77976 100644 --- a/apps/files/js/jquery.iframe-transport.js +++ b/apps/files/js/jquery.iframe-transport.js @@ -1,5 +1,5 @@ /* - * jQuery Iframe Transport Plugin 1.3 + * jQuery Iframe Transport Plugin 1.7 * https://github.com/blueimp/jQuery-File-Upload * * Copyright 2011, Sebastian Tschan @@ -30,27 +30,45 @@ // The iframe transport accepts three additional options: // options.fileInput: a jQuery collection of file input fields // options.paramName: the parameter name for the file form data, - // overrides the name property of the file input field(s) + // overrides the name property of the file input field(s), + // can be a string or an array of strings. // options.formData: an array of objects with name and value properties, // equivalent to the return data of .serializeArray(), e.g.: // [{name: 'a', value: 1}, {name: 'b', value: 2}] $.ajaxTransport('iframe', function (options) { - if (options.async && (options.type === 'POST' || options.type === 'GET')) { + if (options.async) { var form, - iframe; + iframe, + addParamChar; return { send: function (_, completeCallback) { form = $('
'); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } // javascript:false as initial iframe src // prevents warning popups on HTTPS in IE6. // IE versions below IE8 cannot set the name property of // elements that have already been added to the DOM, // so we set the name along with the iframe HTML markup: + counter += 1; iframe = $( '' + counter + '">' ).bind('load', function () { - var fileInputClones; + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; iframe .unbind('load') .bind('load', function () { @@ -79,7 +97,12 @@ // (happens on form submits to iframe targets): $('') .appendTo(form); - form.remove(); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); }); form .prop('target', iframe.prop('name')) @@ -101,8 +124,11 @@ return fileInputClones[index]; }); if (options.paramName) { - options.fileInput.each(function () { - $(this).prop('name', options.paramName); + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); }); } // Appending the file input fields to the hidden form @@ -144,22 +170,36 @@ }); // The iframe transport returns the iframe content document as response. - // The following adds converters from iframe to text, json, html, and script: + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation $.ajaxSetup({ converters: { 'iframe text': function (iframe) { - return $(iframe[0].body).text(); + return iframe && $(iframe[0].body).text(); }, 'iframe json': function (iframe) { - return $.parseJSON($(iframe[0].body).text()); + return iframe && $.parseJSON($(iframe[0].body).text()); }, 'iframe html': function (iframe) { - return $(iframe[0].body).html(); + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); }, 'iframe script': function (iframe) { - return $.globalEval($(iframe[0].body).text()); + return iframe && $.globalEval($(iframe[0].body).text()); } } }); -})); +})); \ No newline at end of file diff --git a/apps/files/js/keyboardshortcuts.js b/apps/files/js/keyboardshortcuts.js index cc2b5d4213..9d6c3ae8c3 100644 --- a/apps/files/js/keyboardshortcuts.js +++ b/apps/files/js/keyboardshortcuts.js @@ -131,7 +131,9 @@ var Files = Files || {}; return; } var preventDefault = false; - if ($.inArray(event.keyCode, keys) === -1) keys.push(event.keyCode); + if ($.inArray(event.keyCode, keys) === -1) { + keys.push(event.keyCode); + } if ( $.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) { preventDefault = true; //new file/folder prevent browser from responding @@ -165,4 +167,4 @@ var Files = Files || {}; removeA(keys, event.keyCode); }); }; -})(Files); \ No newline at end of file +})(Files); diff --git a/apps/files/l10n/ach.php b/apps/files/l10n/ach.php new file mode 100644 index 0000000000..3c711e6b78 --- /dev/null +++ b/apps/files/l10n/ach.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n > 1);"; diff --git a/apps/files/l10n/ady.php b/apps/files/l10n/ady.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/ady.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/af.php b/apps/files/l10n/af.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/af.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/af_ZA.php b/apps/files/l10n/af_ZA.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/af_ZA.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php index 878bb2eefb..0148f5ca3c 100644 --- a/apps/files/l10n/ar.php +++ b/apps/files/l10n/ar.php @@ -2,6 +2,9 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم", "Could not move %s" => "فشل في نقل %s", +"File name cannot be empty." => "اسم الملف لا يجوز أن يكون فارغا", +"Unable to set upload directory." => "غير قادر على تحميل المجلد", +"Invalid Token" => "علامة غير صالحة", "No file was uploaded. Unknown error" => "لم يتم رفع أي ملف , خطأ غير معروف", "There is no error, the file uploaded with success" => "تم ترفيع الملفات بنجاح.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "حجم الملف المرفوع تجاوز قيمة upload_max_filesize الموجودة في ملف php.ini ", @@ -11,40 +14,40 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "المجلد المؤقت غير موجود", "Failed to write to disk" => "خطأ في الكتابة على القرص الصلب", "Not enough storage available" => "لا يوجد مساحة تخزينية كافية", +"Upload failed. Could not get file info." => "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.", +"Upload failed. Could not find uploaded file" => "*فشلت علمية الرفع. تعذر إيجاد الملف الذي تم رفعه.\n*فشلت علمية التحميل. تعذر إيجاد الملف الذي تم تحميله.", "Invalid directory." => "مسار غير صحيح.", "Files" => "الملفات", -"Unable to upload your file as it is a directory or has 0 bytes" => "فشل في رفع ملفاتك , إما أنها مجلد أو حجمها 0 بايت", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت", +"Not enough space available" => "لا توجد مساحة كافية", "Upload cancelled." => "تم إلغاء عملية رفع الملفات .", +"Could not get result from server." => "تعذر الحصول على نتيجة من الخادم", "File upload is in progress. Leaving the page now will cancel the upload." => "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", -"URL cannot be empty." => "عنوان ال URL لا يجوز أن يكون فارغا.", -"Error" => "خطأ", +"{new_name} already exists" => "{new_name} موجود مسبقا", "Share" => "شارك", "Delete permanently" => "حذف بشكل دائم", -"Delete" => "إلغاء", "Rename" => "إعادة تسميه", "Pending" => "قيد الانتظار", -"{new_name} already exists" => "{new_name} موجود مسبقا", -"replace" => "استبدال", -"suggest name" => "اقترح إسم", -"cancel" => "إلغاء", "replaced {new_name} with {old_name}" => "استبدل {new_name} بـ {old_name}", "undo" => "تراجع", -"perform delete operation" => "جاري تنفيذ عملية الحذف", -"1 file uploading" => "جاري رفع 1 ملف", +"_%n folder_::_%n folders_" => array("لا يوجد مجلدات %n","1 مجلد %n","2 مجلد %n","عدد قليل من مجلدات %n","عدد كبير من مجلدات %n","مجلدات %n"), +"_%n file_::_%n files_" => array("لا يوجد ملفات %n","ملف %n","2 ملف %n","قليل من ملفات %n","الكثير من ملفات %n"," ملفات %n"), +"{dirs} and {files}" => "{dirs} و {files}", +"_Uploading %n file_::_Uploading %n files_" => array("لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"), "'.' is an invalid file name." => "\".\" اسم ملف غير صحيح.", -"File name cannot be empty." => "اسم الملف لا يجوز أن يكون فارغا", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "اسم غير صحيح , الرموز '\\', '/', '<', '>', ':', '\"', '|', '?' و \"*\" غير مسموح استخدامها", "Your storage is full, files can not be updated or synced anymore!" => "مساحتك التخزينية ممتلئة, لا يمكم تحديث ملفاتك أو مزامنتها بعد الآن !", "Your storage is almost full ({usedSpacePercent}%)" => "مساحتك التخزينية امتلأت تقريبا ", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "تم تمكين تشفير البرامج لكن لم يتم تهيئة المفاتيح لذا يرجى تسجيل الخروج ثم تسجيل الدخول مرة آخرى.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "المفتاح الخاص بتشفير التطبيقات غير صالح. يرجى تحديث كلمة السر الخاصة بالمفتاح الخاص من الإعدادت الشخصية حتى تتمكن من الوصول للملفات المشفرة.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "تم تعطيل التشفير لكن ملفاتك لا تزال مشفرة. فضلا اذهب إلى الإعدادات الشخصية لإزالة التشفير عن ملفاتك.", "Your download is being prepared. This might take some time if the files are big." => "جاري تجهيز عملية التحميل. قد تستغرق بعض الوقت اذا كان حجم الملفات كبير.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "إسم مجلد غير صحيح. استخدام مصطلح \"Shared\" محجوز للنظام", +"Error moving file" => "حدث خطأ أثناء نقل الملف", +"Error" => "خطأ", "Name" => "اسم", "Size" => "حجم", "Modified" => "معدل", -"1 folder" => "مجلد عدد 1", -"{count} folders" => "{count} مجلدات", -"1 file" => "ملف واحد", -"{count} files" => "{count} ملفات", +"%s could not be renamed" => "%s لا يمكن إعادة تسميته. ", "Upload" => "رفع", "File handling" => "التعامل مع الملف", "Maximum upload size" => "الحد الأقصى لحجم الملفات التي يمكن رفعها", @@ -60,10 +63,9 @@ $TRANSLATIONS = array( "From link" => "من رابط", "Deleted files" => "حذف الملفات", "Cancel upload" => "إلغاء رفع الملفات", -"You don’t have write permissions here." => "لا تملك صلاحيات الكتابة هنا.", "Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرفع بعض الملفات!", "Download" => "تحميل", -"Unshare" => "إلغاء مشاركة", +"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/az.php b/apps/files/l10n/az.php new file mode 100644 index 0000000000..70ab6572ba --- /dev/null +++ b/apps/files/l10n/az.php @@ -0,0 +1,7 @@ + array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array("") +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/be.php b/apps/files/l10n/be.php new file mode 100644 index 0000000000..17262d2184 --- /dev/null +++ b/apps/files/l10n/be.php @@ -0,0 +1,7 @@ + array("","","",""), +"_%n file_::_%n files_" => array("","","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","","","") +); +$PLURAL_FORMS = "nplurals=4; 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/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php index 47f7320679..12e699064b 100644 --- a/apps/files/l10n/bg_BG.php +++ b/apps/files/l10n/bg_BG.php @@ -9,35 +9,32 @@ $TRANSLATIONS = array( "Invalid directory." => "Невалидна директория.", "Files" => "Файлове", "Upload cancelled." => "Качването е спряно.", -"Error" => "Грешка", "Share" => "Споделяне", "Delete permanently" => "Изтриване завинаги", -"Delete" => "Изтриване", "Rename" => "Преименуване", "Pending" => "Чакащо", -"replace" => "препокриване", -"cancel" => "отказ", "undo" => "възтановяване", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "Грешка", "Name" => "Име", "Size" => "Размер", "Modified" => "Променено", -"1 folder" => "1 папка", -"{count} folders" => "{count} папки", -"1 file" => "1 файл", -"{count} files" => "{count} файла", "Upload" => "Качване", "Maximum upload size" => "Максимален размер за качване", "0 is unlimited" => "Ползвайте 0 за без ограничения", "Save" => "Запис", "New" => "Ново", "Text file" => "Текстов файл", +"New folder" => "Нова папка", "Folder" => "Папка", "Cancel upload" => "Спри качването", "Nothing in here. Upload something!" => "Няма нищо тук. Качете нещо.", "Download" => "Изтегляне", +"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." => "Файловете се претърсват, изчакайте.", -"file" => "файл" +"Files are being scanned, please wait." => "Файловете се претърсват, изчакайте." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/bn_BD.php b/apps/files/l10n/bn_BD.php index 288b1477bf..f7266517e9 100644 --- a/apps/files/l10n/bn_BD.php +++ b/apps/files/l10n/bn_BD.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s কে স্থানান্তর করা সম্ভব হলো না - এই নামের ফাইল বিদ্যমান", "Could not move %s" => "%s কে স্থানান্তর করা সম্ভব হলো না", +"File name cannot be empty." => "ফাইলের নামটি ফাঁকা রাখা যাবে না।", "No file was uploaded. Unknown error" => "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।", "There is no error, the file uploaded with success" => "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "আপলোড করা ফাইলটি php.ini তে বর্ণিত upload_max_filesize নির্দেশিত আয়তন অতিক্রম করছেঃ", @@ -12,34 +13,24 @@ $TRANSLATIONS = array( "Failed to write to disk" => "ডিস্কে লিখতে ব্যর্থ", "Invalid directory." => "ভুল ডিরেক্টরি", "Files" => "ফাইল", -"Unable to upload your file as it is a directory or has 0 bytes" => "আপনার ফাইলটি আপলোড করা সম্ভব হলো না, কেননা এটি হয় একটি ফোল্ডার কিংবা এর আকার ০ বাইট", "Not enough space available" => "যথেষ্ঠ পরিমাণ স্থান নেই", "Upload cancelled." => "আপলোড বাতিল করা হয়েছে।", "File upload is in progress. Leaving the page now will cancel the upload." => "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।", -"URL cannot be empty." => "URL ফাঁকা রাখা যাবে না।", -"Error" => "সমস্যা", +"{new_name} already exists" => "{new_name} টি বিদ্যমান", "Share" => "ভাগাভাগি কর", -"Delete" => "মুছে", "Rename" => "পূনঃনামকরণ", "Pending" => "মুলতুবি", -"{new_name} already exists" => "{new_name} টি বিদ্যমান", -"replace" => "প্রতিস্থাপন", -"suggest name" => "নাম সুপারিশ করুন", -"cancel" => "বাতিল", "replaced {new_name} with {old_name}" => "{new_name} কে {old_name} নামে প্রতিস্থাপন করা হয়েছে", "undo" => "ক্রিয়া প্রত্যাহার", -"1 file uploading" => "১টি ফাইল আপলোড করা হচ্ছে", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "'.' is an invalid file name." => "টি একটি অননুমোদিত নাম।", -"File name cannot be empty." => "ফাইলের নামটি ফাঁকা রাখা যাবে না।", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "নামটি সঠিক নয়, '\\', '/', '<', '>', ':', '\"', '|', '?' এবং '*' অনুমোদিত নয়।", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "ফোল্ডারের নামটি সঠিক নয়। 'ভাগাভাগি করা' শুধুমাত্র Owncloud এর জন্য সংরক্ষিত।", +"Error" => "সমস্যা", "Name" => "রাম", "Size" => "আকার", "Modified" => "পরিবর্তিত", -"1 folder" => "১টি ফোল্ডার", -"{count} folders" => "{count} টি ফোল্ডার", -"1 file" => "১টি ফাইল", -"{count} files" => "{count} টি ফাইল", "Upload" => "আপলোড", "File handling" => "ফাইল হ্যার্ডলিং", "Maximum upload size" => "আপলোডের সর্বোচ্চ আকার", @@ -56,7 +47,7 @@ $TRANSLATIONS = array( "Cancel upload" => "আপলোড বাতিল কর", "Nothing in here. Upload something!" => "এখানে কিছুই নেই। কিছু আপলোড করুন !", "Download" => "ডাউনলোড", -"Unshare" => "ভাগাভাগি বাতিল ", +"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/bs.php b/apps/files/l10n/bs.php new file mode 100644 index 0000000000..47276eccda --- /dev/null +++ b/apps/files/l10n/bs.php @@ -0,0 +1,13 @@ + "Podijeli", +"_%n folder_::_%n folders_" => array("","",""), +"_%n file_::_%n files_" => array("","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","",""), +"Name" => "Ime", +"Size" => "Veličina", +"Save" => "Spasi", +"New folder" => "Nova fascikla", +"Folder" => "Fasikla" +); +$PLURAL_FORMS = "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/l10n/ca.php b/apps/files/l10n/ca.php index 8d8469fbea..261713bc58 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom", "Could not move %s" => " No s'ha pogut moure %s", +"File name cannot be empty." => "El nom del fitxer no pot ser buit.", +"File name must not contain \"/\". Please choose a different name." => "El nom de fitxer no pot contenir \"/\". Indiqueu un nom diferent.", +"The name %s is already used in the folder %s. Please choose a different name." => "El nom %s ja s'usa en la carpeta %s. Indiqueu un nom diferent.", +"Not a valid source" => "No és un origen vàlid", +"Error while downloading %s to %s" => "S'ha produït un error en baixar %s a %s", +"Error when creating the file" => "S'ha produït un error en crear el fitxer", +"Folder name cannot be empty." => "El nom de la carpeta no pot ser buit.", +"Folder name must not contain \"/\". Please choose a different name." => "El nom de la carpeta no pot contenir \"/\". Indiqueu un nom diferent.", +"Error when creating the folder" => "S'ha produït un error en crear la carpeta", "Unable to set upload directory." => "No es pot establir la carpeta de pujada.", "Invalid Token" => "Testimoni no vàlid", "No file was uploaded. Unknown error" => "No s'ha carregat cap fitxer. Error desconegut", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Falta un fitxer temporal", "Failed to write to disk" => "Ha fallat en escriure al disc", "Not enough storage available" => "No hi ha prou espai disponible", +"Upload failed. Could not get file info." => "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", +"Upload failed. Could not find uploaded file" => "La pujada ha fallat. El fitxer pujat no s'ha trobat.", "Invalid directory." => "Directori no vàlid.", "Files" => "Fitxers", -"Unable to upload your file as it is a directory or has 0 bytes" => "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", "Not enough space available" => "No hi ha prou espai disponible", "Upload cancelled." => "La pujada s'ha cancel·lat.", +"Could not get result from server." => "No hi ha resposta del servidor.", "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à.", -"URL cannot be empty." => "La URL no pot ser buida", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de carpeta no vàlid. L'ús de 'Shared' està reservat per Owncloud", -"Error" => "Error", +"URL cannot be empty" => "L'URL no pot ser buit", +"In the home folder 'Shared' is a reserved filename" => "A la carpeta inici 'Compartit' és un nom de fitxer reservat", +"{new_name} already exists" => "{new_name} ja existeix", +"Could not create file" => "No s'ha pogut crear el fitxer", +"Could not create folder" => "No s'ha pogut crear la carpeta", "Share" => "Comparteix", "Delete permanently" => "Esborra permanentment", -"Delete" => "Esborra", "Rename" => "Reanomena", "Pending" => "Pendent", -"{new_name} already exists" => "{new_name} ja existeix", -"replace" => "substitueix", -"suggest name" => "sugereix un nom", -"cancel" => "cancel·la", +"Could not rename file" => "No es pot canviar el nom de fitxer", "replaced {new_name} with {old_name}" => "s'ha substituït {old_name} per {new_name}", "undo" => "desfés", -"perform delete operation" => "executa d'operació d'esborrar", -"1 file uploading" => "1 fitxer pujant", -"files uploading" => "fitxers pujant", +"Error deleting file." => "Error en esborrar el fitxer.", +"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetes"), +"_%n file_::_%n files_" => array("%n fitxer","%n fitxers"), +"{dirs} and {files}" => "{dirs} i {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Pujant %n fitxer","Pujant %n fitxers"), "'.' is an invalid file name." => "'.' és un nom no vàlid per un fitxer.", -"File name cannot be empty." => "El nom del fitxer no pot ser buit.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.", "Your storage is full, files can not be updated or synced anymore!" => "El vostre espai d'emmagatzemament és ple, els fitxers ja no es poden actualitzar o sincronitzar!", "Your storage is almost full ({usedSpacePercent}%)" => "El vostre espai d'emmagatzemament és gairebé ple ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "L'aplicació d'encriptació està activada però les claus no estan inicialitzades, sortiu i acrediteu-vos de nou.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "La clau privada de l'aplicació d'encriptació no és vàlida! Actualitzeu la contrasenya de la clau privada a l'arranjament personal per recuperar els fitxers encriptats.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "L'encriptació s'ha desactivat però els vostres fitxers segueixen encriptats. Aneu a la vostra configuració personal per desencriptar els vostres fitxers.", "Your download is being prepared. This might take some time if the files are big." => "S'està preparant la baixada. Pot trigar una estona si els fitxers són grans.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nom de carpeta no vàlid. L'ús de 'Shared' està reservat per Owncloud", +"Error moving file" => "Error en moure el fitxer", +"Error" => "Error", "Name" => "Nom", "Size" => "Mida", "Modified" => "Modificat", -"1 folder" => "1 carpeta", -"{count} folders" => "{count} carpetes", -"1 file" => "1 fitxer", -"{count} files" => "{count} fitxers", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nom de carpeta no vàlid. L'ús de 'Shared' és reservat", "%s could not be renamed" => "%s no es pot canviar el nom", "Upload" => "Puja", "File handling" => "Gestió de fitxers", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Mida màxima d'entrada per fitxers ZIP", "Save" => "Desa", "New" => "Nou", +"New text file" => "Nou fitxer de text", "Text file" => "Fitxer de text", +"New folder" => "Carpeta nova", "Folder" => "Carpeta", "From link" => "Des d'enllaç", "Deleted files" => "Fitxers esborrats", "Cancel upload" => "Cancel·la la pujada", -"You don’t have write permissions here." => "No teniu permisos d'escriptura aquí.", +"You don’t have permission to upload or create files here" => "No teniu permisos per a pujar o crear els fitxers aquí", "Nothing in here. Upload something!" => "Res per aquí. Pugeu alguna cosa!", "Download" => "Baixa", -"Unshare" => "Deixa de compartir", +"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", "Current scanning" => "Actualment escanejant", -"directory" => "directori", -"directories" => "directoris", -"file" => "fitxer", -"files" => "fitxers", "Upgrading filesystem cache..." => "Actualitzant la memòria de cau del sistema de fitxers..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index ba94b9c5ac..75698f569e 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Nelze přesunout %s - již existuje soubor se stejným názvem", "Could not move %s" => "Nelze přesunout %s", +"File name cannot be empty." => "Název souboru nemůže být prázdný řetězec.", +"File name must not contain \"/\". Please choose a different name." => "Název souboru nesmí obsahovat \"/\". Vyberte prosím jiné jméno.", +"The name %s is already used in the folder %s. Please choose a different name." => "Název %s ve složce %s již existuje. Vyberte prosím jiné jméno.", +"Not a valid source" => "Neplatný zdroj", +"Error while downloading %s to %s" => "Chyba při stahování %s do %s", +"Error when creating the file" => "Chyba při vytváření souboru", +"Folder name cannot be empty." => "Název složky nemůže být prázdný.", +"Folder name must not contain \"/\". Please choose a different name." => "Název složky nesmí obsahovat \"/\". Zvolte prosím jiný.", +"Error when creating the folder" => "Chyba při vytváření složky", "Unable to set upload directory." => "Nelze nastavit adresář pro nahrané soubory.", "Invalid Token" => "Neplatný token", "No file was uploaded. Unknown error" => "Žádný soubor nebyl odeslán. Neznámá chyba", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Chybí adresář pro dočasné soubory", "Failed to write to disk" => "Zápis na disk selhal", "Not enough storage available" => "Nedostatek dostupného úložného prostoru", +"Upload failed. Could not get file info." => "Nahrávání selhalo. Nepodařilo se získat informace o souboru.", +"Upload failed. Could not find uploaded file" => "Nahrávání selhalo. Nepodařilo se nalézt nahraný soubor.", "Invalid directory." => "Neplatný adresář", "Files" => "Soubory", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář nebo jeho velikost je 0 bajtů", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nelze nahrát soubor {filename}, protože je to buď adresář nebo má velikost 0 bytů", "Not enough space available" => "Nedostatek volného místa", "Upload cancelled." => "Odesílání zrušeno.", +"Could not get result from server." => "Nepodařilo se získat výsledek ze serveru.", "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í.", -"URL cannot be empty." => "URL nemůže být prázdná.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Název složky nelze použít. Použití názvu 'Shared' je ownCloudem rezervováno", -"Error" => "Chyba", +"URL cannot be empty" => "URL nemůže zůstat prázdná", +"In the home folder 'Shared' is a reserved filename" => "V osobní složce je název 'Shared' rezervovaný", +"{new_name} already exists" => "{new_name} již existuje", +"Could not create file" => "Nepodařilo se vytvořit soubor", +"Could not create folder" => "Nepodařilo se vytvořit složku", "Share" => "Sdílet", "Delete permanently" => "Trvale odstranit", -"Delete" => "Smazat", "Rename" => "Přejmenovat", "Pending" => "Nevyřízené", -"{new_name} already exists" => "{new_name} již existuje", -"replace" => "nahradit", -"suggest name" => "navrhnout název", -"cancel" => "zrušit", +"Could not rename file" => "Nepodařilo se přejmenovat soubor", "replaced {new_name} with {old_name}" => "nahrazeno {new_name} s {old_name}", "undo" => "vrátit zpět", -"perform delete operation" => "provést smazání", -"1 file uploading" => "odesílá se 1 soubor", -"files uploading" => "soubory se odesílají", +"Error deleting file." => "Chyba při mazání souboru.", +"_%n folder_::_%n folders_" => array("%n složka","%n složky","%n složek"), +"_%n file_::_%n files_" => array("%n soubor","%n soubory","%n souborů"), +"{dirs} and {files}" => "{dirs} a {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Nahrávám %n soubor","Nahrávám %n soubory","Nahrávám %n souborů"), "'.' is an invalid file name." => "'.' je neplatným názvem souboru.", -"File name cannot be empty." => "Název souboru nemůže být prázdný řetězec.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neplatný název, znaky '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nejsou povoleny.", "Your storage is full, files can not be updated or synced anymore!" => "Vaše úložiště je plné, nelze aktualizovat ani synchronizovat soubory.", "Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložiště je téměř plné ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Chybný soukromý klíč pro šifrovací aplikaci. Aktualizujte prosím heslo svého soukromého klíče ve vašem osobním nastavení, abyste znovu získali přístup k vašim zašifrovaným souborům.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrování bylo vypnuto, vaše soubory jsou však stále zašifrované. Běžte prosím do osobního nastavení, kde soubory odšifrujete.", "Your download is being prepared. This might take some time if the files are big." => "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to chvíli trvat.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Neplatný název složky. Pojmenování 'Shared' je rezervováno pro vnitřní potřeby ownCloud", +"Error moving file" => "Chyba při přesunu souboru", +"Error" => "Chyba", "Name" => "Název", "Size" => "Velikost", "Modified" => "Upraveno", -"1 folder" => "1 složka", -"{count} folders" => "{count} složek", -"1 file" => "1 soubor", -"{count} files" => "{count} souborů", +"Invalid folder name. Usage of 'Shared' is reserved." => "Neplatný název složky. Použití 'Shared' je rezervováno.", "%s could not be renamed" => "%s nemůže být přejmenován", "Upload" => "Odeslat", "File handling" => "Zacházení se soubory", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Maximální velikost vstupu pro ZIP soubory", "Save" => "Uložit", "New" => "Nový", +"New text file" => "Nový textový soubor", "Text file" => "Textový soubor", +"New folder" => "Nová složka", "Folder" => "Složka", "From link" => "Z odkazu", "Deleted files" => "Odstraněné soubory", "Cancel upload" => "Zrušit odesílání", -"You don’t have write permissions here." => "Nemáte zde práva zápisu.", +"You don’t have permission to upload or create files here" => "Nemáte oprávnění zde nahrávat či vytvářet soubory", "Nothing in here. Upload something!" => "Žádný obsah. Nahrajte něco.", "Download" => "Stáhnout", -"Unshare" => "Zrušit sdílení", +"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.", "Current scanning" => "Aktuální prohledávání", -"directory" => "adresář", -"directories" => "adresáře", -"file" => "soubor", -"files" => "soubory", "Upgrading filesystem cache..." => "Aktualizuji mezipaměť souborového systému..." ); $PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/files/l10n/cy_GB.php b/apps/files/l10n/cy_GB.php index dc50b9cc3f..2a007761c5 100644 --- a/apps/files/l10n/cy_GB.php +++ b/apps/files/l10n/cy_GB.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Methwyd symud %s - Mae ffeil gyda'r enw hwn eisoes yn bodoli", "Could not move %s" => "Methwyd symud %s", +"File name cannot be empty." => "Does dim hawl cael enw ffeil gwag.", "No file was uploaded. Unknown error" => "Ni lwythwyd ffeil i fyny. Gwall anhysbys.", "There is no error, the file uploaded with success" => "Does dim gwall, llwythodd y ffeil i fyny'n llwyddiannus", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb upload_max_filesize yn php.ini:", @@ -13,40 +14,28 @@ $TRANSLATIONS = array( "Not enough storage available" => "Dim digon o le storio ar gael", "Invalid directory." => "Cyfeiriadur annilys.", "Files" => "Ffeiliau", -"Unable to upload your file as it is a directory or has 0 bytes" => "Methu llwytho'ch ffeil i fyny gan ei fod yn gyferiadur neu'n cynnwys 0 beit", "Not enough space available" => "Dim digon o le ar gael", "Upload cancelled." => "Diddymwyd llwytho i fyny.", "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.", -"URL cannot be empty." => "Does dim hawl cael URL gwag.", -"Error" => "Gwall", +"{new_name} already exists" => "{new_name} yn bodoli'n barod", "Share" => "Rhannu", "Delete permanently" => "Dileu'n barhaol", -"Delete" => "Dileu", "Rename" => "Ailenwi", "Pending" => "I ddod", -"{new_name} already exists" => "{new_name} yn bodoli'n barod", -"replace" => "amnewid", -"suggest name" => "awgrymu enw", -"cancel" => "diddymu", "replaced {new_name} with {old_name}" => "newidiwyd {new_name} yn lle {old_name}", "undo" => "dadwneud", -"perform delete operation" => "cyflawni gweithred dileu", -"1 file uploading" => "1 ffeil yn llwytho i fyny", -"files uploading" => "ffeiliau'n llwytho i fyny", +"_%n folder_::_%n folders_" => array("","","",""), +"_%n file_::_%n files_" => array("","","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","","",""), "'.' is an invalid file name." => "Mae '.' yn enw ffeil annilys.", -"File name cannot be empty." => "Does dim hawl cael enw ffeil gwag.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Enw annilys, ni chaniateir, '\\', '/', '<', '>', ':', '\"', '|', '?' na '*'.", "Your storage is full, files can not be updated or synced anymore!" => "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!", "Your storage is almost full ({usedSpacePercent}%)" => "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Wrthi'n paratoi i lwytho i lawr. Gall gymryd peth amser os yw'r ffeiliau'n fawr.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Enw plygell annilys. Mae'r defnydd o 'Shared' yn cael ei gadw gan Owncloud", +"Error" => "Gwall", "Name" => "Enw", "Size" => "Maint", "Modified" => "Addaswyd", -"1 folder" => "1 blygell", -"{count} folders" => "{count} plygell", -"1 file" => "1 ffeil", -"{count} files" => "{count} ffeil", "Upload" => "Llwytho i fyny", "File handling" => "Trafod ffeiliau", "Maximum upload size" => "Maint mwyaf llwytho i fyny", @@ -62,10 +51,9 @@ $TRANSLATIONS = array( "From link" => "Dolen o", "Deleted files" => "Ffeiliau ddilewyd", "Cancel upload" => "Diddymu llwytho i fyny", -"You don’t have write permissions here." => "Nid oes gennych hawliau ysgrifennu fan hyn.", "Nothing in here. Upload something!" => "Does dim byd fan hyn. Llwythwch rhywbeth i fyny!", "Download" => "Llwytho i lawr", -"Unshare" => "Dad-rannu", +"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.php b/apps/files/l10n/da.php index f066b702b3..93c9cb7592 100644 --- a/apps/files/l10n/da.php +++ b/apps/files/l10n/da.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Kunne ikke flytte %s - der findes allerede en fil med dette navn", "Could not move %s" => "Kunne ikke flytte %s", +"File name cannot be empty." => "Filnavnet kan ikke stå tomt.", "Unable to set upload directory." => "Ude af stand til at vælge upload mappe.", "Invalid Token" => "Ugyldig Token ", "No file was uploaded. Unknown error" => "Ingen fil blev uploadet. Ukendt fejl.", @@ -13,71 +14,61 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Manglende midlertidig mappe.", "Failed to write to disk" => "Fejl ved skrivning til disk.", "Not enough storage available" => "Der er ikke nok plads til rådlighed", +"Upload failed. Could not get file info." => "Upload fejlede. Kunne ikke hente filinformation.", +"Upload failed. Could not find uploaded file" => "Upload fejlede. Kunne ikke finde den uploadede fil.", "Invalid directory." => "Ugyldig mappe.", "Files" => "Filer", -"Unable to upload your file as it is a directory or has 0 bytes" => "Kan ikke uploade din fil - det er enten en mappe eller en fil med et indhold på 0 bytes.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.", "Not enough space available" => "ikke nok tilgængelig ledig plads ", "Upload cancelled." => "Upload afbrudt.", +"Could not get result from server." => "Kunne ikke hente resultat fra server.", "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.", -"URL cannot be empty." => "URLen kan ikke være tom.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldigt mappenavn. Brug af 'Shared' er forbeholdt af ownCloud", -"Error" => "Fejl", +"{new_name} already exists" => "{new_name} eksisterer allerede", "Share" => "Del", "Delete permanently" => "Slet permanent", -"Delete" => "Slet", "Rename" => "Omdøb", "Pending" => "Afventer", -"{new_name} already exists" => "{new_name} eksisterer allerede", -"replace" => "erstat", -"suggest name" => "foreslå navn", -"cancel" => "fortryd", "replaced {new_name} with {old_name}" => "erstattede {new_name} med {old_name}", "undo" => "fortryd", -"perform delete operation" => "udfør slet operation", -"1 file uploading" => "1 fil uploades", -"files uploading" => "uploader filer", +"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"), +"_%n file_::_%n files_" => array("%n fil","%n filer"), +"{dirs} and {files}" => "{dirs} og {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Uploader %n fil","Uploader %n filer"), "'.' is an invalid file name." => "'.' er et ugyldigt filnavn.", -"File name cannot be empty." => "Filnavnet kan ikke stå tomt.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.", "Your storage is full, files can not be updated or synced anymore!" => "Din opbevaringsplads er fyldt op, filer kan ikke opdateres eller synkroniseres længere!", "Your storage is almost full ({usedSpacePercent}%)" => "Din opbevaringsplads er næsten fyldt op ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Krypteringen blev deaktiveret, men dine filer er stadig krypteret. Gå venligst til dine personlige indstillinger for at dekryptere dine filer. ", "Your download is being prepared. This might take some time if the files are big." => "Dit download forberedes. Dette kan tage lidt tid ved større filer.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ugyldigt mappenavn. Brug af \"Shared\" er forbeholdt Owncloud", +"Error moving file" => "Fejl ved flytning af fil", +"Error" => "Fejl", "Name" => "Navn", "Size" => "Størrelse", "Modified" => "Ændret", -"1 folder" => "1 mappe", -"{count} folders" => "{count} mapper", -"1 file" => "1 fil", -"{count} files" => "{count} filer", "%s could not be renamed" => "%s kunne ikke omdøbes", "Upload" => "Upload", "File handling" => "Filhåndtering", "Maximum upload size" => "Maksimal upload-størrelse", "max. possible: " => "max. mulige: ", "Needed for multi-file and folder downloads." => "Nødvendigt for at kunne downloade mapper og flere filer ad gangen.", -"Enable ZIP-download" => "Muliggør ZIP-download", +"Enable ZIP-download" => "Tillad ZIP-download", "0 is unlimited" => "0 er ubegrænset", "Maximum input size for ZIP files" => "Maksimal størrelse på ZIP filer", "Save" => "Gem", "New" => "Ny", "Text file" => "Tekstfil", +"New folder" => "Ny Mappe", "Folder" => "Mappe", "From link" => "Fra link", "Deleted files" => "Slettede filer", "Cancel upload" => "Fortryd upload", -"You don’t have write permissions here." => "Du har ikke skriverettigheder her.", "Nothing in here. Upload something!" => "Her er tomt. Upload noget!", "Download" => "Download", -"Unshare" => "Fjern deling", +"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.", "Current scanning" => "Indlæser", -"directory" => "mappe", -"directories" => "Mapper", -"file" => "fil", -"files" => "filer", "Upgrading filesystem cache..." => "Opgraderer filsystems cachen..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index c89294bc09..4617eaef6f 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Konnte %s nicht verschieben. Eine Datei mit diesem Namen existiert bereits", "Could not move %s" => "Konnte %s nicht verschieben", +"File name cannot be empty." => "Der Dateiname darf nicht leer sein.", +"File name must not contain \"/\". Please choose a different name." => "Der Dateiname darf kein \"/\" enthalten. Bitte wähle einen anderen Namen.", +"The name %s is already used in the folder %s. Please choose a different name." => "Der Name %s wird bereits im Ordner %s benutzt. Bitte wähle einen anderen Namen.", +"Not a valid source" => "Keine gültige Quelle", +"Error while downloading %s to %s" => "Fehler beim Herunterladen von %s nach %s", +"Error when creating the file" => "Fehler beim Erstellen der Datei", +"Folder name cannot be empty." => "Der Ordner-Name darf nicht leer sein.", +"Folder name must not contain \"/\". Please choose a different name." => "Der Ordner-Name darf kein \"/\" enthalten. Bitte wähle einen anderen Namen.", +"Error when creating the folder" => "Fehler beim Erstellen des Ordners", "Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.", "Invalid Token" => "Ungültiges Merkmal", "No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Kein temporärer Ordner vorhanden", "Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte", "Not enough storage available" => "Nicht genug Speicher vorhanden.", +"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.", +"Upload failed. Could not find uploaded file" => "Hochladen fehlgeschlagen. Hochgeladene Datei konnte nicht gefunden werden.", "Invalid directory." => "Ungültiges Verzeichnis.", "Files" => "Dateien", -"Unable to upload your file as it is a directory or has 0 bytes" => "Deine Datei kann nicht hochgeladen werden, weil es sich um einen Ordner handelt oder 0 Bytes groß ist.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Not enough space available" => "Nicht genug Speicherplatz verfügbar", "Upload cancelled." => "Upload abgebrochen.", +"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.", "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.", -"URL cannot be empty." => "Die URL darf nicht leer sein.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Der Ordnername ist ungültig. Nur ownCloud kann den Ordner \"Shared\" anlegen", -"Error" => "Fehler", +"URL cannot be empty" => "Die URL darf nicht leer sein", +"In the home folder 'Shared' is a reserved filename" => "Das Benutzerverzeichnis 'Shared' ist ein reservierter Dateiname", +"{new_name} already exists" => "{new_name} existiert bereits", +"Could not create file" => "Die Datei konnte nicht erstellt werden", +"Could not create folder" => "Der Ordner konnte nicht erstellt werden", "Share" => "Teilen", "Delete permanently" => "Endgültig löschen", -"Delete" => "Löschen", "Rename" => "Umbenennen", "Pending" => "Ausstehend", -"{new_name} already exists" => "{new_name} existiert bereits", -"replace" => "ersetzen", -"suggest name" => "Namen vorschlagen", -"cancel" => "abbrechen", +"Could not rename file" => "Die Datei konnte nicht umbenannt werden", "replaced {new_name} with {old_name}" => "{old_name} ersetzt durch {new_name}", "undo" => "rückgängig machen", -"perform delete operation" => "Löschvorgang ausführen", -"1 file uploading" => "1 Datei wird hochgeladen", -"files uploading" => "Dateien werden hoch geladen", +"Error deleting file." => "Fehler beim Löschen der Datei.", +"_%n folder_::_%n folders_" => array("%n Ordner","%n Ordner"), +"_%n file_::_%n files_" => array("%n Datei","%n Dateien"), +"{dirs} and {files}" => "{dirs} und {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hochgeladen","%n Dateien werden hochgeladen"), "'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.", -"File name cannot be empty." => "Der Dateiname darf nicht leer sein.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.", "Your storage is full, files can not be updated or synced anymore!" => "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", "Your storage is almost full ({usedSpacePercent}%)" => "Dein Speicher ist fast voll ({usedSpacePercent}%)", +"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 melden Dich nochmals ab und wieder an.", +"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 was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind Deine Dateien nach wie vor verschlüsselt. Bitte gehe zu Deinen persönlichen Einstellungen, um Deine Dateien zu entschlüsseln.", "Your download is being prepared. This might take some time if the files are big." => "Dein Download wird vorbereitet. Dies kann bei größeren Dateien etwas dauern.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ungültiger Verzeichnisname. Die Nutzung von \"Shared\" ist ownCloud vorbehalten.", +"Error moving file" => "Fehler beim Verschieben der Datei", +"Error" => "Fehler", "Name" => "Name", "Size" => "Größe", "Modified" => "Geändert", -"1 folder" => "1 Ordner", -"{count} folders" => "{count} Ordner", -"1 file" => "1 Datei", -"{count} files" => "{count} Dateien", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ungültiger Verzeichnisname. Die Nutzung von 'Shared' ist reserviert.", "%s could not be renamed" => "%s konnte nicht umbenannt werden", "Upload" => "Hochladen", "File handling" => "Dateibehandlung", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Maximale Größe für ZIP-Dateien", "Save" => "Speichern", "New" => "Neu", +"New text file" => "Neue Textdatei", "Text file" => "Textdatei", +"New folder" => "Neuer Ordner", "Folder" => "Ordner", "From link" => "Von einem Link", "Deleted files" => "Gelöschte Dateien", "Cancel upload" => "Upload abbrechen", -"You don’t have write permissions here." => "Du hast hier keine Schreib-Berechtigung.", +"You don’t have permission to upload or create files here" => "Du besitzt hier keine Berechtigung, um Dateien hochzuladen oder zu erstellen", "Nothing in here. Upload something!" => "Alles leer. Lade etwas hoch!", "Download" => "Herunterladen", -"Unshare" => "Freigabe aufheben", +"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.", "Current scanning" => "Scanne", -"directory" => "Verzeichnis", -"directories" => "Verzeichnisse", -"file" => "Datei", -"files" => "Dateien", "Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/de_AT.php b/apps/files/l10n/de_AT.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/de_AT.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/de_CH.php b/apps/files/l10n/de_CH.php new file mode 100644 index 0000000000..b950429346 --- /dev/null +++ b/apps/files/l10n/de_CH.php @@ -0,0 +1,68 @@ + "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.", +"Could not move %s" => "Konnte %s nicht verschieben", +"File name cannot be empty." => "Der Dateiname darf nicht leer sein.", +"Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.", +"Invalid Token" => "Ungültiges Merkmal", +"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler", +"There is no error, the file uploaded with success" => "Es ist kein Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Datei ist grösser, als die MAX_FILE_SIZE Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", +"The uploaded file was only partially uploaded" => "Die Datei konnte nur teilweise übertragen werden", +"No file was uploaded" => "Keine Datei konnte übertragen werden.", +"Missing a temporary folder" => "Kein temporärer Ordner vorhanden", +"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte", +"Not enough storage available" => "Nicht genug Speicher vorhanden.", +"Invalid directory." => "Ungültiges Verzeichnis.", +"Files" => "Dateien", +"Not enough space available" => "Nicht genügend Speicherplatz verfügbar", +"Upload cancelled." => "Upload abgebrochen.", +"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.", +"{new_name} already exists" => "{new_name} existiert bereits", +"Share" => "Teilen", +"Delete permanently" => "Endgültig löschen", +"Rename" => "Umbenennen", +"Pending" => "Ausstehend", +"replaced {new_name} with {old_name}" => "{old_name} wurde ersetzt durch {new_name}", +"undo" => "rückgängig machen", +"_%n folder_::_%n folders_" => array("","%n Ordner"), +"_%n file_::_%n files_" => array("","%n Dateien"), +"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hochgeladen","%n Dateien werden hochgeladen"), +"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, «\\», «/», «<», «>», «:», «\"», «|», «?» und «*» sind nicht zulässig.", +"Your storage is full, files can not be updated or synced anymore!" => "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", +"Your storage is almost full ({usedSpacePercent}%)" => "Ihr Speicher ist fast voll ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.", +"Your download is being prepared. This might take some time if the files are big." => "Ihr Download wird vorbereitet. Dies kann bei grösseren Dateien etwas dauern.", +"Error" => "Fehler", +"Name" => "Name", +"Size" => "Grösse", +"Modified" => "Geändert", +"%s could not be renamed" => "%s konnte nicht umbenannt werden", +"Upload" => "Hochladen", +"File handling" => "Dateibehandlung", +"Maximum upload size" => "Maximale Upload-Grösse", +"max. possible: " => "maximal möglich:", +"Needed for multi-file and folder downloads." => "Für Mehrfachdatei- und Ordnerdownloads benötigt:", +"Enable ZIP-download" => "ZIP-Download aktivieren", +"0 is unlimited" => "0 bedeutet unbegrenzt", +"Maximum input size for ZIP files" => "Maximale Grösse für ZIP-Dateien", +"Save" => "Speichern", +"New" => "Neu", +"Text file" => "Textdatei", +"New folder" => "Neues Verzeichnis", +"Folder" => "Ordner", +"From link" => "Von einem Link", +"Deleted files" => "Gelöschte Dateien", +"Cancel upload" => "Upload abbrechen", +"Nothing in here. Upload something!" => "Alles leer. Laden Sie etwas hoch!", +"Download" => "Herunterladen", +"Delete" => "Löschen", +"Upload too large" => "Der Upload ist zu gross", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgrösse für Uploads auf diesem Server.", +"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.", +"Current scanning" => "Scanne", +"Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..." +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index 6a4cbcef06..2502b540cd 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.", "Could not move %s" => "Konnte %s nicht verschieben", +"File name cannot be empty." => "Der Dateiname darf nicht leer sein.", +"File name must not contain \"/\". Please choose a different name." => "Der Dateiname darf kein \"/\" enthalten. Bitte wählen Sie einen anderen Namen.", +"The name %s is already used in the folder %s. Please choose a different name." => "Der Name %s wird bereits im Ordner %s benutzt. Bitte wählen Sie einen anderen Namen.", +"Not a valid source" => "Keine gültige Quelle", +"Error while downloading %s to %s" => "Fehler beim Herunterladen von %s nach %s", +"Error when creating the file" => "Fehler beim Erstellen der Datei", +"Folder name cannot be empty." => "Der Ordner-Name darf nicht leer sein.", +"Folder name must not contain \"/\". Please choose a different name." => "Der Ordner-Name darf kein \"/\" enthalten. Bitte wählen Sie einen anderen Namen.", +"Error when creating the folder" => "Fehler beim Erstellen des Ordners", "Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.", "Invalid Token" => "Ungültiges Merkmal", "No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Kein temporärer Ordner vorhanden", "Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte", "Not enough storage available" => "Nicht genug Speicher vorhanden.", +"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Die Dateiinformationen konnten nicht abgerufen werden.", +"Upload failed. Could not find uploaded file" => "Hochladen fehlgeschlagen. Die hochgeladene Datei konnte nicht gefunden werden.", "Invalid directory." => "Ungültiges Verzeichnis.", "Files" => "Dateien", -"Unable to upload your file as it is a directory or has 0 bytes" => "Ihre Datei kann nicht hochgeladen werden, weil es sich um einen Ordner handelt oder 0 Bytes groß ist.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Not enough space available" => "Nicht genügend Speicherplatz verfügbar", "Upload cancelled." => "Upload abgebrochen.", +"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.", "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.", -"URL cannot be empty." => "Die URL darf nicht leer sein.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten.", -"Error" => "Fehler", +"URL cannot be empty" => "Die URL darf nicht leer sein", +"In the home folder 'Shared' is a reserved filename" => "Das Benutzerverzeichnis 'Shared' ist ein reservierter Dateiname", +"{new_name} already exists" => "{new_name} existiert bereits", +"Could not create file" => "Die Datei konnte nicht erstellt werden", +"Could not create folder" => "Der Ordner konnte nicht erstellt werden", "Share" => "Teilen", "Delete permanently" => "Endgültig löschen", -"Delete" => "Löschen", "Rename" => "Umbenennen", "Pending" => "Ausstehend", -"{new_name} already exists" => "{new_name} existiert bereits", -"replace" => "ersetzen", -"suggest name" => "Namen vorschlagen", -"cancel" => "abbrechen", +"Could not rename file" => "Die Datei konnte nicht umbenannt werden", "replaced {new_name} with {old_name}" => "{old_name} wurde ersetzt durch {new_name}", "undo" => "rückgängig machen", -"perform delete operation" => "Löschvorgang ausführen", -"1 file uploading" => "1 Datei wird hochgeladen", -"files uploading" => "Dateien werden hoch geladen", +"Error deleting file." => "Fehler beim Löschen der Datei.", +"_%n folder_::_%n folders_" => array("%n Ordner","%n Ordner"), +"_%n file_::_%n files_" => array("%n Datei","%n Dateien"), +"{dirs} and {files}" => "{dirs} und {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hoch geladen","%n Dateien werden hoch geladen"), "'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.", -"File name cannot be empty." => "Der Dateiname darf nicht leer sein.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.", "Your storage is full, files can not be updated or synced anymore!" => "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", "Your storage is almost full ({usedSpacePercent}%)" => "Ihr Speicher ist fast voll ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Verschlüsselung-App ist aktiviert, aber Ihre Schlüssel sind nicht initialisiert. Bitte melden sich nochmals ab und wieder an.", +"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 aktualisieren Sie Ihr privates Schlüssel-Passwort, um den Zugriff auf Ihre verschlüsselten Dateien wiederherzustellen.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.", "Your download is being prepared. This might take some time if the files are big." => "Ihr Download wird vorbereitet. Dies kann bei größeren Dateien etwas dauern.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ungültiger Verzeichnisname. Die Nutzung von \"Shared\" ist ownCloud vorbehalten", +"Error moving file" => "Fehler beim Verschieben der Datei", +"Error" => "Fehler", "Name" => "Name", "Size" => "Größe", "Modified" => "Geändert", -"1 folder" => "1 Ordner", -"{count} folders" => "{count} Ordner", -"1 file" => "1 Datei", -"{count} files" => "{count} Dateien", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ungültiger Verzeichnisname. Die Nutzung von 'Shared' ist reserviert.", "%s could not be renamed" => "%s konnte nicht umbenannt werden", "Upload" => "Hochladen", "File handling" => "Dateibehandlung", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Maximale Größe für ZIP-Dateien", "Save" => "Speichern", "New" => "Neu", +"New text file" => "Neue Textdatei", "Text file" => "Textdatei", +"New folder" => "Neues Verzeichnis", "Folder" => "Ordner", "From link" => "Von einem Link", "Deleted files" => "Gelöschte Dateien", "Cancel upload" => "Upload abbrechen", -"You don’t have write permissions here." => "Sie haben hier keine Schreib-Berechtigungen.", +"You don’t have permission to upload or create files here" => "Sie besitzen hier keine Berechtigung Dateien hochzuladen oder zu erstellen", "Nothing in here. Upload something!" => "Alles leer. Laden Sie etwas hoch!", "Download" => "Herunterladen", -"Unshare" => "Freigabe aufheben", +"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.", "Current scanning" => "Scanne", -"directory" => "Verzeichnis", -"directories" => "Verzeichnisse", -"file" => "Datei", -"files" => "Dateien", "Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php index 0246ba2a89..cab7b2c6e3 100644 --- a/apps/files/l10n/el.php +++ b/apps/files/l10n/el.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Αδυναμία μετακίνησης του %s - υπάρχει ήδη αρχείο με αυτό το όνομα", "Could not move %s" => "Αδυναμία μετακίνησης του %s", +"File name cannot be empty." => "Το όνομα αρχείου δεν μπορεί να είναι κενό.", "Unable to set upload directory." => "Αδυναμία ορισμού καταλόγου αποστολής.", "Invalid Token" => "Μη έγκυρο Token", "No file was uploaded. Unknown error" => "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα", @@ -15,41 +16,30 @@ $TRANSLATIONS = array( "Not enough storage available" => "Μη επαρκής διαθέσιμος αποθηκευτικός χώρος", "Invalid directory." => "Μη έγκυρος φάκελος.", "Files" => "Αρχεία", -"Unable to upload your file as it is a directory or has 0 bytes" => "Αδυναμία στην αποστολή του αρχείου σας αφού είναι φάκελος ή έχει 0 bytes", "Not enough space available" => "Δεν υπάρχει αρκετός διαθέσιμος χώρος", "Upload cancelled." => "Η αποστολή ακυρώθηκε.", "File upload is in progress. Leaving the page now will cancel the upload." => "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.", -"URL cannot be empty." => "Η URL δεν μπορεί να είναι κενή.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Μη έγκυρο όνομα φακέλου. Η χρήση του 'Κοινόχρηστος' χρησιμοποιείται από το ownCloud", -"Error" => "Σφάλμα", +"{new_name} already exists" => "{new_name} υπάρχει ήδη", "Share" => "Διαμοιρασμός", "Delete permanently" => "Μόνιμη διαγραφή", -"Delete" => "Διαγραφή", "Rename" => "Μετονομασία", "Pending" => "Εκκρεμεί", -"{new_name} already exists" => "{new_name} υπάρχει ήδη", -"replace" => "αντικατέστησε", -"suggest name" => "συνιστώμενο όνομα", -"cancel" => "ακύρωση", "replaced {new_name} with {old_name}" => "αντικαταστάθηκε το {new_name} με {old_name}", "undo" => "αναίρεση", -"perform delete operation" => "εκτέλεση της διαδικασίας διαγραφής", -"1 file uploading" => "1 αρχείο ανεβαίνει", -"files uploading" => "αρχεία ανεβαίνουν", +"_%n folder_::_%n folders_" => array("%n φάκελος","%n φάκελοι"), +"_%n file_::_%n files_" => array("%n αρχείο","%n αρχεία"), +"_Uploading %n file_::_Uploading %n files_" => array("Ανέβασμα %n αρχείου","Ανέβασμα %n αρχείων"), "'.' is an invalid file name." => "'.' είναι μη έγκυρο όνομα αρχείου.", -"File name cannot be empty." => "Το όνομα αρχείου δεν μπορεί να είναι κενό.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Μη έγκυρο όνομα, '\\', '/', '<', '>', ':', '\"', '|', '?' και '*' δεν επιτρέπονται.", "Your storage is full, files can not be updated or synced anymore!" => "Ο αποθηκευτικός σας χώρος είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!", "Your storage is almost full ({usedSpacePercent}%)" => "Ο αποθηκευτικός χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Η κρυπτογράφηση απενεργοποιήθηκε, αλλά τα αρχεία σας είναι ακόμα κρυπτογραφημένα. Παρακαλούμε απενεργοποιήσετε την κρυπτογράφηση αρχείων από τις προσωπικές σας ρυθμίσεις", "Your download is being prepared. This might take some time if the files are big." => "Η λήψη προετοιμάζεται. Αυτό μπορεί να πάρει ώρα εάν τα αρχεία έχουν μεγάλο μέγεθος.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Μη έγκυρο όνομα φακέλου. Η χρήση του 'Κοινόχρηστος' χρησιμοποιείται από ο Owncloud", +"Error moving file" => "Σφάλμα κατά τη μετακίνηση του αρχείου", +"Error" => "Σφάλμα", "Name" => "Όνομα", "Size" => "Μέγεθος", "Modified" => "Τροποποιήθηκε", -"1 folder" => "1 φάκελος", -"{count} folders" => "{count} φάκελοι", -"1 file" => "1 αρχείο", -"{count} files" => "{count} αρχεία", "%s could not be renamed" => "Αδυναμία μετονομασίας του %s", "Upload" => "Μεταφόρτωση", "File handling" => "Διαχείριση αρχείων", @@ -62,22 +52,18 @@ $TRANSLATIONS = array( "Save" => "Αποθήκευση", "New" => "Νέο", "Text file" => "Αρχείο κειμένου", +"New folder" => "Νέος κατάλογος", "Folder" => "Φάκελος", "From link" => "Από σύνδεσμο", "Deleted files" => "Διαγραμμένα αρχεία", "Cancel upload" => "Ακύρωση αποστολής", -"You don’t have write permissions here." => "Δεν έχετε δικαιώματα εγγραφής εδώ.", "Nothing in here. Upload something!" => "Δεν υπάρχει τίποτα εδώ. Ανεβάστε κάτι!", "Download" => "Λήψη", -"Unshare" => "Σταμάτημα διαμοιρασμού", +"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." => "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", "Current scanning" => "Τρέχουσα ανίχνευση", -"directory" => "κατάλογος", -"directories" => "κατάλογοι", -"file" => "αρχείο", -"files" => "αρχεία", "Upgrading filesystem cache..." => "Ενημέρωση της μνήμης cache του συστήματος αρχείων..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/en@pirate.php b/apps/files/l10n/en@pirate.php index 339f94ae97..128f527aef 100644 --- a/apps/files/l10n/en@pirate.php +++ b/apps/files/l10n/en@pirate.php @@ -1,5 +1,8 @@ array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "Download" => "Download" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php new file mode 100644 index 0000000000..e45c4bf4ed --- /dev/null +++ b/apps/files/l10n/en_GB.php @@ -0,0 +1,93 @@ + "Could not move %s - File with this name already exists", +"Could not move %s" => "Could not move %s", +"File name cannot be empty." => "File name cannot be empty.", +"File name must not contain \"/\". Please choose a different name." => "File name must not contain \"/\". Please choose a different name.", +"The name %s is already used in the folder %s. Please choose a different name." => "The name %s is already used in the folder %s. Please choose a different name.", +"Not a valid source" => "Not a valid source", +"Error while downloading %s to %s" => "Error whilst downloading %s to %s", +"Error when creating the file" => "Error when creating the file", +"Folder name cannot be empty." => "Folder name cannot be empty.", +"Folder name must not contain \"/\". Please choose a different name." => "Folder name must not contain \"/\". Please choose a different name.", +"Error when creating the folder" => "Error when creating the folder", +"Unable to set upload directory." => "Unable to set upload directory.", +"Invalid Token" => "Invalid Token", +"No file was uploaded. Unknown error" => "No file was uploaded. Unknown error", +"There is no error, the file uploaded with success" => "There is no error, the file uploaded successfully", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "The uploaded file exceeds the upload_max_filesize directive in php.ini: ", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", +"The uploaded file was only partially uploaded" => "The uploaded file was only partially uploaded", +"No file was uploaded" => "No file was uploaded", +"Missing a temporary folder" => "Missing a temporary folder", +"Failed to write to disk" => "Failed to write to disk", +"Not enough storage available" => "Not enough storage available", +"Upload failed. Could not get file info." => "Upload failed. Could not get file info.", +"Upload failed. Could not find uploaded file" => "Upload failed. Could not find uploaded file", +"Invalid directory." => "Invalid directory.", +"Files" => "Files", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Unable to upload {filename} as it is a directory or has 0 bytes", +"Not enough space available" => "Not enough space available", +"Upload cancelled." => "Upload cancelled.", +"Could not get result from server." => "Could not get result from server.", +"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.", +"URL cannot be empty" => "URL cannot be empty", +"In the home folder 'Shared' is a reserved filename" => "In the home folder 'Shared' is a reserved file name", +"{new_name} already exists" => "{new_name} already exists", +"Could not create file" => "Could not create file", +"Could not create folder" => "Could not create folder", +"Share" => "Share", +"Delete permanently" => "Delete permanently", +"Rename" => "Rename", +"Pending" => "Pending", +"Could not rename file" => "Could not rename file", +"replaced {new_name} with {old_name}" => "replaced {new_name} with {old_name}", +"undo" => "undo", +"Error deleting file." => "Error deleting file.", +"_%n folder_::_%n folders_" => array("%n folder","%n folders"), +"_%n file_::_%n files_" => array("%n file","%n files"), +"{dirs} and {files}" => "{dirs} and {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Uploading %n file","Uploading %n files"), +"'.' is an invalid file name." => "'.' is an invalid file name.", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Invalid name: '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.", +"Your storage is full, files can not be updated or synced anymore!" => "Your storage is full, files can not be updated or synced anymore!", +"Your storage is almost full ({usedSpacePercent}%)" => "Your storage is almost full ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Encryption App is enabled but your keys are not initialised, please log-out and log-in again", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.", +"Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.", +"Error moving file" => "Error moving file", +"Error" => "Error", +"Name" => "Name", +"Size" => "Size", +"Modified" => "Modified", +"Invalid folder name. Usage of 'Shared' is reserved." => "Invalid folder name. Usage of 'Shared' is reserved.", +"%s could not be renamed" => "%s could not be renamed", +"Upload" => "Upload", +"File handling" => "File handling", +"Maximum upload size" => "Maximum upload size", +"max. possible: " => "max. possible: ", +"Needed for multi-file and folder downloads." => "Needed for multi-file and folder downloads.", +"Enable ZIP-download" => "Enable ZIP-download", +"0 is unlimited" => "0 is unlimited", +"Maximum input size for ZIP files" => "Maximum input size for ZIP files", +"Save" => "Save", +"New" => "New", +"New text file" => "New text file", +"Text file" => "Text file", +"New folder" => "New folder", +"Folder" => "Folder", +"From link" => "From link", +"Deleted files" => "Deleted files", +"Cancel upload" => "Cancel upload", +"You don’t have permission to upload or create files here" => "You don’t have permission to upload or create files here", +"Nothing in here. Upload something!" => "Nothing in here. Upload something!", +"Download" => "Download", +"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.", +"Current scanning" => "Current scanning", +"Upgrading filesystem cache..." => "Upgrading filesystem cache..." +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index 726abb1334..81cfa03fd6 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -2,6 +2,16 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Ne eblis movi %s: dosiero kun ĉi tiu nomo jam ekzistas", "Could not move %s" => "Ne eblis movi %s", +"File name cannot be empty." => "Dosiernomo devas ne malpleni.", +"File name must not contain \"/\". Please choose a different name." => "La dosieronomo ne devas enhavi “/”. Bonvolu elekti malsaman nomon.", +"The name %s is already used in the folder %s. Please choose a different name." => "La nomo %s jam uziĝas en la dosierujo %s. Bonvolu elekti malsaman nomon.", +"Not a valid source" => "Nevalida fonto", +"Error while downloading %s to %s" => "Eraris elŝuto de %s al %s", +"Error when creating the file" => "Eraris la kreo de la dosiero", +"Folder name cannot be empty." => "La dosierujnomo ne povas malpleni.", +"Folder name must not contain \"/\". Please choose a different name." => "La dosiernomo ne devas enhavi “/”. Bonvolu elekti malsaman nomon.", +"Error when creating the folder" => "Eraris la kreo de la dosierujo", +"Unable to set upload directory." => "Ne povis agordiĝi la alŝuta dosierujo.", "No file was uploaded. Unknown error" => "Neniu dosiero alŝutiĝis. Nekonata eraro.", "There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "La dosiero alŝutita superas la regulon upload_max_filesize el php.ini: ", @@ -11,43 +21,41 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Mankas provizora dosierujo.", "Failed to write to disk" => "Malsukcesis skribo al disko", "Not enough storage available" => "Ne haveblas sufiĉa memoro", +"Upload failed. Could not get file info." => "La alŝuto malsukcesis. Ne povis ekhaviĝi informo pri dosiero.", +"Upload failed. Could not find uploaded file" => "La alŝuto malsukcesis. Ne troviĝis alŝutota dosiero.", "Invalid directory." => "Nevalida dosierujo.", "Files" => "Dosieroj", -"Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Not enough space available" => "Ne haveblas sufiĉa spaco", "Upload cancelled." => "La alŝuto nuliĝis.", +"Could not get result from server." => "Ne povis ekhaviĝi rezulto el la servilo.", "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.", -"URL cannot be empty." => "URL ne povas esti malplena.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nevalida dosierujnomo. La uzo de “Shared” estas rezervita de ownCloud.", -"Error" => "Eraro", +"URL cannot be empty" => "La URL ne povas malpleni", +"{new_name} already exists" => "{new_name} jam ekzistas", +"Could not create file" => "Ne povis kreiĝi dosiero", +"Could not create folder" => "Ne povis kreiĝi dosierujo", "Share" => "Kunhavigi", "Delete permanently" => "Forigi por ĉiam", -"Delete" => "Forigi", "Rename" => "Alinomigi", "Pending" => "Traktotaj", -"{new_name} already exists" => "{new_name} jam ekzistas", -"replace" => "anstataŭigi", -"suggest name" => "sugesti nomon", -"cancel" => "nuligi", +"Could not rename file" => "Ne povis alinomiĝi dosiero", "replaced {new_name} with {old_name}" => "anstataŭiĝis {new_name} per {old_name}", "undo" => "malfari", -"perform delete operation" => "plenumi forigan operacion", -"1 file uploading" => "1 dosiero estas alŝutata", -"files uploading" => "dosieroj estas alŝutataj", +"_%n folder_::_%n folders_" => array("%n dosierujo","%n dosierujoj"), +"_%n file_::_%n files_" => array("%n dosiero","%n dosieroj"), +"{dirs} and {files}" => "{dirs} kaj {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Alŝutatas %n dosiero","Alŝutatas %n dosieroj"), "'.' is an invalid file name." => "'.' ne estas valida dosiernomo.", -"File name cannot be empty." => "Dosiernomo devas ne malpleni.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nevalida nomo: “\\”, “/”, “<”, “>”, “:”, “\"”, “|”, “?” kaj “*” ne permesatas.", "Your storage is full, files can not be updated or synced anymore!" => "Via memoro plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!", "Your storage is almost full ({usedSpacePercent}%)" => "Via memoro preskaŭ plenas ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Via elŝuto pretiĝatas. Ĉi tio povas daŭri iom da tempo se la dosieroj grandas.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nevalida dosierujnomo. Uzo de “Shared” rezervatas de Owncloud.", +"Error moving file" => "Eraris movo de dosiero", +"Error" => "Eraro", "Name" => "Nomo", "Size" => "Grando", "Modified" => "Modifita", -"1 folder" => "1 dosierujo", -"{count} folders" => "{count} dosierujoj", -"1 file" => "1 dosiero", -"{count} files" => "{count} dosierujoj", +"%s could not be renamed" => "%s ne povis alinomiĝi", "Upload" => "Alŝuti", "File handling" => "Dosieradministro", "Maximum upload size" => "Maksimuma alŝutogrando", @@ -59,20 +67,19 @@ $TRANSLATIONS = array( "Save" => "Konservi", "New" => "Nova", "Text file" => "Tekstodosiero", +"New folder" => "Nova dosierujo", "Folder" => "Dosierujo", "From link" => "El ligilo", "Deleted files" => "Forigitaj dosieroj", "Cancel upload" => "Nuligi alŝuton", -"You don’t have write permissions here." => "Vi ne havas permeson skribi ĉi tie.", +"You don’t have permission to upload or create files here" => "Vi ne havas permeson alŝuti aŭ krei dosierojn ĉi tie", "Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!", "Download" => "Elŝuti", -"Unshare" => "Malkunhavigi", +"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.", "Current scanning" => "Nuna skano", -"file" => "dosiero", -"files" => "dosieroj", "Upgrading filesystem cache..." => "Ĝisdatiĝas dosiersistema kaŝmemoro..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index 407a783a85..84e11df681 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -1,83 +1,93 @@ "No se pudo mover %s - Un archivo con ese nombre ya existe.", +"Could not move %s - File with this name already exists" => "No se pudo mover %s - Ya existe un archivo con ese nombre.", "Could not move %s" => "No se pudo mover %s", +"File name cannot be empty." => "El nombre de archivo no puede estar vacío.", +"File name must not contain \"/\". Please choose a different name." => "El nombre del archivo, NO puede contener el simbolo\"/\", por favor elija un nombre diferente.", +"The name %s is already used in the folder %s. Please choose a different name." => "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", +"Not a valid source" => "No es un origen válido", +"Error while downloading %s to %s" => "Error mientras se descargaba %s a %s", +"Error when creating the file" => "Error al crear el archivo", +"Folder name cannot be empty." => "El nombre de la carpeta no puede estar vacío.", +"Folder name must not contain \"/\". Please choose a different name." => "El nombre de la carpeta, NO puede contener el simbolo\"/\", por favor elija un nombre diferente.", +"Error when creating the folder" => "Error al crear la carpeta.", "Unable to set upload directory." => "Incapaz de crear directorio de subida.", "Invalid Token" => "Token Inválido", "No file was uploaded. Unknown error" => "No se subió ningún archivo. Error desconocido", -"There is no error, the file uploaded with success" => "No hay ningún error, el archivo se ha subido con éxito", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "El archivo subido sobrepasa la directiva upload_max_filesize en php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo subido sobrepasa la directiva MAX_FILE_SIZE especificada en el formulario HTML", +"There is no error, the file uploaded with success" => "No hubo ningún problema, el archivo se subió con éxito", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "El archivo subido sobrepasa la directiva 'upload_max_filesize' en php.ini:", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo subido sobrepasa la directiva 'MAX_FILE_SIZE' especificada en el formulario HTML", "The uploaded file was only partially uploaded" => "El archivo subido fue sólo subido parcialmente", "No file was uploaded" => "No se subió ningún archivo", "Missing a temporary folder" => "Falta la carpeta temporal", "Failed to write to disk" => "Falló al escribir al disco", "Not enough storage available" => "No hay suficiente espacio disponible", +"Upload failed. Could not get file info." => "Actualización fallida. No se pudo obtener información del archivo.", +"Upload failed. Could not find uploaded file" => "Actualización fallida. No se pudo encontrar el archivo subido", "Invalid directory." => "Directorio inválido.", "Files" => "Archivos", -"Unable to upload your file as it is a directory or has 0 bytes" => "Incapaz de subir su archivo, es un directorio o tiene 0 bytes", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Not enough space available" => "No hay suficiente espacio disponible", "Upload cancelled." => "Subida cancelada.", -"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 cancelará la subida.", -"URL cannot be empty." => "La URL no puede estar vacía.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nombre de carpeta invalido. El uso de \"Shared\" está reservado por ownCloud", -"Error" => "Error", +"Could not get result from server." => "No se pudo obtener respuesta del servidor.", +"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.", +"URL cannot be empty" => "La dirección URL no puede estar vacía", +"In the home folder 'Shared' is a reserved filename" => "En la carpeta de inicio, 'Shared' es un nombre reservado", +"{new_name} already exists" => "{new_name} ya existe", +"Could not create file" => "No se pudo crear el archivo", +"Could not create folder" => "No se pudo crear la carpeta", "Share" => "Compartir", "Delete permanently" => "Eliminar permanentemente", -"Delete" => "Eliminar", "Rename" => "Renombrar", "Pending" => "Pendiente", -"{new_name} already exists" => "{new_name} ya existe", -"replace" => "reemplazar", -"suggest name" => "sugerir nombre", -"cancel" => "cancelar", +"Could not rename file" => "No se pudo renombrar el archivo", "replaced {new_name} with {old_name}" => "reemplazado {new_name} con {old_name}", "undo" => "deshacer", -"perform delete operation" => "Realizar operación de borrado", -"1 file uploading" => "subiendo 1 archivo", -"files uploading" => "subiendo archivos", +"Error deleting file." => "Error borrando el archivo.", +"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetas"), +"_%n file_::_%n files_" => array("%n archivo","%n archivos"), +"{dirs} and {files}" => "{dirs} y {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"), "'.' is an invalid file name." => "'.' no es un nombre de archivo válido.", -"File name cannot be empty." => "El nombre de archivo no puede estar vacío.", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre Invalido, \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ", -"Your storage is full, files can not be updated or synced anymore!" => "Su almacenamiento está lleno, ¡no se pueden actualizar o sincronizar más!", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre inválido, los caracteres \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ", +"Your storage is full, files can not be updated or synced anymore!" => "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!", "Your storage is almost full ({usedSpacePercent}%)" => "Su almacenamiento está casi lleno ({usedSpacePercent}%)", -"Your download is being prepared. This might take some time if the files are big." => "Su descarga está siendo preparada. Esto puede tardar algún tiempo si los archivos son grandes.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nombre de carpeta no es válido. El uso de \"Shared\" está reservado por Owncloud", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "La app de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "La clave privada no es válida para la app de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "El cifrado ha sido deshabilitado pero tus archivos permanecen cifrados. Por favor, ve a tus ajustes personales para descifrar tus archivos.", +"Your download is being prepared. This might take some time if the files are big." => "Su descarga está siendo preparada. Esto podría tardar algo de tiempo si los archivos son grandes.", +"Error moving file" => "Error moviendo archivo", +"Error" => "Error", "Name" => "Nombre", "Size" => "Tamaño", "Modified" => "Modificado", -"1 folder" => "1 carpeta", -"{count} folders" => "{count} carpetas", -"1 file" => "1 archivo", -"{count} files" => "{count} archivos", -"%s could not be renamed" => "%s no se pudo renombrar", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nombre de carpeta inválido. El uso de \"Shared\" esta reservado.", +"%s could not be renamed" => "%s no pudo ser renombrado", "Upload" => "Subir", -"File handling" => "Manejo de archivos", +"File handling" => "Administración de archivos", "Maximum upload size" => "Tamaño máximo de subida", "max. possible: " => "máx. posible:", "Needed for multi-file and folder downloads." => "Necesario para multi-archivo y descarga de carpetas", "Enable ZIP-download" => "Habilitar descarga en ZIP", -"0 is unlimited" => "0 es ilimitado", +"0 is unlimited" => "0 significa ilimitado", "Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada", "Save" => "Guardar", "New" => "Nuevo", +"New text file" => "Nuevo archivo de texto", "Text file" => "Archivo de texto", +"New folder" => "Nueva carpeta", "Folder" => "Carpeta", "From link" => "Desde enlace", "Deleted files" => "Archivos eliminados", "Cancel upload" => "Cancelar subida", -"You don’t have write permissions here." => "No tiene permisos de escritura aquí.", +"You don’t have permission to upload or create files here" => "No tienes permisos para subir o crear archivos aquí.", "Nothing in here. Upload something!" => "No hay nada aquí. ¡Suba algo!", "Download" => "Descargar", -"Unshare" => "Dejar de compartir", +"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.", "Current scanning" => "Escaneo actual", -"directory" => "carpeta", -"directories" => "carpetas", -"file" => "archivo", -"files" => "archivos", -"Upgrading filesystem cache..." => "Actualizando caché del sistema de archivos" +"Upgrading filesystem cache..." => "Actualizando caché del sistema de archivos..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php index fd422ab1d9..78d6388cd9 100644 --- a/apps/files/l10n/es_AR.php +++ b/apps/files/l10n/es_AR.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "No se pudo mover %s - Un archivo con este nombre ya existe", "Could not move %s" => "No se pudo mover %s ", +"File name cannot be empty." => "El nombre del archivo no puede quedar vacío.", "Unable to set upload directory." => "No fue posible crear el directorio de subida.", "Invalid Token" => "Token Inválido", "No file was uploaded. Unknown error" => "El archivo no fue subido. Error desconocido", @@ -15,41 +16,30 @@ $TRANSLATIONS = array( "Not enough storage available" => "No hay suficiente almacenamiento", "Invalid directory." => "Directorio inválido.", "Files" => "Archivos", -"Unable to upload your file as it is a directory or has 0 bytes" => "No fue posible subir el archivo porque es un directorio o porque su tamaño es 0 bytes", "Not enough space available" => "No hay suficiente espacio disponible", "Upload cancelled." => "La subida fue cancelada", "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á.", -"URL cannot be empty." => "La URL no puede estar vacía", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nombre de directorio inválido. El uso de \"Shared\" está reservado por ownCloud", -"Error" => "Error", +"{new_name} already exists" => "{new_name} ya existe", "Share" => "Compartir", "Delete permanently" => "Borrar permanentemente", -"Delete" => "Borrar", "Rename" => "Cambiar nombre", "Pending" => "Pendientes", -"{new_name} already exists" => "{new_name} ya existe", -"replace" => "reemplazar", -"suggest name" => "sugerir nombre", -"cancel" => "cancelar", "replaced {new_name} with {old_name}" => "se reemplazó {new_name} con {old_name}", "undo" => "deshacer", -"perform delete operation" => "Llevar a cabo borrado", -"1 file uploading" => "Subiendo 1 archivo", -"files uploading" => "Subiendo archivos", +"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetas"), +"_%n file_::_%n files_" => array("%n archivo","%n archivos"), +"{dirs} and {files}" => "{carpetas} y {archivos}", +"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"), "'.' is an invalid file name." => "'.' es un nombre de archivo inválido.", -"File name cannot be empty." => "El nombre del archivo no puede quedar vacío.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre invalido, '\\', '/', '<', '>', ':', '\"', '|', '?' y '*' no están permitidos.", "Your storage is full, files can not be updated or synced anymore!" => "El almacenamiento está lleno, los archivos no se pueden seguir actualizando ni sincronizando", "Your storage is almost full ({usedSpacePercent}%)" => "El almacenamiento está casi lleno ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "El proceso de cifrado se ha desactivado, pero los archivos aún están encriptados. Por favor, vaya a la configuración personal para descifrar los archivos.", "Your download is being prepared. This might take some time if the files are big." => "Tu descarga se está preparando. Esto puede demorar si los archivos son muy grandes.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nombre de carpeta inválido. El uso de 'Shared' está reservado por ownCloud", +"Error" => "Error", "Name" => "Nombre", "Size" => "Tamaño", "Modified" => "Modificado", -"1 folder" => "1 directorio", -"{count} folders" => "{count} directorios", -"1 file" => "1 archivo", -"{count} files" => "{count} archivos", "%s could not be renamed" => "No se pudo renombrar %s", "Upload" => "Subir", "File handling" => "Tratamiento de archivos", @@ -62,22 +52,18 @@ $TRANSLATIONS = array( "Save" => "Guardar", "New" => "Nuevo", "Text file" => "Archivo de texto", +"New folder" => "Nueva Carpeta", "Folder" => "Carpeta", "From link" => "Desde enlace", "Deleted files" => "Archivos borrados", "Cancel upload" => "Cancelar subida", -"You don’t have write permissions here." => "No tenés permisos de escritura acá.", "Nothing in here. Upload something!" => "No hay nada. ¡Subí contenido!", "Download" => "Descargar", -"Unshare" => "Dejar de compartir", +"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á.", "Current scanning" => "Escaneo actual", -"directory" => "directorio", -"directories" => "directorios", -"file" => "archivo", -"files" => "archivos", "Upgrading filesystem cache..." => "Actualizando el cache del sistema de archivos" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/es_MX.php b/apps/files/l10n/es_MX.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/es_MX.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index e6a643fbad..98f74e1f00 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Ei saa liigutada faili %s - samanimeline fail on juba olemas", "Could not move %s" => "%s liigutamine ebaõnnestus", +"File name cannot be empty." => "Faili nimi ei saa olla tühi.", +"File name must not contain \"/\". Please choose a different name." => "Faili nimi ei tohi sisaldada \"/\". Palun vali mõni teine nimi.", +"The name %s is already used in the folder %s. Please choose a different name." => "Nimi %s on juba kasutusel kataloogis %s. Palun vali mõni teine nimi.", +"Not a valid source" => "Pole korrektne lähteallikas", +"Error while downloading %s to %s" => "Viga %s allalaadimisel %s", +"Error when creating the file" => "Viga faili loomisel", +"Folder name cannot be empty." => "Kataloogi nimi ei saa olla tühi.", +"Folder name must not contain \"/\". Please choose a different name." => "Kataloogi nimi ei tohi sisaldada \"/\". Palun vali mõni teine nimi.", +"Error when creating the folder" => "Viga kataloogi loomisel", "Unable to set upload directory." => "Üleslaadimiste kausta määramine ebaõnnestus.", "Invalid Token" => "Vigane kontrollkood", "No file was uploaded. Unknown error" => "Ühtegi faili ei laetud üles. Tundmatu viga", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Ajutiste failide kaust puudub", "Failed to write to disk" => "Kettale kirjutamine ebaõnnestus", "Not enough storage available" => "Saadaval pole piisavalt ruumi", +"Upload failed. Could not get file info." => "Üleslaadimine ebaõnnestus. Faili info hankimine ebaõnnestus.", +"Upload failed. Could not find uploaded file" => "Üleslaadimine ebaõnnestus. Üleslaetud faili ei leitud", "Invalid directory." => "Vigane kaust.", "Files" => "Failid", -"Unable to upload your file as it is a directory or has 0 bytes" => "Faili ei saa üles laadida, kuna see on kaust või selle suurus on 0 baiti", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti", "Not enough space available" => "Pole piisavalt ruumi", "Upload cancelled." => "Üleslaadimine tühistati.", +"Could not get result from server." => "Serverist ei saadud tulemusi", "File upload is in progress. Leaving the page now will cancel the upload." => "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", -"URL cannot be empty." => "URL ei saa olla tühi.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Vigane kausta nimi. 'Shared' kasutamine on reserveeritud ownCloud poolt.", -"Error" => "Viga", +"URL cannot be empty" => "URL ei saa olla tühi", +"In the home folder 'Shared' is a reserved filename" => "Kodukataloogis 'Shared' on reserveeritud failinimi", +"{new_name} already exists" => "{new_name} on juba olemas", +"Could not create file" => "Ei suuda luua faili", +"Could not create folder" => "Ei suuda luua kataloogi", "Share" => "Jaga", "Delete permanently" => "Kustuta jäädavalt", -"Delete" => "Kustuta", "Rename" => "Nimeta ümber", "Pending" => "Ootel", -"{new_name} already exists" => "{new_name} on juba olemas", -"replace" => "asenda", -"suggest name" => "soovita nime", -"cancel" => "loobu", +"Could not rename file" => "Ei suuda faili ümber nimetada", "replaced {new_name} with {old_name}" => "asendas nime {old_name} nimega {new_name}", "undo" => "tagasi", -"perform delete operation" => "teosta kustutamine", -"1 file uploading" => "1 fail üleslaadimisel", -"files uploading" => "faili üleslaadimisel", +"Error deleting file." => "Viga faili kustutamisel.", +"_%n folder_::_%n folders_" => array("%n kataloog","%n kataloogi"), +"_%n file_::_%n files_" => array("%n fail","%n faili"), +"{dirs} and {files}" => "{dirs} ja {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Laadin üles %n faili","Laadin üles %n faili"), "'.' is an invalid file name." => "'.' on vigane failinimi.", -"File name cannot be empty." => "Faili nimi ei saa olla tühi.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud.", "Your storage is full, files can not be updated or synced anymore!" => "Sinu andmemaht on täis! Faile ei uuendata ega sünkroniseerita!", "Your storage is almost full ({usedSpacePercent}%)" => "Su andmemaht on peaaegu täis ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Krüpteerimisrakend on lubatud, kuid võtmeid pole lähtestatud. Palun logi välja ning uuesti sisse.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Vigane Krüpteerimisrakendi privaatvõti . Palun uuenda oma privaatse võtme parool oma personaasete seadete all taastamaks ligipääsu oma krüpteeritud failidele.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Krüpteering on keelatud, kuid sinu failid on endiselt krüpteeritud. Palun vaata oma personaalseid seadeid oma failide dekrüpteerimiseks.", "Your download is being prepared. This might take some time if the files are big." => "Valmistatakse allalaadimist. See võib võtta veidi aega, kui on tegu suurte failidega. ", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Vigane kataloogi nimi. 'Shared' kasutamine on reserveeritud ownCloud poolt.", +"Error moving file" => "Viga faili eemaldamisel", +"Error" => "Viga", "Name" => "Nimi", "Size" => "Suurus", "Modified" => "Muudetud", -"1 folder" => "1 kaust", -"{count} folders" => "{count} kausta", -"1 file" => "1 fail", -"{count} files" => "{count} faili", +"Invalid folder name. Usage of 'Shared' is reserved." => "Vigane kausta nimi. Nime 'Shared' kasutamine on reserveeritud.", "%s could not be renamed" => "%s ümbernimetamine ebaõnnestus", "Upload" => "Lae üles", "File handling" => "Failide käsitlemine", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Maksimaalne ZIP-faili sisestatava faili suurus", "Save" => "Salvesta", "New" => "Uus", +"New text file" => "Uus tekstifail", "Text file" => "Tekstifail", +"New folder" => "Uus kaust", "Folder" => "Kaust", "From link" => "Allikast", "Deleted files" => "Kustutatud failid", "Cancel upload" => "Tühista üleslaadimine", -"You don’t have write permissions here." => "Siin puudvad sul kirjutamisõigused.", +"You don’t have permission to upload or create files here" => "Sul puuduvad õigused siia failide üleslaadimiseks või tekitamiseks", "Nothing in here. Upload something!" => "Siin pole midagi. Lae midagi üles!", "Download" => "Lae alla", -"Unshare" => "Lõpeta jagamine", +"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.", "Current scanning" => "Praegune skannimine", -"directory" => "kaust", -"directories" => "kaustad", -"file" => "fail", -"files" => "faili", "Upgrading filesystem cache..." => "Failisüsteemi puhvri uuendamine..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index 740f53d4e9..5df480c2bc 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Ezin da %s mugitu - Izen hau duen fitxategia dagoeneko existitzen da", "Could not move %s" => "Ezin dira fitxategiak mugitu %s", +"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.", +"File name must not contain \"/\". Please choose a different name." => "Fitxategi izenak ezin du \"/\" izan. Mesedez hautatu beste izen bat.", +"The name %s is already used in the folder %s. Please choose a different name." => "%s izena dagoeneko erabilita dago %s karpetan. Mesdez hautatu izen ezberdina.", +"Not a valid source" => "Ez da jatorri baliogarria", +"Error while downloading %s to %s" => "Errorea %s %sra deskargatzerakoan", +"Error when creating the file" => "Errorea fitxategia sortzerakoan", +"Folder name cannot be empty." => "Karpeta izena ezin da hutsa izan.", +"Folder name must not contain \"/\". Please choose a different name." => "Karpeta izenak ezin du \"/\" izan. Mesedez hautatu beste izen bat.", +"Error when creating the folder" => "Errorea karpeta sortzerakoan", "Unable to set upload directory." => "Ezin da igoera direktorioa ezarri.", "Invalid Token" => "Lekuko baliogabea", "No file was uploaded. Unknown error" => "Ez da fitxategirik igo. Errore ezezaguna", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Aldi bateko karpeta falta da", "Failed to write to disk" => "Errore bat izan da diskoan idazterakoan", "Not enough storage available" => "Ez dago behar aina leku erabilgarri,", +"Upload failed. Could not get file info." => "Igoerak huts egin du. Ezin izan da fitxategiaren informazioa eskuratu.", +"Upload failed. Could not find uploaded file" => "Igoerak huts egin du. Ezin izan da igotako fitxategia aurkitu", "Invalid directory." => "Baliogabeko karpeta.", "Files" => "Fitxategiak", -"Unable to upload your file as it is a directory or has 0 bytes" => "Ezin izan da zure fitxategia igo karpeta bat delako edo 0 byte dituelako", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako", "Not enough space available" => "Ez dago leku nahikorik.", "Upload cancelled." => "Igoera ezeztatuta", +"Could not get result from server." => "Ezin da zerbitzaritik emaitzik lortu", "File upload is in progress. Leaving the page now will cancel the upload." => "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", -"URL cannot be empty." => "URLa ezin da hutsik egon.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Karpeta izne baliogabea. \"Shared\" karpeta erabilpena OwnCloudentzat erreserbaturik dago.", -"Error" => "Errorea", +"URL cannot be empty" => "URLa ezin da hutsik egon", +"In the home folder 'Shared' is a reserved filename" => "Etxeko (home) karpetan 'Shared' erreserbatutako fitxategi izena da", +"{new_name} already exists" => "{new_name} dagoeneko existitzen da", +"Could not create file" => "Ezin izan da fitxategia sortu", +"Could not create folder" => "Ezin izan da karpeta sortu", "Share" => "Elkarbanatu", "Delete permanently" => "Ezabatu betirako", -"Delete" => "Ezabatu", "Rename" => "Berrizendatu", "Pending" => "Zain", -"{new_name} already exists" => "{new_name} dagoeneko existitzen da", -"replace" => "ordeztu", -"suggest name" => "aholkatu izena", -"cancel" => "ezeztatu", +"Could not rename file" => "Ezin izan da fitxategia berrizendatu", "replaced {new_name} with {old_name}" => " {new_name}-k {old_name} ordezkatu du", "undo" => "desegin", -"perform delete operation" => "Ezabatu", -"1 file uploading" => "fitxategi 1 igotzen", -"files uploading" => "fitxategiak igotzen", +"Error deleting file." => "Errorea fitxategia ezabatzerakoan.", +"_%n folder_::_%n folders_" => array("karpeta %n","%n karpeta"), +"_%n file_::_%n files_" => array("fitxategi %n","%n fitxategi"), +"{dirs} and {files}" => "{dirs} eta {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Fitxategi %n igotzen","%n fitxategi igotzen"), "'.' is an invalid file name." => "'.' ez da fitxategi izen baliogarria.", -"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.", "Your storage is full, files can not be updated or synced anymore!" => "Zure biltegiratzea beterik dago, ezingo duzu aurrerantzean fitxategirik igo edo sinkronizatu!", "Your storage is almost full ({usedSpacePercent}%)" => "Zure biltegiratzea nahiko beterik dago (%{usedSpacePercent})", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Enkriptazio aplikazioa gaituta dago baina zure gakoak ez daude konfiguratuta, mesedez saioa bukatu eta berriro hasi", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Enkriptazio aplikaziorako gako pribatu okerra. Mesedez eguneratu zure gako pribatuaren pasahitza zure ezarpen pertsonaletan zure enkriptatuko fitxategietarako sarrera berreskuratzeko.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Enkriptazioa desgaitua izan da baina zure fitxategiak oraindik enkriptatuta daude. Mesedez jo zure ezarpen pertsonaletara zure fitxategiak dekodifikatzeko.", "Your download is being prepared. This might take some time if the files are big." => "Zure deskarga prestatu egin behar da. Denbora bat har lezake fitxategiak handiak badira. ", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Baliogabeako karpeta izena. 'Shared' izena Owncloudek erreserbatzen du", +"Error moving file" => "Errorea fitxategia mugitzean", +"Error" => "Errorea", "Name" => "Izena", "Size" => "Tamaina", "Modified" => "Aldatuta", -"1 folder" => "karpeta bat", -"{count} folders" => "{count} karpeta", -"1 file" => "fitxategi bat", -"{count} files" => "{count} fitxategi", +"Invalid folder name. Usage of 'Shared' is reserved." => "Baliogabeako karpeta izena. 'Shared' izena erreserbatuta dago.", "%s could not be renamed" => "%s ezin da berrizendatu", "Upload" => "Igo", "File handling" => "Fitxategien kudeaketa", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "ZIP fitxategien gehienezko tamaina", "Save" => "Gorde", "New" => "Berria", +"New text file" => "Testu fitxategi berria", "Text file" => "Testu fitxategia", +"New folder" => "Karpeta berria", "Folder" => "Karpeta", "From link" => "Estekatik", "Deleted files" => "Ezabatutako fitxategiak", "Cancel upload" => "Ezeztatu igoera", -"You don’t have write permissions here." => "Ez duzu hemen idazteko baimenik.", +"You don’t have permission to upload or create files here" => "Ez duzu fitxategiak hona igotzeko edo hemen sortzeko baimenik", "Nothing in here. Upload something!" => "Ez dago ezer. Igo zerbait!", "Download" => "Deskargatu", -"Unshare" => "Ez elkarbanatu", +"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.", "Current scanning" => "Orain eskaneatzen ari da", -"directory" => "direktorioa", -"directories" => "direktorioak", -"file" => "fitxategia", -"files" => "fitxategiak", "Upgrading filesystem cache..." => "Fitxategi sistemaren katxea eguneratzen..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php index 9670afdd05..4f3257bc07 100644 --- a/apps/files/l10n/fa.php +++ b/apps/files/l10n/fa.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s نمی تواند حرکت کند - در حال حاضر پرونده با این نام وجود دارد. ", "Could not move %s" => "%s نمی تواند حرکت کند ", +"File name cannot be empty." => "نام پرونده نمی تواند خالی باشد.", "Unable to set upload directory." => "قادر به تنظیم پوشه آپلود نمی باشد.", "Invalid Token" => "رمز نامعتبر", "No file was uploaded. Unknown error" => "هیچ فایلی آپلود نشد.خطای ناشناس", @@ -15,41 +16,28 @@ $TRANSLATIONS = array( "Not enough storage available" => "فضای کافی در دسترس نیست", "Invalid directory." => "فهرست راهنما نامعتبر می باشد.", "Files" => "پرونده‌ها", -"Unable to upload your file as it is a directory or has 0 bytes" => "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد", "Not enough space available" => "فضای کافی در دسترس نیست", "Upload cancelled." => "بار گذاری لغو شد", "File upload is in progress. Leaving the page now will cancel the upload." => "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", -"URL cannot be empty." => "URL نمی تواند خالی باشد.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "نام پوشه نامعتبر است. استفاده از 'به اشتراک گذاشته شده' متعلق به ownCloud میباشد.", -"Error" => "خطا", +"{new_name} already exists" => "{نام _جدید} در حال حاضر وجود دارد.", "Share" => "اشتراک‌گذاری", "Delete permanently" => "حذف قطعی", -"Delete" => "حذف", "Rename" => "تغییرنام", "Pending" => "در انتظار", -"{new_name} already exists" => "{نام _جدید} در حال حاضر وجود دارد.", -"replace" => "جایگزین", -"suggest name" => "پیشنهاد نام", -"cancel" => "لغو", "replaced {new_name} with {old_name}" => "{نام_جدید} با { نام_قدیمی} جایگزین شد.", "undo" => "بازگشت", -"perform delete operation" => "انجام عمل حذف", -"1 file uploading" => "1 پرونده آپلود شد.", -"files uploading" => "بارگذاری فایل ها", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), "'.' is an invalid file name." => "'.' یک نام پرونده نامعتبر است.", -"File name cannot be empty." => "نام پرونده نمی تواند خالی باشد.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "نام نامعتبر ، '\\', '/', '<', '>', ':', '\"', '|', '?' و '*' مجاز نمی باشند.", "Your storage is full, files can not be updated or synced anymore!" => "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!", "Your storage is almost full ({usedSpacePercent}%)" => "فضای ذخیره ی شما تقریبا پر است ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "دانلود شما در حال آماده شدن است. در صورتیکه پرونده ها بزرگ باشند ممکن است مدتی طول بکشد.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "نام پوشه نامعتبر است. استفاده از \" به اشتراک گذاشته شده \" متعلق به سایت Owncloud است.", +"Error" => "خطا", "Name" => "نام", "Size" => "اندازه", "Modified" => "تاریخ", -"1 folder" => "1 پوشه", -"{count} folders" => "{ شمار} پوشه ها", -"1 file" => "1 پرونده", -"{count} files" => "{ شمار } فایل ها", "%s could not be renamed" => "%s نمیتواند تغییر نام دهد.", "Upload" => "بارگزاری", "File handling" => "اداره پرونده ها", @@ -62,22 +50,18 @@ $TRANSLATIONS = array( "Save" => "ذخیره", "New" => "جدید", "Text file" => "فایل متنی", +"New folder" => "پوشه جدید", "Folder" => "پوشه", "From link" => "از پیوند", "Deleted files" => "فایل های حذف شده", "Cancel upload" => "متوقف کردن بار گذاری", -"You don’t have write permissions here." => "شما اجازه ی نوشتن در اینجا را ندارید", "Nothing in here. Upload something!" => "اینجا هیچ چیز نیست.", "Download" => "دانلود", -"Unshare" => "لغو اشتراک", +"Delete" => "حذف", "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." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید", "Current scanning" => "بازرسی کنونی", -"directory" => "پوشه", -"directories" => "پوشه ها", -"file" => "پرونده", -"files" => "پرونده ها", "Upgrading filesystem cache..." => "بهبود فایل سیستمی ذخیره گاه..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index 2d1bf8c4e3..2c7327b0f3 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -2,47 +2,60 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Kohteen %s siirto ei onnistunut - Tiedosto samalla nimellä on jo olemassa", "Could not move %s" => "Kohteen %s siirto ei onnistunut", +"File name cannot be empty." => "Tiedoston nimi ei voi olla tyhjä.", +"File name must not contain \"/\". Please choose a different name." => "Tiedoston nimessä ei saa olla merkkiä \"/\". Valitse toinen nimi.", +"The name %s is already used in the folder %s. Please choose a different name." => "Nimi %s on jo käytössä kansiossa %s. Valitse toinen nimi.", +"Not a valid source" => "Virheellinen lähde", +"Error while downloading %s to %s" => "Virhe ladatessa kohdetta %s sijaintiin %s", +"Error when creating the file" => "Virhe tiedostoa luotaessa", +"Folder name cannot be empty." => "Kansion nimi ei voi olla tyhjä.", +"Folder name must not contain \"/\". Please choose a different name." => "Kansion nimessä ei saa olla merkkiä \"/\". Valitse toinen nimi.", +"Error when creating the folder" => "Virhe kansiota luotaessa", "No file was uploaded. Unknown error" => "Tiedostoa ei lähetetty. Tuntematon virhe", "There is no error, the file uploaded with success" => "Ei virheitä, tiedosto lähetettiin onnistuneesti", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Lähetetyn tiedoston koko ylittää php.ini-tiedoston upload_max_filesize-säännön:", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ladattavan tiedoston maksimikoko ylittää MAX_FILE_SIZE dirketiivin, joka on määritelty HTML-lomakkeessa", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Lähetettävän tiedoston enimmäiskoko ylittää HTML-lomakkeessa määritellyn MAX_FILE_SIZE-säännön", "The uploaded file was only partially uploaded" => "Tiedoston lähetys onnistui vain osittain", "No file was uploaded" => "Yhtäkään tiedostoa ei lähetetty", "Missing a temporary folder" => "Tilapäiskansio puuttuu", "Failed to write to disk" => "Levylle kirjoitus epäonnistui", "Not enough storage available" => "Tallennustilaa ei ole riittävästi käytettävissä", +"Upload failed. Could not find uploaded file" => "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.", "Invalid directory." => "Virheellinen kansio.", "Files" => "Tiedostot", -"Unable to upload your file as it is a directory or has 0 bytes" => "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua", "Not enough space available" => "Tilaa ei ole riittävästi", "Upload cancelled." => "Lähetys peruttu.", +"Could not get result from server." => "Tuloksien saaminen palvelimelta ei onnistunut.", "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.", -"URL cannot be empty." => "Verkko-osoite ei voi olla tyhjä", -"Error" => "Virhe", +"URL cannot be empty" => "Osoite ei voi olla tyhjä", +"{new_name} already exists" => "{new_name} on jo olemassa", +"Could not create file" => "Tiedoston luominen epäonnistui", +"Could not create folder" => "Kansion luominen epäonnistui", "Share" => "Jaa", "Delete permanently" => "Poista pysyvästi", -"Delete" => "Poista", "Rename" => "Nimeä uudelleen", "Pending" => "Odottaa", -"{new_name} already exists" => "{new_name} on jo olemassa", -"replace" => "korvaa", -"suggest name" => "ehdota nimeä", -"cancel" => "peru", +"Could not rename file" => "Tiedoston nimeäminen uudelleen epäonnistui", "undo" => "kumoa", -"perform delete operation" => "suorita poistotoiminto", +"Error deleting file." => "Virhe tiedostoa poistaessa.", +"_%n folder_::_%n folders_" => array("%n kansio","%n kansiota"), +"_%n file_::_%n files_" => array("%n tiedosto","%n tiedostoa"), +"{dirs} and {files}" => "{dirs} ja {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Lähetetään %n tiedosto","Lähetetään %n tiedostoa"), "'.' is an invalid file name." => "'.' on virheellinen nimi tiedostolle.", -"File name cannot be empty." => "Tiedoston nimi ei voi olla tyhjä.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Virheellinen nimi, merkit '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' eivät ole sallittuja.", "Your storage is full, files can not be updated or synced anymore!" => "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!", "Your storage is almost full ({usedSpacePercent}%)" => "Tallennustila on melkein loppu ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Salaus poistettiin käytöstä, mutta tiedostosi ovat edelleen salattuina. Siirry henkilökohtaisiin asetuksiin avataksesi tiedostojesi salauksen.", "Your download is being prepared. This might take some time if the files are big." => "Lataustasi valmistellaan. Tämä saattaa kestää hetken, jos tiedostot ovat suuria kooltaan.", +"Error moving file" => "Virhe tiedostoa siirrettäessä", +"Error" => "Virhe", "Name" => "Nimi", "Size" => "Koko", "Modified" => "Muokattu", -"1 folder" => "1 kansio", -"{count} folders" => "{count} kansiota", -"1 file" => "1 tiedosto", -"{count} files" => "{count} tiedostoa", +"Invalid folder name. Usage of 'Shared' is reserved." => "Virheellinen kansion nimi. 'Shared':n käyttö on varattu.", +"%s could not be renamed" => "kohteen %s nimeäminen uudelleen epäonnistui", "Upload" => "Lähetä", "File handling" => "Tiedostonhallinta", "Maximum upload size" => "Lähetettävän tiedoston suurin sallittu koko", @@ -53,23 +66,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "ZIP-tiedostojen enimmäiskoko", "Save" => "Tallenna", "New" => "Uusi", +"New text file" => "Uusi tekstitiedosto", "Text file" => "Tekstitiedosto", +"New folder" => "Uusi kansio", "Folder" => "Kansio", "From link" => "Linkistä", "Deleted files" => "Poistetut tiedostot", "Cancel upload" => "Peru lähetys", -"You don’t have write permissions here." => "Tunnuksellasi ei ole kirjoitusoikeuksia tänne.", +"You don’t have permission to upload or create files here" => "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin", "Nothing in here. Upload something!" => "Täällä ei ole mitään. Lähetä tänne jotakin!", "Download" => "Lataa", -"Unshare" => "Peru jakaminen", +"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.", "Current scanning" => "Tämänhetkinen tutkinta", -"directory" => "kansio", -"directories" => "kansiota", -"file" => "tiedosto", -"files" => "tiedostoa", "Upgrading filesystem cache..." => "Päivitetään tiedostojärjestelmän välimuistia..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index ad79a9f499..c493e2d553 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -2,54 +2,66 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Impossible de déplacer %s - Un fichier possédant ce nom existe déjà", "Could not move %s" => "Impossible de déplacer %s", +"File name cannot be empty." => "Le nom de fichier ne peut être vide.", +"File name must not contain \"/\". Please choose a different name." => "Le nom de fichier ne doit pas contenir \"/\". Merci de choisir un nom différent.", +"The name %s is already used in the folder %s. Please choose a different name." => "Le nom %s est déjà utilisé dans le dossier %s. Merci de choisir un nom différent.", +"Not a valid source" => "La source n'est pas valide", +"Error while downloading %s to %s" => "Erreur pendant le téléchargement de %s à %s", +"Error when creating the file" => "Erreur pendant la création du fichier", +"Folder name cannot be empty." => "Le nom de dossier ne peux pas être vide.", +"Folder name must not contain \"/\". Please choose a different name." => "Le nom de dossier ne doit pas contenir \"/\". Merci de choisir un nom différent.", +"Error when creating the folder" => "Erreur pendant la création du dossier", "Unable to set upload directory." => "Impossible de définir le dossier pour l'upload, charger.", "Invalid Token" => "Jeton non valide", "No file was uploaded. Unknown error" => "Aucun fichier n'a été envoyé. Erreur inconnue", "There is no error, the file uploaded with success" => "Aucune erreur, le fichier a été envoyé avec succès.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Le fichier envoyé dépasse la valeur upload_max_filesize située dans le fichier php.ini:", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse la directive MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini:", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse l'instruction MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", "The uploaded file was only partially uploaded" => "Le fichier n'a été que partiellement envoyé.", "No file was uploaded" => "Pas de fichier envoyé.", "Missing a temporary folder" => "Absence de dossier temporaire.", "Failed to write to disk" => "Erreur d'écriture sur le disque", "Not enough storage available" => "Plus assez d'espace de stockage disponible", +"Upload failed. Could not get file info." => "L'envoi a échoué. Impossible d'obtenir les informations du fichier.", +"Upload failed. Could not find uploaded file" => "L'envoi a échoué. Impossible de trouver le fichier envoyé.", "Invalid directory." => "Dossier invalide.", "Files" => "Fichiers", -"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible d'envoyer votre fichier dans la mesure où il s'agit d'un répertoire ou d'un fichier de taille nulle", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle", "Not enough space available" => "Espace disponible insuffisant", "Upload cancelled." => "Envoi annulé.", +"Could not get result from server." => "Ne peut recevoir les résultats du serveur.", "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.", -"URL cannot be empty." => "L'URL ne peut-être vide", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée à Owncloud", -"Error" => "Erreur", +"URL cannot be empty" => "L'URL ne peut pas être vide", +"In the home folder 'Shared' is a reserved filename" => "Dans le dossier home, 'Partagé' est un nom de fichier réservé", +"{new_name} already exists" => "{new_name} existe déjà", +"Could not create file" => "Impossible de créer le fichier", +"Could not create folder" => "Impossible de créer le dossier", "Share" => "Partager", "Delete permanently" => "Supprimer de façon définitive", -"Delete" => "Supprimer", "Rename" => "Renommer", "Pending" => "En attente", -"{new_name} already exists" => "{new_name} existe déjà", -"replace" => "remplacer", -"suggest name" => "Suggérer un nom", -"cancel" => "annuler", +"Could not rename file" => "Impossible de renommer le fichier", "replaced {new_name} with {old_name}" => "{new_name} a été remplacé par {old_name}", "undo" => "annuler", -"perform delete operation" => "effectuer l'opération de suppression", -"1 file uploading" => "1 fichier en cours d'envoi", -"files uploading" => "fichiers en cours d'envoi", +"Error deleting file." => "Erreur pendant la suppression du fichier.", +"_%n folder_::_%n folders_" => array("%n dossier","%n dossiers"), +"_%n file_::_%n files_" => array("%n fichier","%n fichiers"), +"{dirs} and {files}" => "{dirs} et {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Téléversement de %n fichier","Téléversement de %n fichiers"), "'.' is an invalid file name." => "'.' n'est pas un nom de fichier valide.", -"File name cannot be empty." => "Le nom de fichier ne peut être vide.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", "Your storage is full, files can not be updated or synced anymore!" => "Votre espage de stockage est plein, les fichiers ne peuvent plus être téléversés ou synchronisés !", "Your storage is almost full ({usedSpacePercent}%)" => "Votre espace de stockage est presque plein ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "L'application de chiffrement est activée mais vos clés ne sont pas initialisées, veuillez vous déconnecter et ensuite vous reconnecter.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Votre clef privée pour l'application de chiffrement est invalide ! Veuillez mettre à jour le mot de passe de votre clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Le chiffrement était désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos Paramètres personnels pour déchiffrer vos fichiers.", "Your download is being prepared. This might take some time if the files are big." => "Votre téléchargement est cours de préparation. Ceci peut nécessiter un certain temps si les fichiers sont volumineux.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée à Owncloud", +"Error moving file" => "Erreur lors du déplacement du fichier", +"Error" => "Erreur", "Name" => "Nom", "Size" => "Taille", "Modified" => "Modifié", -"1 folder" => "1 dossier", -"{count} folders" => "{count} dossiers", -"1 file" => "1 fichier", -"{count} files" => "{count} fichiers", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée.", "%s could not be renamed" => "%s ne peut être renommé", "Upload" => "Envoyer", "File handling" => "Gestion des fichiers", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Taille maximale pour les fichiers ZIP", "Save" => "Sauvegarder", "New" => "Nouveau", +"New text file" => "Nouveau fichier texte", "Text file" => "Fichier texte", +"New folder" => "Nouveau dossier", "Folder" => "Dossier", "From link" => "Depuis le lien", "Deleted files" => "Fichiers supprimés", "Cancel upload" => "Annuler l'envoi", -"You don’t have write permissions here." => "Vous n'avez pas le droit d'écriture ici.", +"You don’t have permission to upload or create files here" => "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", "Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)", "Download" => "Télécharger", -"Unshare" => "Ne plus partager", +"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 permise par ce serveur.", "Files are being scanned, please wait." => "Les fichiers sont en cours d'analyse, veuillez patienter.", "Current scanning" => "Analyse en cours", -"directory" => "dossier", -"directories" => "dossiers", -"file" => "fichier", -"files" => "fichiers", "Upgrading filesystem cache..." => "Mise à niveau du cache du système de fichier" ); $PLURAL_FORMS = "nplurals=2; plural=(n > 1);"; diff --git a/apps/files/l10n/fr_CA.php b/apps/files/l10n/fr_CA.php new file mode 100644 index 0000000000..3c711e6b78 --- /dev/null +++ b/apps/files/l10n/fr_CA.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n > 1);"; diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index 02bbad53e4..c2d8d9b7d1 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -1,7 +1,16 @@ "Non se moveu %s - Xa existe un ficheiro con ese nome.", +"Could not move %s - File with this name already exists" => "Non foi posíbel mover %s; Xa existe un ficheiro con ese nome.", "Could not move %s" => "Non foi posíbel mover %s", +"File name cannot be empty." => "O nome de ficheiro non pode estar baleiro", +"File name must not contain \"/\". Please choose a different name." => "O nome do ficheiro non pode conter «/». Escolla outro nome.", +"The name %s is already used in the folder %s. Please choose a different name." => "Xa existe o nome %s no cartafol %s. Escolla outro nome.", +"Not a valid source" => "Esta orixe non é correcta", +"Error while downloading %s to %s" => "Produciuse un erro ao descargar %s en %s", +"Error when creating the file" => "Produciuse un erro ao crear o ficheiro", +"Folder name cannot be empty." => "O nome de cartafol non pode estar baleiro.", +"Folder name must not contain \"/\". Please choose a different name." => "O nome do cartafol non pode conter «/». Escolla outro nome.", +"Error when creating the folder" => "Produciuse un erro ao crear o cartafol", "Unable to set upload directory." => "Non é posíbel configurar o directorio de envíos.", "Invalid Token" => "Marca incorrecta", "No file was uploaded. Unknown error" => "Non se enviou ningún ficheiro. Produciuse un erro descoñecido.", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Falta o cartafol temporal", "Failed to write to disk" => "Produciuse un erro ao escribir no disco", "Not enough storage available" => "Non hai espazo de almacenamento abondo", +"Upload failed. Could not get file info." => "O envío fracasou. Non foi posíbel obter información do ficheiro.", +"Upload failed. Could not find uploaded file" => "O envío fracasou. Non foi posíbel atopar o ficheiro enviado", "Invalid directory." => "O directorio é incorrecto.", "Files" => "Ficheiros", -"Unable to upload your file as it is a directory or has 0 bytes" => "Non foi posíbel enviar o ficheiro pois ou é un directorio ou ten 0 bytes", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes", "Not enough space available" => "O espazo dispoñíbel é insuficiente", "Upload cancelled." => "Envío cancelado.", +"Could not get result from server." => "Non foi posíbel obter o resultado do servidor.", "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.", -"URL cannot be empty." => "O URL non pode quedar baleiro.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome de cartafol incorrecto. O uso de «Compartido» e «Shared» está reservado para o ownClod", -"Error" => "Erro", +"URL cannot be empty" => "O URL non pode quedar en branco.", +"In the home folder 'Shared' is a reserved filename" => "«Shared» dentro do cartafol persoal é un nome reservado", +"{new_name} already exists" => "Xa existe un {new_name}", +"Could not create file" => "Non foi posíbel crear o ficheiro", +"Could not create folder" => "Non foi posíbel crear o cartafol", "Share" => "Compartir", "Delete permanently" => "Eliminar permanentemente", -"Delete" => "Eliminar", "Rename" => "Renomear", "Pending" => "Pendentes", -"{new_name} already exists" => "Xa existe un {new_name}", -"replace" => "substituír", -"suggest name" => "suxerir nome", -"cancel" => "cancelar", +"Could not rename file" => "Non foi posíbel renomear o ficheiro", "replaced {new_name} with {old_name}" => "substituír {new_name} por {old_name}", "undo" => "desfacer", -"perform delete operation" => "realizar a operación de eliminación", -"1 file uploading" => "Enviándose 1 ficheiro", -"files uploading" => "ficheiros enviándose", +"Error deleting file." => "Produciuse un erro ao eliminar o ficheiro.", +"_%n folder_::_%n folders_" => array("%n cartafol","%n cartafoles"), +"_%n file_::_%n files_" => array("%n ficheiro","%n ficheiros"), +"{dirs} and {files}" => "{dirs} e {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Cargando %n ficheiro","Cargando %n ficheiros"), "'.' is an invalid file name." => "«.» é un nome de ficheiro incorrecto", -"File name cannot be empty." => "O nome de ficheiro non pode estar baleiro", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».", "Your storage is full, files can not be updated or synced anymore!" => "O seu espazo de almacenamento está cheo, non é posíbel actualizar ou sincronizar máis os ficheiros!", "Your storage is almost full ({usedSpacePercent}%)" => "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "O aplicativo de cifrado está activado, mais as chaves non foron inicializadas, saia da sesión e volva a acceder de novo", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "A chave privada para o aplicativo de cifrado non é correcta. Actualice o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "O cifrado foi desactivado, mais os ficheiros están cifrados. Vaia á configuración persoal para descifrar os ficheiros.", "Your download is being prepared. This might take some time if the files are big." => "Está a prepararse a súa descarga. Isto pode levar bastante tempo se os ficheiros son grandes.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome de cartafol incorrecto. O uso de «Shared» está reservado por Owncloud", +"Error moving file" => "Produciuse un erro ao mover o ficheiro", +"Error" => "Erro", "Name" => "Nome", "Size" => "Tamaño", "Modified" => "Modificado", -"1 folder" => "1 cartafol", -"{count} folders" => "{count} cartafoles", -"1 file" => "1 ficheiro", -"{count} files" => "{count} ficheiros", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nome de cartafol non válido. O uso de «Shared» está reservado.", "%s could not be renamed" => "%s non pode cambiar de nome", "Upload" => "Enviar", "File handling" => "Manexo de ficheiro", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Tamaño máximo de descarga para os ficheiros ZIP", "Save" => "Gardar", "New" => "Novo", +"New text file" => "Ficheiro novo de texto", "Text file" => "Ficheiro de texto", +"New folder" => "Novo cartafol", "Folder" => "Cartafol", "From link" => "Desde a ligazón", "Deleted files" => "Ficheiros eliminados", "Cancel upload" => "Cancelar o envío", -"You don’t have write permissions here." => "Non ten permisos para escribir aquí.", +"You don’t have permission to upload or create files here" => "Non ten permisos para enviar ou crear ficheiros aquí.", "Nothing in here. Upload something!" => "Aquí non hai nada. Envíe algo.", "Download" => "Descargar", -"Unshare" => "Deixar de compartir", +"Delete" => "Eliminar", "Upload too large" => "Envío demasiado grande", "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.", "Current scanning" => "Análise actual", -"directory" => "directorio", -"directories" => "directorios", -"file" => "ficheiro", -"files" => "ficheiros", "Upgrading filesystem cache..." => "Anovando a caché do sistema de ficheiros..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 8af6b0852e..0cdb178254 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים", "Could not move %s" => "לא ניתן להעביר את %s", +"File name cannot be empty." => "שם קובץ אינו יכול להיות ריק", "No file was uploaded. Unknown error" => "לא הועלה קובץ. טעות בלתי מזוהה.", "There is no error, the file uploaded with success" => "לא התרחשה שגיאה, הקובץ הועלה בהצלחה", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:", @@ -11,35 +12,28 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "תקיה זמנית חסרה", "Failed to write to disk" => "הכתיבה לכונן נכשלה", "Not enough storage available" => "אין די שטח פנוי באחסון", +"Upload failed. Could not get file info." => "העלאה נכשלה. לא ניתן להשיג את פרטי הקובץ.", "Invalid directory." => "תיקייה שגויה.", "Files" => "קבצים", -"Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים", "Upload cancelled." => "ההעלאה בוטלה.", +"Could not get result from server." => "לא ניתן לגשת לתוצאות מהשרת.", "File upload is in progress. Leaving the page now will cancel the upload." => "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", -"URL cannot be empty." => "קישור אינו יכול להיות ריק.", -"Error" => "שגיאה", +"{new_name} already exists" => "{new_name} כבר קיים", "Share" => "שתף", "Delete permanently" => "מחק לצמיתות", -"Delete" => "מחיקה", "Rename" => "שינוי שם", "Pending" => "ממתין", -"{new_name} already exists" => "{new_name} כבר קיים", -"replace" => "החלפה", -"suggest name" => "הצעת שם", -"cancel" => "ביטול", "replaced {new_name} with {old_name}" => "{new_name} הוחלף ב־{old_name}", "undo" => "ביטול", -"perform delete operation" => "ביצוע פעולת מחיקה", -"1 file uploading" => "קובץ אחד נשלח", -"files uploading" => "קבצים בהעלאה", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'.", +"Your storage is almost full ({usedSpacePercent}%)" => "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)", +"Error" => "שגיאה", "Name" => "שם", "Size" => "גודל", "Modified" => "זמן שינוי", -"1 folder" => "תיקייה אחת", -"{count} folders" => "{count} תיקיות", -"1 file" => "קובץ אחד", -"{count} files" => "{count} קבצים", "Upload" => "העלאה", "File handling" => "טיפול בקבצים", "Maximum upload size" => "גודל העלאה מקסימלי", @@ -53,15 +47,14 @@ $TRANSLATIONS = array( "Text file" => "קובץ טקסט", "Folder" => "תיקייה", "From link" => "מקישור", +"Deleted files" => "קבצים שנמחקו", "Cancel upload" => "ביטול ההעלאה", "Nothing in here. Upload something!" => "אין כאן שום דבר. אולי ברצונך להעלות משהו?", "Download" => "הורדה", -"Unshare" => "הסר שיתוף", +"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." => "הקבצים נסרקים, נא להמתין.", -"Current scanning" => "הסריקה הנוכחית", -"file" => "קובץ", -"files" => "קבצים" +"Current scanning" => "הסריקה הנוכחית" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/hi.php b/apps/files/l10n/hi.php index 48e2194256..ae01bfc47e 100644 --- a/apps/files/l10n/hi.php +++ b/apps/files/l10n/hi.php @@ -1,7 +1,11 @@ "त्रुटि", "Share" => "साझा करें", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "त्रुटि", +"Upload" => "अपलोड ", "Save" => "सहेजें" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php index 6bc6904041..5048a15c8b 100644 --- a/apps/files/l10n/hr.php +++ b/apps/files/l10n/hr.php @@ -7,20 +7,16 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Nedostaje privremeni direktorij", "Failed to write to disk" => "Neuspjelo pisanje na disk", "Files" => "Datoteke", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nemoguće poslati datoteku jer je prazna ili je direktorij", "Upload cancelled." => "Slanje poništeno.", "File upload is in progress. Leaving the page now will cancel the upload." => "Učitavanje datoteke. Napuštanjem stranice će prekinuti učitavanje.", -"Error" => "Greška", "Share" => "Podijeli", -"Delete" => "Obriši", "Rename" => "Promjeni ime", "Pending" => "U tijeku", -"replace" => "zamjeni", -"suggest name" => "predloži ime", -"cancel" => "odustani", "undo" => "vrati", -"1 file uploading" => "1 datoteka se učitava", -"files uploading" => "datoteke se učitavaju", +"_%n folder_::_%n folders_" => array("","",""), +"_%n file_::_%n files_" => array("","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","",""), +"Error" => "Greška", "Name" => "Ime", "Size" => "Veličina", "Modified" => "Zadnja promjena", @@ -39,12 +35,10 @@ $TRANSLATIONS = array( "Cancel upload" => "Prekini upload", "Nothing in here. Upload something!" => "Nema ničega u ovoj mapi. Pošalji nešto!", "Download" => "Preuzimanje", -"Unshare" => "Makni djeljenje", +"Delete" => "Obriši", "Upload too large" => "Prijenos je preobiman", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju.", "Files are being scanned, please wait." => "Datoteke se skeniraju, molimo pričekajte.", -"Current scanning" => "Trenutno skeniranje", -"file" => "datoteka", -"files" => "datoteke" +"Current scanning" => "Trenutno skeniranje" ); $PLURAL_FORMS = "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/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php index 061fb27f0f..f2150f0599 100644 --- a/apps/files/l10n/hu_HU.php +++ b/apps/files/l10n/hu_HU.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s áthelyezése nem sikerült - már létezik másik fájl ezzel a névvel", "Could not move %s" => "Nem sikerült %s áthelyezése", +"File name cannot be empty." => "A fájlnév nem lehet semmi.", +"File name must not contain \"/\". Please choose a different name." => "Az állomány neve nem tartalmazhatja a \"/\" karaktert. Kérem válasszon másik nevet!", +"The name %s is already used in the folder %s. Please choose a different name." => "A %s név már létezik a %s mappában. Kérem válasszon másik nevet!", +"Not a valid source" => "A kiinduló állomány érvénytelen", +"Error while downloading %s to %s" => "Hiba történt miközben %s-t letöltöttük %s-be", +"Error when creating the file" => "Hiba történt az állomány létrehozásakor", +"Folder name cannot be empty." => "A mappa neve nem maradhat kitöltetlenül", +"Folder name must not contain \"/\". Please choose a different name." => "A mappa neve nem tartalmazhatja a \"/\" karaktert. Kérem válasszon másik nevet!", +"Error when creating the folder" => "Hiba történt a mappa létrehozásakor", "Unable to set upload directory." => "Nem található a mappa, ahova feltölteni szeretne.", "Invalid Token" => "Hibás mappacím", "No file was uploaded. Unknown error" => "Nem történt feltöltés. Ismeretlen hiba", @@ -13,43 +22,45 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Hiányzik egy ideiglenes mappa", "Failed to write to disk" => "Nem sikerült a lemezre történő írás", "Not enough storage available" => "Nincs elég szabad hely.", +"Upload failed. Could not get file info." => "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el.", +"Upload failed. Could not find uploaded file" => "A feltöltés nem sikerült. Nem található a feltöltendő állomány.", "Invalid directory." => "Érvénytelen mappa.", "Files" => "Fájlok", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.", "Not enough space available" => "Nincs elég szabad hely", "Upload cancelled." => "A feltöltést megszakítottuk.", +"Could not get result from server." => "A kiszolgálótól nem kapható meg az eredmény.", "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.", -"URL cannot be empty." => "Az URL nem lehet semmi.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Érvénytelen mappanév. A 'Shared' az ownCloud számára fenntartott elnevezés", -"Error" => "Hiba", +"URL cannot be empty" => "Az URL-cím nem maradhat kitöltetlenül", +"In the home folder 'Shared' is a reserved filename" => "A kiindulási mappában a 'Shared' egy belső használatra fenntartott név", +"{new_name} already exists" => "{new_name} már létezik", +"Could not create file" => "Az állomány nem hozható létre", +"Could not create folder" => "A mappa nem hozható létre", "Share" => "Megosztás", "Delete permanently" => "Végleges törlés", -"Delete" => "Törlés", "Rename" => "Átnevezés", "Pending" => "Folyamatban", -"{new_name} already exists" => "{new_name} már létezik", -"replace" => "írjuk fölül", -"suggest name" => "legyen más neve", -"cancel" => "mégse", +"Could not rename file" => "Az állomány nem nevezhető át", "replaced {new_name} with {old_name}" => "{new_name} fájlt kicseréltük ezzel: {old_name}", "undo" => "visszavonás", -"perform delete operation" => "a törlés végrehajtása", -"1 file uploading" => "1 fájl töltődik föl", -"files uploading" => "fájl töltődik föl", +"_%n folder_::_%n folders_" => array("%n mappa","%n mappa"), +"_%n file_::_%n files_" => array("%n állomány","%n állomány"), +"{dirs} and {files}" => "{dirs} és {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n állomány feltöltése","%n állomány feltöltése"), "'.' is an invalid file name." => "'.' fájlnév érvénytelen.", -"File name cannot be empty." => "A fájlnév nem lehet semmi.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Érvénytelen elnevezés. Ezek a karakterek nem használhatók: '\\', '/', '<', '>', ':', '\"', '|', '?' és '*'", "Your storage is full, files can not be updated or synced anymore!" => "A tároló tele van, a fájlok nem frissíthetőek vagy szinkronizálhatóak a jövőben.", "Your storage is almost full ({usedSpacePercent}%)" => "A tároló majdnem tele van ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Az állományok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérjük, hogy jelentkezzen ki, és lépjen be újra!", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Az állományok titkosításához használt titkos kulcsa érvénytelen. Kérjük frissítse a titkos kulcs jelszót a személyes beállításokban, hogy ismét hozzáférjen a titkosított állományaihoz!", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "A titkosítási funkciót kikapcsolták, de az Ön állományai még mindig titkosított állapotban vannak. A személyes beállításoknál tudja a titkosítást feloldani.", "Your download is being prepared. This might take some time if the files are big." => "Készül a letöltendő állomány. Ez eltarthat egy ideig, ha nagyok a fájlok.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Érvénytelen mappanév. A név használata csak a Owncloud számára lehetséges.", +"Error moving file" => "Az állomány áthelyezése nem sikerült.", +"Error" => "Hiba", "Name" => "Név", "Size" => "Méret", "Modified" => "Módosítva", -"1 folder" => "1 mappa", -"{count} folders" => "{count} mappa", -"1 file" => "1 fájl", -"{count} files" => "{count} fájl", +"Invalid folder name. Usage of 'Shared' is reserved." => "Érvénytelen mappanév. A 'Shared' a rendszer számára fenntartott elnevezés.", "%s could not be renamed" => "%s átnevezése nem sikerült", "Upload" => "Feltöltés", "File handling" => "Fájlkezelés", @@ -62,22 +73,19 @@ $TRANSLATIONS = array( "Save" => "Mentés", "New" => "Új", "Text file" => "Szövegfájl", +"New folder" => "Új mappa", "Folder" => "Mappa", "From link" => "Feltöltés linkről", "Deleted files" => "Törölt fájlok", "Cancel upload" => "A feltöltés megszakítása", -"You don’t have write permissions here." => "Itt nincs írásjoga.", +"You don’t have permission to upload or create files here" => "Önnek nincs jogosultsága ahhoz, hogy ide állományokat töltsön föl, vagy itt újakat hozzon létre", "Nothing in here. Upload something!" => "Itt nincs semmi. Töltsön fel valamit!", "Download" => "Letöltés", -"Unshare" => "A megosztás visszavonása", +"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!", "Current scanning" => "Ellenőrzés alatt", -"directory" => "mappa", -"directories" => "mappa", -"file" => "fájl", -"files" => "fájlok", "Upgrading filesystem cache..." => "A fájlrendszer gyorsítótárának frissítése zajlik..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/hy.php b/apps/files/l10n/hy.php index 101734c01d..9a5ebb862a 100644 --- a/apps/files/l10n/hy.php +++ b/apps/files/l10n/hy.php @@ -1,7 +1,10 @@ "Ջնջել", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "Save" => "Պահպանել", -"Download" => "Բեռնել" +"Download" => "Բեռնել", +"Delete" => "Ջնջել" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php index 2ccd559469..82fd2e658d 100644 --- a/apps/files/l10n/ia.php +++ b/apps/files/l10n/ia.php @@ -4,9 +4,11 @@ $TRANSLATIONS = array( "No file was uploaded" => "Nulle file esseva incargate.", "Missing a temporary folder" => "Manca un dossier temporari", "Files" => "Files", -"Error" => "Error", "Share" => "Compartir", -"Delete" => "Deler", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "Error", "Name" => "Nomine", "Size" => "Dimension", "Modified" => "Modificate", @@ -18,6 +20,7 @@ $TRANSLATIONS = array( "Folder" => "Dossier", "Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!", "Download" => "Discargar", +"Delete" => "Deler", "Upload too large" => "Incargamento troppo longe" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php index 4b6bf8a32b..4e254ff6f6 100644 --- a/apps/files/l10n/id.php +++ b/apps/files/l10n/id.php @@ -2,6 +2,17 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Tidak dapat memindahkan %s - Berkas dengan nama ini sudah ada", "Could not move %s" => "Tidak dapat memindahkan %s", +"File name cannot be empty." => "Nama berkas tidak boleh kosong.", +"File name must not contain \"/\". Please choose a different name." => "Nama berkas tidak boleh mengandung \"/\". Silakan pilih nama yang berbeda.", +"The name %s is already used in the folder %s. Please choose a different name." => "Nama %s sudah digunakan dalam folder %s. Silakan pilih nama yang berbeda.", +"Not a valid source" => "Sumber tidak sah", +"Error while downloading %s to %s" => "Galat saat mengunduh %s ke %s", +"Error when creating the file" => "Galat saat membuat berkas", +"Folder name cannot be empty." => "Nama folder tidak bolh kosong.", +"Folder name must not contain \"/\". Please choose a different name." => "Nama folder tidak boleh mengandung \"/\". Silakan pilih nama yang berbeda.", +"Error when creating the folder" => "Galat saat membuat folder", +"Unable to set upload directory." => "Tidak dapat mengatur folder unggah", +"Invalid Token" => "Token tidak sah", "No file was uploaded. Unknown error" => "Tidak ada berkas yang diunggah. Galat tidak dikenal.", "There is no error, the file uploaded with success" => "Tidak ada galat, berkas sukses diunggah", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Berkas yang diunggah melampaui direktif upload_max_filesize pada php.ini", @@ -11,42 +22,47 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Folder sementara tidak ada", "Failed to write to disk" => "Gagal menulis ke disk", "Not enough storage available" => "Ruang penyimpanan tidak mencukupi", +"Upload failed. Could not get file info." => "Unggah gagal. Tidak mendapatkan informasi berkas.", +"Upload failed. Could not find uploaded file" => "Unggah gagal. Tidak menemukan berkas yang akan diunggah", "Invalid directory." => "Direktori tidak valid.", "Files" => "Berkas", -"Unable to upload your file as it is a directory or has 0 bytes" => "Gagal mengunggah berkas Anda karena berupa direktori atau mempunyai ukuran 0 byte", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte", "Not enough space available" => "Ruang penyimpanan tidak mencukupi", "Upload cancelled." => "Pengunggahan dibatalkan.", +"Could not get result from server." => "Tidak mendapatkan hasil dari server.", "File upload is in progress. Leaving the page now will cancel the upload." => "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.", -"URL cannot be empty." => "URL tidak boleh kosong", -"Error" => "Galat", +"URL cannot be empty" => "URL tidak boleh kosong", +"In the home folder 'Shared' is a reserved filename" => "Pada folder home, 'Shared' adalah nama berkas yang sudah digunakan", +"{new_name} already exists" => "{new_name} sudah ada", +"Could not create file" => "Tidak dapat membuat berkas", +"Could not create folder" => "Tidak dapat membuat folder", "Share" => "Bagikan", "Delete permanently" => "Hapus secara permanen", -"Delete" => "Hapus", "Rename" => "Ubah nama", "Pending" => "Menunggu", -"{new_name} already exists" => "{new_name} sudah ada", -"replace" => "ganti", -"suggest name" => "sarankan nama", -"cancel" => "batalkan", +"Could not rename file" => "Tidak dapat mengubah nama berkas", "replaced {new_name} with {old_name}" => "mengganti {new_name} dengan {old_name}", "undo" => "urungkan", -"perform delete operation" => "Lakukan operasi penghapusan", -"1 file uploading" => "1 berkas diunggah", -"files uploading" => "berkas diunggah", +"Error deleting file." => "Galat saat menghapus berkas.", +"_%n folder_::_%n folders_" => array("%n folder"), +"_%n file_::_%n files_" => array("%n berkas"), +"{dirs} and {files}" => "{dirs} dan {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Mengunggah %n berkas"), "'.' is an invalid file name." => "'.' bukan nama berkas yang valid.", -"File name cannot be empty." => "Nama berkas tidak boleh kosong.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nama tidak valid, karakter '\\', '/', '<', '>', ':', '\"', '|', '?' dan '*' tidak diizinkan.", "Your storage is full, files can not be updated or synced anymore!" => "Ruang penyimpanan Anda penuh, berkas tidak dapat diperbarui atau disinkronkan lagi!", "Your storage is almost full ({usedSpacePercent}%)" => "Ruang penyimpanan hampir penuh ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikasi Enskripsi telah diaktifkan tetapi kunci tidak diinisialisasi, silakan log-out dan log-in lagi", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Kunci privat tidak sah untuk Aplikasi Enskripsi. Silakan perbarui sandi kunci privat anda pada pengaturan pribadi untuk memulihkan akses ke berkas anda yang dienskripsi.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Enskripi telah dinonaktifkan tetapi berkas anda tetap dienskripsi. Silakan menuju ke pengaturan pribadi untuk deskrip berkas anda.", "Your download is being prepared. This might take some time if the files are big." => "Unduhan Anda sedang disiapkan. Prosesnya dapat berlangsung agak lama jika ukuran berkasnya besar.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nama folder salah. Nama 'Shared' telah digunakan oleh Owncloud.", +"Error moving file" => "Galat saat memindahkan berkas", +"Error" => "Galat", "Name" => "Nama", "Size" => "Ukuran", "Modified" => "Dimodifikasi", -"1 folder" => "1 folder", -"{count} folders" => "{count} folder", -"1 file" => "1 berkas", -"{count} files" => "{count} berkas", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nama folder tidak sah. Menggunakan 'Shared' sudah digunakan.", +"%s could not be renamed" => "%s tidak dapat diubah nama", "Upload" => "Unggah", "File handling" => "Penanganan berkas", "Maximum upload size" => "Ukuran pengunggahan maksimum", @@ -57,21 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Ukuran masukan maksimum untuk berkas ZIP", "Save" => "Simpan", "New" => "Baru", +"New text file" => "Berkas teks baru", "Text file" => "Berkas teks", +"New folder" => "Map baru", "Folder" => "Folder", "From link" => "Dari tautan", "Deleted files" => "Berkas yang dihapus", "Cancel upload" => "Batal pengunggahan", -"You don’t have write permissions here." => "Anda tidak memiliki izin menulis di sini.", +"You don’t have permission to upload or create files here" => "Anda tidak memiliki akses untuk mengunggah atau membuat berkas disini", "Nothing in here. Upload something!" => "Tidak ada apa-apa di sini. Unggah sesuatu!", "Download" => "Unduh", -"Unshare" => "Batalkan berbagi", +"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.", "Current scanning" => "Yang sedang dipindai", -"file" => "berkas", -"files" => "berkas-berkas", "Upgrading filesystem cache..." => "Meningkatkan tembolok sistem berkas..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/is.php b/apps/files/l10n/is.php index 8a131b20c8..5c5cc7d5d7 100644 --- a/apps/files/l10n/is.php +++ b/apps/files/l10n/is.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Gat ekki fært %s - Skrá með þessu nafni er þegar til", "Could not move %s" => "Gat ekki fært %s", +"File name cannot be empty." => "Nafn skráar má ekki vera tómt", "No file was uploaded. Unknown error" => "Engin skrá var send inn. Óþekkt villa.", "There is no error, the file uploaded with success" => "Engin villa, innsending heppnaðist", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Innsend skrá er stærri en upload_max stillingin í php.ini:", @@ -12,34 +13,24 @@ $TRANSLATIONS = array( "Failed to write to disk" => "Tókst ekki að skrifa á disk", "Invalid directory." => "Ógild mappa.", "Files" => "Skrár", -"Unable to upload your file as it is a directory or has 0 bytes" => "Innsending á skrá mistókst, hugsanlega sendir þú möppu eða skráin er 0 bæti.", "Not enough space available" => "Ekki nægt pláss tiltækt", "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.", -"URL cannot be empty." => "Vefslóð má ekki vera tóm.", -"Error" => "Villa", +"{new_name} already exists" => "{new_name} er þegar til", "Share" => "Deila", -"Delete" => "Eyða", "Rename" => "Endurskýra", "Pending" => "Bíður", -"{new_name} already exists" => "{new_name} er þegar til", -"replace" => "yfirskrifa", -"suggest name" => "stinga upp á nafni", -"cancel" => "hætta við", "replaced {new_name} with {old_name}" => "yfirskrifaði {new_name} með {old_name}", "undo" => "afturkalla", -"1 file uploading" => "1 skrá innsend", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "'.' is an invalid file name." => "'.' er ekki leyfilegt nafn.", -"File name cannot be empty." => "Nafn skráar má ekki vera tómt", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ógilt nafn, táknin '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' eru ekki leyfð.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Óleyfilegt nafn á möppu. Nafnið 'Shared' er frátekið fyrir Owncloud", +"Error" => "Villa", "Name" => "Nafn", "Size" => "Stærð", "Modified" => "Breytt", -"1 folder" => "1 mappa", -"{count} folders" => "{count} möppur", -"1 file" => "1 skrá", -"{count} files" => "{count} skrár", "Upload" => "Senda inn", "File handling" => "Meðhöndlun skrár", "Maximum upload size" => "Hámarks stærð innsendingar", @@ -56,7 +47,7 @@ $TRANSLATIONS = array( "Cancel upload" => "Hætta við innsendingu", "Nothing in here. Upload something!" => "Ekkert hér. Settu eitthvað inn!", "Download" => "Niðurhal", -"Unshare" => "Hætta deilingu", +"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.php b/apps/files/l10n/it.php index e5e4bd03bb..335ae41656 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Impossibile spostare %s - un file con questo nome esiste già", "Could not move %s" => "Impossibile spostare %s", +"File name cannot be empty." => "Il nome del file non può essere vuoto.", +"File name must not contain \"/\". Please choose a different name." => "Il nome del file non può contenere il carattere \"/\". Scegli un nome diverso.", +"The name %s is already used in the folder %s. Please choose a different name." => "Il nome %s è attualmente in uso nella cartella %s. Scegli un nome diverso.", +"Not a valid source" => "Non è una sorgente valida", +"Error while downloading %s to %s" => "Errore durante lo scaricamento di %s su %s", +"Error when creating the file" => "Errore durante la creazione del file", +"Folder name cannot be empty." => "Il nome della cartella non può essere vuoto.", +"Folder name must not contain \"/\". Please choose a different name." => "Il nome della cartella non può contenere il carattere \"/\". Scegli un nome diverso.", +"Error when creating the folder" => "Errore durante la creazione della cartella", "Unable to set upload directory." => "Impossibile impostare una cartella di caricamento.", "Invalid Token" => "Token non valido", "No file was uploaded. Unknown error" => "Nessun file è stato inviato. Errore sconosciuto", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Manca una cartella temporanea", "Failed to write to disk" => "Scrittura su disco non riuscita", "Not enough storage available" => "Spazio di archiviazione insufficiente", +"Upload failed. Could not get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.", +"Upload failed. Could not find uploaded file" => "Caricamento non riuscito. Impossibile trovare il file caricato.", "Invalid directory." => "Cartella non valida.", "Files" => "File", -"Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile caricare il file poiché è una cartella o ha una dimensione di 0 byte", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", "Not enough space available" => "Spazio disponibile insufficiente", "Upload cancelled." => "Invio annullato", +"Could not get result from server." => "Impossibile ottenere il risultato dal server.", "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.", -"URL cannot be empty." => "L'URL non può essere vuoto.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome della cartella non valido. L'uso di 'Shared' è riservato a ownCloud", -"Error" => "Errore", +"URL cannot be empty" => "L'URL non può essere vuoto.", +"In the home folder 'Shared' is a reserved filename" => "Nella cartella home 'Shared' è un nome riservato", +"{new_name} already exists" => "{new_name} esiste già", +"Could not create file" => "Impossibile creare il file", +"Could not create folder" => "Impossibile creare la cartella", "Share" => "Condividi", "Delete permanently" => "Elimina definitivamente", -"Delete" => "Elimina", "Rename" => "Rinomina", "Pending" => "In corso", -"{new_name} already exists" => "{new_name} esiste già", -"replace" => "sostituisci", -"suggest name" => "suggerisci nome", -"cancel" => "annulla", +"Could not rename file" => "Impossibile rinominare il file", "replaced {new_name} with {old_name}" => "sostituito {new_name} con {old_name}", "undo" => "annulla", -"perform delete operation" => "esegui l'operazione di eliminazione", -"1 file uploading" => "1 file in fase di caricamento", -"files uploading" => "caricamento file", +"Error deleting file." => "Errore durante l'eliminazione del file.", +"_%n folder_::_%n folders_" => array("%n cartella","%n cartelle"), +"_%n file_::_%n files_" => array("%n file","%n file"), +"{dirs} and {files}" => "{dirs} e {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Caricamento di %n file in corso","Caricamento di %n file in corso"), "'.' is an invalid file name." => "'.' non è un nome file valido.", -"File name cannot be empty." => "Il nome del file non può essere vuoto.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non valido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non sono consentiti.", "Your storage is full, files can not be updated or synced anymore!" => "Lo spazio di archiviazione è pieno, i file non possono essere più aggiornati o sincronizzati!", "Your storage is almost full ({usedSpacePercent}%)" => "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "L'applicazione di cifratura è abilitata, ma le chiavi non sono state inizializzate, disconnettiti ed effettua nuovamente l'accesso", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Chiave privata non valida per l'applicazione di cifratura. Aggiorna la password della chiave privata nelle impostazioni personali per ripristinare l'accesso ai tuoi file cifrati.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "La cifratura è stata disabilitata ma i tuoi file sono ancora cifrati. Vai nelle impostazioni personali per decifrare i file.", "Your download is being prepared. This might take some time if the files are big." => "Il tuo scaricamento è in fase di preparazione. Ciò potrebbe richiedere del tempo se i file sono grandi.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome della cartella non valido. L'uso di 'Shared' è riservato da ownCloud", +"Error moving file" => "Errore durante lo spostamento del file", +"Error" => "Errore", "Name" => "Nome", "Size" => "Dimensione", "Modified" => "Modificato", -"1 folder" => "1 cartella", -"{count} folders" => "{count} cartelle", -"1 file" => "1 file", -"{count} files" => "{count} file", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nome della cartella non valido. L'uso di 'Shared' è riservato.", "%s could not be renamed" => "%s non può essere rinominato", "Upload" => "Carica", "File handling" => "Gestione file", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Dimensione massima per i file ZIP", "Save" => "Salva", "New" => "Nuovo", +"New text file" => "Nuovo file di testo", "Text file" => "File di testo", +"New folder" => "Nuova cartella", "Folder" => "Cartella", "From link" => "Da collegamento", "Deleted files" => "File eliminati", "Cancel upload" => "Annulla invio", -"You don’t have write permissions here." => "Qui non hai i permessi di scrittura.", +"You don’t have permission to upload or create files here" => "Qui non hai i permessi di caricare o creare file", "Nothing in here. Upload something!" => "Non c'è niente qui. Carica qualcosa!", "Download" => "Scarica", -"Unshare" => "Rimuovi condivisione", +"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", "Current scanning" => "Scansione corrente", -"directory" => "cartella", -"directories" => "cartelle", -"file" => "file", -"files" => "file", "Upgrading filesystem cache..." => "Aggiornamento della cache del filesystem in corso..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index 0902353a17..dd55615186 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s を移動できませんでした ― この名前のファイルはすでに存在します", "Could not move %s" => "%s を移動できませんでした", +"File name cannot be empty." => "ファイル名を空にすることはできません。", +"File name must not contain \"/\". Please choose a different name." => "ファイル名には \"/\" を含めることはできません。別の名前を選択してください。", +"The name %s is already used in the folder %s. Please choose a different name." => "%s はフォルダ %s ないですでに使われています。別の名前を選択してください。", +"Not a valid source" => "有効なソースではありません", +"Error while downloading %s to %s" => "%s から %s へのダウンロードエラー", +"Error when creating the file" => "ファイルの生成エラー", +"Folder name cannot be empty." => "フォルダ名は空にできません", +"Folder name must not contain \"/\". Please choose a different name." => "フォルダ名には \"/\" を含めることはできません。別の名前を選択してください。", +"Error when creating the folder" => "フォルダの生成エラー", "Unable to set upload directory." => "アップロードディレクトリを設定出来ません。", "Invalid Token" => "無効なトークン", "No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "一時保存フォルダが見つかりません", "Failed to write to disk" => "ディスクへの書き込みに失敗しました", "Not enough storage available" => "ストレージに十分な空き容量がありません", +"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。", +"Upload failed. Could not find uploaded file" => "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。", "Invalid directory." => "無効なディレクトリです。", "Files" => "ファイル", -"Unable to upload your file as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのファイルはアップロードできません", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのため {filename} をアップロードできません", "Not enough space available" => "利用可能なスペースが十分にありません", "Upload cancelled." => "アップロードはキャンセルされました。", +"Could not get result from server." => "サーバから結果を取得できませんでした。", "File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。", -"URL cannot be empty." => "URLは空にできません。", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無効なフォルダ名です。'Shared' の利用はownCloudで予約済みです", -"Error" => "エラー", +"URL cannot be empty" => "URL は空にできません", +"In the home folder 'Shared' is a reserved filename" => "ホームフォルダでは、'Shared' はシステムが使用する予約済みのファイル名です", +"{new_name} already exists" => "{new_name} はすでに存在しています", +"Could not create file" => "ファイルを作成できませんでした", +"Could not create folder" => "フォルダを作成できませんでした", "Share" => "共有", "Delete permanently" => "完全に削除する", -"Delete" => "削除", "Rename" => "名前の変更", "Pending" => "中断", -"{new_name} already exists" => "{new_name} はすでに存在しています", -"replace" => "置き換え", -"suggest name" => "推奨名称", -"cancel" => "キャンセル", +"Could not rename file" => "ファイルの名前変更ができませんでした", "replaced {new_name} with {old_name}" => "{old_name} を {new_name} に置換", "undo" => "元に戻す", -"perform delete operation" => "削除を実行", -"1 file uploading" => "ファイルを1つアップロード中", -"files uploading" => "ファイルをアップロード中", +"Error deleting file." => "ファイルの削除エラー。", +"_%n folder_::_%n folders_" => array("%n 個のフォルダ"), +"_%n file_::_%n files_" => array("%n 個のファイル"), +"{dirs} and {files}" => "{dirs} と {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n 個のファイルをアップロード中"), "'.' is an invalid file name." => "'.' は無効なファイル名です。", -"File name cannot be empty." => "ファイル名を空にすることはできません。", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。", "Your storage is full, files can not be updated or synced anymore!" => "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!", "Your storage is almost full ({usedSpacePercent}%)" => "あなたのストレージはほぼ一杯です({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "暗号化アプリの無効なプライベートキーです。あなたの暗号化されたファイルへアクセスするために、個人設定からプライベートキーのパスワードを更新してください。", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。", "Your download is being prepared. This might take some time if the files are big." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "無効なフォルダ名です。'Shared' の利用は ownCloud が予約済みです。", +"Error moving file" => "ファイルの移動エラー", +"Error" => "エラー", "Name" => "名前", "Size" => "サイズ", -"Modified" => "変更", -"1 folder" => "1 フォルダ", -"{count} folders" => "{count} フォルダ", -"1 file" => "1 ファイル", -"{count} files" => "{count} ファイル", +"Modified" => "更新日時", +"Invalid folder name. Usage of 'Shared' is reserved." => "無効なフォルダ名。「Shared」の利用は予約されています。", "%s could not be renamed" => "%sの名前を変更できませんでした", "Upload" => "アップロード", "File handling" => "ファイル操作", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "ZIPファイルへの最大入力サイズ", "Save" => "保存", "New" => "新規作成", +"New text file" => "新規のテキストファイル作成", "Text file" => "テキストファイル", +"New folder" => "新しいフォルダ", "Folder" => "フォルダ", "From link" => "リンク", -"Deleted files" => "削除ファイル", +"Deleted files" => "ゴミ箱", "Cancel upload" => "アップロードをキャンセル", -"You don’t have write permissions here." => "あなたには書き込み権限がありません。", +"You don’t have permission to upload or create files here" => "ここにファイルをアップロードもしくは作成する権限がありません", "Nothing in here. Upload something!" => "ここには何もありません。何かアップロードしてください。", "Download" => "ダウンロード", -"Unshare" => "共有解除", +"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." => "ファイルをスキャンしています、しばらくお待ちください。", "Current scanning" => "スキャン中", -"directory" => "ディレクトリ", -"directories" => "ディレクトリ", -"file" => "ファイル", -"files" => "ファイル", "Upgrading filesystem cache..." => "ファイルシステムキャッシュを更新中..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/ka.php b/apps/files/l10n/ka.php index bbc70614cf..544e8168c5 100644 --- a/apps/files/l10n/ka.php +++ b/apps/files/l10n/ka.php @@ -1,6 +1,9 @@ "ფაილები", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), "Download" => "გადმოწერა" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php index f6bf618106..eafa0c083f 100644 --- a/apps/files/l10n/ka_GE.php +++ b/apps/files/l10n/ka_GE.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s –ის გადატანა ვერ მოხერხდა – ფაილი ამ სახელით უკვე არსებობს", "Could not move %s" => "%s –ის გადატანა ვერ მოხერხდა", +"File name cannot be empty." => "ფაილის სახელი არ შეიძლება იყოს ცარიელი.", "No file was uploaded. Unknown error" => "ფაილი არ აიტვირთა. უცნობი შეცდომა", "There is no error, the file uploaded with success" => "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში", @@ -13,40 +14,28 @@ $TRANSLATIONS = array( "Not enough storage available" => "საცავში საკმარისი ადგილი არ არის", "Invalid directory." => "დაუშვებელი დირექტორია.", "Files" => "ფაილები", -"Unable to upload your file as it is a directory or has 0 bytes" => "თქვენი ფაილის ატვირთვა ვერ მოხერხდა. ის არის საქაღალდე და შეიცავს 0 ბაიტს", "Not enough space available" => "საკმარისი ადგილი არ არის", "Upload cancelled." => "ატვირთვა შეჩერებულ იქნა.", "File upload is in progress. Leaving the page now will cancel the upload." => "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას", -"URL cannot be empty." => "URL არ შეიძლება იყოს ცარიელი.", -"Error" => "შეცდომა", +"{new_name} already exists" => "{new_name} უკვე არსებობს", "Share" => "გაზიარება", "Delete permanently" => "სრულად წაშლა", -"Delete" => "წაშლა", "Rename" => "გადარქმევა", "Pending" => "მოცდის რეჟიმში", -"{new_name} already exists" => "{new_name} უკვე არსებობს", -"replace" => "შეცვლა", -"suggest name" => "სახელის შემოთავაზება", -"cancel" => "უარყოფა", "replaced {new_name} with {old_name}" => "{new_name} შეცვლილია {old_name}–ით", "undo" => "დაბრუნება", -"perform delete operation" => "მიმდინარეობს წაშლის ოპერაცია", -"1 file uploading" => "1 ფაილის ატვირთვა", -"files uploading" => "ფაილები იტვირთება", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), "'.' is an invalid file name." => "'.' არის დაუშვებელი ფაილის სახელი.", -"File name cannot be empty." => "ფაილის სახელი არ შეიძლება იყოს ცარიელი.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "არადაშვებადი სახელი, '\\', '/', '<', '>', ':', '\"', '|', '?' და '*' არ არის დაიშვებული.", "Your storage is full, files can not be updated or synced anymore!" => "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!", "Your storage is almost full ({usedSpacePercent}%)" => "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "გადმოწერის მოთხოვნა მუშავდება. ის მოითხოვს გარკვეულ დროს რაგდან ფაილები არის დიდი ზომის.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "დაუშვებელი ფოლდერის სახელი. 'Shared'–ის გამოყენება რეზერვირებულია Owncloud–ის მიერ", +"Error" => "შეცდომა", "Name" => "სახელი", "Size" => "ზომა", "Modified" => "შეცვლილია", -"1 folder" => "1 საქაღალდე", -"{count} folders" => "{count} საქაღალდე", -"1 file" => "1 ფაილი", -"{count} files" => "{count} ფაილი", "Upload" => "ატვირთვა", "File handling" => "ფაილის დამუშავება", "Maximum upload size" => "მაქსიმუმ ატვირთის ზომა", @@ -58,14 +47,14 @@ $TRANSLATIONS = array( "Save" => "შენახვა", "New" => "ახალი", "Text file" => "ტექსტური ფაილი", +"New folder" => "ახალი ფოლდერი", "Folder" => "საქაღალდე", "From link" => "მისამართიდან", "Deleted files" => "წაშლილი ფაილები", "Cancel upload" => "ატვირთვის გაუქმება", -"You don’t have write permissions here." => "თქვენ არ გაქვთ ჩაწერის უფლება აქ.", "Nothing in here. Upload something!" => "აქ არაფერი არ არის. ატვირთე რამე!", "Download" => "ჩამოტვირთვა", -"Unshare" => "გაუზიარებადი", +"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.php b/apps/files/l10n/km.php new file mode 100644 index 0000000000..9733358d62 --- /dev/null +++ b/apps/files/l10n/km.php @@ -0,0 +1,8 @@ + array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), +"Delete" => "លុប" +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/kn.php b/apps/files/l10n/kn.php new file mode 100644 index 0000000000..70ab6572ba --- /dev/null +++ b/apps/files/l10n/kn.php @@ -0,0 +1,7 @@ + array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array("") +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index d68fb162d0..fbb80b7bfa 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -2,6 +2,9 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s 항목을 이동시키지 못하였음 - 파일 이름이 이미 존재함", "Could not move %s" => "%s 항목을 이딩시키지 못하였음", +"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.", +"Unable to set upload directory." => "업로드 디렉터리를 정할수 없습니다", +"Invalid Token" => "잘못된 토큰", "No file was uploaded. Unknown error" => "파일이 업로드되지 않았습니다. 알 수 없는 오류입니다", "There is no error, the file uploaded with success" => "파일 업로드에 성공하였습니다.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:", @@ -11,42 +14,38 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "임시 폴더가 없음", "Failed to write to disk" => "디스크에 쓰지 못했습니다", "Not enough storage available" => "저장소가 용량이 충분하지 않습니다.", +"Upload failed. Could not get file info." => "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다.", +"Upload failed. Could not find uploaded file" => "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다", "Invalid directory." => "올바르지 않은 디렉터리입니다.", "Files" => "파일", -"Unable to upload your file as it is a directory or has 0 bytes" => "디렉터리 및 빈 파일은 업로드할 수 없습니다", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다.", "Not enough space available" => "여유 공간이 부족합니다", "Upload cancelled." => "업로드가 취소되었습니다.", +"Could not get result from server." => "서버에서 결과를 가져올수 없습니다.", "File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.", -"URL cannot be empty." => "URL을 입력해야 합니다.", -"Error" => "오류", +"{new_name} already exists" => "{new_name}이(가) 이미 존재함", "Share" => "공유", "Delete permanently" => "영원히 삭제", -"Delete" => "삭제", "Rename" => "이름 바꾸기", "Pending" => "대기 중", -"{new_name} already exists" => "{new_name}이(가) 이미 존재함", -"replace" => "바꾸기", -"suggest name" => "이름 제안", -"cancel" => "취소", "replaced {new_name} with {old_name}" => "{old_name}이(가) {new_name}(으)로 대체됨", "undo" => "되돌리기", -"perform delete operation" => "삭제 작업중", -"1 file uploading" => "파일 1개 업로드 중", -"files uploading" => "파일 업로드중", +"_%n folder_::_%n folders_" => array("폴더 %n"), +"_%n file_::_%n files_" => array("파일 %n 개"), +"{dirs} and {files}" => "{dirs} 그리고 {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n 개의 파일을 업로드중"), "'.' is an invalid file name." => "'.' 는 올바르지 않은 파일 이름 입니다.", -"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.", "Your storage is full, files can not be updated or synced anymore!" => "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!", "Your storage is almost full ({usedSpacePercent}%)" => "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오", "Your download is being prepared. This might take some time if the files are big." => "다운로드가 준비 중입니다. 파일 크기가 크다면 시간이 오래 걸릴 수도 있습니다.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "폴더 이름이 유효하지 않습니다. ", +"Error moving file" => "파일 이동 오류", +"Error" => "오류", "Name" => "이름", "Size" => "크기", "Modified" => "수정됨", -"1 folder" => "폴더 1개", -"{count} folders" => "폴더 {count}개", -"1 file" => "파일 1개", -"{count} files" => "파일 {count}개", +"%s could not be renamed" => "%s 의 이름을 변경할수 없습니다", "Upload" => "업로드", "File handling" => "파일 처리", "Maximum upload size" => "최대 업로드 크기", @@ -58,20 +57,18 @@ $TRANSLATIONS = array( "Save" => "저장", "New" => "새로 만들기", "Text file" => "텍스트 파일", +"New folder" => "새 폴더", "Folder" => "폴더", "From link" => "링크에서", "Deleted files" => "파일 삭제됨", "Cancel upload" => "업로드 취소", -"You don’t have write permissions here." => "당신은 여기에 쓰기를 할 수 있는 권한이 없습니다.", "Nothing in here. Upload something!" => "내용이 없습니다. 업로드할 수 있습니다!", "Download" => "다운로드", -"Unshare" => "공유 해제", +"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." => "파일을 검색하고 있습니다. 기다려 주십시오.", "Current scanning" => "현재 검색", -"file" => "파일", -"files" => "파일", "Upgrading filesystem cache..." => "파일 시스템 캐시 업그레이드 중..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/ku_IQ.php b/apps/files/l10n/ku_IQ.php index ad85edaa0d..f04e9ec44d 100644 --- a/apps/files/l10n/ku_IQ.php +++ b/apps/files/l10n/ku_IQ.php @@ -1,6 +1,9 @@ "ناونیشانی به‌سته‌ر نابێت به‌تاڵ بێت.", +"Share" => "هاوبەشی کردن", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "Error" => "هه‌ڵه", "Name" => "ناو", "Upload" => "بارکردن", diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php index 762d9189fb..822ca7e2d0 100644 --- a/apps/files/l10n/lb.php +++ b/apps/files/l10n/lb.php @@ -7,15 +7,15 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Et feelt en temporären Dossier", "Failed to write to disk" => "Konnt net op den Disk schreiwen", "Files" => "Dateien", -"Unable to upload your file as it is a directory or has 0 bytes" => "Kann deng Datei net eroplueden well et en Dossier ass oder 0 byte grouss ass.", "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.", -"Error" => "Fehler", "Share" => "Deelen", -"Delete" => "Läschen", -"replace" => "ersetzen", -"cancel" => "ofbriechen", +"Rename" => "Ëm-benennen", "undo" => "réckgängeg man", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "Fehler", "Name" => "Numm", "Size" => "Gréisst", "Modified" => "Geännert", @@ -34,12 +34,10 @@ $TRANSLATIONS = array( "Cancel upload" => "Upload ofbriechen", "Nothing in here. Upload something!" => "Hei ass näischt. Lued eppes rop!", "Download" => "Download", -"Unshare" => "Net méi deelen", +"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.", -"Current scanning" => "Momentane Scan", -"file" => "Datei", -"files" => "Dateien" +"Current scanning" => "Momentane Scan" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php index c2d0fee6e6..d902365863 100644 --- a/apps/files/l10n/lt_LT.php +++ b/apps/files/l10n/lt_LT.php @@ -2,6 +2,17 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja", "Could not move %s" => "Nepavyko perkelti %s", +"File name cannot be empty." => "Failo pavadinimas negali būti tuščias.", +"File name must not contain \"/\". Please choose a different name." => "Failo pavadinime negali būti simbolio \"/\". Prašome pasirinkti kitokį pavadinimą.", +"The name %s is already used in the folder %s. Please choose a different name." => "Pavadinimas %s jau naudojamas aplanke %s. Prašome pasirinkti kitokį pavadinimą.", +"Not a valid source" => "Netinkamas šaltinis", +"Error while downloading %s to %s" => "Klaida siunčiant %s į %s", +"Error when creating the file" => "Klaida kuriant failą", +"Folder name cannot be empty." => "Aplanko pavadinimas negali būti tuščias.", +"Folder name must not contain \"/\". Please choose a different name." => "Aplanko pavadinime negali būti simbolio \"/\". Prašome pasirinkti kitokį pavadinimą.", +"Error when creating the folder" => "Klaida kuriant aplanką", +"Unable to set upload directory." => "Nepavyksta nustatyti įkėlimų katalogo.", +"Invalid Token" => "Netinkamas ženklas", "No file was uploaded. Unknown error" => "Failai nebuvo įkelti dėl nežinomos priežasties", "There is no error, the file uploaded with success" => "Failas įkeltas sėkmingai, be klaidų", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Įkeliamas failas yra didesnis nei leidžia upload_max_filesize php.ini faile:", @@ -11,43 +22,45 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Nėra laikinojo katalogo", "Failed to write to disk" => "Nepavyko įrašyti į diską", "Not enough storage available" => "Nepakanka vietos serveryje", +"Upload failed. Could not get file info." => "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.", +"Upload failed. Could not find uploaded file" => "Įkėlimas nepavyko. Nepavyko rasti įkelto failo", "Invalid directory." => "Neteisingas aplankas", "Files" => "Failai", -"Unable to upload your file as it is a directory or has 0 bytes" => "Neįmanoma įkelti failo - jo dydis gali būti 0 bitų arba tai katalogas", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio", "Not enough space available" => "Nepakanka vietos", "Upload cancelled." => "Įkėlimas atšauktas.", +"Could not get result from server." => "Nepavyko gauti rezultato iš serverio.", "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.", -"URL cannot be empty." => "URL negali būti tuščias.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Negalimas aplanko pavadinimas. 'Shared' pavadinimas yra rezervuotas ownCloud", -"Error" => "Klaida", +"URL cannot be empty" => "URL negali būti tuščias.", +"{new_name} already exists" => "{new_name} jau egzistuoja", +"Could not create file" => "Neįmanoma sukurti failo", +"Could not create folder" => "Neįmanoma sukurti aplanko", "Share" => "Dalintis", "Delete permanently" => "Ištrinti negrįžtamai", -"Delete" => "Ištrinti", "Rename" => "Pervadinti", "Pending" => "Laukiantis", -"{new_name} already exists" => "{new_name} jau egzistuoja", -"replace" => "pakeisti", -"suggest name" => "pasiūlyti pavadinimą", -"cancel" => "atšaukti", +"Could not rename file" => "Neįmanoma pervadinti failo", "replaced {new_name} with {old_name}" => "pakeiskite {new_name} į {old_name}", "undo" => "anuliuoti", -"perform delete operation" => "ištrinti", -"1 file uploading" => "įkeliamas 1 failas", -"files uploading" => "įkeliami failai", +"Error deleting file." => "Klaida trinant failą.", +"_%n folder_::_%n folders_" => array("%n aplankas","%n aplankai","%n aplankų"), +"_%n file_::_%n files_" => array("%n failas","%n failai","%n failų"), +"{dirs} and {files}" => "{dirs} ir {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"), "'.' is an invalid file name." => "'.' yra neleidžiamas failo pavadinime.", -"File name cannot be empty." => "Failo pavadinimas negali būti tuščias.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neleistinas pavadinimas, '\\', '/', '<', '>', ':', '\"', '|', '?' ir '*' yra neleidžiami.", "Your storage is full, files can not be updated or synced anymore!" => "Jūsų visa vieta serveryje užimta", "Your storage is almost full ({usedSpacePercent}%)" => "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Šifravimo programa įjungta, bet Jūsų raktai nėra pritaikyti. Prašome atsijungti ir vėl prisijungti", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Netinkamas privatus raktas Šifravimo programai. Prašome atnaujinti savo privataus rakto slaptažodį asmeniniuose nustatymuose, kad atkurti prieigą prie šifruotų failų.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.", "Your download is being prepared. This might take some time if the files are big." => "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunčiamas didelis failas.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Negalimas aplanko pavadinimas. 'Shared' pavadinimas yra rezervuotas ownCloud", +"Error moving file" => "Klaida perkeliant failą", +"Error" => "Klaida", "Name" => "Pavadinimas", "Size" => "Dydis", "Modified" => "Pakeista", -"1 folder" => "1 aplankalas", -"{count} folders" => "{count} aplankalai", -"1 file" => "1 failas", -"{count} files" => "{count} failai", +"%s could not be renamed" => "%s negali būti pervadintas", "Upload" => "Įkelti", "File handling" => "Failų tvarkymas", "Maximum upload size" => "Maksimalus įkeliamo failo dydis", @@ -59,20 +72,19 @@ $TRANSLATIONS = array( "Save" => "Išsaugoti", "New" => "Naujas", "Text file" => "Teksto failas", +"New folder" => "Naujas aplankas", "Folder" => "Katalogas", "From link" => "Iš nuorodos", "Deleted files" => "Ištrinti failai", "Cancel upload" => "Atšaukti siuntimą", -"You don’t have write permissions here." => "Jūs neturite rašymo leidimo.", +"You don’t have permission to upload or create files here" => "Jūs neturite leidimo čia įkelti arba kurti failus", "Nothing in here. Upload something!" => "Čia tuščia. Įkelkite ką nors!", "Download" => "Atsisiųsti", -"Unshare" => "Nebesidalinti", +"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.", "Current scanning" => "Šiuo metu skenuojama", -"file" => "failas", -"files" => "failai", "Upgrading filesystem cache..." => "Atnaujinamas sistemos kešavimas..." ); $PLURAL_FORMS = "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/l10n/lv.php b/apps/files/l10n/lv.php index 24161cb2a6..7f8975b294 100644 --- a/apps/files/l10n/lv.php +++ b/apps/files/l10n/lv.php @@ -2,6 +2,9 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu", "Could not move %s" => "Nevarēja pārvietot %s", +"File name cannot be empty." => "Datnes nosaukums nevar būt tukšs.", +"Unable to set upload directory." => "Nevar uzstādīt augšupielādes mapi.", +"Invalid Token" => "Nepareiza pilnvara", "No file was uploaded. Unknown error" => "Netika augšupielādēta neviena datne. Nezināma kļūda", "There is no error, the file uploaded with success" => "Viss kārtībā, datne augšupielādēta veiksmīga", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Augšupielādētā datne pārsniedz upload_max_filesize norādījumu php.ini datnē:", @@ -13,39 +16,30 @@ $TRANSLATIONS = array( "Not enough storage available" => "Nav pietiekami daudz vietas", "Invalid directory." => "Nederīga direktorija.", "Files" => "Datnes", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nevar augšupielādēt jūsu datni, jo tā ir direktorija vai arī tā ir 0 baitu liela", "Not enough space available" => "Nepietiek brīvas vietas", "Upload cancelled." => "Augšupielāde ir atcelta.", "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.", -"URL cannot be empty." => "URL nevar būt tukšs.", -"Error" => "Kļūda", +"{new_name} already exists" => "{new_name} jau eksistē", "Share" => "Dalīties", "Delete permanently" => "Dzēst pavisam", -"Delete" => "Dzēst", "Rename" => "Pārsaukt", "Pending" => "Gaida savu kārtu", -"{new_name} already exists" => "{new_name} jau eksistē", -"replace" => "aizvietot", -"suggest name" => "ieteiktais nosaukums", -"cancel" => "atcelt", "replaced {new_name} with {old_name}" => "aizvietoja {new_name} ar {old_name}", "undo" => "atsaukt", -"perform delete operation" => "veikt dzēšanas darbību", -"1 file uploading" => "Augšupielādē 1 datni", +"_%n folder_::_%n folders_" => array("%n mapes","%n mape","%n mapes"), +"_%n file_::_%n files_" => array("%n faili","%n fails","%n faili"), +"_Uploading %n file_::_Uploading %n files_" => array("%n","Augšupielāde %n failu","Augšupielāde %n failus"), "'.' is an invalid file name." => "'.' ir nederīgs datnes nosaukums.", -"File name cannot be empty." => "Datnes nosaukums nevar būt tukšs.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nederīgs nosaukums, nav atļauti '\\', '/', '<', '>', ':', '\"', '|', '?' un '*'.", "Your storage is full, files can not be updated or synced anymore!" => "Jūsu krātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!", "Your storage is almost full ({usedSpacePercent}%)" => "Jūsu krātuve ir gandrīz pilna ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrēšana tika atslēgta, tomēr jūsu faili joprojām ir šifrēti. Atšifrēt failus var Personiskajos uzstādījumos.", "Your download is being prepared. This might take some time if the files are big." => "Tiek sagatavota lejupielāde. Tas var aizņemt kādu laiciņu, ja datnes ir lielas.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nederīgs mapes nosaukums. “Koplietots” izmantojums ir rezervēts ownCloud servisam.", +"Error" => "Kļūda", "Name" => "Nosaukums", "Size" => "Izmērs", "Modified" => "Mainīts", -"1 folder" => "1 mape", -"{count} folders" => "{count} mapes", -"1 file" => "1 datne", -"{count} files" => "{count} datnes", +"%s could not be renamed" => "%s nevar tikt pārsaukts", "Upload" => "Augšupielādēt", "File handling" => "Datņu pārvaldība", "Maximum upload size" => "Maksimālais datņu augšupielādes apjoms", @@ -57,20 +51,18 @@ $TRANSLATIONS = array( "Save" => "Saglabāt", "New" => "Jauna", "Text file" => "Teksta datne", +"New folder" => "Jauna mape", "Folder" => "Mape", "From link" => "No saites", "Deleted files" => "Dzēstās datnes", "Cancel upload" => "Atcelt augšupielādi", -"You don’t have write permissions here." => "Jums nav tiesību šeit rakstīt.", "Nothing in here. Upload something!" => "Te vēl nekas nav. Rīkojies, sāc augšupielādēt!", "Download" => "Lejupielādēt", -"Unshare" => "Pārtraukt dalīšanos", +"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.", "Current scanning" => "Šobrīd tiek caurskatīts", -"file" => "fails", -"files" => "faili", "Upgrading filesystem cache..." => "Uzlabo datņu sistēmas kešatmiņu..." ); $PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"; diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php index a922876553..fadf5efc07 100644 --- a/apps/files/l10n/mk.php +++ b/apps/files/l10n/mk.php @@ -1,5 +1,16 @@ "Не можам да го преместам %s - Датотека со такво име веќе постои", +"Could not move %s" => "Не можам да ги префрлам %s", +"File name cannot be empty." => "Името на датотеката не може да биде празно.", +"Not a valid source" => "Не е валиден извор", +"Error while downloading %s to %s" => "Грешка додека преземам %s to %s", +"Error when creating the file" => "Грешка при креирање на датотека", +"Folder name cannot be empty." => "Името на папката не може да биде празно.", +"Folder name must not contain \"/\". Please choose a different name." => "Името на папката не смее да содржи \"/\". Одберете друго име.", +"Error when creating the folder" => "Грешка при креирање на папка", +"Unable to set upload directory." => "Не може да се постави папката за префрлање на податоци.", +"Invalid Token" => "Грешен токен", "No file was uploaded. Unknown error" => "Ниту еден фајл не се вчита. Непозната грешка", "There is no error, the file uploaded with success" => "Датотеката беше успешно подигната.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini:", @@ -8,31 +19,41 @@ $TRANSLATIONS = array( "No file was uploaded" => "Не беше подигната датотека.", "Missing a temporary folder" => "Недостасува привремена папка", "Failed to write to disk" => "Неуспеав да запишам на диск", +"Not enough storage available" => "Нема доволно слободен сториџ", +"Upload failed. Could not find uploaded file" => "Префрлањето е неуспешно. Не можам да го најдам префрлената датотека.", +"Invalid directory." => "Погрешна папка.", "Files" => "Датотеки", -"Unable to upload your file as it is a directory or has 0 bytes" => "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти", +"Not enough space available" => "Немате доволно дисков простор", "Upload cancelled." => "Преземањето е прекинато.", +"Could not get result from server." => "Не можам да добијам резултат од серверот.", "File upload is in progress. Leaving the page now will cancel the upload." => "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", -"URL cannot be empty." => "Адресата неможе да биде празна.", -"Error" => "Грешка", +"URL cannot be empty" => "URL-то не може да биде празно", +"In the home folder 'Shared' is a reserved filename" => "Во домашната папка, 'Shared' е резервирано има на датотека/папка", +"{new_name} already exists" => "{new_name} веќе постои", +"Could not create file" => "Не множам да креирам датотека", +"Could not create folder" => "Не можам да креирам папка", "Share" => "Сподели", -"Delete" => "Избриши", +"Delete permanently" => "Трајно избришани", "Rename" => "Преименувај", "Pending" => "Чека", -"{new_name} already exists" => "{new_name} веќе постои", -"replace" => "замени", -"suggest name" => "предложи име", -"cancel" => "откажи", +"Could not rename file" => "Не можам да ја преименувам датотеката", "replaced {new_name} with {old_name}" => "заменета {new_name} со {old_name}", "undo" => "врати", -"1 file uploading" => "1 датотека се подига", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"{dirs} and {files}" => "{dirs} и {files}", +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"'.' is an invalid file name." => "'.' е грешно име за датотека.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправилно име. , '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не се дозволени.", +"Your storage is full, files can not be updated or synced anymore!" => "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!", +"Your storage is almost full ({usedSpacePercent}%)" => "Вашиот сториџ е скоро полн ({usedSpacePercent}%)", +"Your download is being prepared. This might take some time if the files are big." => "Вашето преземање се подготвува. Ова може да потрае до колку датотеките се големи.", +"Error moving file" => "Грешка при префрлање на датотека", +"Error" => "Грешка", "Name" => "Име", "Size" => "Големина", "Modified" => "Променето", -"1 folder" => "1 папка", -"{count} folders" => "{count} папки", -"1 file" => "1 датотека", -"{count} files" => "{count} датотеки", +"%s could not be renamed" => "%s не може да биде преименуван", "Upload" => "Подигни", "File handling" => "Ракување со датотеки", "Maximum upload size" => "Максимална големина за подигање", @@ -46,15 +67,15 @@ $TRANSLATIONS = array( "Text file" => "Текстуална датотека", "Folder" => "Папка", "From link" => "Од врска", +"Deleted files" => "Избришани датотеки", "Cancel upload" => "Откажи прикачување", "Nothing in here. Upload something!" => "Тука нема ништо. Снимете нешто!", "Download" => "Преземи", -"Unshare" => "Не споделувај", +"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." => "Се скенираат датотеки, ве молам почекајте.", "Current scanning" => "Моментално скенирам", -"file" => "датотека", -"files" => "датотеки" +"Upgrading filesystem cache..." => "Го надградувам кешот на фјал системот..." ); $PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"; diff --git a/apps/files/l10n/ml_IN.php b/apps/files/l10n/ml_IN.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/ml_IN.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php index 48ef8587ca..0a7a50abb1 100644 --- a/apps/files/l10n/ms_MY.php +++ b/apps/files/l10n/ms_MY.php @@ -8,14 +8,14 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Direktori sementara hilang", "Failed to write to disk" => "Gagal untuk disimpan", "Files" => "Fail-fail", -"Unable to upload your file as it is a directory or has 0 bytes" => "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes", "Upload cancelled." => "Muatnaik dibatalkan.", -"Error" => "Ralat", "Share" => "Kongsi", -"Delete" => "Padam", +"Rename" => "Namakan", "Pending" => "Dalam proses", -"replace" => "ganti", -"cancel" => "Batal", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), +"Error" => "Ralat", "Name" => "Nama", "Size" => "Saiz", "Modified" => "Dimodifikasi", @@ -34,11 +34,10 @@ $TRANSLATIONS = array( "Cancel upload" => "Batal muat naik", "Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!", "Download" => "Muat turun", +"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.", -"Current scanning" => "Imbasan semasa", -"file" => "fail", -"files" => "fail" +"Current scanning" => "Imbasan semasa" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/my_MM.php b/apps/files/l10n/my_MM.php index c94cc5fd6f..497ecc0949 100644 --- a/apps/files/l10n/my_MM.php +++ b/apps/files/l10n/my_MM.php @@ -1,6 +1,9 @@ "ဖိုင်များ", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), "Download" => "ဒေါင်းလုတ်" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php index 15104914fd..ebd7ef3899 100644 --- a/apps/files/l10n/nb_NO.php +++ b/apps/files/l10n/nb_NO.php @@ -2,7 +2,9 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Kan ikke flytte %s - En fil med samme navn finnes allerede", "Could not move %s" => "Kunne ikke flytte %s", +"File name cannot be empty." => "Filnavn kan ikke være tomt.", "Unable to set upload directory." => "Kunne ikke sette opplastingskatalog.", +"Invalid Token" => "Ugyldig nøkkel", "No file was uploaded. Unknown error" => "Ingen filer ble lastet opp. Ukjent feil.", "There is no error, the file uploaded with success" => "Pust ut, ingen feil. Filen ble lastet opp problemfritt", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Filstørrelsen overskrider maksgrensedirektivet upload_max_filesize i php.ini-konfigurasjonen.", @@ -14,41 +16,29 @@ $TRANSLATIONS = array( "Not enough storage available" => "Ikke nok lagringsplass", "Invalid directory." => "Ugyldig katalog.", "Files" => "Filer", -"Unable to upload your file as it is a directory or has 0 bytes" => "Kan ikke laste opp filen din siden det er en mappe eller den har 0 bytes", "Not enough space available" => "Ikke nok lagringsplass", "Upload cancelled." => "Opplasting avbrutt.", "File upload is in progress. Leaving the page now will cancel the upload." => "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.", -"URL cannot be empty." => "URL-en kan ikke være tom.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldig mappenavn. Bruk av \"Shared\" er reservert av ownCloud.", -"Error" => "Feil", +"{new_name} already exists" => "{new_name} finnes allerede", "Share" => "Del", "Delete permanently" => "Slett permanent", -"Delete" => "Slett", -"Rename" => "Omdøp", +"Rename" => "Gi nytt navn", "Pending" => "Ventende", -"{new_name} already exists" => "{new_name} finnes allerede", -"replace" => "erstatt", -"suggest name" => "foreslå navn", -"cancel" => "avbryt", -"replaced {new_name} with {old_name}" => "erstatt {new_name} med {old_name}", +"replaced {new_name} with {old_name}" => "erstattet {new_name} med {old_name}", "undo" => "angre", -"perform delete operation" => "utfør sletting", -"1 file uploading" => "1 fil lastes opp", -"files uploading" => "filer lastes opp", +"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"), +"_%n file_::_%n files_" => array("%n fil","%n filer"), +"_Uploading %n file_::_Uploading %n files_" => array("Laster opp %n fil","Laster opp %n filer"), "'.' is an invalid file name." => "'.' er et ugyldig filnavn.", -"File name cannot be empty." => "Filnavn kan ikke være tomt.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig navn, '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' er ikke tillatt.", "Your storage is full, files can not be updated or synced anymore!" => "Lagringsplass er oppbrukt, filer kan ikke lenger oppdateres eller synkroniseres!", -"Your storage is almost full ({usedSpacePercent}%)" => "Lagringsplass er nesten oppbruker ([usedSpacePercent}%)", +"Your storage is almost full ({usedSpacePercent}%)" => "Lagringsplass er nesten brukt opp ([usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Nedlastingen din klargjøres. Hvis filene er store kan dette ta litt tid.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ugyldig mappenavn. Bruk av \"Shared\" er reservert av ownCloud.", +"Error" => "Feil", "Name" => "Navn", "Size" => "Størrelse", "Modified" => "Endret", -"1 folder" => "1 mappe", -"{count} folders" => "{count} mapper", -"1 file" => "1 fil", -"{count} files" => "{count} filer", +"%s could not be renamed" => "Kunne ikke gi nytt navn til %s", "Upload" => "Last opp", "File handling" => "Filhåndtering", "Maximum upload size" => "Maksimum opplastingsstørrelse", @@ -60,22 +50,18 @@ $TRANSLATIONS = array( "Save" => "Lagre", "New" => "Ny", "Text file" => "Tekstfil", +"New folder" => "Ny mappe", "Folder" => "Mappe", "From link" => "Fra link", "Deleted files" => "Slettet filer", "Cancel upload" => "Avbryt opplasting", -"You don’t have write permissions here." => "Du har ikke skrivetilgang her.", "Nothing in here. Upload something!" => "Ingenting her. Last opp noe!", "Download" => "Last ned", -"Unshare" => "Avslutt deling", +"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 for å laste opp til denne serveren.", -"Files are being scanned, please wait." => "Skanner etter filer, vennligst vent.", +"Files are being scanned, please wait." => "Skanner filer, vennligst vent.", "Current scanning" => "Pågående skanning", -"directory" => "katalog", -"directories" => "kataloger", -"file" => "fil", -"files" => "filer", "Upgrading filesystem cache..." => "Oppgraderer filsystemets mellomlager..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/nds.php b/apps/files/l10n/nds.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/nds.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ne.php b/apps/files/l10n/ne.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/ne.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index d0f6542f1f..9edee862cb 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Kon %s niet verplaatsen - Er bestaat al een bestand met deze naam", "Could not move %s" => "Kon %s niet verplaatsen", +"File name cannot be empty." => "Bestandsnaam kan niet leeg zijn.", +"File name must not contain \"/\". Please choose a different name." => "De bestandsnaam mag geen \"/\" bevatten. Kies een andere naam.", +"The name %s is already used in the folder %s. Please choose a different name." => "De naam %s bestaat al in map %s. Kies een andere naam.", +"Not a valid source" => "Geen geldige bron", +"Error while downloading %s to %s" => "Fout bij downloaden %s naar %s", +"Error when creating the file" => "Fout bij creëren bestand", +"Folder name cannot be empty." => "Mapnaam mag niet leeg zijn.", +"Folder name must not contain \"/\". Please choose a different name." => "De mapnaam mag geen \"/\" bevatten. Kies een andere naam.", +"Error when creating the folder" => "Fout bij aanmaken map", "Unable to set upload directory." => "Kan upload map niet instellen.", "Invalid Token" => "Ongeldig Token", "No file was uploaded. Unknown error" => "Er was geen bestand geladen. Onbekende fout", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Er ontbreekt een tijdelijke map", "Failed to write to disk" => "Schrijven naar schijf mislukt", "Not enough storage available" => "Niet genoeg opslagruimte beschikbaar", +"Upload failed. Could not get file info." => "Upload mislukt, Kon geen bestandsinfo krijgen.", +"Upload failed. Could not find uploaded file" => "Upload mislukt. Kon ge-uploade bestand niet vinden", "Invalid directory." => "Ongeldige directory.", "Files" => "Bestanden", -"Unable to upload your file as it is a directory or has 0 bytes" => "Het lukt niet om uw bestand te uploaded, omdat het een folder of 0 bytes is", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is", "Not enough space available" => "Niet genoeg ruimte beschikbaar", "Upload cancelled." => "Uploaden geannuleerd.", +"Could not get result from server." => "Kon het resultaat van de server niet terugkrijgen.", "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.", -"URL cannot be empty." => "URL kan niet leeg zijn.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ongeldige mapnaam. Gebruik van 'Gedeeld' is voorbehouden aan Owncloud zelf", -"Error" => "Fout", +"URL cannot be empty" => "URL mag niet leeg zijn", +"In the home folder 'Shared' is a reserved filename" => "in de home map 'Shared' is een gereserveerde bestandsnaam", +"{new_name} already exists" => "{new_name} bestaat al", +"Could not create file" => "Kon bestand niet creëren", +"Could not create folder" => "Kon niet creëren map", "Share" => "Delen", "Delete permanently" => "Verwijder definitief", -"Delete" => "Verwijder", "Rename" => "Hernoem", "Pending" => "In behandeling", -"{new_name} already exists" => "{new_name} bestaat al", -"replace" => "vervang", -"suggest name" => "Stel een naam voor", -"cancel" => "annuleren", +"Could not rename file" => "Kon niet hernoemen bestand", "replaced {new_name} with {old_name}" => "verving {new_name} met {old_name}", "undo" => "ongedaan maken", -"perform delete operation" => "uitvoeren verwijderactie", -"1 file uploading" => "1 bestand wordt ge-upload", -"files uploading" => "bestanden aan het uploaden", +"Error deleting file." => "Fout bij verwijderen bestand.", +"_%n folder_::_%n folders_" => array("","%n mappen"), +"_%n file_::_%n files_" => array("","%n bestanden"), +"{dirs} and {files}" => "{dirs} en {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n bestand aan het uploaden","%n bestanden aan het uploaden"), "'.' is an invalid file name." => "'.' is een ongeldige bestandsnaam.", -"File name cannot be empty." => "Bestandsnaam kan niet leeg zijn.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Onjuiste naam; '\\', '/', '<', '>', ':', '\"', '|', '?' en '*' zijn niet toegestaan.", "Your storage is full, files can not be updated or synced anymore!" => "Uw opslagruimte zit vol, Bestanden kunnen niet meer worden ge-upload of gesynchroniseerd!", "Your storage is almost full ({usedSpacePercent}%)" => "Uw opslagruimte zit bijna vol ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Crypto app is geactiveerd, maar uw sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Ongeldige privésleutel voor crypto app. Werk het privésleutel wachtwoord bij in uw persoonlijke instellingen om opnieuw toegang te krijgen tot uw versleutelde bestanden.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Encryptie is uitgeschakeld maar uw bestanden zijn nog steeds versleuteld. Ga naar uw persoonlijke instellingen om uw bestanden te decoderen.", "Your download is being prepared. This might take some time if the files are big." => "Uw download wordt voorbereid. Dit kan enige tijd duren bij grote bestanden.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ongeldige mapnaam. Gebruik van'Gedeeld' is voorbehouden aan Owncloud", +"Error moving file" => "Fout bij verplaatsen bestand", +"Error" => "Fout", "Name" => "Naam", "Size" => "Grootte", "Modified" => "Aangepast", -"1 folder" => "1 map", -"{count} folders" => "{count} mappen", -"1 file" => "1 bestand", -"{count} files" => "{count} bestanden", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ongeldige mapnaam. Gebruik van 'Shared' is gereserveerd.", "%s could not be renamed" => "%s kon niet worden hernoemd", "Upload" => "Uploaden", "File handling" => "Bestand", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Maximale grootte voor ZIP bestanden", "Save" => "Bewaren", "New" => "Nieuw", +"New text file" => "Nieuw tekstbestand", "Text file" => "Tekstbestand", +"New folder" => "Nieuwe map", "Folder" => "Map", "From link" => "Vanaf link", "Deleted files" => "Verwijderde bestanden", "Cancel upload" => "Upload afbreken", -"You don’t have write permissions here." => "U hebt hier geen schrijfpermissies.", +"You don’t have permission to upload or create files here" => "U hebt geen toestemming om hier te uploaden of bestanden te maken", "Nothing in here. Upload something!" => "Er bevindt zich hier niets. Upload een bestand!", "Download" => "Downloaden", -"Unshare" => "Stop met delen", +"Delete" => "Verwijder", "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.", "Current scanning" => "Er wordt gescand", -"directory" => "directory", -"directories" => "directories", -"file" => "bestand", -"files" => "bestanden", "Upgrading filesystem cache..." => "Upgraden bestandssysteem cache..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php index 2e1a5a5cfc..a5e6e737ea 100644 --- a/apps/files/l10n/nn_NO.php +++ b/apps/files/l10n/nn_NO.php @@ -2,6 +2,9 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet", "Could not move %s" => "Klarte ikkje flytta %s", +"File name cannot be empty." => "Filnamnet kan ikkje vera tomt.", +"Unable to set upload directory." => "Klarte ikkje å endra opplastingsmappa.", +"Invalid Token" => "Ugyldig token", "No file was uploaded. Unknown error" => "Ingen filer lasta opp. Ukjend feil", "There is no error, the file uploaded with success" => "Ingen feil, fila vart lasta opp", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fila du lasta opp er større enn det «upload_max_filesize» i php.ini tillater: ", @@ -11,43 +14,38 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Manglar ei mellombels mappe", "Failed to write to disk" => "Klarte ikkje skriva til disk", "Not enough storage available" => "Ikkje nok lagringsplass tilgjengeleg", +"Upload failed. Could not get file info." => "Feil ved opplasting. Klarte ikkje å henta filinfo.", +"Upload failed. Could not find uploaded file" => "Feil ved opplasting. Klarte ikkje å finna opplasta fil.", "Invalid directory." => "Ugyldig mappe.", "Files" => "Filer", -"Unable to upload your file as it is a directory or has 0 bytes" => "Klarte ikkje lasta opp fila sidan ho er ei mappe eller er på 0 byte", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Not enough space available" => "Ikkje nok lagringsplass tilgjengeleg", "Upload cancelled." => "Opplasting avbroten.", +"Could not get result from server." => "Klarte ikkje å henta resultat frå tenaren.", "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.", -"URL cannot be empty." => "Nettadressa kan ikkje vera tom.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldig mappenamn. Mappa «Shared» er reservert av ownCloud", -"Error" => "Feil", +"{new_name} already exists" => "{new_name} finst allereie", "Share" => "Del", "Delete permanently" => "Slett for godt", -"Delete" => "Slett", "Rename" => "Endra namn", "Pending" => "Under vegs", -"{new_name} already exists" => "{new_name} finst allereie", -"replace" => "byt ut", -"suggest name" => "føreslå namn", -"cancel" => "avbryt", "replaced {new_name} with {old_name}" => "bytte ut {new_name} med {old_name}", "undo" => "angre", -"perform delete operation" => "utfør sletting", -"1 file uploading" => "1 fil lastar opp", -"files uploading" => "filer lastar opp", +"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"), +"_%n file_::_%n files_" => array("%n fil","%n filer"), +"{dirs} and {files}" => "{dirs} og {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Lastar opp %n fil","Lastar opp %n filer"), "'.' is an invalid file name." => "«.» er eit ugyldig filnamn.", -"File name cannot be empty." => "Filnamnet kan ikkje vera tomt.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig namn, «\\», «/», «<», «>», «:», «\"», «|», «?» og «*» er ikkje tillate.", "Your storage is full, files can not be updated or synced anymore!" => "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!", "Your storage is almost full ({usedSpacePercent}%)" => "Lagringa di er nesten full ({usedSpacePercent} %)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kryptering er skrudd av, men filene dine er enno krypterte. Du kan dekryptera filene i personlege innstillingar.", "Your download is being prepared. This might take some time if the files are big." => "Gjer klar nedlastinga di. Dette kan ta ei stund viss filene er store.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ugyldig mappenamn. Mappa «Shared» er reservert av ownCloud", +"Error moving file" => "Feil ved flytting av fil", +"Error" => "Feil", "Name" => "Namn", "Size" => "Storleik", "Modified" => "Endra", -"1 folder" => "1 mappe", -"{count} folders" => "{count} mapper", -"1 file" => "1 fil", -"{count} files" => "{count} filer", +"%s could not be renamed" => "Klarte ikkje å omdøypa på %s", "Upload" => "Last opp", "File handling" => "Filhandtering", "Maximum upload size" => "Maksimal opplastingsstorleik", @@ -63,10 +61,9 @@ $TRANSLATIONS = array( "From link" => "Frå lenkje", "Deleted files" => "Sletta filer", "Cancel upload" => "Avbryt opplasting", -"You don’t have write permissions here." => "Du har ikkje skriverettar her.", "Nothing in here. Upload something!" => "Ingenting her. Last noko opp!", "Download" => "Last ned", -"Unshare" => "Udel", +"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/nqo.php b/apps/files/l10n/nqo.php new file mode 100644 index 0000000000..70ab6572ba --- /dev/null +++ b/apps/files/l10n/nqo.php @@ -0,0 +1,7 @@ + array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array("") +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php index 382a4b2158..eb1a9038b0 100644 --- a/apps/files/l10n/oc.php +++ b/apps/files/l10n/oc.php @@ -7,20 +7,16 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Un dorsièr temporari manca", "Failed to write to disk" => "L'escriptura sul disc a fracassat", "Files" => "Fichièrs", -"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible d'amontcargar lo teu fichièr qu'es un repertòri o que ten pas que 0 octet.", "Upload cancelled." => "Amontcargar anullat.", "File upload is in progress. Leaving the page now will cancel the upload." => "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. ", -"Error" => "Error", "Share" => "Parteja", -"Delete" => "Escafa", "Rename" => "Torna nomenar", "Pending" => "Al esperar", -"replace" => "remplaça", -"suggest name" => "nom prepausat", -"cancel" => "anulla", "undo" => "defar", -"1 file uploading" => "1 fichièr al amontcargar", -"files uploading" => "fichièrs al amontcargar", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "Error", "Name" => "Nom", "Size" => "Talha", "Modified" => "Modificat", @@ -39,12 +35,10 @@ $TRANSLATIONS = array( "Cancel upload" => " Anulla l'amontcargar", "Nothing in here. Upload something!" => "Pas res dedins. Amontcarga qualquaren", "Download" => "Avalcarga", -"Unshare" => "Pas partejador", +"Delete" => "Escafa", "Upload too large" => "Amontcargament tròp gròs", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los fichièrs que sias a amontcargar son tròp pesucs per la talha maxi pel servidor.", "Files are being scanned, please wait." => "Los fiichièrs son a èsser explorats, ", -"Current scanning" => "Exploracion en cors", -"file" => "fichièr", -"files" => "fichièrs" +"Current scanning" => "Exploracion en cors" ); $PLURAL_FORMS = "nplurals=2; plural=(n > 1);"; diff --git a/apps/files/l10n/pa.php b/apps/files/l10n/pa.php new file mode 100644 index 0000000000..63fcbe12dd --- /dev/null +++ b/apps/files/l10n/pa.php @@ -0,0 +1,16 @@ + "ਫਾਇਲਾਂ", +"Share" => "ਸਾਂਝਾ ਕਰੋ", +"Rename" => "ਨਾਂ ਬਦਲੋ", +"undo" => "ਵਾਪਸ", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "ਗਲਤੀ", +"Upload" => "ਅੱਪਲੋਡ", +"Cancel upload" => "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ", +"Download" => "ਡਾਊਨਲੋਡ", +"Delete" => "ਹਟਾਓ" +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php index fc37234fc6..0ebae8f45c 100644 --- a/apps/files/l10n/pl.php +++ b/apps/files/l10n/pl.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Nie można było przenieść %s - Plik o takiej nazwie już istnieje", "Could not move %s" => "Nie można było przenieść %s", +"File name cannot be empty." => "Nazwa pliku nie może być pusta.", +"File name must not contain \"/\". Please choose a different name." => "Nazwa pliku nie może zawierać \"/\". Proszę wybrać inną nazwę.", +"The name %s is already used in the folder %s. Please choose a different name." => "Nazwa %s jest już używana w folderze %s. Proszę wybrać inną nazwę.", +"Not a valid source" => "Niepoprawne źródło", +"Error while downloading %s to %s" => "Błąd podczas pobierania %s do %S", +"Error when creating the file" => "Błąd przy tworzeniu pliku", +"Folder name cannot be empty." => "Nazwa folderu nie może być pusta.", +"Folder name must not contain \"/\". Please choose a different name." => "Nazwa folderu nie może zawierać \"/\". Proszę wybrać inną nazwę.", +"Error when creating the folder" => "Błąd przy tworzeniu folderu", "Unable to set upload directory." => "Nie można ustawić katalog wczytywania.", "Invalid Token" => "Nieprawidłowy Token", "No file was uploaded. Unknown error" => "Żaden plik nie został załadowany. Nieznany błąd", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Brak folderu tymczasowego", "Failed to write to disk" => "Błąd zapisu na dysk", "Not enough storage available" => "Za mało dostępnego miejsca", +"Upload failed. Could not get file info." => "Nieudane przesłanie. Nie można pobrać informacji o pliku.", +"Upload failed. Could not find uploaded file" => "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku", "Invalid directory." => "Zła ścieżka.", "Files" => "Pliki", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nie można wczytać pliku, ponieważ jest on katalogiem lub ma 0 bajtów", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów", "Not enough space available" => "Za mało miejsca", "Upload cancelled." => "Wczytywanie anulowane.", +"Could not get result from server." => "Nie można uzyskać wyniku z serwera.", "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.", -"URL cannot be empty." => "URL nie może być pusty.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nieprawidłowa nazwa folderu. Wykorzystanie 'Shared' jest zarezerwowane przez ownCloud", -"Error" => "Błąd", +"URL cannot be empty" => "URL nie może być pusty", +"In the home folder 'Shared' is a reserved filename" => "W katalogu domowym \"Shared\" jest zarezerwowana nazwa pliku", +"{new_name} already exists" => "{new_name} już istnieje", +"Could not create file" => "Nie można utworzyć pliku", +"Could not create folder" => "Nie można utworzyć folderu", "Share" => "Udostępnij", "Delete permanently" => "Trwale usuń", -"Delete" => "Usuń", "Rename" => "Zmień nazwę", "Pending" => "Oczekujące", -"{new_name} already exists" => "{new_name} już istnieje", -"replace" => "zastąp", -"suggest name" => "zasugeruj nazwę", -"cancel" => "anuluj", +"Could not rename file" => "Nie można zmienić nazwy pliku", "replaced {new_name} with {old_name}" => "zastąpiono {new_name} przez {old_name}", "undo" => "cofnij", -"perform delete operation" => "wykonaj operację usunięcia", -"1 file uploading" => "1 plik wczytywany", -"files uploading" => "pliki wczytane", +"Error deleting file." => "Błąd podczas usuwania pliku", +"_%n folder_::_%n folders_" => array("%n katalog","%n katalogi","%n katalogów"), +"_%n file_::_%n files_" => array("%n plik","%n pliki","%n plików"), +"{dirs} and {files}" => "{dirs} and {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików"), "'.' is an invalid file name." => "„.” jest nieprawidłową nazwą pliku.", -"File name cannot be empty." => "Nazwa pliku nie może być pusta.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nieprawidłowa nazwa. Znaki '\\', '/', '<', '>', ':', '\"', '|', '?' oraz '*' są niedozwolone.", "Your storage is full, files can not be updated or synced anymore!" => "Magazyn jest pełny. Pliki nie mogą zostać zaktualizowane lub zsynchronizowane!", "Your storage is almost full ({usedSpacePercent}%)" => "Twój magazyn jest prawie pełny ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikacja szyfrująca jest aktywna, ale twoje klucze nie zostały zainicjowane, prosze wyloguj się i zaloguj ponownie.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Klucz prywatny nie jest poprawny! Może Twoje hasło zostało zmienione z zewnątrz. Można zaktualizować hasło klucza prywatnego w ustawieniach osobistych w celu odzyskania dostępu do plików", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.", "Your download is being prepared. This might take some time if the files are big." => "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pliki są duże.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nieprawidłowa nazwa folderu. Korzystanie z nazwy „Shared” jest zarezerwowane dla ownCloud", +"Error moving file" => "Błąd prz przenoszeniu pliku", +"Error" => "Błąd", "Name" => "Nazwa", "Size" => "Rozmiar", "Modified" => "Modyfikacja", -"1 folder" => "1 folder", -"{count} folders" => "Ilość folderów: {count}", -"1 file" => "1 plik", -"{count} files" => "Ilość plików: {count}", +"Invalid folder name. Usage of 'Shared' is reserved." => "Niepoprawna nazwa folderu. Wykorzystanie \"Shared\" jest zarezerwowane.", "%s could not be renamed" => "%s nie można zmienić nazwy", "Upload" => "Wyślij", "File handling" => "Zarządzanie plikami", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Maksymalna wielkość pliku wejściowego ZIP ", "Save" => "Zapisz", "New" => "Nowy", +"New text file" => "Nowy plik tekstowy", "Text file" => "Plik tekstowy", +"New folder" => "Nowy folder", "Folder" => "Folder", "From link" => "Z odnośnika", "Deleted files" => "Pliki usunięte", "Cancel upload" => "Anuluj wysyłanie", -"You don’t have write permissions here." => "Nie masz uprawnień do zapisu w tym miejscu.", +"You don’t have permission to upload or create files here" => "Nie masz uprawnień do wczytywania lub tworzenia plików w tym miejscu", "Nothing in here. Upload something!" => "Pusto. Wyślij coś!", "Download" => "Pobierz", -"Unshare" => "Zatrzymaj współdzielenie", +"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ć.", "Current scanning" => "Aktualnie skanowane", -"directory" => "Katalog", -"directories" => "Katalogi", -"file" => "plik", -"files" => "pliki", "Upgrading filesystem cache..." => "Uaktualnianie plików pamięci podręcznej..." ); $PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"; diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index 421de07c2b..4f19361171 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Impossível mover %s - Um arquivo com este nome já existe", "Could not move %s" => "Impossível mover %s", +"File name cannot be empty." => "O nome do arquivo não pode estar vazio.", +"File name must not contain \"/\". Please choose a different name." => "O nome do arquivo não deve conter \"/\". Por favor, escolha um nome diferente.", +"The name %s is already used in the folder %s. Please choose a different name." => "O nome %s já é usado na pasta %s. Por favor, escolha um nome diferente.", +"Not a valid source" => "Não é uma fonte válida", +"Error while downloading %s to %s" => "Erro ao baixar %s para %s", +"Error when creating the file" => "Erro ao criar o arquivo", +"Folder name cannot be empty." => "O nome da pasta não pode estar vazio.", +"Folder name must not contain \"/\". Please choose a different name." => "O nome da pasta não pode conter \"/\". Por favor, escolha um nome diferente.", +"Error when creating the folder" => "Erro ao criar a pasta", "Unable to set upload directory." => "Impossível configurar o diretório de upload", "Invalid Token" => "Token inválido", "No file was uploaded. Unknown error" => "Nenhum arquivo foi enviado. Erro desconhecido", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Pasta temporária não encontrada", "Failed to write to disk" => "Falha ao escrever no disco", "Not enough storage available" => "Espaço de armazenamento insuficiente", +"Upload failed. Could not get file info." => "Falha no envio. Não foi possível obter informações do arquivo.", +"Upload failed. Could not find uploaded file" => "Falha no envio. Não foi possível encontrar o arquivo enviado", "Invalid directory." => "Diretório inválido.", "Files" => "Arquivos", -"Unable to upload your file as it is a directory or has 0 bytes" => "Impossível enviar seus arquivo por ele ser um diretório ou ter 0 bytes.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Not enough space available" => "Espaço de armazenamento insuficiente", "Upload cancelled." => "Envio cancelado.", +"Could not get result from server." => "Não foi possível obter o resultado do servidor.", "File upload is in progress. Leaving the page now will cancel the upload." => "Upload em andamento. Sair da página agora resultará no cancelamento do envio.", -"URL cannot be empty." => "URL não pode ficar em branco", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome de pasta inválido. O uso do nome 'Compartilhado' é reservado ao ownCloud", -"Error" => "Erro", +"URL cannot be empty" => "URL não pode estar vazia", +"In the home folder 'Shared' is a reserved filename" => "Na pasta home 'Shared- Compartilhada' é um nome reservado", +"{new_name} already exists" => "{new_name} já existe", +"Could not create file" => "Não foi possível criar o arquivo", +"Could not create folder" => "Não foi possível criar a pasta", "Share" => "Compartilhar", "Delete permanently" => "Excluir permanentemente", -"Delete" => "Excluir", "Rename" => "Renomear", "Pending" => "Pendente", -"{new_name} already exists" => "{new_name} já existe", -"replace" => "substituir", -"suggest name" => "sugerir nome", -"cancel" => "cancelar", +"Could not rename file" => "Não foi possível renomear o arquivo", "replaced {new_name} with {old_name}" => "Substituído {old_name} por {new_name} ", "undo" => "desfazer", -"perform delete operation" => "realizar operação de exclusão", -"1 file uploading" => "enviando 1 arquivo", -"files uploading" => "enviando arquivos", +"Error deleting file." => "Erro eliminando o arquivo.", +"_%n folder_::_%n folders_" => array("%n pasta","%n pastas"), +"_%n file_::_%n files_" => array("%n arquivo","%n arquivos"), +"{dirs} and {files}" => "{dirs} e {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Enviando %n arquivo","Enviando %n arquivos"), "'.' is an invalid file name." => "'.' é um nome de arquivo inválido.", -"File name cannot be empty." => "O nome do arquivo não pode estar vazio.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.", "Your storage is full, files can not be updated or synced anymore!" => "Seu armazenamento está cheio, arquivos não podem mais ser atualizados ou sincronizados!", "Your storage is almost full ({usedSpacePercent}%)" => "Seu armazenamento está quase cheio ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "App de encriptação está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Chave do App de Encriptação é inválida. Por favor, atualize sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Encriptação foi desabilitada mas seus arquivos continuam encriptados. Por favor vá a suas configurações pessoais para descriptar seus arquivos.", "Your download is being prepared. This might take some time if the files are big." => "Seu download está sendo preparado. Isto pode levar algum tempo se os arquivos forem grandes.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome de pasta inválido. O uso de 'Shared' é reservado para o Owncloud", +"Error moving file" => "Erro movendo o arquivo", +"Error" => "Erro", "Name" => "Nome", "Size" => "Tamanho", "Modified" => "Modificado", -"1 folder" => "1 pasta", -"{count} folders" => "{count} pastas", -"1 file" => "1 arquivo", -"{count} files" => "{count} arquivos", +"Invalid folder name. Usage of 'Shared' is reserved." => "Nome da pasta inválido. Uso de 'Shared' é reservado.", "%s could not be renamed" => "%s não pode ser renomeado", "Upload" => "Upload", "File handling" => "Tratamento de Arquivo", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Tamanho máximo para arquivo ZIP", "Save" => "Guardar", "New" => "Novo", +"New text file" => "Novo arquivo texto", "Text file" => "Arquivo texto", +"New folder" => "Nova pasta", "Folder" => "Pasta", "From link" => "Do link", "Deleted files" => "Arquivos apagados", "Cancel upload" => "Cancelar upload", -"You don’t have write permissions here." => "Você não possui permissão de escrita aqui.", +"You don’t have permission to upload or create files here" => "Você não tem permissão para carregar ou criar arquivos aqui", "Nothing in here. Upload something!" => "Nada aqui.Carrege alguma coisa!", "Download" => "Baixar", -"Unshare" => "Descompartilhar", +"Delete" => "Excluir", "Upload too large" => "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.", "Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.", "Current scanning" => "Scanning atual", -"directory" => "diretório", -"directories" => "diretórios", -"file" => "arquivo", -"files" => "arquivos", "Upgrading filesystem cache..." => "Atualizando cache do sistema de arquivos..." ); $PLURAL_FORMS = "nplurals=2; plural=(n > 1);"; diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index c9b98bbed4..4b9fade2e2 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Não foi possível mover o ficheiro %s - Já existe um ficheiro com esse nome", "Could not move %s" => "Não foi possível move o ficheiro %s", +"File name cannot be empty." => "O nome do ficheiro não pode estar vazio.", "Unable to set upload directory." => "Não foi possível criar o diretório de upload", "Invalid Token" => "Token inválido", "No file was uploaded. Unknown error" => "Nenhum ficheiro foi carregado. Erro desconhecido", @@ -13,43 +14,35 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Está a faltar a pasta temporária", "Failed to write to disk" => "Falhou a escrita no disco", "Not enough storage available" => "Não há espaço suficiente em disco", +"Upload failed. Could not get file info." => "O carregamento falhou. Não foi possível obter a informação do ficheiro.", "Invalid directory." => "Directório Inválido", "Files" => "Ficheiros", -"Unable to upload your file as it is a directory or has 0 bytes" => "Não é possível fazer o envio do ficheiro devido a ser uma pasta ou ter 0 bytes", "Not enough space available" => "Espaço em disco insuficiente!", "Upload cancelled." => "Envio cancelado.", +"Could not get result from server." => "Não foi possível obter o resultado do servidor.", "File upload is in progress. Leaving the page now will cancel the upload." => "Envio de ficheiro em progresso. Irá cancelar o envio se sair da página agora.", -"URL cannot be empty." => "O URL não pode estar vazio.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome da pasta inválido. Palavra 'Shared' é reservado pela ownCloud", -"Error" => "Erro", +"{new_name} already exists" => "O nome {new_name} já existe", "Share" => "Partilhar", "Delete permanently" => "Eliminar permanentemente", -"Delete" => "Eliminar", "Rename" => "Renomear", "Pending" => "Pendente", -"{new_name} already exists" => "O nome {new_name} já existe", -"replace" => "substituir", -"suggest name" => "sugira um nome", -"cancel" => "cancelar", "replaced {new_name} with {old_name}" => "substituido {new_name} por {old_name}", "undo" => "desfazer", -"perform delete operation" => "Executar a tarefa de apagar", -"1 file uploading" => "A enviar 1 ficheiro", -"files uploading" => "A enviar os ficheiros", +"_%n folder_::_%n folders_" => array("%n pasta","%n pastas"), +"_%n file_::_%n files_" => array("%n ficheiro","%n ficheiros"), +"{dirs} and {files}" => "{dirs} e {files}", +"_Uploading %n file_::_Uploading %n files_" => array("A carregar %n ficheiro","A carregar %n ficheiros"), "'.' is an invalid file name." => "'.' não é um nome de ficheiro válido!", -"File name cannot be empty." => "O nome do ficheiro não pode estar vazio.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome Inválido, os caracteres '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.", "Your storage is full, files can not be updated or synced anymore!" => "O seu armazenamento está cheio, os ficheiros não podem ser sincronizados.", "Your storage is almost full ({usedSpacePercent}%)" => "O seu espaço de armazenamento está quase cheiro ({usedSpacePercent}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "A encriptação foi desactivada mas os seus ficheiros continuam encriptados. Por favor consulte as suas definições pessoais para desencriptar os ficheiros.", "Your download is being prepared. This might take some time if the files are big." => "O seu download está a ser preparado. Este processo pode demorar algum tempo se os ficheiros forem grandes.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome de pasta inválido. O Uso de 'shared' é reservado para o ownCloud", +"Error moving file" => "Erro ao mover o ficheiro", +"Error" => "Erro", "Name" => "Nome", "Size" => "Tamanho", "Modified" => "Modificado", -"1 folder" => "1 pasta", -"{count} folders" => "{count} pastas", -"1 file" => "1 ficheiro", -"{count} files" => "{count} ficheiros", "%s could not be renamed" => "%s não pode ser renomeada", "Upload" => "Carregar", "File handling" => "Manuseamento de ficheiros", @@ -62,22 +55,18 @@ $TRANSLATIONS = array( "Save" => "Guardar", "New" => "Novo", "Text file" => "Ficheiro de texto", +"New folder" => "Nova Pasta", "Folder" => "Pasta", "From link" => "Da ligação", "Deleted files" => "Ficheiros eliminados", "Cancel upload" => "Cancelar envio", -"You don’t have write permissions here." => "Não tem permissões de escrita aqui.", "Nothing in here. Upload something!" => "Vazio. Envie alguma coisa!", "Download" => "Transferir", -"Unshare" => "Deixar de partilhar", +"Delete" => "Eliminar", "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.", "Current scanning" => "Análise actual", -"directory" => "diretório", -"directories" => "diretórios", -"file" => "ficheiro", -"files" => "ficheiros", "Upgrading filesystem cache..." => "Atualizar cache do sistema de ficheiros..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php index c9b340ff9b..933625d8d1 100644 --- a/apps/files/l10n/ro.php +++ b/apps/files/l10n/ro.php @@ -2,82 +2,72 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "%s nu se poate muta - Fișierul cu acest nume există deja ", "Could not move %s" => "Nu s-a putut muta %s", +"File name cannot be empty." => "Numele fișierului nu poate rămâne gol.", "Unable to set upload directory." => "Imposibil de a seta directorul pentru incărcare.", "Invalid Token" => "Jeton Invalid", "No file was uploaded. Unknown error" => "Nici un fișier nu a fost încărcat. Eroare necunoscută", "There is no error, the file uploaded with success" => "Nu a apărut nici o eroare, fișierul a fost încărcat cu succes", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fisierul incarcat depaseste upload_max_filesize permisi in php.ini: ", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fisierul incarcat depaseste marimea maxima permisa in php.ini: ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fișierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML", "The uploaded file was only partially uploaded" => "Fișierul a fost încărcat doar parțial", "No file was uploaded" => "Nu a fost încărcat nici un fișier", -"Missing a temporary folder" => "Lipsește un director temporar", -"Failed to write to disk" => "Eroare la scriere pe disc", +"Missing a temporary folder" => "Lipsește un dosar temporar", +"Failed to write to disk" => "Eroare la scrierea discului", "Not enough storage available" => "Nu este suficient spațiu disponibil", -"Invalid directory." => "Director invalid.", +"Upload failed. Could not get file info." => "Încărcare eșuată. Nu se pot obține informații despre fișier.", +"Upload failed. Could not find uploaded file" => "Încărcare eșuată. Nu se poate găsi fișierul încărcat", +"Invalid directory." => "registru invalid.", "Files" => "Fișiere", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nu s-a putut încărca fișierul tău deoarece pare să fie un director sau are 0 bytes.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți", "Not enough space available" => "Nu este suficient spațiu disponibil", "Upload cancelled." => "Încărcare anulată.", +"Could not get result from server." => "Nu se poate obține rezultatul de la server.", "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.", -"URL cannot be empty." => "Adresa URL nu poate fi goală.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nume de dosar invalid. Utilizarea 'Shared' e rezervată de ownCloud", -"Error" => "Eroare", -"Share" => "Partajează", -"Delete permanently" => "Stergere permanenta", -"Delete" => "Șterge", -"Rename" => "Redenumire", -"Pending" => "În așteptare", "{new_name} already exists" => "{new_name} deja exista", -"replace" => "înlocuire", -"suggest name" => "sugerează nume", -"cancel" => "anulare", +"Share" => "a imparti", +"Delete permanently" => "Stergere permanenta", +"Rename" => "Redenumire", +"Pending" => "in timpul", "replaced {new_name} with {old_name}" => "{new_name} inlocuit cu {old_name}", "undo" => "Anulează ultima acțiune", -"perform delete operation" => "efectueaza operatiunea de stergere", -"1 file uploading" => "un fișier se încarcă", -"files uploading" => "fișiere se încarcă", +"_%n folder_::_%n folders_" => array("%n director","%n directoare","%n directoare"), +"_%n file_::_%n files_" => array("%n fișier","%n fișiere","%n fișiere"), +"{dirs} and {files}" => "{dirs} și {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."), "'.' is an invalid file name." => "'.' este un nume invalid de fișier.", -"File name cannot be empty." => "Numele fișierului nu poate rămâne gol.", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume invalid, '\\', '/', '<', '>', ':', '\"', '|', '?' si '*' nu sunt permise.", -"Your storage is full, files can not be updated or synced anymore!" => "Spatiul de stocare este plin, nu mai puteti incarca s-au sincroniza alte fisiere.", -"Your storage is almost full ({usedSpacePercent}%)" => "Spatiul de stocare este aproape plin ({usedSpacePercent}%)", -"Your download is being prepared. This might take some time if the files are big." => "Se pregătește descărcarea. Aceasta poate să dureze ceva timp dacă fișierele sunt mari.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Invalid folder name. Usage of 'Shared' is reserved by Ownclou", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume invalide, '\\', '/', '<', '>', ':', '\"', '|', '?' si '*' nu sunt permise.", +"Your storage is full, files can not be updated or synced anymore!" => "Spatiul de stocare este plin, fisierele nu mai pot fi actualizate sau sincronizate", +"Your storage is almost full ({usedSpacePercent}%)" => "Spatiul de stocare este aproape plin {spatiu folosit}%", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "criptarea a fost disactivata dar fisierele sant inca criptate.va rog intrati in setarile personale pentru a decripta fisierele", +"Your download is being prepared. This might take some time if the files are big." => "in curs de descarcare. Aceasta poate să dureze ceva timp dacă fișierele sunt mari.", +"Error moving file" => "Eroare la mutarea fișierului", +"Error" => "Eroare", "Name" => "Nume", "Size" => "Dimensiune", "Modified" => "Modificat", -"1 folder" => "1 folder", -"{count} folders" => "{count} foldare", -"1 file" => "1 fisier", -"{count} files" => "{count} fisiere", "%s could not be renamed" => "%s nu a putut fi redenumit", "Upload" => "Încărcare", "File handling" => "Manipulare fișiere", "Maximum upload size" => "Dimensiune maximă admisă la încărcare", "max. possible: " => "max. posibil:", -"Needed for multi-file and folder downloads." => "Necesar pentru descărcarea mai multor fișiere și a dosarelor", -"Enable ZIP-download" => "Activează descărcare fișiere compresate", +"Needed for multi-file and folder downloads." => "necesar la descarcarea mai multor liste si fisiere", +"Enable ZIP-download" => "permite descarcarea codurilor ZIP", "0 is unlimited" => "0 e nelimitat", "Maximum input size for ZIP files" => "Dimensiunea maximă de intrare pentru fișiere compresate", "Save" => "Salvează", "New" => "Nou", -"Text file" => "Fișier text", +"Text file" => "lista", "Folder" => "Dosar", "From link" => "de la adresa", "Deleted files" => "Sterge fisierele", "Cancel upload" => "Anulează încărcarea", -"You don’t have write permissions here." => "Nu ai permisiunea de a sterge fisiere aici.", "Nothing in here. Upload something!" => "Nimic aici. Încarcă ceva!", "Download" => "Descarcă", -"Unshare" => "Anulare partajare", +"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șierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server.", -"Files are being scanned, please wait." => "Fișierele sunt scanate, te rog așteptă.", +"Files are being scanned, please wait." => "Fișierele sunt scanate, asteptati va rog", "Current scanning" => "În curs de scanare", -"directory" => "catalog", -"directories" => "cataloage", -"file" => "fișier", -"files" => "fișiere", "Upgrading filesystem cache..." => "Modernizare fisiere de sistem cache.." ); $PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"; diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 4d3bec0274..cede72f26e 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Невозможно переместить %s - файл с таким именем уже существует", "Could not move %s" => "Невозможно переместить %s", +"File name cannot be empty." => "Имя файла не может быть пустым.", +"File name must not contain \"/\". Please choose a different name." => "Имя файла не должно содержать символ \"/\". Пожалуйста, выберите другое имя.", +"The name %s is already used in the folder %s. Please choose a different name." => "Имя %s уже используется в папке %s. Пожалуйста выберите другое имя.", +"Not a valid source" => "Неправильный источник", +"Error while downloading %s to %s" => "Ошибка при загрузке %s в %s", +"Error when creating the file" => "Ошибка при создании файла", +"Folder name cannot be empty." => "Имя папки не может быть пустым.", +"Folder name must not contain \"/\". Please choose a different name." => "Имя папки не должно содержать символ \"/\". Пожалуйста, выберите другое имя.", +"Error when creating the folder" => "Ошибка при создании папки", "Unable to set upload directory." => "Не удалось установить каталог загрузки.", "Invalid Token" => "Недопустимый маркер", "No file was uploaded. Unknown error" => "Файл не был загружен. Неизвестная ошибка", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Отсутствует временная папка", "Failed to write to disk" => "Ошибка записи на диск", "Not enough storage available" => "Недостаточно доступного места в хранилище", +"Upload failed. Could not get file info." => "Загрузка не удалась. Невозможно получить информацию о файле", +"Upload failed. Could not find uploaded file" => "Загрузка не удалась. Невозможно найти загруженный файл", "Invalid directory." => "Неправильный каталог.", "Files" => "Файлы", -"Unable to upload your file as it is a directory or has 0 bytes" => "Файл не был загружен: его размер 0 байт либо это не файл, а директория.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Невозможно загрузить файл {filename} так как он является директорией либо имеет размер 0 байт", "Not enough space available" => "Недостаточно свободного места", "Upload cancelled." => "Загрузка отменена.", +"Could not get result from server." => "Не получен ответ от сервера", "File upload is in progress. Leaving the page now will cancel the upload." => "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку.", -"URL cannot be empty." => "Ссылка не может быть пустой.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Неправильное имя каталога. Имя 'Shared' зарезервировано.", -"Error" => "Ошибка", +"URL cannot be empty" => "Ссылка не может быть пустой.", +"In the home folder 'Shared' is a reserved filename" => "В домашней папке 'Shared' зарезервированное имя файла", +"{new_name} already exists" => "{new_name} уже существует", +"Could not create file" => "Не удалось создать файл", +"Could not create folder" => "Не удалось создать папку", "Share" => "Открыть доступ", "Delete permanently" => "Удалено навсегда", -"Delete" => "Удалить", "Rename" => "Переименовать", "Pending" => "Ожидание", -"{new_name} already exists" => "{new_name} уже существует", -"replace" => "заменить", -"suggest name" => "предложить название", -"cancel" => "отмена", +"Could not rename file" => "Не удалось переименовать файл", "replaced {new_name} with {old_name}" => "заменено {new_name} на {old_name}", "undo" => "отмена", -"perform delete operation" => "выполнить операцию удаления", -"1 file uploading" => "загружается 1 файл", -"files uploading" => "файлы загружаются", +"Error deleting file." => "Ошибка при удалении файла.", +"_%n folder_::_%n folders_" => array("%n папка","%n папки","%n папок"), +"_%n file_::_%n files_" => array("%n файл","%n файла","%n файлов"), +"{dirs} and {files}" => "{dirs} и {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Закачка %n файла","Закачка %n файлов","Закачка %n файлов"), "'.' is an invalid file name." => "'.' - неправильное имя файла.", -"File name cannot be empty." => "Имя файла не может быть пустым.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправильное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.", "Your storage is full, files can not be updated or synced anymore!" => "Ваше дисковое пространство полностью заполнено, произведите очистку перед загрузкой новых файлов.", "Your storage is almost full ({usedSpacePercent}%)" => "Ваше хранилище почти заполнено ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Приложение для шифрования активно, но ваши ключи не инициализированы, пожалуйста, перелогиньтесь", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Неверный приватный ключ для приложения шифрования. Пожалуйста, обноваите ваш приватный ключ в персональных настройках чтобы восстановить доступ к вашим зашифрованным файлам.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Шифрование было отключено, но ваши файлы все еще зашифрованы. Пожалуйста, зайдите на страницу персональных настроек для того, чтобы расшифровать ваши файлы.", "Your download is being prepared. This might take some time if the files are big." => "Загрузка началась. Это может потребовать много времени, если файл большого размера.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Неправильное имя каталога. Имя 'Shared' зарезервировано.", +"Error moving file" => "Ошибка при перемещении файла", +"Error" => "Ошибка", "Name" => "Имя", "Size" => "Размер", "Modified" => "Изменён", -"1 folder" => "1 папка", -"{count} folders" => "{count} папок", -"1 file" => "1 файл", -"{count} files" => "{count} файлов", +"Invalid folder name. Usage of 'Shared' is reserved." => "Неправильное имя каталога. Имя 'Shared' зарезервировано.", "%s could not be renamed" => "%s не может быть переименован", "Upload" => "Загрузка", "File handling" => "Управление файлами", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Максимальный исходный размер для ZIP файлов", "Save" => "Сохранить", "New" => "Новый", +"New text file" => "Новый текстовый файл", "Text file" => "Текстовый файл", +"New folder" => "Новая папка", "Folder" => "Папка", "From link" => "Из ссылки", "Deleted files" => "Удалённые файлы", "Cancel upload" => "Отмена загрузки", -"You don’t have write permissions here." => "У вас нет разрешений на запись здесь.", +"You don’t have permission to upload or create files here" => "У вас недостаточно прав для загрузки или создания файлов отсюда.", "Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!", "Download" => "Скачать", -"Unshare" => "Закрыть общий доступ", +"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." => "Подождите, файлы сканируются.", "Current scanning" => "Текущее сканирование", -"directory" => "директория", -"directories" => "директории", -"file" => "файл", -"files" => "файлы", "Upgrading filesystem cache..." => "Обновление кэша файловой системы..." ); $PLURAL_FORMS = "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/l10n/ru_RU.php b/apps/files/l10n/ru_RU.php index bbc06fe1a5..2a6ceeb99b 100644 --- a/apps/files/l10n/ru_RU.php +++ b/apps/files/l10n/ru_RU.php @@ -1,18 +1,21 @@ "Файл не был загружен. Неизвестная ошибка", -"There is no error, the file uploaded with success" => "Ошибки нет, файл успешно загружен", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Размер загружаемого файла превысил максимально допустимый в директиве MAX_FILE_SIZE, специфицированной в HTML-форме", -"The uploaded file was only partially uploaded" => "Загружаемый файл был загружен лишь частично", -"No file was uploaded" => "Файл не был загружен", -"Missing a temporary folder" => "Отсутствие временной папки", -"Failed to write to disk" => "Не удалось записать на диск", -"Not enough storage available" => "Недостаточно места в хранилище", +"File name cannot be empty." => "Имя файла не может быть пустым.", +"Files" => "Файлы", "Share" => "Сделать общим", -"Delete" => "Удалить", +"Rename" => "Переименовать", +"_%n folder_::_%n folders_" => array("","",""), +"_%n file_::_%n files_" => array("","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","",""), +"'.' is an invalid file name." => "'.' является неверным именем файла.", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Некорректное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не допустимы.", "Error" => "Ошибка", -"Name" => "Имя", +"Size" => "Размер", +"Upload" => "Загрузка", +"0 is unlimited" => "0 без ограничений", "Save" => "Сохранить", -"Download" => "Загрузка" +"Cancel upload" => "Отмена загрузки", +"Download" => "Загрузка", +"Delete" => "Удалить" ); $PLURAL_FORMS = "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/l10n/si_LK.php b/apps/files/l10n/si_LK.php index 4f576af17e..44decfef1b 100644 --- a/apps/files/l10n/si_LK.php +++ b/apps/files/l10n/si_LK.php @@ -10,21 +10,16 @@ $TRANSLATIONS = array( "Files" => "ගොනු", "Upload cancelled." => "උඩුගත කිරීම අත් හරින්න ලදී", "File upload is in progress. Leaving the page now will cancel the upload." => "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", -"URL cannot be empty." => "යොමුව හිස් විය නොහැක", -"Error" => "දෝෂයක්", "Share" => "බෙදා හදා ගන්න", -"Delete" => "මකා දමන්න", "Rename" => "නැවත නම් කරන්න", -"replace" => "ප්‍රතිස්ථාපනය කරන්න", -"suggest name" => "නමක් යෝජනා කරන්න", -"cancel" => "අත් හරින්න", "undo" => "නිෂ්ප්‍රභ කරන්න", -"1 file uploading" => "1 ගොනුවක් උඩගත කෙරේ", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "දෝෂයක්", "Name" => "නම", "Size" => "ප්‍රමාණය", "Modified" => "වෙනස් කළ", -"1 folder" => "1 ෆොල්ඩරයක්", -"1 file" => "1 ගොනුවක්", "Upload" => "උඩුගත කරන්න", "File handling" => "ගොනු පරිහරණය", "Maximum upload size" => "උඩුගත කිරීමක උපරිම ප්‍රමාණය", @@ -41,12 +36,10 @@ $TRANSLATIONS = array( "Cancel upload" => "උඩුගත කිරීම අත් හරින්න", "Nothing in here. Upload something!" => "මෙහි කිසිවක් නොමැත. යමක් උඩුගත කරන්න", "Download" => "බාන්න", -"Unshare" => "නොබෙදු", +"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." => "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න", -"Current scanning" => "වර්තමාන පරික්ෂාව", -"file" => "ගොනුව", -"files" => "ගොනු" +"Current scanning" => "වර්තමාන පරික්ෂාව" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/sk.php b/apps/files/l10n/sk.php new file mode 100644 index 0000000000..a3178a95c4 --- /dev/null +++ b/apps/files/l10n/sk.php @@ -0,0 +1,7 @@ + array("","",""), +"_%n file_::_%n files_" => array("","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","","") +); +$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php index f0220822d0..2d0eb25f62 100644 --- a/apps/files/l10n/sk_SK.php +++ b/apps/files/l10n/sk_SK.php @@ -2,54 +2,66 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Nie je možné presunúť %s - súbor s týmto menom už existuje", "Could not move %s" => "Nie je možné presunúť %s", +"File name cannot be empty." => "Meno súboru nemôže byť prázdne", +"File name must not contain \"/\". Please choose a different name." => "Názov súboru nesmie obsahovať \"/\". Prosím zvoľte iný názov.", +"The name %s is already used in the folder %s. Please choose a different name." => "Názov %s už používa priečinok s%. Prosím zvoľte iný názov.", +"Not a valid source" => "Neplatný zdroj", +"Error while downloading %s to %s" => "Chyba pri sťahovaní súboru %s do %s", +"Error when creating the file" => "Chyba pri vytváraní súboru", +"Folder name cannot be empty." => "Názov priečinka nemôže byť prázdny.", +"Folder name must not contain \"/\". Please choose a different name." => "Názov priečinka nesmie obsahovať \"/\". Prosím zvoľte iný názov.", +"Error when creating the folder" => "Chyba pri vytváraní priečinka", "Unable to set upload directory." => "Nemožno nastaviť priečinok pre nahrané súbory.", "Invalid Token" => "Neplatný token", -"No file was uploaded. Unknown error" => "Žiaden súbor nebol odoslaný. Neznáma chyba", +"No file was uploaded. Unknown error" => "Žiaden súbor nebol nahraný. Neznáma chyba", "There is no error, the file uploaded with success" => "Nenastala žiadna chyba, súbor bol úspešne nahraný", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Nahraný súbor predčil konfiguračnú direktívu upload_max_filesize v súbore php.ini:", +"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Nahraný súbor prekročil limit nastavený v upload_max_filesize v súbore php.ini:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.", "The uploaded file was only partially uploaded" => "Ukladaný súbor sa nahral len čiastočne", "No file was uploaded" => "Žiadny súbor nebol uložený", "Missing a temporary folder" => "Chýba dočasný priečinok", "Failed to write to disk" => "Zápis na disk sa nepodaril", "Not enough storage available" => "Nedostatok dostupného úložného priestoru", +"Upload failed. Could not get file info." => "Nahrávanie zlyhalo. Nepodarilo sa získať informácie o súbore.", +"Upload failed. Could not find uploaded file" => "Nahrávanie zlyhalo. Nepodarilo sa nájsť nahrávaný súbor", "Invalid directory." => "Neplatný priečinok.", "Files" => "Súbory", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nedá sa odoslať Váš súbor, pretože je to priečinok, alebo je jeho veľkosť 0 bajtov", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov", "Not enough space available" => "Nie je k dispozícii dostatok miesta", "Upload cancelled." => "Odosielanie zrušené.", +"Could not get result from server." => "Nepodarilo sa dostať výsledky zo servera.", "File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", -"URL cannot be empty." => "URL nemôže byť prázdne.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Neplatný názov priečinka. Názov \"Shared\" je rezervovaný pre ownCloud", -"Error" => "Chyba", +"URL cannot be empty" => "URL nemôže byť prázdna", +"In the home folder 'Shared' is a reserved filename" => "V domovskom priečinku je názov \"Shared\" vyhradený názov súboru", +"{new_name} already exists" => "{new_name} už existuje", +"Could not create file" => "Nemožno vytvoriť súbor", +"Could not create folder" => "Nemožno vytvoriť priečinok", "Share" => "Zdieľať", "Delete permanently" => "Zmazať trvalo", -"Delete" => "Zmazať", "Rename" => "Premenovať", "Pending" => "Prebieha", -"{new_name} already exists" => "{new_name} už existuje", -"replace" => "nahradiť", -"suggest name" => "pomôcť s menom", -"cancel" => "zrušiť", +"Could not rename file" => "Nemožno premenovať súbor", "replaced {new_name} with {old_name}" => "prepísaný {new_name} súborom {old_name}", "undo" => "vrátiť", -"perform delete operation" => "vykonať zmazanie", -"1 file uploading" => "1 súbor sa posiela ", -"files uploading" => "nahrávanie súborov", +"Error deleting file." => "Chyba pri mazaní súboru.", +"_%n folder_::_%n folders_" => array("%n priečinok","%n priečinky","%n priečinkov"), +"_%n file_::_%n files_" => array("%n súbor","%n súbory","%n súborov"), +"{dirs} and {files}" => "{dirs} a {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov"), "'.' is an invalid file name." => "'.' je neplatné meno súboru.", -"File name cannot be empty." => "Meno súboru nemôže byť prázdne", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty.", "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ť!", "Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložisko je takmer plné ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Chybný súkromný kľúč na šifrovanie aplikácií. Zaktualizujte si heslo súkromného kľúča v svojom osobnom nastavení, aby ste znovu získali prístup k svojim zašifrovaným súborom.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrovanie bolo zakázané, ale vaše súbory sú stále zašifrované. Prosím, choďte do osobného nastavenia pre dešifrovanie súborov.", "Your download is being prepared. This might take some time if the files are big." => "Vaše sťahovanie sa pripravuje. Ak sú sťahované súbory veľké, môže to chvíľu trvať.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Neplatné meno priečinka. Používanie mena 'Shared' je vyhradené len pre Owncloud", +"Error moving file" => "Chyba pri presúvaní súboru", +"Error" => "Chyba", "Name" => "Názov", "Size" => "Veľkosť", "Modified" => "Upravené", -"1 folder" => "1 priečinok", -"{count} folders" => "{count} priečinkov", -"1 file" => "1 súbor", -"{count} files" => "{count} súborov", +"Invalid folder name. Usage of 'Shared' is reserved." => "Názov priečinka je chybný. Použitie názvu 'Shared' nie je povolené.", "%s could not be renamed" => "%s nemohol byť premenovaný", "Upload" => "Odoslať", "File handling" => "Nastavenie správania sa k súborom", @@ -60,24 +72,22 @@ $TRANSLATIONS = array( "0 is unlimited" => "0 znamená neobmedzené", "Maximum input size for ZIP files" => "Najväčšia veľkosť ZIP súborov", "Save" => "Uložiť", -"New" => "Nová", +"New" => "Nový", +"New text file" => "Nový textový súbor", "Text file" => "Textový súbor", +"New folder" => "Nový priečinok", "Folder" => "Priečinok", "From link" => "Z odkazu", "Deleted files" => "Zmazané súbory", "Cancel upload" => "Zrušiť odosielanie", -"You don’t have write permissions here." => "Nemáte oprávnenie na zápis.", +"You don’t have permission to upload or create files here" => "Nemáte oprávnenie sem nahrávať alebo vytvoriť súbory", "Nothing in here. Upload something!" => "Žiadny súbor. Nahrajte niečo!", "Download" => "Sťahovanie", -"Unshare" => "Zrušiť zdieľanie", +"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é.", "Current scanning" => "Práve prezerané", -"directory" => "priečinok", -"directories" => "priečinky", -"file" => "súbor", -"files" => "súbory", "Upgrading filesystem cache..." => "Aktualizujem medzipamäť súborového systému..." ); $PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index 85daabf6cf..421792f321 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -1,7 +1,16 @@ "%s ni mogoče premakniti - datoteka s tem imenom že obstaja", -"Could not move %s" => "Ni mogoče premakniti %s", +"Could not move %s - File with this name already exists" => "Datoteke %s ni mogoče premakniti - datoteka s tem imenom že obstaja.", +"Could not move %s" => "Datoteke %s ni mogoče premakniti", +"File name cannot be empty." => "Ime datoteke ne sme biti prazno polje.", +"File name must not contain \"/\". Please choose a different name." => "Ime datoteke ne sme vsebovati znaka \"/\". Določiti je treba drugo ime.", +"The name %s is already used in the folder %s. Please choose a different name." => "Ime %s je že v mapi %s že v uporabi. Izbrati je treba drugo ime.", +"Not a valid source" => "Vir ni veljaven", +"Error while downloading %s to %s" => "Napaka med prejemanjem %s v mapo %s", +"Error when creating the file" => "Napaka med ustvarjanjem datoteke", +"Folder name cannot be empty." => "Ime mape ne more biti prazna vrednost.", +"Folder name must not contain \"/\". Please choose a different name." => "Ime mape ne sme vsebovati znaka \"/\". Določiti je treba drugo ime.", +"Error when creating the folder" => "Napaka med ustvarjanjem mape", "Unable to set upload directory." => "Mapo, v katero boste prenašali dokumente, ni mogoče določiti", "Invalid Token" => "Neveljaven žeton", "No file was uploaded. Unknown error" => "Ni poslane datoteke. Neznana napaka.", @@ -13,44 +22,47 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Manjka začasna mapa", "Failed to write to disk" => "Pisanje na disk je spodletelo", "Not enough storage available" => "Na voljo ni dovolj prostora", +"Upload failed. Could not get file info." => "Pošiljanje je spodletelo. Ni mogoče pridobiti podrobnosti datoteke.", +"Upload failed. Could not find uploaded file" => "Pošiljanje je spodletelo. Ni mogoče najti poslane datoteke.", "Invalid directory." => "Neveljavna mapa.", "Files" => "Datoteke", -"Unable to upload your file as it is a directory or has 0 bytes" => "Pošiljanja ni mogoče izvesti, saj gre za mapo oziroma datoteko velikosti 0 bajtov.", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ni mogoče poslati datoteke {filename}, saj je to ali mapa ali pa je velikost datoteke 0 bajtov.", "Not enough space available" => "Na voljo ni dovolj prostora.", "Upload cancelled." => "Pošiljanje je preklicano.", +"Could not get result from server." => "Ni mogoče pridobiti podatkov s strežnika.", "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.", -"URL cannot be empty." => "Naslov URL ne sme biti prazna vrednost.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ime mape je neveljavno. Uporaba oznake \"Souporaba\" je rezervirana za ownCloud", -"Error" => "Napaka", +"URL cannot be empty" => "Polje naslova URL ne sme biti prazno", +"In the home folder 'Shared' is a reserved filename" => "V domači mapi ni dovoljeno ustvariti mape z imenom 'Souporabe', saj je ime zadržano za javno mapo.", +"{new_name} already exists" => "{new_name} že obstaja", +"Could not create file" => "Ni mogoče ustvariti datoteke", +"Could not create folder" => "Ni mogoče ustvariti mape", "Share" => "Souporaba", "Delete permanently" => "Izbriši dokončno", -"Delete" => "Izbriši", "Rename" => "Preimenuj", "Pending" => "V čakanju ...", -"{new_name} already exists" => "{new_name} že obstaja", -"replace" => "zamenjaj", -"suggest name" => "predlagaj ime", -"cancel" => "prekliči", +"Could not rename file" => "Ni mogoče preimenovati datoteke", "replaced {new_name} with {old_name}" => "preimenovano ime {new_name} z imenom {old_name}", "undo" => "razveljavi", -"perform delete operation" => "izvedi opravilo brisanja", -"1 file uploading" => "Pošiljanje 1 datoteke", -"files uploading" => "poteka pošiljanje datotek", +"Error deleting file." => "Napaka brisanja datoteke.", +"_%n folder_::_%n folders_" => array("%n mapa","%n mapi","%n mape","%n map"), +"_%n file_::_%n files_" => array("%n datoteka","%n datoteki","%n datoteke","%n datotek"), +"{dirs} and {files}" => "{dirs} in {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Posodabljanje %n datotek"), "'.' is an invalid file name." => "'.' je neveljavno ime datoteke.", -"File name cannot be empty." => "Ime datoteke ne sme biti prazno polje.", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neveljavno ime, znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni.", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neveljavno ime; znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni.", "Your storage is full, files can not be updated or synced anymore!" => "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!", -"Your storage is almost full ({usedSpacePercent}%)" => "Mesto za shranjevanje je skoraj polno ({usedSpacePercent}%)", -"Your download is being prepared. This might take some time if the files are big." => "Postopek priprave datoteke za prejem je lahko dolgotrajen, če je datoteka zelo velika.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Neveljavno ime mape. Uporaba oznake \"Souporaba\" je zadržan za sistem ownCloud.", +"Your storage is almost full ({usedSpacePercent}%)" => "Prostor za shranjevanje je skoraj do konca zaseden ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Program za šifriranje je omogočen, vendar ni začet. Odjavite se in nato ponovno prijavite.", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Ni ustreznega osebnega ključa za program za šifriranje. Posodobite osebni ključ za dostop do šifriranih datotek med nastavitvami.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifriranje je onemogočeno, datoteke pa so še vedno šifrirane. Odšifrirajte jih med nastavitvami.", +"Your download is being prepared. This might take some time if the files are big." => "Postopek priprave datoteke za prejem je lahko dolgotrajen, kadar je datoteka zelo velika.", +"Error moving file" => "Napaka premikanja datoteke", +"Error" => "Napaka", "Name" => "Ime", "Size" => "Velikost", "Modified" => "Spremenjeno", -"1 folder" => "1 mapa", -"{count} folders" => "{count} map", -"1 file" => "1 datoteka", -"{count} files" => "{count} datotek", -"%s could not be renamed" => "%s ni bilo mogoče preimenovati", +"Invalid folder name. Usage of 'Shared' is reserved." => "Neveljavno ime mape. Ime 'Souporaba' je zadržana za javno mapo.", +"%s could not be renamed" => "%s ni mogoče preimenovati", "Upload" => "Pošlji", "File handling" => "Upravljanje z datotekami", "Maximum upload size" => "Največja velikost za pošiljanja", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "Največja vhodna velikost za datoteke ZIP", "Save" => "Shrani", "New" => "Novo", +"New text file" => "Nova besedilna datoteka", "Text file" => "Besedilna datoteka", +"New folder" => "Nova mapa", "Folder" => "Mapa", "From link" => "Iz povezave", "Deleted files" => "Izbrisane datoteke", "Cancel upload" => "Prekliči pošiljanje", -"You don’t have write permissions here." => "Za to mesto ni ustreznih dovoljenj za pisanje.", +"You don’t have permission to upload or create files here" => "Ni ustreznih dovoljenj za pošiljanje ali ustvarjanje datotek na tem mestu.", "Nothing in here. Upload something!" => "Tukaj še ni ničesar. Najprej je treba kakšno datoteko poslati v oblak!", "Download" => "Prejmi", -"Unshare" => "Prekliči souporabo", +"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 ...", "Current scanning" => "Trenutno poteka preučevanje", -"directory" => "direktorij", -"directories" => "direktoriji", -"file" => "datoteka", -"files" => "datoteke", "Upgrading filesystem cache..." => "Nadgrajevanje predpomnilnika datotečnega sistema ..." ); $PLURAL_FORMS = "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"; diff --git a/apps/files/l10n/sq.php b/apps/files/l10n/sq.php index 91f53fc00b..a06b6821af 100644 --- a/apps/files/l10n/sq.php +++ b/apps/files/l10n/sq.php @@ -1,75 +1,68 @@ "%s nuk u spostua - Aty ekziston një skedar me të njëjtin emër", -"Could not move %s" => "%s nuk u spostua", -"No file was uploaded. Unknown error" => "Nuk u ngarkua asnjë skedar. Veprim i gabuar i panjohur", -"There is no error, the file uploaded with success" => "Nuk pati veprime të gabuara, skedari u ngarkua me sukses", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Skedari i ngarkuar tejkalon udhëzimin upload_max_filesize tek php.ini:", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Skedari i ngarkuar tejkalon udhëzimin MAX_FILE_SIZE të specifikuar në formularin HTML", -"The uploaded file was only partially uploaded" => "Skedari i ngarkuar u ngarkua vetëm pjesërisht", -"No file was uploaded" => "Nuk u ngarkua asnjë skedar", -"Missing a temporary folder" => "Një dosje e përkohshme nuk u gjet", -"Failed to write to disk" => "Ruajtja në disk dështoi", -"Not enough storage available" => "Nuk ka mbetur hapësirë memorizimi e mjaftueshme", -"Invalid directory." => "Dosje e pavlefshme.", -"Files" => "Skedarët", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nuk është i mundur ngarkimi i skedarit tuaj sepse është dosje ose ka dimension 0 byte", -"Not enough space available" => "Nuk ka hapësirë memorizimi e mjaftueshme", -"Upload cancelled." => "Ngarkimi u anulua.", -"File upload is in progress. Leaving the page now will cancel the upload." => "Ngarkimi i skedarit është në vazhdim. Nqse ndërroni faqen tani ngarkimi do të anulohet.", -"URL cannot be empty." => "URL-i nuk mund të jetë bosh.", -"Error" => "Veprim i gabuar", -"Share" => "Nda", -"Delete permanently" => "Elimino përfundimisht", -"Delete" => "Elimino", -"Rename" => "Riemërto", -"Pending" => "Pezulluar", -"{new_name} already exists" => "{new_name} ekziston", -"replace" => "zëvëndëso", -"suggest name" => "sugjero një emër", -"cancel" => "anulo", -"replaced {new_name} with {old_name}" => "U zëvëndësua {new_name} me {old_name}", -"undo" => "anulo", -"perform delete operation" => "ekzekuto operacionin e eliminimit", -"1 file uploading" => "Po ngarkohet 1 skedar", -"files uploading" => "po ngarkoj skedarët", -"'.' is an invalid file name." => "'.' është emër i pavlefshëm.", +"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", "File name cannot be empty." => "Emri i skedarit nuk mund të jetë bosh.", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Emër i pavlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.", -"Your storage is full, files can not be updated or synced anymore!" => "Hapësira juaj e memorizimit është plot, nuk mund të ngarkoni apo sinkronizoni më skedarët.", -"Your storage is almost full ({usedSpacePercent}%)" => "Hapësira juaj e memorizimit është gati plot ({usedSpacePercent}%)", -"Your download is being prepared. This might take some time if the files are big." => "Shkarkimi juaj po përgatitet. Mund të duhet pak kohë nqse skedarët janë të mëdhenj.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Emri i dosjes është i pavlefshëm. Përdorimi i \"Shared\" është i rezervuar nga Owncloud-i.", +"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", +"Failed to write to disk" => "Dështoi shkrimi në disk", +"Not enough storage available" => "Hapsira e arkivimit e pamjaftueshme", +"Invalid directory." => "Dosje e pavlefshme", +"Files" => "Skedarë", +"Not enough space available" => "Nuk ka hapsirë të nevojshme", +"Upload cancelled." => "Ngarkimi u anullua", +"File upload is in progress. Leaving the page now will cancel the upload." => "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin", +"{new_name} already exists" => "{new_name} është ekzistues ", +"Share" => "Ndaj", +"Delete permanently" => "Fshi përfundimisht", +"Rename" => "Riemëro", +"Pending" => "Në vijim", +"replaced {new_name} with {old_name}" => "u zëvendësua {new_name} me {old_name}", +"undo" => "anullo", +"_%n folder_::_%n folders_" => array("%n dosje","%n dosje"), +"_%n file_::_%n files_" => array("%n skedar","%n skedarë"), +"{dirs} and {files}" => "{dirs} dhe {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Po ngarkoj %n skedar","Po ngarkoj %n skedarë"), +"'.' is an invalid file name." => "'.' nuk është skedar i vlefshem.", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Emër jo i vlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.", +"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}%)", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kodifikimi u çaktivizua por skedarët tuaj vazhdojnë të jenë të kodifikuar. Ju lutem shkoni tek parametrat personale për të dekodifikuar skedarët tuaj.", +"Your download is being prepared. This might take some time if the files are big." => "Shkarkimi juaj është duke u përgatitur. Kjo mund të kërkojë kohë nëse skedarët janë të mëdhenj.", +"Error" => "Gabim", "Name" => "Emri", -"Size" => "Dimensioni", -"Modified" => "Modifikuar", -"1 folder" => "1 dosje", -"{count} folders" => "{count} dosje", -"1 file" => "1 skedar", -"{count} files" => "{count} skedarë", +"Size" => "Madhësia", +"Modified" => "Ndryshuar", +"%s could not be renamed" => "Nuk është i mundur riemërtimi i %s", "Upload" => "Ngarko", -"File handling" => "Trajtimi i skedarit", -"Maximum upload size" => "Dimensioni maksimal i ngarkimit", -"max. possible: " => "maks. i mundur:", -"Needed for multi-file and folder downloads." => "Duhet për shkarkimin e dosjeve dhe të skedarëve", -"Enable ZIP-download" => "Aktivizo shkarkimin e ZIP-eve", -"0 is unlimited" => "0 është i pakufizuar", -"Maximum input size for ZIP files" => "Dimensioni maksimal i ngarkimit të skedarëve ZIP", +"File handling" => "Trajtimi i Skedarëve", +"Maximum upload size" => "Madhësia maksimale e nagarkimit", +"max. possible: " => "maks i mundshëm", +"Needed for multi-file and folder downloads." => "Nevojitej shkarkim i shumë skedarëve dhe dosjeve", +"Enable ZIP-download" => "Mundëso skarkimin e ZIP", +"0 is unlimited" => "o është pa limit", +"Maximum input size for ZIP files" => "Maksimumi hyrës i skedarëve ZIP", "Save" => "Ruaj", -"New" => "I ri", -"Text file" => "Skedar teksti", +"New" => "E re", +"Text file" => "Skedar tekst", "Folder" => "Dosje", "From link" => "Nga lidhja", -"Deleted files" => "Skedarë të eliminuar", -"Cancel upload" => "Anulo ngarkimin", -"You don’t have write permissions here." => "Nuk keni të drejta për të shkruar këtu.", -"Nothing in here. Upload something!" => "Këtu nuk ka asgjë. Ngarkoni diçka!", +"Deleted files" => "Skedarë të fshirë ", +"Cancel upload" => "Anullo ngarkimin", +"Nothing in here. Upload something!" => "Këtu nuk ka asgje. Ngarko dicka", "Download" => "Shkarko", -"Unshare" => "Hiq ndarjen", -"Upload too large" => "Ngarkimi është shumë i madh", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Skedarët që doni të ngarkoni tejkalojnë dimensionet maksimale për ngarkimet në këtë server.", -"Files are being scanned, please wait." => "Skedarët po analizohen, ju lutemi pritni.", -"Current scanning" => "Analizimi aktual", -"Upgrading filesystem cache..." => "Po përmirësoj memorjen e filesystem-it..." +"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.", +"Current scanning" => "Skanimi aktual", +"Upgrading filesystem cache..." => "Përditësimi i cache-se së sistemit në procesim..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php index 09d1683a91..e383b66e07 100644 --- a/apps/files/l10n/sr.php +++ b/apps/files/l10n/sr.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Не могу да преместим %s – датотека с овим именом већ постоји", "Could not move %s" => "Не могу да преместим %s", +"File name cannot be empty." => "Име датотеке не може бити празно.", "No file was uploaded. Unknown error" => "Ниједна датотека није отпремљена услед непознате грешке", "There is no error, the file uploaded with success" => "Није дошло до грешке. Датотека је успешно отпремљена.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Отпремљена датотека прелази смерницу upload_max_filesize у датотеци php.ini:", @@ -13,40 +14,28 @@ $TRANSLATIONS = array( "Not enough storage available" => "Нема довољно простора", "Invalid directory." => "неисправна фасцикла.", "Files" => "Датотеке", -"Unable to upload your file as it is a directory or has 0 bytes" => "Не могу да отпремим датотеку као фасциклу или она има 0 бајтова", "Not enough space available" => "Нема довољно простора", "Upload cancelled." => "Отпремање је прекинуто.", "File upload is in progress. Leaving the page now will cancel the upload." => "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање.", -"URL cannot be empty." => "Адреса не може бити празна.", -"Error" => "Грешка", +"{new_name} already exists" => "{new_name} већ постоји", "Share" => "Дели", "Delete permanently" => "Обриши за стално", -"Delete" => "Обриши", "Rename" => "Преименуј", "Pending" => "На чекању", -"{new_name} already exists" => "{new_name} већ постоји", -"replace" => "замени", -"suggest name" => "предложи назив", -"cancel" => "откажи", "replaced {new_name} with {old_name}" => "замењено {new_name} са {old_name}", "undo" => "опозови", -"perform delete operation" => "обриши", -"1 file uploading" => "Отпремам 1 датотеку", -"files uploading" => "датотеке се отпремају", +"_%n folder_::_%n folders_" => array("","",""), +"_%n file_::_%n files_" => array("","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","",""), "'.' is an invalid file name." => "Датотека „.“ је неисправног имена.", -"File name cannot be empty." => "Име датотеке не може бити празно.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неисправан назив. Следећи знакови нису дозвољени: \\, /, <, >, :, \", |, ? и *.", "Your storage is full, files can not be updated or synced anymore!" => "Ваше складиште је пуно. Датотеке више не могу бити ажуриране ни синхронизоване.", "Your storage is almost full ({usedSpacePercent}%)" => "Ваше складиште је скоро па пуно ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Припремам преузимање. Ово може да потраје ако су датотеке велике.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Неисправно име фасцикле. Фасцикла „Shared“ је резервисана за ownCloud.", +"Error" => "Грешка", "Name" => "Име", "Size" => "Величина", "Modified" => "Измењено", -"1 folder" => "1 фасцикла", -"{count} folders" => "{count} фасцикле/и", -"1 file" => "1 датотека", -"{count} files" => "{count} датотеке/а", "Upload" => "Отпреми", "File handling" => "Управљање датотекама", "Maximum upload size" => "Највећа величина датотеке", @@ -62,10 +51,9 @@ $TRANSLATIONS = array( "From link" => "Са везе", "Deleted files" => "Обрисане датотеке", "Cancel upload" => "Прекини отпремање", -"You don’t have write permissions here." => "Овде немате дозволу за писање.", "Nothing in here. Upload something!" => "Овде нема ничег. Отпремите нешто!", "Download" => "Преузми", -"Unshare" => "Укини дељење", +"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.php b/apps/files/l10n/sr@latin.php index 5b425aaa96..13ce5ec8b3 100644 --- a/apps/files/l10n/sr@latin.php +++ b/apps/files/l10n/sr@latin.php @@ -6,7 +6,11 @@ $TRANSLATIONS = array( "No file was uploaded" => "Nijedan fajl nije poslat", "Missing a temporary folder" => "Nedostaje privremena fascikla", "Files" => "Fajlovi", -"Delete" => "Obriši", +"Share" => "Podeli", +"_%n folder_::_%n folders_" => array("","",""), +"_%n file_::_%n files_" => array("","",""), +"_Uploading %n file_::_Uploading %n files_" => array("","",""), +"Error" => "Greška", "Name" => "Ime", "Size" => "Veličina", "Modified" => "Zadnja izmena", @@ -15,6 +19,7 @@ $TRANSLATIONS = array( "Save" => "Snimi", "Nothing in here. Upload something!" => "Ovde nema ničeg. Pošaljite nešto!", "Download" => "Preuzmi", +"Delete" => "Obriši", "Upload too large" => "Pošiljka je prevelika", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru." ); diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index 41206423cf..9e1b8110d4 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -2,6 +2,15 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Kunde inte flytta %s - Det finns redan en fil med detta namn", "Could not move %s" => "Kan inte flytta %s", +"File name cannot be empty." => "Filnamn kan inte vara tomt.", +"File name must not contain \"/\". Please choose a different name." => "Filnamnet får ej innehålla \"/\". Välj ett annat namn.", +"The name %s is already used in the folder %s. Please choose a different name." => "Namnet %s används redan i katalogen %s. Välj ett annat namn.", +"Not a valid source" => "Inte en giltig källa", +"Error while downloading %s to %s" => "Fel under nerladdning från %s till %s", +"Error when creating the file" => "Fel under skapande utav filen", +"Folder name cannot be empty." => "Katalognamn kan ej vara tomt.", +"Folder name must not contain \"/\". Please choose a different name." => "Katalog namnet får ej innehålla \"/\". Välj ett annat namn.", +"Error when creating the folder" => "Fel under skapande utav en katalog", "Unable to set upload directory." => "Kan inte sätta mapp för uppladdning.", "Invalid Token" => "Ogiltig token", "No file was uploaded. Unknown error" => "Ingen fil uppladdad. Okänt fel", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "En temporär mapp saknas", "Failed to write to disk" => "Misslyckades spara till disk", "Not enough storage available" => "Inte tillräckligt med lagringsutrymme tillgängligt", +"Upload failed. Could not get file info." => "Uppladdning misslyckades. Gick inte att hämta filinformation.", +"Upload failed. Could not find uploaded file" => "Uppladdning misslyckades. Kunde inte hitta den uppladdade filen", "Invalid directory." => "Felaktig mapp.", "Files" => "Filer", -"Unable to upload your file as it is a directory or has 0 bytes" => "Kan inte ladda upp din fil eftersom det är en katalog eller har 0 bytes", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.", "Not enough space available" => "Inte tillräckligt med utrymme tillgängligt", "Upload cancelled." => "Uppladdning avbruten.", +"Could not get result from server." => "Gick inte att hämta resultat från server.", "File upload is in progress. Leaving the page now will cancel the upload." => "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", -"URL cannot be empty." => "URL kan inte vara tom.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ogiltigt mappnamn. Användning av 'Shared' är reserverad av ownCloud", -"Error" => "Fel", +"URL cannot be empty" => "URL kan ej vara tomt", +"In the home folder 'Shared' is a reserved filename" => "I hemma katalogen 'Delat' är ett reserverat filnamn", +"{new_name} already exists" => "{new_name} finns redan", +"Could not create file" => "Kunde ej skapa fil", +"Could not create folder" => "Kunde ej skapa katalog", "Share" => "Dela", "Delete permanently" => "Radera permanent", -"Delete" => "Radera", "Rename" => "Byt namn", "Pending" => "Väntar", -"{new_name} already exists" => "{new_name} finns redan", -"replace" => "ersätt", -"suggest name" => "föreslå namn", -"cancel" => "avbryt", +"Could not rename file" => "Kan ej byta filnamn", "replaced {new_name} with {old_name}" => "ersatt {new_name} med {old_name}", "undo" => "ångra", -"perform delete operation" => "utför raderingen", -"1 file uploading" => "1 filuppladdning", -"files uploading" => "filer laddas upp", +"Error deleting file." => "Kunde inte ta bort filen.", +"_%n folder_::_%n folders_" => array("%n mapp","%n mappar"), +"_%n file_::_%n files_" => array("%n fil","%n filer"), +"{dirs} and {files}" => "{dirs} och {files}", +"_Uploading %n file_::_Uploading %n files_" => array("Laddar upp %n fil","Laddar upp %n filer"), "'.' is an invalid file name." => "'.' är ett ogiltigt filnamn.", -"File name cannot be empty." => "Filnamn kan inte vara tomt.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.", "Your storage is full, files can not be updated or synced anymore!" => "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!", "Your storage is almost full ({usedSpacePercent}%)" => "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Ogiltig privat nyckel i krypteringsprogrammet. Vänligen uppdatera lösenordet till din privata nyckel under dina personliga inställningar för att återfå tillgång till dina krypterade filer.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kryptering inaktiverades men dina filer är fortfarande krypterade. Vänligen gå till sidan för dina personliga inställningar för att dekryptera dina filer.", "Your download is being prepared. This might take some time if the files are big." => "Din nedladdning förbereds. Det kan ta tid om det är stora filer.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ogiltigt mappnamn. Användande av 'Shared' är reserverat av ownCloud", +"Error moving file" => "Fel uppstod vid flyttning av fil", +"Error" => "Fel", "Name" => "Namn", "Size" => "Storlek", "Modified" => "Ändrad", -"1 folder" => "1 mapp", -"{count} folders" => "{count} mappar", -"1 file" => "1 fil", -"{count} files" => "{count} filer", +"Invalid folder name. Usage of 'Shared' is reserved." => "Ogiltigt mappnamn. Användande av 'Shared' är reserverat av ownCloud", "%s could not be renamed" => "%s kunde inte namnändras", "Upload" => "Ladda upp", "File handling" => "Filhantering", @@ -62,22 +74,19 @@ $TRANSLATIONS = array( "Save" => "Spara", "New" => "Ny", "Text file" => "Textfil", +"New folder" => "Ny mapp", "Folder" => "Mapp", "From link" => "Från länk", "Deleted files" => "Raderade filer", "Cancel upload" => "Avbryt uppladdning", -"You don’t have write permissions here." => "Du saknar skrivbehörighet här.", +"You don’t have permission to upload or create files here" => "Du har ej tillåtelse att ladda upp eller skapa filer här", "Nothing in here. Upload something!" => "Ingenting här. Ladda upp något!", "Download" => "Ladda ner", -"Unshare" => "Sluta dela", +"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", "Current scanning" => "Aktuell skanning", -"directory" => "mapp", -"directories" => "mappar", -"file" => "fil", -"files" => "filer", "Upgrading filesystem cache..." => "Uppgraderar filsystemets cache..." ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/sw_KE.php b/apps/files/l10n/sw_KE.php new file mode 100644 index 0000000000..0157af093e --- /dev/null +++ b/apps/files/l10n/sw_KE.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php index 616248d87b..f91a74ee9b 100644 --- a/apps/files/l10n/ta_LK.php +++ b/apps/files/l10n/ta_LK.php @@ -8,30 +8,22 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "ஒரு தற்காலிகமான கோப்புறையை காணவில்லை", "Failed to write to disk" => "வட்டில் எழுத முடியவில்லை", "Files" => "கோப்புகள்", -"Unable to upload your file as it is a directory or has 0 bytes" => "அடைவு அல்லது 0 bytes ஐ கொண்டுள்ளதால் உங்களுடைய கோப்பை பதிவேற்ற முடியவில்லை", "Upload cancelled." => "பதிவேற்றல் இரத்து செய்யப்பட்டுள்ளது", "File upload is in progress. Leaving the page now will cancel the upload." => "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", -"URL cannot be empty." => "URL வெறுமையாக இருக்கமுடியாது.", -"Error" => "வழு", +"{new_name} already exists" => "{new_name} ஏற்கனவே உள்ளது", "Share" => "பகிர்வு", -"Delete" => "நீக்குக", "Rename" => "பெயர்மாற்றம்", "Pending" => "நிலுவையிலுள்ள", -"{new_name} already exists" => "{new_name} ஏற்கனவே உள்ளது", -"replace" => "மாற்றிடுக", -"suggest name" => "பெயரை பரிந்துரைக்க", -"cancel" => "இரத்து செய்க", "replaced {new_name} with {old_name}" => "{new_name} ஆனது {old_name} இனால் மாற்றப்பட்டது", "undo" => "முன் செயல் நீக்கம் ", -"1 file uploading" => "1 கோப்பு பதிவேற்றப்படுகிறது", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "செல்லுபடியற்ற பெயர்,'\\', '/', '<', '>', ':', '\"', '|', '?' மற்றும் '*' ஆகியன அனுமதிக்கப்படமாட்டாது.", +"Error" => "வழு", "Name" => "பெயர்", "Size" => "அளவு", "Modified" => "மாற்றப்பட்டது", -"1 folder" => "1 கோப்புறை", -"{count} folders" => "{எண்ணிக்கை} கோப்புறைகள்", -"1 file" => "1 கோப்பு", -"{count} files" => "{எண்ணிக்கை} கோப்புகள்", "Upload" => "பதிவேற்றுக", "File handling" => "கோப்பு கையாளுதல்", "Maximum upload size" => "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ", @@ -48,7 +40,7 @@ $TRANSLATIONS = array( "Cancel upload" => "பதிவேற்றலை இரத்து செய்க", "Nothing in here. Upload something!" => "இங்கு ஒன்றும் இல்லை. ஏதாவது பதிவேற்றுக!", "Download" => "பதிவிறக்குக", -"Unshare" => "பகிரப்படாதது", +"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.php b/apps/files/l10n/te.php index bb729b0187..155e4b5c20 100644 --- a/apps/files/l10n/te.php +++ b/apps/files/l10n/te.php @@ -1,12 +1,15 @@ "పొరపాటు", "Delete permanently" => "శాశ్వతంగా తొలగించు", -"Delete" => "తొలగించు", -"cancel" => "రద్దుచేయి", +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "పొరపాటు", "Name" => "పేరు", "Size" => "పరిమాణం", "Save" => "భద్రపరచు", -"Folder" => "సంచయం" +"New folder" => "కొత్త సంచయం", +"Folder" => "సంచయం", +"Delete" => "తొలగించు" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php index b480237008..38a67c5067 100644 --- a/apps/files/l10n/th_TH.php +++ b/apps/files/l10n/th_TH.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "ไม่สามารถย้าย %s ได้ - ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้ว", "Could not move %s" => "ไม่สามารถย้าย %s ได้", +"File name cannot be empty." => "ชื่อไฟล์ไม่สามารถเว้นว่างได้", "No file was uploaded. Unknown error" => "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ", "There is no error, the file uploaded with success" => "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "ขนาดไฟล์ที่อัพโหลดมีขนาดเกิน upload_max_filesize ที่ระบุไว้ใน php.ini", @@ -13,39 +14,27 @@ $TRANSLATIONS = array( "Not enough storage available" => "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน", "Invalid directory." => "ไดเร็กทอรี่ไม่ถูกต้อง", "Files" => "ไฟล์", -"Unable to upload your file as it is a directory or has 0 bytes" => "ไม่สามารถอัพโหลดไฟล์ของคุณได้ เนื่องจากไฟล์ดังกล่าวเป็นไดเร็กทอรี่ หรือ มีขนาดไฟล์ 0 ไบต์", "Not enough space available" => "มีพื้นที่เหลือไม่เพียงพอ", "Upload cancelled." => "การอัพโหลดถูกยกเลิก", "File upload is in progress. Leaving the page now will cancel the upload." => "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", -"URL cannot be empty." => "URL ไม่สามารถเว้นว่างได้", -"Error" => "ข้อผิดพลาด", +"{new_name} already exists" => "{new_name} มีอยู่แล้วในระบบ", "Share" => "แชร์", -"Delete" => "ลบ", "Rename" => "เปลี่ยนชื่อ", "Pending" => "อยู่ระหว่างดำเนินการ", -"{new_name} already exists" => "{new_name} มีอยู่แล้วในระบบ", -"replace" => "แทนที่", -"suggest name" => "แนะนำชื่อ", -"cancel" => "ยกเลิก", "replaced {new_name} with {old_name}" => "แทนที่ {new_name} ด้วย {old_name} แล้ว", "undo" => "เลิกทำ", -"perform delete operation" => "ดำเนินการตามคำสั่งลบ", -"1 file uploading" => "กำลังอัพโหลดไฟล์ 1 ไฟล์", -"files uploading" => "การอัพโหลดไฟล์", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), "'.' is an invalid file name." => "'.' เป็นชื่อไฟล์ที่ไม่ถูกต้อง", -"File name cannot be empty." => "ชื่อไฟล์ไม่สามารถเว้นว่างได้", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง, '\\', '/', '<', '>', ':', '\"', '|', '?' และ '*' ไม่ได้รับอนุญาตให้ใช้งานได้", "Your storage is full, files can not be updated or synced anymore!" => "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัพเดทหรือผสานไฟล์ต่างๆได้อีกต่อไป", "Your storage is almost full ({usedSpacePercent}%)" => "พื้นที่จัดเก็บข้อมูลของคุณใกล้เต็มแล้ว ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "กำลังเตรียมดาวน์โหลดข้อมูล หากไฟล์มีขนาดใหญ่ อาจใช้เวลาสักครู่", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "ชื่อโฟลเดอร์ไม่ถูกต้อง การใช้งาน 'แชร์' สงวนไว้สำหรับ Owncloud เท่านั้น", +"Error" => "ข้อผิดพลาด", "Name" => "ชื่อ", "Size" => "ขนาด", "Modified" => "แก้ไขแล้ว", -"1 folder" => "1 โฟลเดอร์", -"{count} folders" => "{count} โฟลเดอร์", -"1 file" => "1 ไฟล์", -"{count} files" => "{count} ไฟล์", "Upload" => "อัพโหลด", "File handling" => "การจัดกาไฟล์", "Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้", @@ -62,13 +51,11 @@ $TRANSLATIONS = array( "Cancel upload" => "ยกเลิกการอัพโหลด", "Nothing in here. Upload something!" => "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!", "Download" => "ดาวน์โหลด", -"Unshare" => "ยกเลิกการแชร์", +"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." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", "Current scanning" => "ไฟล์ที่กำลังสแกนอยู่ขณะนี้", -"file" => "ไฟล์", -"files" => "ไฟล์", "Upgrading filesystem cache..." => "กำลังอัพเกรดหน่วยความจำแคชของระบบไฟล์..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php index 351b23cb95..9ede20634a 100644 --- a/apps/files/l10n/tr.php +++ b/apps/files/l10n/tr.php @@ -1,9 +1,18 @@ "%s taşınamadı. Bu isimde dosya zaten var.", +"Could not move %s - File with this name already exists" => "%s taşınamadı - Bu isimde dosya zaten var", "Could not move %s" => "%s taşınamadı", +"File name cannot be empty." => "Dosya adı boş olamaz.", +"File name must not contain \"/\". Please choose a different name." => "Dosya adı \"/\" içermemelidir. Lütfen farklı bir isim seçin.", +"The name %s is already used in the folder %s. Please choose a different name." => "%s ismi zaten %s klasöründe kullanılıyor. Lütfen farklı bir isim seçin.", +"Not a valid source" => "Geçerli bir kaynak değil", +"Error while downloading %s to %s" => "%s, %s içine indirilirken hata", +"Error when creating the file" => "Dosya oluşturulurken hata", +"Folder name cannot be empty." => "Klasör adı boş olamaz.", +"Folder name must not contain \"/\". Please choose a different name." => "Klasör adı \"/\" içermemelidir. Lütfen farklı bir isim seçin.", +"Error when creating the folder" => "Klasör oluşturulurken hata", "Unable to set upload directory." => "Yükleme dizini tanımlanamadı.", -"Invalid Token" => "Geçeriz simge", +"Invalid Token" => "Geçersiz Simge", "No file was uploaded. Unknown error" => "Dosya yüklenmedi. Bilinmeyen hata", "There is no error, the file uploaded with success" => "Dosya başarıyla yüklendi, hata oluşmadı", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "php.ini dosyasında upload_max_filesize ile belirtilen dosya yükleme sınırı aşıldı.", @@ -13,43 +22,46 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "Geçici dizin eksik", "Failed to write to disk" => "Diske yazılamadı", "Not enough storage available" => "Yeterli disk alanı yok", +"Upload failed. Could not get file info." => "Yükleme başarısız. Dosya bilgisi alınamadı.", +"Upload failed. Could not find uploaded file" => "Yükleme başarısız. Yüklenen dosya bulunamadı", "Invalid directory." => "Geçersiz dizin.", "Files" => "Dosyalar", -"Unable to upload your file as it is a directory or has 0 bytes" => "Dosyanızın boyutu 0 byte olduğundan veya bir dizin olduğundan yüklenemedi", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "Bir dizin veya 0 bayt olduğundan {filename} yüklenemedi", "Not enough space available" => "Yeterli disk alanı yok", "Upload cancelled." => "Yükleme iptal edildi.", +"Could not get result from server." => "Sunucudan sonuç alınamadı.", "File upload is in progress. Leaving the page now will cancel the upload." => "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur.", -"URL cannot be empty." => "URL boş olamaz.", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Geçersiz dizin adı. 'Shared' dizin ismi kullanımı ownCloud tarafından rezerve edilmiştir.", -"Error" => "Hata", +"URL cannot be empty" => "URL boş olamaz", +"In the home folder 'Shared' is a reserved filename" => "Ev klasöründeki 'Paylaşılan', ayrılmış bir dosya adıdır", +"{new_name} already exists" => "{new_name} zaten mevcut", +"Could not create file" => "Dosya oluşturulamadı", +"Could not create folder" => "Klasör oluşturulamadı", "Share" => "Paylaş", "Delete permanently" => "Kalıcı olarak sil", -"Delete" => "Sil", "Rename" => "İsim değiştir.", "Pending" => "Bekliyor", -"{new_name} already exists" => "{new_name} zaten mevcut", -"replace" => "değiştir", -"suggest name" => "Öneri ad", -"cancel" => "iptal", +"Could not rename file" => "Dosya adlandırılamadı", "replaced {new_name} with {old_name}" => "{new_name} ismi {old_name} ile değiştirildi", "undo" => "geri al", -"perform delete operation" => "Silme işlemini gerçekleştir", -"1 file uploading" => "1 dosya yüklendi", -"files uploading" => "Dosyalar yükleniyor", -"'.' is an invalid file name." => "'.' geçersiz dosya adı.", -"File name cannot be empty." => "Dosya adı boş olamaz.", +"Error deleting file." => "Dosya silinirken hata.", +"_%n folder_::_%n folders_" => array("%n dizin","%n dizin"), +"_%n file_::_%n files_" => array("%n dosya","%n dosya"), +"{dirs} and {files}" => "{dirs} ve {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n dosya yükleniyor","%n dosya yükleniyor"), +"'.' is an invalid file name." => "'.' geçersiz bir dosya adı.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Geçersiz isim, '\\', '/', '<', '>', ':', '\"', '|', '?' ve '*' karakterlerine izin verilmemektedir.", "Your storage is full, files can not be updated or synced anymore!" => "Depolama alanınız dolu, artık dosyalar güncellenmeyecek yada senkronizasyon edilmeyecek.", "Your storage is almost full ({usedSpacePercent}%)" => "Depolama alanınız neredeyse dolu ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Şifreleme Uygulaması etkin ancak anahtarlarınız başlatılmamış. Lütfen oturumu kapatıp yeniden açın", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Şifreleme Uygulaması için geçersiz özel anahtar. Lütfen şifreli dosyalarınıza erişimi tekrar kazanabilmek için kişisel ayarlarınızdan özel anahtar parolanızı güncelleyin.", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Şifreleme işlemi durduruldu ancak dosyalarınız şifreli. Dosyalarınızın şifresini kaldırmak için lütfen kişisel ayarlar kısmına geçiniz.", "Your download is being prepared. This might take some time if the files are big." => "İndirmeniz hazırlanıyor. Dosya büyük ise biraz zaman alabilir.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Geçersiz dizin adı. Shared isminin kullanımı Owncloud tarafından rezerver edilmiştir.", +"Error moving file" => "Dosya taşıma hatası", +"Error" => "Hata", "Name" => "İsim", "Size" => "Boyut", "Modified" => "Değiştirilme", -"1 folder" => "1 dizin", -"{count} folders" => "{count} dizin", -"1 file" => "1 dosya", -"{count} files" => "{count} dosya", +"Invalid folder name. Usage of 'Shared' is reserved." => "Geçersiz dizin adı. 'Shared' ismi ayrılmıştır.", "%s could not be renamed" => "%s yeniden adlandırılamadı", "Upload" => "Yükle", "File handling" => "Dosya taşıma", @@ -61,23 +73,21 @@ $TRANSLATIONS = array( "Maximum input size for ZIP files" => "ZIP dosyaları için en fazla girdi sayısı", "Save" => "Kaydet", "New" => "Yeni", +"New text file" => "Yeni metin dosyası", "Text file" => "Metin dosyası", +"New folder" => "Yeni klasör", "Folder" => "Klasör", "From link" => "Bağlantıdan", -"Deleted files" => "Dosyalar silindi", +"Deleted files" => "Silinmiş dosyalar", "Cancel upload" => "Yüklemeyi iptal et", -"You don’t have write permissions here." => "Buraya erişim hakkınız yok.", -"Nothing in here. Upload something!" => "Burada hiçbir şey yok. Birşeyler yükleyin!", +"You don’t have permission to upload or create files here" => "Buraya dosya yükleme veya oluşturma izniniz yok", +"Nothing in here. Upload something!" => "Burada hiçbir şey yok. Bir şeyler yükleyin!", "Download" => "İndir", -"Unshare" => "Paylaşılmayan", +"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 maksimum yükleme boyutunu aşıyor.", "Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.", "Current scanning" => "Güncel tarama", -"directory" => "dizin", -"directories" => "dizinler", -"file" => "dosya", -"files" => "dosyalar", "Upgrading filesystem cache..." => "Sistem dosyası önbelleği güncelleniyor" ); $PLURAL_FORMS = "nplurals=2; plural=(n > 1);"; diff --git a/apps/files/l10n/tzm.php b/apps/files/l10n/tzm.php new file mode 100644 index 0000000000..c50e35da62 --- /dev/null +++ b/apps/files/l10n/tzm.php @@ -0,0 +1,7 @@ + array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;"; diff --git a/apps/files/l10n/ug.php b/apps/files/l10n/ug.php index 819b46c50c..45458c51af 100644 --- a/apps/files/l10n/ug.php +++ b/apps/files/l10n/ug.php @@ -10,35 +10,30 @@ $TRANSLATIONS = array( "Not enough space available" => "يېتەرلىك بوشلۇق يوق", "Upload cancelled." => "يۈكلەشتىن ۋاز كەچتى.", "File upload is in progress. Leaving the page now will cancel the upload." => "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.", -"Error" => "خاتالىق", +"{new_name} already exists" => "{new_name} مەۋجۇت", "Share" => "ھەمبەھىر", "Delete permanently" => "مەڭگۈلۈك ئۆچۈر", -"Delete" => "ئۆچۈر", "Rename" => "ئات ئۆزگەرت", "Pending" => "كۈتۈۋاتىدۇ", -"{new_name} already exists" => "{new_name} مەۋجۇت", -"replace" => "ئالماشتۇر", -"suggest name" => "تەۋسىيە ئات", -"cancel" => "ۋاز كەچ", "undo" => "يېنىۋال", -"1 file uploading" => "1 ھۆججەت يۈكلىنىۋاتىدۇ", -"files uploading" => "ھۆججەت يۈكلىنىۋاتىدۇ", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), +"Error" => "خاتالىق", "Name" => "ئاتى", "Size" => "چوڭلۇقى", "Modified" => "ئۆزگەرتكەن", -"1 folder" => "1 قىسقۇچ", -"1 file" => "1 ھۆججەت", -"{count} files" => "{count} ھۆججەت", "Upload" => "يۈكلە", "Save" => "ساقلا", "New" => "يېڭى", "Text file" => "تېكىست ھۆججەت", +"New folder" => "يېڭى قىسقۇچ", "Folder" => "قىسقۇچ", "Deleted files" => "ئۆچۈرۈلگەن ھۆججەتلەر", "Cancel upload" => "يۈكلەشتىن ۋاز كەچ", "Nothing in here. Upload something!" => "بۇ جايدا ھېچنېمە يوق. Upload something!", "Download" => "چۈشۈر", -"Unshare" => "ھەمبەھىرلىمە", +"Delete" => "ئۆچۈر", "Upload too large" => "يۈكلەندىغىنى بەك چوڭ", "Upgrading filesystem cache..." => "ھۆججەت سىستېما غەملىكىنى يۈكسەلدۈرۈۋاتىدۇ…" ); diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index 3cb4f00029..1e37d3d77d 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -2,6 +2,9 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Не вдалося перемістити %s - Файл з таким ім'ям вже існує", "Could not move %s" => "Не вдалося перемістити %s", +"File name cannot be empty." => " Ім'я файлу не може бути порожнім.", +"Folder name cannot be empty." => "Ім'я теки не може бути порожнім.", +"Unable to set upload directory." => "Не вдалося встановити каталог завантаження.", "No file was uploaded. Unknown error" => "Не завантажено жодного файлу. Невідома помилка", "There is no error, the file uploaded with success" => "Файл успішно вивантажено без помилок.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Розмір звантаження перевищує upload_max_filesize параметра в php.ini: ", @@ -13,40 +16,34 @@ $TRANSLATIONS = array( "Not enough storage available" => "Місця більше немає", "Invalid directory." => "Невірний каталог.", "Files" => "Файли", -"Unable to upload your file as it is a directory or has 0 bytes" => "Неможливо завантажити ваш файл тому, що він тека або файл розміром 0 байт", "Not enough space available" => "Місця більше немає", "Upload cancelled." => "Завантаження перервано.", "File upload is in progress. Leaving the page now will cancel the upload." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.", -"URL cannot be empty." => "URL не може бути пустим.", -"Error" => "Помилка", +"URL cannot be empty" => "URL не може бути порожнім", +"{new_name} already exists" => "{new_name} вже існує", +"Could not create file" => "Не вдалося створити файл", +"Could not create folder" => "Не вдалося створити теку", "Share" => "Поділитися", "Delete permanently" => "Видалити назавжди", -"Delete" => "Видалити", "Rename" => "Перейменувати", "Pending" => "Очікування", -"{new_name} already exists" => "{new_name} вже існує", -"replace" => "заміна", -"suggest name" => "запропонуйте назву", -"cancel" => "відміна", +"Could not rename file" => "Неможливо перейменувати файл", "replaced {new_name} with {old_name}" => "замінено {new_name} на {old_name}", "undo" => "відмінити", -"perform delete operation" => "виконати операцію видалення", -"1 file uploading" => "1 файл завантажується", -"files uploading" => "файли завантажуються", +"_%n folder_::_%n folders_" => array("%n тека","%n тека","%n теки"), +"_%n file_::_%n files_" => array("%n файл","%n файлів","%n файли"), +"_Uploading %n file_::_Uploading %n files_" => array("","",""), "'.' is an invalid file name." => "'.' це невірне ім'я файлу.", -"File name cannot be empty." => " Ім'я файлу не може бути порожнім.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені.", "Your storage is full, files can not be updated or synced anymore!" => "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані !", "Your storage is almost full ({usedSpacePercent}%)" => "Ваше сховище майже повне ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Ваше завантаження готується. Це може зайняти деякий час, якщо файли завеликі.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Невірне ім'я теки. Використання \"Shared\" зарезервовано Owncloud", +"Error moving file" => "Помилка переміщення файлу", +"Error" => "Помилка", "Name" => "Ім'я", "Size" => "Розмір", "Modified" => "Змінено", -"1 folder" => "1 папка", -"{count} folders" => "{count} папок", -"1 file" => "1 файл", -"{count} files" => "{count} файлів", +"%s could not be renamed" => "%s не може бути перейменований", "Upload" => "Вивантажити", "File handling" => "Робота з файлами", "Maximum upload size" => "Максимальний розмір відвантажень", @@ -58,20 +55,18 @@ $TRANSLATIONS = array( "Save" => "Зберегти", "New" => "Створити", "Text file" => "Текстовий файл", -"Folder" => "Папка", +"New folder" => "Нова тека", +"Folder" => "Тека", "From link" => "З посилання", "Deleted files" => "Видалено файлів", "Cancel upload" => "Перервати завантаження", -"You don’t have write permissions here." => "У вас тут немає прав на запис.", "Nothing in here. Upload something!" => "Тут нічого немає. Відвантажте що-небудь!", "Download" => "Завантажити", -"Unshare" => "Закрити доступ", +"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." => "Файли скануються, зачекайте, будь-ласка.", "Current scanning" => "Поточне сканування", -"file" => "файл", -"files" => "файли", "Upgrading filesystem cache..." => "Оновлення кеша файлової системи..." ); $PLURAL_FORMS = "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/l10n/ur_PK.php b/apps/files/l10n/ur_PK.php index 1f08345536..3e13a7f516 100644 --- a/apps/files/l10n/ur_PK.php +++ b/apps/files/l10n/ur_PK.php @@ -1,6 +1,8 @@ "ایرر", -"Unshare" => "شئیرنگ ختم کریں" +"_%n folder_::_%n folders_" => array("",""), +"_%n file_::_%n files_" => array("",""), +"_Uploading %n file_::_Uploading %n files_" => array("",""), +"Error" => "ایرر" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files/l10n/uz.php b/apps/files/l10n/uz.php new file mode 100644 index 0000000000..70ab6572ba --- /dev/null +++ b/apps/files/l10n/uz.php @@ -0,0 +1,7 @@ + array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array("") +); +$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php index 4d0240c9ba..8236d5e7ef 100644 --- a/apps/files/l10n/vi.php +++ b/apps/files/l10n/vi.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "Không thể di chuyển %s - Đã có tên tập tin này trên hệ thống", "Could not move %s" => "Không thể di chuyển %s", +"File name cannot be empty." => "Tên file không được rỗng", "No file was uploaded. Unknown error" => "Không có tập tin nào được tải lên. Lỗi không xác định", "There is no error, the file uploaded with success" => "Không có lỗi, các tập tin đã được tải lên thành công", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "The uploaded file exceeds the upload_max_filesize directive in php.ini: ", @@ -13,40 +14,28 @@ $TRANSLATIONS = array( "Not enough storage available" => "Không đủ không gian lưu trữ", "Invalid directory." => "Thư mục không hợp lệ", "Files" => "Tập tin", -"Unable to upload your file as it is a directory or has 0 bytes" => "Không thể tải lên tập tin của bạn ,nó như là một thư mục hoặc có 0 byte", "Not enough space available" => "Không đủ chỗ trống cần thiết", "Upload cancelled." => "Hủy tải lên", "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.", -"URL cannot be empty." => "URL không được để trống.", -"Error" => "Lỗi", +"{new_name} already exists" => "{new_name} đã tồn tại", "Share" => "Chia sẻ", "Delete permanently" => "Xóa vĩnh vễn", -"Delete" => "Xóa", "Rename" => "Sửa tên", "Pending" => "Đang chờ", -"{new_name} already exists" => "{new_name} đã tồn tại", -"replace" => "thay thế", -"suggest name" => "tên gợi ý", -"cancel" => "hủy", "replaced {new_name} with {old_name}" => "đã thay thế {new_name} bằng {old_name}", "undo" => "lùi lại", -"perform delete operation" => "thực hiện việc xóa", -"1 file uploading" => "1 tệp tin đang được tải lên", -"files uploading" => "tệp tin đang được tải lên", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), "'.' is an invalid file name." => "'.' là một tên file không hợp lệ", -"File name cannot be empty." => "Tên file không được rỗng", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Tên không hợp lệ, '\\', '/', '<', '>', ':', '\"', '|', '?' và '*' thì không được phép dùng.", "Your storage is full, files can not be updated or synced anymore!" => "Your storage is full, files can not be updated or synced anymore!", "Your storage is almost full ({usedSpacePercent}%)" => "Your storage is almost full ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Invalid folder name. Usage of 'Shared' is reserved by Owncloud", +"Error" => "Lỗi", "Name" => "Tên", "Size" => "Kích cỡ", "Modified" => "Thay đổi", -"1 folder" => "1 thư mục", -"{count} folders" => "{count} thư mục", -"1 file" => "1 tập tin", -"{count} files" => "{count} tập tin", "Upload" => "Tải lên", "File handling" => "Xử lý tập tin", "Maximum upload size" => "Kích thước tối đa ", @@ -58,20 +47,18 @@ $TRANSLATIONS = array( "Save" => "Lưu", "New" => "Mới", "Text file" => "Tập tin văn bản", +"New folder" => "Tạo thư mục", "Folder" => "Thư mục", "From link" => "Từ liên kết", "Deleted files" => "File đã bị xóa", "Cancel upload" => "Hủy upload", -"You don’t have write permissions here." => "Bạn không có quyền ghi vào đây.", "Nothing in here. Upload something!" => "Không có gì ở đây .Hãy tải lên một cái gì đó !", "Download" => "Tải về", -"Unshare" => "Bỏ chia sẻ", +"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ờ.", "Current scanning" => "Hiện tại đang quét", -"file" => "file", -"files" => "files", "Upgrading filesystem cache..." => "Đang nâng cấp bộ nhớ đệm cho tập tin hệ thống..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/zh_CN.GB2312.php b/apps/files/l10n/zh_CN.GB2312.php deleted file mode 100644 index 9b08b5dda2..0000000000 --- a/apps/files/l10n/zh_CN.GB2312.php +++ /dev/null @@ -1,83 +0,0 @@ - "无法移动 %s - 存在同名文件", -"Could not move %s" => "无法移动 %s", -"Unable to set upload directory." => "无法设置上传文件夹", -"Invalid Token" => "非法Token", -"No file was uploaded. Unknown error" => "没有上传文件。未知错误", -"There is no error, the file uploaded with success" => "文件上传成功", -"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "上传的文件超过了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" => "文件部分上传", -"No file was uploaded" => "没有上传文件", -"Missing a temporary folder" => "缺失临时文件夹", -"Failed to write to disk" => "写磁盘失败", -"Not enough storage available" => "容量不足", -"Invalid directory." => "无效文件夹", -"Files" => "文件", -"Unable to upload your file as it is a directory or has 0 bytes" => "不能上传您的文件,由于它是文件夹或者为空文件", -"Not enough space available" => "容量不足", -"Upload cancelled." => "上传取消了", -"File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传。关闭页面会取消上传。", -"URL cannot be empty." => "网址不能为空。", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "无效文件夹名。“Shared”已经被系统保留。", -"Error" => "出错", -"Share" => "分享", -"Delete permanently" => "永久删除", -"Delete" => "删除", -"Rename" => "重命名", -"Pending" => "等待中", -"{new_name} already exists" => "{new_name} 已存在", -"replace" => "替换", -"suggest name" => "推荐名称", -"cancel" => "取消", -"replaced {new_name} with {old_name}" => "已用 {old_name} 替换 {new_name}", -"undo" => "撤销", -"perform delete operation" => "执行删除", -"1 file uploading" => "1 个文件正在上传", -"files uploading" => "个文件正在上传", -"'.' is an invalid file name." => "'.' 文件名不正确", -"File name cannot be empty." => "文件名不能为空", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "文件名内不能包含以下符号:\\ / < > : \" | ?和 *", -"Your storage is full, files can not be updated or synced anymore!" => "容量已满,不能再同步/上传文件了!", -"Your storage is almost full ({usedSpacePercent}%)" => "你的空间快用满了 ({usedSpacePercent}%)", -"Your download is being prepared. This might take some time if the files are big." => "正在下载,可能会花点时间,跟文件大小有关", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "不正确文件夹名。Shared是保留名,不能使用。", -"Name" => "名称", -"Size" => "大小", -"Modified" => "修改日期", -"1 folder" => "1 个文件夹", -"{count} folders" => "{count} 个文件夹", -"1 file" => "1 个文件", -"{count} files" => "{count} 个文件", -"%s could not be renamed" => "不能重命名 %s", -"Upload" => "上传", -"File handling" => "文件处理中", -"Maximum upload size" => "最大上传大小", -"max. possible: " => "最大可能", -"Needed for multi-file and folder downloads." => "需要多文件和文件夹下载.", -"Enable ZIP-download" => "支持ZIP下载", -"0 is unlimited" => "0是无限的", -"Maximum input size for ZIP files" => "最大的ZIP文件输入大小", -"Save" => "保存", -"New" => "新建", -"Text file" => "文本文档", -"Folder" => "文件夹", -"From link" => "来自链接", -"Deleted files" => "已删除的文件", -"Cancel upload" => "取消上传", -"You don’t have write permissions here." => "您没有写入权限。", -"Nothing in here. Upload something!" => "这里没有东西.上传点什么!", -"Download" => "下载", -"Unshare" => "取消分享", -"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." => "正在扫描文件,请稍候.", -"Current scanning" => "正在扫描", -"directory" => "文件夹", -"directories" => "文件夹", -"file" => "文件", -"files" => "文件", -"Upgrading filesystem cache..." => "升级系统缓存..." -); -$PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index d4bf220590..effcb0225c 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -2,6 +2,7 @@ $TRANSLATIONS = array( "Could not move %s - File with this name already exists" => "无法移动 %s - 同名文件已存在", "Could not move %s" => "无法移动 %s", +"File name cannot be empty." => "文件名不能为空。", "Unable to set upload directory." => "无法设置上传文件夹。", "Invalid Token" => "无效密匙", "No file was uploaded. Unknown error" => "没有文件被上传。未知错误", @@ -15,41 +16,28 @@ $TRANSLATIONS = array( "Not enough storage available" => "没有足够的存储空间", "Invalid directory." => "无效文件夹。", "Files" => "文件", -"Unable to upload your file as it is a directory or has 0 bytes" => "无法上传您的文件,文件夹或者空文件", "Not enough space available" => "没有足够可用空间", "Upload cancelled." => "上传已取消", "File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传中。现在离开此页会导致上传动作被取消。", -"URL cannot be empty." => "URL不能为空", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "无效的文件夹名。”Shared“ 是 Owncloud 预留的文件夹", -"Error" => "错误", +"{new_name} already exists" => "{new_name} 已存在", "Share" => "分享", "Delete permanently" => "永久删除", -"Delete" => "删除", "Rename" => "重命名", "Pending" => "等待", -"{new_name} already exists" => "{new_name} 已存在", -"replace" => "替换", -"suggest name" => "建议名称", -"cancel" => "取消", "replaced {new_name} with {old_name}" => "已将 {old_name}替换成 {new_name}", "undo" => "撤销", -"perform delete operation" => "进行删除操作", -"1 file uploading" => "1个文件上传中", -"files uploading" => "文件上传中", +"_%n folder_::_%n folders_" => array("%n 文件夹"), +"_%n file_::_%n files_" => array("%n个文件"), +"_Uploading %n file_::_Uploading %n files_" => array(""), "'.' is an invalid file name." => "'.' 是一个无效的文件名。", -"File name cannot be empty." => "文件名不能为空。", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。", "Your storage is full, files can not be updated or synced anymore!" => "您的存储空间已满,文件将无法更新或同步!", "Your storage is almost full ({usedSpacePercent}%)" => "您的存储空间即将用完 ({usedSpacePercent}%)", "Your download is being prepared. This might take some time if the files are big." => "下载正在准备中。如果文件较大可能会花费一些时间。", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "无效文件夹名。'共享' 是 Owncloud 预留的文件夹名。", +"Error" => "错误", "Name" => "名称", "Size" => "大小", "Modified" => "修改日期", -"1 folder" => "1个文件夹", -"{count} folders" => "{count} 个文件夹", -"1 file" => "1 个文件", -"{count} files" => "{count} 个文件", "%s could not be renamed" => "%s 不能被重命名", "Upload" => "上传", "File handling" => "文件处理", @@ -62,20 +50,18 @@ $TRANSLATIONS = array( "Save" => "保存", "New" => "新建", "Text file" => "文本文件", +"New folder" => "添加文件夹", "Folder" => "文件夹", "From link" => "来自链接", "Deleted files" => "已删除文件", "Cancel upload" => "取消上传", -"You don’t have write permissions here." => "您没有写权限", "Nothing in here. Upload something!" => "这里还什么都没有。上传些东西吧!", "Download" => "下载", -"Unshare" => "取消共享", +"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." => "文件正在被扫描,请稍候。", "Current scanning" => "当前扫描", -"file" => "文件", -"files" => "文件", "Upgrading filesystem cache..." => "正在更新文件系统缓存..." ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/zh_HK.php b/apps/files/l10n/zh_HK.php index 1f309d9b2f..4885500ce4 100644 --- a/apps/files/l10n/zh_HK.php +++ b/apps/files/l10n/zh_HK.php @@ -1,14 +1,15 @@ "文件", -"Error" => "錯誤", "Share" => "分享", -"Delete" => "刪除", +"_%n folder_::_%n folders_" => array(""), +"_%n file_::_%n files_" => array(""), +"_Uploading %n file_::_Uploading %n files_" => array(""), +"Error" => "錯誤", "Name" => "名稱", -"{count} folders" => "{}文件夾", "Upload" => "上傳", "Save" => "儲存", "Download" => "下載", -"Unshare" => "取消分享" +"Delete" => "刪除" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php index 6e0dd54fdd..dd9cbfdf1a 100644 --- a/apps/files/l10n/zh_TW.php +++ b/apps/files/l10n/zh_TW.php @@ -1,11 +1,20 @@ "無法移動 %s - 同名的檔案已經存在", +"Could not move %s - File with this name already exists" => "無法移動 %s ,同名的檔案已經存在", "Could not move %s" => "無法移動 %s", -"Unable to set upload directory." => "無法設定上傳目錄。", +"File name cannot be empty." => "檔名不能為空", +"File name must not contain \"/\". Please choose a different name." => "檔名不能包含 \"/\" ,請選其他名字", +"The name %s is already used in the folder %s. Please choose a different name." => "%s 已經被使用於資料夾 %s ,請換一個名字", +"Not a valid source" => "不是有效的來源", +"Error while downloading %s to %s" => "下載 %s 到 %s 失敗", +"Error when creating the file" => "建立檔案失敗", +"Folder name cannot be empty." => "資料夾名稱不能留空", +"Folder name must not contain \"/\". Please choose a different name." => "資料夾名稱不能包含 \"/\" ,請選其他名字", +"Error when creating the folder" => "建立資料夾失敗", +"Unable to set upload directory." => "無法設定上傳目錄", "Invalid Token" => "無效的 token", -"No file was uploaded. Unknown error" => "沒有檔案被上傳。未知的錯誤。", -"There is no error, the file uploaded with success" => "無錯誤,檔案上傳成功", +"No file was uploaded. Unknown error" => "沒有檔案被上傳,原因未知", +"There is no error, the file uploaded with success" => "一切都順利,檔案上傳成功", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "上傳的檔案大小超過 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" => "只有檔案的一部分被上傳", @@ -13,71 +22,69 @@ $TRANSLATIONS = array( "Missing a temporary folder" => "找不到暫存資料夾", "Failed to write to disk" => "寫入硬碟失敗", "Not enough storage available" => "儲存空間不足", -"Invalid directory." => "無效的資料夾。", +"Upload failed. Could not get file info." => "上傳失敗,無法取得檔案資訊", +"Upload failed. Could not find uploaded file" => "上傳失敗,找不到上傳的檔案", +"Invalid directory." => "無效的資料夾", "Files" => "檔案", -"Unable to upload your file as it is a directory or has 0 bytes" => "無法上傳您的檔案因為它可能是一個目錄或檔案大小為0", +"Unable to upload {filename} as it is a directory or has 0 bytes" => "因為 {filename} 是個目錄或是大小為零,所以無法上傳", "Not enough space available" => "沒有足夠的可用空間", "Upload cancelled." => "上傳已取消", -"File upload is in progress. Leaving the page now will cancel the upload." => "檔案上傳中。離開此頁面將會取消上傳。", -"URL cannot be empty." => "URL 不能為空白。", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無效的資料夾名稱,'Shared' 的使用被 ownCloud 保留", -"Error" => "錯誤", +"Could not get result from server." => "無法從伺服器取回結果", +"File upload is in progress. Leaving the page now will cancel the upload." => "檔案上傳中,離開此頁面將會取消上傳。", +"URL cannot be empty" => "URL 不能留空", +"In the home folder 'Shared' is a reserved filename" => "在家目錄中不能使用「共享」作為檔名", +"{new_name} already exists" => "{new_name} 已經存在", +"Could not create file" => "無法建立檔案", +"Could not create folder" => "無法建立資料夾", "Share" => "分享", "Delete permanently" => "永久刪除", -"Delete" => "刪除", "Rename" => "重新命名", "Pending" => "等候中", -"{new_name} already exists" => "{new_name} 已經存在", -"replace" => "取代", -"suggest name" => "建議檔名", -"cancel" => "取消", +"Could not rename file" => "無法重新命名", "replaced {new_name} with {old_name}" => "使用 {new_name} 取代 {old_name}", "undo" => "復原", -"perform delete operation" => "進行刪除動作", -"1 file uploading" => "1 個檔案正在上傳", -"files uploading" => "檔案正在上傳中", -"'.' is an invalid file name." => "'.' 是不合法的檔名。", -"File name cannot be empty." => "檔名不能為空。", -"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "檔名不合法,不允許 '\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 。", +"_%n folder_::_%n folders_" => array("%n 個資料夾"), +"_%n file_::_%n files_" => array("%n 個檔案"), +"{dirs} and {files}" => "{dirs} 和 {files}", +"_Uploading %n file_::_Uploading %n files_" => array("%n 個檔案正在上傳"), +"'.' is an invalid file name." => "'.' 是不合法的檔名", +"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "檔名不合法,不允許 \\ / < > : \" | ? * 字元", "Your storage is full, files can not be updated or synced anymore!" => "您的儲存空間已滿,沒有辦法再更新或是同步檔案!", "Your storage is almost full ({usedSpacePercent}%)" => "您的儲存空間快要滿了 ({usedSpacePercent}%)", +"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次", +"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "無效的檔案加密私鑰,請在個人設定中更新您的私鑰密語以存取加密的檔案。", +"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "加密已經被停用,但是您的舊檔案還是處於已加密的狀態,請前往個人設定以解密這些檔案。", "Your download is being prepared. This might take some time if the files are big." => "正在準備您的下載,若您的檔案較大,將會需要更多時間。", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "無效的資料夾名稱,'Shared' 的使用被 ownCloud 保留", +"Error moving file" => "移動檔案失敗", +"Error" => "錯誤", "Name" => "名稱", "Size" => "大小", -"Modified" => "修改", -"1 folder" => "1 個資料夾", -"{count} folders" => "{count} 個資料夾", -"1 file" => "1 個檔案", -"{count} files" => "{count} 個檔案", +"Modified" => "修改時間", "%s could not be renamed" => "無法重新命名 %s", "Upload" => "上傳", "File handling" => "檔案處理", -"Maximum upload size" => "最大上傳檔案大小", +"Maximum upload size" => "上傳限制", "max. possible: " => "最大允許:", -"Needed for multi-file and folder downloads." => "針對多檔案和目錄下載是必填的。", -"Enable ZIP-download" => "啟用 Zip 下載", +"Needed for multi-file and folder downloads." => "下載多檔案和目錄時,此項是必填的。", +"Enable ZIP-download" => "啟用 ZIP 下載", "0 is unlimited" => "0代表沒有限制", -"Maximum input size for ZIP files" => "針對 ZIP 檔案最大輸入大小", +"Maximum input size for ZIP files" => "ZIP 壓縮前的原始大小限制", "Save" => "儲存", "New" => "新增", "Text file" => "文字檔", +"New folder" => "新資料夾", "Folder" => "資料夾", "From link" => "從連結", -"Deleted files" => "已刪除的檔案", +"Deleted files" => "回收桶", "Cancel upload" => "取消上傳", -"You don’t have write permissions here." => "您在這裡沒有編輯權。", -"Nothing in here. Upload something!" => "這裡什麼也沒有,上傳一些東西吧!", +"You don’t have permission to upload or create files here" => "您沒有權限在這裡上傳或建立檔案", +"Nothing in here. Upload something!" => "這裡還沒有東西,上傳一些吧!", "Download" => "下載", -"Unshare" => "取消共享", +"Delete" => "刪除", "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." => "正在掃描檔案,請稍等。", -"Current scanning" => "目前掃描", -"directory" => "目錄", -"directories" => "目錄", -"file" => "檔案", -"files" => "檔案", -"Upgrading filesystem cache..." => "正在升級檔案系統快取..." +"Current scanning" => "正在掃描", +"Upgrading filesystem cache..." => "正在升級檔案系統快取…" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php index f7052ef80b..e04ac173d5 100644 --- a/apps/files/lib/app.php +++ b/apps/files/lib/app.php @@ -25,7 +25,14 @@ namespace OCA\Files; class App { + /** + * @var \OC_L10N + */ private $l10n; + + /** + * @var \OC\Files\View + */ private $view; public function __construct($view, $l10n) { @@ -50,9 +57,17 @@ class App { // rename to "/Shared" is denied if( $dir === '/' and $newname === 'Shared' ) { $result['data'] = array( - 'message' => $this->l10n->t("Invalid folder name. Usage of 'Shared' is reserved by ownCloud") + 'message' => $this->l10n->t("Invalid folder name. Usage of 'Shared' is reserved.") ); - } elseif( + // rename to existing file is denied + } else if ($this->view->file_exists($dir . '/' . $newname)) { + + $result['data'] = array( + 'message' => $this->l10n->t( + "The name %s is already used in the folder %s. Please choose a different name.", + array($newname, $dir)) + ); + } else if ( // rename to "." is denied $newname !== '.' and // rename of "/Shared" is denied @@ -61,12 +76,25 @@ class App { $this->view->rename($dir . '/' . $oldname, $dir . '/' . $newname) ) { // successful rename - $result['success'] = true; - $result['data'] = array( - 'dir' => $dir, - 'file' => $oldname, - 'newname' => $newname + $meta = $this->view->getFileInfo($dir . '/' . $newname); + if ($meta['mimetype'] === 'httpd/unix-directory') { + $meta['type'] = 'dir'; + } + else { + $meta['type'] = 'file'; + } + $fileinfo = array( + 'id' => $meta['fileid'], + 'mime' => $meta['mimetype'], + 'size' => $meta['size'], + 'etag' => $meta['etag'], + 'directory' => $dir, + 'name' => $newname, + 'isPreviewAvailable' => \OC::$server->getPreviewManager()->isMimeSupported($meta['mimetype']), + 'icon' => \OCA\Files\Helper::determineIcon($meta) ); + $result['success'] = true; + $result['data'] = $fileinfo; } else { // rename failed $result['data'] = array( @@ -76,4 +104,4 @@ class App { return $result; } -} \ No newline at end of file +} diff --git a/apps/files/lib/capabilities.php b/apps/files/lib/capabilities.php index 90a5e2f4eb..d4820e931b 100644 --- a/apps/files/lib/capabilities.php +++ b/apps/files/lib/capabilities.php @@ -21,4 +21,4 @@ class Capabilities { )); } -} \ No newline at end of file +} diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index f2b1f142e9..eaff28178e 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -1,6 +1,6 @@ t('Upload') . ' max. ' . $maxHumanFilesize; // information about storage capacities - $storageInfo = \OC_Helper::getStorageInfo(); + $storageInfo = \OC_Helper::getStorageInfo($dir); return array('uploadMaxFilesize' => $maxUploadFilesize, 'maxHumanFilesize' => $maxHumanFilesize, 'usedSpacePercent' => (int)$storageInfo['relative']); } + + public static function determineIcon($file) { + if($file['type'] === 'dir') { + $dir = $file['directory']; + $absPath = \OC\Files\Filesystem::getView()->getAbsolutePath($dir.'/'.$file['name']); + $mount = \OC\Files\Filesystem::getMountManager()->find($absPath); + if (!is_null($mount)) { + $sid = $mount->getStorageId(); + if (!is_null($sid)) { + $sid = explode(':', $sid); + if ($sid[0] === 'shared') { + return \OC_Helper::mimetypeIcon('dir-shared'); + } + if ($sid[0] !== 'local' and $sid[0] !== 'home') { + return \OC_Helper::mimetypeIcon('dir-external'); + } + } + } + return \OC_Helper::mimetypeIcon('dir'); + } + + if($file['isPreviewAvailable']) { + $pathForPreview = $file['directory'] . '/' . $file['name']; + return \OC_Helper::previewIcon($pathForPreview) . '&c=' . $file['etag']; + } + return \OC_Helper::mimetypeIcon($file['mimetype']); + } + + /** + * Comparator function to sort files alphabetically and have + * the directories appear first + * @param array $a file + * @param array $b file + * @return -1 if $a must come before $b, 1 otherwise + */ + public static function fileCmp($a, $b) { + if ($a['type'] === 'dir' and $b['type'] !== 'dir') { + return -1; + } elseif ($a['type'] !== 'dir' and $b['type'] === 'dir') { + return 1; + } else { + return strnatcasecmp($a['name'], $b['name']); + } + } + + /** + * Retrieves the contents of the given directory and + * returns it as a sorted array. + * @param string $dir path to the directory + * @return array of files + */ + public static function getFiles($dir) { + $content = \OC\Files\Filesystem::getDirectoryContent($dir); + $files = array(); + + foreach ($content as $i) { + $i['date'] = \OCP\Util::formatDate($i['mtime']); + if ($i['type'] === 'file') { + $fileinfo = pathinfo($i['name']); + $i['basename'] = $fileinfo['filename']; + if (!empty($fileinfo['extension'])) { + $i['extension'] = '.' . $fileinfo['extension']; + } else { + $i['extension'] = ''; + } + } + $i['directory'] = $dir; + $i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']); + $i['icon'] = \OCA\Files\Helper::determineIcon($i); + $files[] = $i; + } + + usort($files, array('\OCA\Files\Helper', 'fileCmp')); + + return $files; + } + + /** + * Splits the given path into a breadcrumb structure. + * @param string $dir path to process + * @return array where each entry is a hash of the absolute + * directory path and its name + */ + public static function makeBreadcrumb($dir){ + $breadcrumb = array(); + $pathtohere = ''; + foreach (explode('/', $dir) as $i) { + if ($i !== '') { + $pathtohere .= '/' . $i; + $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i); + } + } + return $breadcrumb; + } + + /** + * Returns the numeric permissions for the given directory. + * @param string $dir directory without trailing slash + * @return numeric permissions + */ + public static function getDirPermissions($dir){ + $permissions = \OCP\PERMISSION_READ; + if (\OC\Files\Filesystem::isCreatable($dir . '/')) { + $permissions |= \OCP\PERMISSION_CREATE; + } + if (\OC\Files\Filesystem::isUpdatable($dir . '/')) { + $permissions |= \OCP\PERMISSION_UPDATE; + } + if (\OC\Files\Filesystem::isDeletable($dir . '/')) { + $permissions |= \OCP\PERMISSION_DELETE; + } + if (\OC\Files\Filesystem::isSharable($dir . '/')) { + $permissions |= \OCP\PERMISSION_SHARE; + } + return $permissions; + } } diff --git a/apps/files/templates/admin.php b/apps/files/templates/admin.php index e1ca6afc4a..697fc52526 100644 --- a/apps/files/templates/admin.php +++ b/apps/files/templates/admin.php @@ -2,7 +2,7 @@
- t('File handling')); ?> +

t('File handling')); ?>

'/> diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html new file mode 100644 index 0000000000..662177ac7e --- /dev/null +++ b/apps/files/templates/fileexists.html @@ -0,0 +1,26 @@ +
+ {why}
+ {what}
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 79c283dc33..00ec109621 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -1,43 +1,31 @@ -
- -
+
t('New'));?>
  • t('Text file'));?>

  • + data-type='file' data-newname='t('New text file')) ?>.txt'>

    t('Text file'));?>

  • t('Folder'));?>

  • -
  • '>

    t('Folder'));?>

  • +
  • t('From link'));?>

- = 0):?> - - - + -
- + >
@@ -48,51 +36,44 @@
- -
- - +
+ t('You don’t have permission to upload or create files here'))?> +
- -
t('Nothing in here. Upload something!'))?>
- +
class="hidden">t('Nothing in here. Upload something!'))?>
- + + +
- - - + @@ -101,7 +82,7 @@
- - t( 'Name' )); ?> - - - - Download" /> - t('Download'))?> - - - + class="hidden" id='headerName'> +
+ + + t( 'Name' )); ?> + + + + Download" /> + t('Download'))?> + + + +
t('Size')); ?> + class="hidden" id="headerSize">t('Size')); ?>class="hidden" id="headerDate"> t( 'Modified' )); ?> - - - - t('Unshare'))?> - <?php p($l->t('Unshare'))?>" /> - - - - t('Delete'))?> - <?php p($l->t('Delete'))?>" /> - - + + t('Delete'))?> + <?php p($l->t('Delete'))?>" /> +
-
+

t('The files you are trying to upload exceed the maximum size for file uploads on this server.'));?> @@ -117,5 +98,13 @@

+ + + + + + + +"> data-file="" data-type="" data-mime="" - data-size='' - data-permissions=''> - - style="background-image:url()" + data-size="" + data-etag="" + data-permissions=""> + + - style="background-image:url()" + + style="background-image:url()" > - + + + + - - - - - + - - - - + + + + + + + @@ -64,33 +60,4 @@ $totalsize = 0; ?> - - - - - t('directory')); - } else { - p($l->t('directories')); - } - } - if ($totaldirs !== 0 && $totalfiles !== 0) { - p(' & '); - } - if ($totalfiles !== 0) { - p($totalfiles.' '); - if ($totalfiles === 1) { - p($l->t('file')); - } else { - p($l->t('files')); - } - } ?> - - - - - - - getMock('\OC_L10N', array('t'), array(), '', false); $l10nMock->expects($this->any()) ->method('t') ->will($this->returnArgument(0)); - $viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath'), array(), '', false); + $viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath', 'getFileInfo'), array(), '', false); $viewMock->expects($this->any()) ->method('normalizePath') ->will($this->returnArgument(0)); $viewMock->expects($this->any()) ->method('rename') ->will($this->returnValue(true)); + $this->viewMock = $viewMock; $this->files = new \OCA\Files\App($viewMock, $l10nMock); } + function tearDown() { + $result = \OC_User::deleteUser(self::$user); + $this->assertTrue($result); + \OC\Files\Filesystem::tearDown(); + } + /** * @brief test rename of file/folder named "Shared" */ @@ -64,17 +80,28 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $oldname = 'Shared'; $newname = 'new_name'; - $result = $this->files->rename($dir, $oldname, $newname); - $expected = array( - 'success' => true, - 'data' => array( - 'dir' => $dir, - 'file' => $oldname, - 'newname' => $newname - ) - ); + $this->viewMock->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue(array( + 'fileid' => 123, + 'type' => 'dir', + 'mimetype' => 'httpd/unix-directory', + 'size' => 18, + 'etag' => 'abcdef', + 'directory' => '/', + 'name' => 'new_name', + ))); - $this->assertEquals($expected, $result); + $result = $this->files->rename($dir, $oldname, $newname); + + $this->assertTrue($result['success']); + $this->assertEquals(123, $result['data']['id']); + $this->assertEquals('new_name', $result['data']['name']); + $this->assertEquals('/test', $result['data']['directory']); + $this->assertEquals(18, $result['data']['size']); + $this->assertEquals('httpd/unix-directory', $result['data']['mime']); + $this->assertEquals(\OC_Helper::mimetypeIcon('dir'), $result['data']['icon']); + $this->assertFalse($result['data']['isPreviewAvailable']); } /** @@ -88,7 +115,7 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $result = $this->files->rename($dir, $oldname, $newname); $expected = array( 'success' => false, - 'data' => array('message' => "Invalid folder name. Usage of 'Shared' is reserved by ownCloud") + 'data' => array('message' => "Invalid folder name. Usage of 'Shared' is reserved.") ); $this->assertEquals($expected, $result); @@ -102,16 +129,29 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $oldname = 'oldname'; $newname = 'newname'; - $result = $this->files->rename($dir, $oldname, $newname); - $expected = array( - 'success' => true, - 'data' => array( - 'dir' => $dir, - 'file' => $oldname, - 'newname' => $newname - ) - ); + $this->viewMock->expects($this->any()) + ->method('getFileInfo') + ->will($this->returnValue(array( + 'fileid' => 123, + 'type' => 'dir', + 'mimetype' => 'httpd/unix-directory', + 'size' => 18, + 'etag' => 'abcdef', + 'directory' => '/', + 'name' => 'new_name', + ))); - $this->assertEquals($expected, $result); + + $result = $this->files->rename($dir, $oldname, $newname); + + $this->assertTrue($result['success']); + $this->assertEquals(123, $result['data']['id']); + $this->assertEquals('newname', $result['data']['name']); + $this->assertEquals('/', $result['data']['directory']); + $this->assertEquals(18, $result['data']['size']); + $this->assertEquals('httpd/unix-directory', $result['data']['mime']); + $this->assertEquals('abcdef', $result['data']['etag']); + $this->assertEquals(\OC_Helper::mimetypeIcon('dir'), $result['data']['icon']); + $this->assertFalse($result['data']['isPreviewAvailable']); } -} \ No newline at end of file +} diff --git a/apps/files_encryption/ajax/changeRecoveryPassword.php b/apps/files_encryption/ajax/changeRecoveryPassword.php index 366f634a51..945f054ea8 100644 --- a/apps/files_encryption/ajax/changeRecoveryPassword.php +++ b/apps/files_encryption/ajax/changeRecoveryPassword.php @@ -49,4 +49,4 @@ if ($return) { \OCP\JSON::success(array('data' => array('message' => $l->t('Password successfully changed.')))); } else { \OCP\JSON::error(array('data' => array('message' => $l->t('Could not change the password. Maybe the old password was not correct.')))); -} \ No newline at end of file +} diff --git a/apps/files_encryption/ajax/getMigrationStatus.php b/apps/files_encryption/ajax/getMigrationStatus.php new file mode 100644 index 0000000000..17469a1af0 --- /dev/null +++ b/apps/files_encryption/ajax/getMigrationStatus.php @@ -0,0 +1,28 @@ + + * This file is licensed under the Affero General Public License version 3 or later. + * See the COPYING-README file. + * + * @brief check migration status + */ +use OCA\Encryption\Util; + +\OCP\JSON::checkAppEnabled('files_encryption'); + +$loginname = isset($_POST['user']) ? $_POST['user'] : ''; +$password = isset($_POST['password']) ? $_POST['password'] : ''; + +$migrationCompleted = true; + +if ($loginname !== '' && $password !== '') { + $username = \OCP\User::checkPassword($loginname, $password); + if ($username) { + $util = new Util(new \OC_FilesystemView('/'), $username); + if ($util->getMigrationStatus() !== Util::MIGRATION_COMPLETED) { + $migrationCompleted = false; + } + } +} + +\OCP\JSON::success(array('data' => array('migrationCompleted' => $migrationCompleted))); diff --git a/apps/files_encryption/ajax/updatePrivateKeyPassword.php b/apps/files_encryption/ajax/updatePrivateKeyPassword.php index 6fd63dae9c..29c72952ae 100644 --- a/apps/files_encryption/ajax/updatePrivateKeyPassword.php +++ b/apps/files_encryption/ajax/updatePrivateKeyPassword.php @@ -48,7 +48,8 @@ if ($decryptedKey) { // success or failure if ($return) { + $session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL); \OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.')))); } else { \OCP\JSON::error(array('data' => array('message' => $l->t('Could not update the private key password. Maybe the old password was not correct.')))); -} \ No newline at end of file +} diff --git a/apps/files_encryption/ajax/userrecovery.php b/apps/files_encryption/ajax/userrecovery.php index 1d0f1ac2d1..d6c94bde81 100644 --- a/apps/files_encryption/ajax/userrecovery.php +++ b/apps/files_encryption/ajax/userrecovery.php @@ -38,4 +38,4 @@ if ( } // Return success or failure -($return) ? \OCP\JSON::success() : \OCP\JSON::error(); \ No newline at end of file +($return) ? \OCP\JSON::success() : \OCP\JSON::error(); diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php index 90a9984e27..fd9aa429b0 100644 --- a/apps/files_encryption/appinfo/app.php +++ b/apps/files_encryption/appinfo/app.php @@ -10,6 +10,8 @@ OC::$CLASSPATH['OCA\Encryption\Session'] = 'files_encryption/lib/session.php'; OC::$CLASSPATH['OCA\Encryption\Capabilities'] = 'files_encryption/lib/capabilities.php'; OC::$CLASSPATH['OCA\Encryption\Helper'] = 'files_encryption/lib/helper.php'; +\OCP\Util::addscript('files_encryption', 'detect-migration'); + if (!OC_Config::getValue('maintenance', false)) { OC_FileProxy::register(new OCA\Encryption\Proxy()); @@ -25,7 +27,9 @@ if (!OC_Config::getValue('maintenance', false)) { // App manager related hooks OCA\Encryption\Helper::registerAppHooks(); - stream_wrapper_register('crypt', 'OCA\Encryption\Stream'); + if(!in_array('crypt', stream_get_wrappers())) { + stream_wrapper_register('crypt', 'OCA\Encryption\Stream'); + } // check if we are logged in if (OCP\User::isLoggedIn()) { @@ -41,23 +45,6 @@ if (!OC_Config::getValue('maintenance', false)) { if($sessionReady) { $session = new \OCA\Encryption\Session($view); } - - $user = \OCP\USER::getUser(); - // check if user has a private key - if ($sessionReady === false - || (!$view->file_exists('/' . $user . '/files_encryption/' . $user . '.private.key') - && OCA\Encryption\Crypt::mode() === 'server') - ) { - - // Force the user to log-in again if the encryption key isn't unlocked - // (happens when a user is logged in before the encryption app is - // enabled) - OCP\User::logout(); - - header("Location: " . OC::$WEBROOT . '/'); - - exit(); - } } } else { // logout user if we are in maintenance to force re-login @@ -67,4 +54,3 @@ if (!OC_Config::getValue('maintenance', false)) { // Register settings scripts OCP\App::registerAdmin('files_encryption', 'settings-admin'); OCP\App::registerPersonal('files_encryption', 'settings-personal'); - diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml index 46f1375c98..9d495916d2 100644 --- a/apps/files_encryption/appinfo/info.xml +++ b/apps/files_encryption/appinfo/info.xml @@ -7,6 +7,7 @@ Sam Tuke, Bjoern Schiessle, Florin Peter 4 true + false diff --git a/apps/files_encryption/appinfo/routes.php b/apps/files_encryption/appinfo/routes.php index ab83432a4b..07ff920a60 100644 --- a/apps/files_encryption/appinfo/routes.php +++ b/apps/files_encryption/appinfo/routes.php @@ -6,4 +6,4 @@ */ // Register with the capabilities API -OC_API::register('get', '/cloud/capabilities', array('OCA\Encryption\Capabilities', 'getCapabilities'), 'files_encryption', OC_API::USER_AUTH); \ No newline at end of file +OC_API::register('get', '/cloud/capabilities', array('OCA\Encryption\Capabilities', 'getCapabilities'), 'files_encryption', OC_API::USER_AUTH); diff --git a/apps/files_encryption/appinfo/version b/apps/files_encryption/appinfo/version index bd73f47072..2eb3c4fe4e 100644 --- a/apps/files_encryption/appinfo/version +++ b/apps/files_encryption/appinfo/version @@ -1 +1 @@ -0.4 +0.5 diff --git a/apps/files_encryption/css/settings-personal.css b/apps/files_encryption/css/settings-personal.css index 4ee0acc976..8eb5bedcb0 100644 --- a/apps/files_encryption/css/settings-personal.css +++ b/apps/files_encryption/css/settings-personal.css @@ -7,4 +7,4 @@ , #recoveryEnabledError , #recoveryEnabledSuccess { display: none; -} \ No newline at end of file +} diff --git a/apps/files_encryption/files/error.php b/apps/files_encryption/files/error.php index f93c67d920..317cea05a1 100644 --- a/apps/files_encryption/files/error.php +++ b/apps/files_encryption/files/error.php @@ -1,23 +1,47 @@ t('Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.'); - - if(isset($_GET['p']) && $_GET['p'] === '1') { - header('HTTP/1.0 404 ' . $errorMsg); + if (isset($_GET['errorCode'])) { + $errorCode = $_GET['errorCode']; + switch ($errorCode) { + case \OCA\Encryption\Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR: + $errorMsg = $l->t('Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app.'); + break; + case \OCA\Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR: + $theme = new OC_Defaults(); + $errorMsg = $l->t('Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.', array($theme->getName())); + break; + case \OCA\Encryption\Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND: + $errorMsg = $l->t('Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.'); + break; + default: + $errorMsg = $l->t("Unknown error please check your system settings or contact your administrator"); + break; + } + } else { + $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_UNKNOWN_ERROR; + $errorMsg = $l->t("Unknown error please check your system settings or contact your administrator"); } - // check if ajax request - if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { + if (isset($_GET['p']) && $_GET['p'] === '1') { + header('HTTP/1.0 403 ' . $errorMsg); + } + +// check if ajax request + if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { \OCP\JSON::error(array('data' => array('message' => $errorMsg))); } else { - header('HTTP/1.0 404 ' . $errorMsg); + header('HTTP/1.0 403 ' . $errorMsg); $tmpl = new OC_Template('files_encryption', 'invalid_private_key', 'guest'); + $tmpl->assign('message', $errorMsg); + $tmpl->assign('errorCode', $errorCode); $tmpl->printPage(); } exit; } + diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index 07da839e8a..7b13ae2a1d 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -30,24 +30,19 @@ use OC\Files\Filesystem; */ class Hooks { - // TODO: use passphrase for encrypting private key that is separate to - // the login password - /** * @brief Startup encryption backend upon user login * @note This method should never be called for users using client side encryption */ public static function login($params) { - $l = new \OC_L10N('files_encryption'); - //check if all requirements are met - if(!Helper::checkRequirements() || !Helper::checkConfiguration() ) { - $error_msg = $l->t("Missing requirements."); - $hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.'); - \OC_App::disable('files_encryption'); - \OCP\Util::writeLog('Encryption library', $error_msg . ' ' . $hint, \OCP\Util::ERROR); - \OCP\Template::printErrorPage($error_msg, $hint); + + if (\OCP\App::isEnabled('files_encryption') === false) { + return true; } + + $l = new \OC_L10N('files_encryption'); + $view = new \OC_FilesystemView('/'); // ensure filesystem is loaded @@ -55,6 +50,20 @@ class Hooks { \OC_Util::setupFS($params['uid']); } + $privateKey = \OCA\Encryption\Keymanager::getPrivateKey($view, $params['uid']); + + // if no private key exists, check server configuration + if(!$privateKey) { + //check if all requirements are met + if(!Helper::checkRequirements() || !Helper::checkConfiguration()) { + $error_msg = $l->t("Missing requirements."); + $hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.'); + \OC_App::disable('files_encryption'); + \OCP\Util::writeLog('Encryption library', $error_msg . ' ' . $hint, \OCP\Util::ERROR); + \OCP\Template::printErrorPage($error_msg, $hint); + } + } + $util = new Util($view, $params['uid']); // setup user, if user not ready force relogin @@ -62,18 +71,7 @@ class Hooks { return false; } - $encryptedKey = Keymanager::getPrivateKey($view, $params['uid']); - - $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']); - - if ($privateKey === false) { - \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid'] - . '" is not valid! Maybe the user password was changed from outside if so please change it back to gain access', \OCP\Util::ERROR); - } - - $session = new \OCA\Encryption\Session($view); - - $session->setPrivateKey($privateKey); + $session = $util->initEncryption($params); // Check if first-run file migration has already been performed $ready = false; @@ -86,7 +84,7 @@ class Hooks { $userView = new \OC_FilesystemView('/' . $params['uid']); - // Set legacy encryption key if it exists, to support + // Set legacy encryption key if it exists, to support // depreciated encryption system if ( $userView->file_exists('encryption.key') @@ -100,8 +98,6 @@ class Hooks { } // Encrypt existing user files: - // This serves to upgrade old versions of the encryption - // app (see appinfo/spec.txt) if ( $util->encryptAll('/' . $params['uid'] . '/' . 'files', $session->getLegacyKey(), $params['password']) ) { @@ -127,11 +123,12 @@ class Hooks { * @note This method should never be called for users using client side encryption */ public static function postCreateUser($params) { - $view = new \OC_FilesystemView('/'); - $util = new Util($view, $params['uid']); - - Helper::setupUser($util, $params['password']); + if (\OCP\App::isEnabled('files_encryption')) { + $view = new \OC_FilesystemView('/'); + $util = new Util($view, $params['uid']); + Helper::setupUser($util, $params['password']); + } } /** @@ -139,26 +136,31 @@ class Hooks { * @note This method should never be called for users using client side encryption */ public static function postDeleteUser($params) { - $view = new \OC_FilesystemView('/'); - // cleanup public key - $publicKey = '/public-keys/' . $params['uid'] . '.public.key'; + if (\OCP\App::isEnabled('files_encryption')) { + $view = new \OC_FilesystemView('/'); - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // cleanup public key + $publicKey = '/public-keys/' . $params['uid'] . '.public.key'; - $view->unlink($publicKey); + // Disable encryption proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - \OC_FileProxy::$enabled = $proxyStatus; + $view->unlink($publicKey); + + \OC_FileProxy::$enabled = $proxyStatus; + } } /** * @brief If the password can't be changed within ownCloud, than update the key password in advance. */ public static function preSetPassphrase($params) { - if ( ! \OC_User::canUserChangePassword($params['uid']) ) { - self::setPassphrase($params); + if (\OCP\App::isEnabled('files_encryption')) { + if ( ! \OC_User::canUserChangePassword($params['uid']) ) { + self::setPassphrase($params); + } } } @@ -168,14 +170,18 @@ class Hooks { */ public static function setPassphrase($params) { + if (\OCP\App::isEnabled('files_encryption') === false) { + return true; + } + // Only attempt to change passphrase if server-side encryption // is in use (client-side encryption does not have access to // the necessary keys) if (Crypt::mode() === 'server') { - if ($params['uid'] === \OCP\User::getUser()) { + $view = new \OC_FilesystemView('/'); - $view = new \OC_FilesystemView('/'); + if ($params['uid'] === \OCP\User::getUser()) { $session = new \OCA\Encryption\Session($view); @@ -196,36 +202,41 @@ class Hooks { } else { // admin changed the password for a different user, create new keys and reencrypt file keys $user = $params['uid']; - $recoveryPassword = $params['recoveryPassword']; - $newUserPassword = $params['password']; + $util = new Util($view, $user); + $recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null; - $view = new \OC_FilesystemView('/'); + if (($util->recoveryEnabledForUser() && $recoveryPassword) + || !$util->userKeysExists()) { - // make sure that the users home is mounted - \OC\Files\Filesystem::initMountPoints($user); + $recoveryPassword = $params['recoveryPassword']; + $newUserPassword = $params['password']; - $keypair = Crypt::createKeypair(); + // make sure that the users home is mounted + \OC\Files\Filesystem::initMountPoints($user); - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + $keypair = Crypt::createKeypair(); - // Save public key - $view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']); + // Disable encryption proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - // Encrypt private key empty passphrase - $encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword); + // Save public key + $view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']); - // Save private key - $view->file_put_contents( - '/' . $user . '/files_encryption/' . $user . '.private.key', $encryptedPrivateKey); + // Encrypt private key empty passphrase + $encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword); - if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files - $util = new Util($view, $user); - $util->recoverUsersFiles($recoveryPassword); + // Save private key + $view->file_put_contents( + '/' . $user . '/files_encryption/' . $user . '.private.key', $encryptedPrivateKey); + + if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files + $util = new Util($view, $user); + $util->recoverUsersFiles($recoveryPassword); + } + + \OC_FileProxy::$enabled = $proxyStatus; } - - \OC_FileProxy::$enabled = $proxyStatus; } } } @@ -238,6 +249,10 @@ class Hooks { */ public static function preShared($params) { + if (\OCP\App::isEnabled('files_encryption') === false) { + return true; + } + $l = new \OC_L10N('files_encryption'); $users = array(); $view = new \OC\Files\View('/public-keys/'); @@ -262,7 +277,7 @@ class Hooks { $params['run'] = false; $params['error'] = $l->t('Following users are not set up for encryption:') . ' ' . join(', ' , $notConfigured); } - + } /** @@ -273,7 +288,7 @@ class Hooks { // NOTE: $params has keys: // [itemType] => file // itemSource -> int, filecache file ID - // [parent] => + // [parent] => // [itemTarget] => /13 // shareWith -> string, uid of user being shared to // fileTarget -> path of file being shared @@ -289,6 +304,10 @@ class Hooks { // [run] => whether emitting script should continue to run // TODO: Should other kinds of item be encrypted too? + if (\OCP\App::isEnabled('files_encryption') === false) { + return true; + } + if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') { $view = new \OC_FilesystemView('/'); @@ -304,8 +323,8 @@ class Hooks { // get the parent from current share $parent = $util->getShareParent($params['parent']); - // if parent is file the it is an 1:1 share - if ($parent['item_type'] === 'file') { + // if parent has the same type than the child it is a 1:1 share + if ($parent['item_type'] === $params['itemType']) { // prefix path with Shared $path = '/Shared' . $parent['file_target']; @@ -314,13 +333,13 @@ class Hooks { // NOTE: parent is folder but shared was a file! // we try to rebuild the missing path // some examples we face here - // user1 share folder1 with user2 folder1 has - // the following structure + // user1 share folder1 with user2 folder1 has + // the following structure // /folder1/subfolder1/subsubfolder1/somefile.txt // user2 re-share subfolder2 with user3 // user3 re-share somefile.txt user4 - // so our path should be - // /Shared/subfolder1/subsubfolder1/somefile.txt + // so our path should be + // /Shared/subfolder1/subsubfolder1/somefile.txt // while user3 is sharing if ($params['itemType'] === 'file') { @@ -383,6 +402,10 @@ class Hooks { // [shareWith] => test1 // [itemParent] => + if (\OCP\App::isEnabled('files_encryption') === false) { + return true; + } + if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') { $view = new \OC_FilesystemView('/'); @@ -464,6 +487,11 @@ class Hooks { * of the stored versions along the actual file */ public static function postRename($params) { + + if (\OCP\App::isEnabled('files_encryption') === false) { + return true; + } + // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; @@ -551,14 +579,29 @@ class Hooks { } /** - * set migration status back to '0' so that all new files get encrypted + * set migration status and the init status back to '0' so that all new files get encrypted * if the app gets enabled again * @param array $params contains the app ID */ public static function preDisable($params) { if ($params['app'] === 'files_encryption') { - $query = \OC_DB::prepare('UPDATE `*PREFIX*encryption` SET `migration_status`=0'); - $query->execute(); + + $setMigrationStatus = \OC_DB::prepare('UPDATE `*PREFIX*encryption` SET `migration_status`=0'); + $setMigrationStatus->execute(); + + $session = new \OCA\Encryption\Session(new \OC\Files\View('/')); + $session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED); + } + } + + /** + * set the init status to 'NOT_INITIALIZED' (0) if the app gets enabled + * @param array $params contains the app ID + */ + public static function postEnable($params) { + if ($params['app'] === 'files_encryption') { + $session = new \OCA\Encryption\Session(new \OC\Files\View('/')); + $session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED); } } diff --git a/apps/files_encryption/js/detect-migration.js b/apps/files_encryption/js/detect-migration.js new file mode 100644 index 0000000000..301e77f24f --- /dev/null +++ b/apps/files_encryption/js/detect-migration.js @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2013 + * Bjoern Schiessle + * This file is licensed under the Affero General Public License version 3 or later. + * See the COPYING-README file. + */ + + +$(document).ready(function(){ + $('form[name="login"]').on('submit', function() { + var user = $('#user').val(); + var password = $('#password').val(); + $.ajax({ + type: 'POST', + url: OC.linkTo('files_encryption', 'ajax/getMigrationStatus.php'), + dataType: 'json', + data: {user: user, password: password}, + async: false, + success: function(response) { + if (response.data.migrationCompleted === false) { + var message = t('files_encryption', 'Initial encryption started... This can take some time. Please wait.'); + $('#messageText').text(message); + $('#message').removeClass('hidden').addClass('update'); + } + } + }); + }); + +}); diff --git a/apps/files_encryption/js/settings-admin.js b/apps/files_encryption/js/settings-admin.js index 7c1866445e..c2140a6f1e 100644 --- a/apps/files_encryption/js/settings-admin.js +++ b/apps/files_encryption/js/settings-admin.js @@ -1,6 +1,8 @@ /** - * Copyright (c) 2013, Sam Tuke , Robin Appelman - * + * Copyright (c) 2013 + * Sam Tuke + * Robin Appelman + * Bjoern Schiessle * This file is licensed under the Affero General Public License version 3 or later. * See the COPYING-README file. */ @@ -31,22 +33,23 @@ $(document).ready(function(){ // Trigger ajax on recoveryAdmin status change var enabledStatus = $('#adminEnableRecovery').val(); - $('input:password[name="recoveryPassword"]').keyup(function(event) { - var recoveryPassword = $( '#recoveryPassword' ).val(); + $('input:password[name="encryptionRecoveryPassword"]').keyup(function(event) { + var recoveryPassword = $( '#encryptionRecoveryPassword' ).val(); + var recoveryPasswordRepeated = $( '#repeatEncryptionRecoveryPassword' ).val(); var checkedButton = $('input:radio[name="adminEnableRecovery"]:checked').val(); var uncheckedValue = (1+parseInt(checkedButton)) % 2; - if (recoveryPassword != '' ) { + if (recoveryPassword !== '' && recoveryPassword === recoveryPasswordRepeated) { $('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').removeAttr("disabled"); } else { $('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').attr("disabled", "true"); } }); - $( 'input:radio[name="adminEnableRecovery"]' ).change( + $( 'input:radio[name="adminEnableRecovery"]' ).change( function() { var recoveryStatus = $( this ).val(); var oldStatus = (1+parseInt(recoveryStatus)) % 2; - var recoveryPassword = $( '#recoveryPassword' ).val(); + var recoveryPassword = $( '#encryptionRecoveryPassword' ).val(); $.post( OC.filePath( 'files_encryption', 'ajax', 'adminrecovery.php' ) , { adminEnableRecovery: recoveryStatus, recoveryPassword: recoveryPassword } @@ -57,11 +60,10 @@ $(document).ready(function(){ } else { OC.Notification.hide(); if (recoveryStatus === "0") { - $('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true"); - $('input:password[name="changeRecoveryPassword"]').attr("disabled", "true"); - $('input:password[name="changeRecoveryPassword"]').val(""); + $('p[name="changeRecoveryPasswordBlock"]').addClass("hidden"); } else { - $('input:password[name="changeRecoveryPassword"]').removeAttr("disabled"); + $('input:password[name="changeRecoveryPassword"]').val(""); + $('p[name="changeRecoveryPasswordBlock"]').removeClass("hidden"); } } } @@ -72,9 +74,11 @@ $(document).ready(function(){ // change recovery password $('input:password[name="changeRecoveryPassword"]').keyup(function(event) { - var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val(); - var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val(); - if (newRecoveryPassword != '' && oldRecoveryPassword != '' ) { + var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val(); + var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val(); + var newRecoveryPasswordRepeated = $('#repeatedNewEncryptionRecoveryPassword').val(); + + if (newRecoveryPassword !== '' && oldRecoveryPassword !== '' && newRecoveryPassword === newRecoveryPasswordRepeated) { $('button:button[name="submitChangeRecoveryKey"]').removeAttr("disabled"); } else { $('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true"); @@ -83,8 +87,8 @@ $(document).ready(function(){ $('button:button[name="submitChangeRecoveryKey"]').click(function() { - var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val(); - var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val(); + var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val(); + var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val(); OC.msg.startSaving('#encryption .msg'); $.post( OC.filePath( 'files_encryption', 'ajax', 'changeRecoveryPassword.php' ) @@ -98,5 +102,5 @@ $(document).ready(function(){ } ); }); - -}); \ No newline at end of file + +}); diff --git a/apps/files_encryption/js/settings-personal.js b/apps/files_encryption/js/settings-personal.js index d6535a25b7..e16519c3c9 100644 --- a/apps/files_encryption/js/settings-personal.js +++ b/apps/files_encryption/js/settings-personal.js @@ -95,4 +95,4 @@ $(document).ready(function(){ updatePrivateKeyPasswd(); }); -}); \ No newline at end of file +}); diff --git a/apps/files_encryption/l10n/ru_RU.php b/apps/files_encryption/l10n/bs.php similarity index 80% rename from apps/files_encryption/l10n/ru_RU.php rename to apps/files_encryption/l10n/bs.php index 438e6fb5e9..708e045ade 100644 --- a/apps/files_encryption/l10n/ru_RU.php +++ b/apps/files_encryption/l10n/bs.php @@ -1,5 +1,5 @@ "Сохранение" +"Saving..." => "Spašavam..." ); $PLURAL_FORMS = "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_encryption/l10n/ca.php b/apps/files_encryption/l10n/ca.php index c7581fa604..33d2754483 100644 --- a/apps/files_encryption/l10n/ca.php +++ b/apps/files_encryption/l10n/ca.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "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.", "Could not update the private key password. Maybe the old password was not correct." => "No s'ha pogut actualitzar la contrasenya de la clau privada. Potser la contrasenya anterior no era correcta.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "La clau privada no és vàlida! Probablement la contrasenya va ser canviada des de fora del sistema ownCloud (per exemple, en el directori de l'empresa). Vostè pot actualitzar la contrasenya de clau privada en la seva configuració personal per poder recuperar l'accés en els arxius xifrats.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "L'aplicació d'encriptació no està inicialitzada! Potser l'aplicació d'encriptació ha estat reiniciada durant la sessió. Intenteu sortir i acreditar-vos de nou per reinicialitzar l'aplicació d'encriptació.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "La clau privada no és vàlida! Probablement la contrasenya va ser canviada des de fora de %s (per exemple, en el directori de l'empresa). Vostè pot actualitzar la contrasenya de clau privada en la seva configuració personal per poder recuperar l'accés en els arxius xifrats.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "No es pot desencriptar aquest fitxer, probablement és un fitxer compartit. Demaneu al propietari del fitxer que el comparteixi de nou amb vós.", +"Unknown error please check your system settings or contact your administrator" => "Error desconegut. Comproveu l'arranjament del sistema o contacteu amb l'administrador", "Missing requirements." => "Manca de requisits.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Assegureu-vos que teniu instal·lat PHP 5.3.3 o una versió superior i que està activat Open SSL i habilitada i configurada correctament l'extensió de PHP. De moment, l'aplicació d'encriptació s'ha desactivat.", "Following users are not set up for encryption:" => "Els usuaris següents no estan configurats per a l'encriptació:", +"Initial encryption started... This can take some time. Please wait." => "La encriptació inicial ha començat... Pot trigar una estona, espereu.", "Saving..." => "Desant...", -"Your private key is not valid! Maybe the your password was changed from outside." => "La vostra clau privada no és vàlida! Potser la vostra contrasenya ha canviat des de fora.", -"You can unlock your private key in your " => "Podeu desbloquejar la clau privada en el vostre", +"Go directly to your " => "Vés directament a", "personal settings" => "arranjament personal", "Encryption" => "Xifrat", "Enable recovery key (allow to recover users files in case of password loss):" => "Activa la clau de recuperació (permet recuperar fitxers d'usuaris en cas de pèrdua de contrasenya):", "Recovery key password" => "Clau de recuperació de la contrasenya", +"Repeat Recovery key password" => "Repetiu la clau de recuperació de contrasenya", "Enabled" => "Activat", "Disabled" => "Desactivat", "Change recovery key password:" => "Canvia la clau de recuperació de contrasenya:", "Old Recovery key password" => "Antiga clau de recuperació de contrasenya", "New Recovery key password" => "Nova clau de recuperació de contrasenya", +"Repeat New Recovery key password" => "Repetiu la nova clau de recuperació de contrasenya", "Change Password" => "Canvia la contrasenya", "Your private key password no longer match your log-in password:" => "La clau privada ja no es correspon amb la contrasenya d'accés:", "Set your old private key password to your current log-in password." => "Establiu la vostra contrasenya clau en funció de la contrasenya actual d'accés.", diff --git a/apps/files_encryption/l10n/cs_CZ.php b/apps/files_encryption/l10n/cs_CZ.php index 8bd4723938..cf2776371d 100644 --- a/apps/files_encryption/l10n/cs_CZ.php +++ b/apps/files_encryption/l10n/cs_CZ.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Změna hesla se nezdařila. Pravděpodobně nebylo stávající heslo zadáno správně.", "Private key password successfully updated." => "Heslo soukromého klíče úspěšně aktualizováno.", "Could not update the private key password. Maybe the old password was not correct." => "Nelze aktualizovat heslo soukromého klíče. Možná nebylo staré heslo správně.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Váš soukromý klíč není platný! Pravděpodobně bylo heslo změněno vně systému ownCloud (např. ve vašem firemním adresáři). Heslo vašeho soukromého klíče můžete změnit ve svém osobním nastavení pro obnovení přístupu k vašim zašifrovaným souborům.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Aplikace pro šifrování není inicializována! Je možné, že aplikace byla znovu aktivována během vašeho přihlášení. Zkuste se prosím odhlásit a znovu přihlásit pro provedení inicializace šifrovací aplikace.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Váš soukromý klíč není platný! Pravděpodobně bylo vaše heslo změněno vně systému %s (např. ve vašem firemním adresáři). Heslo vašeho soukromého klíče můžete změnit ve svém osobním nastavení pro obnovení přístupu k vašim zašifrovaným souborům.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Tento soubor se nepodařilo dešifrovat, pravděpodobně je sdílený. Požádejte prosím majitele souboru, aby jej s vámi znovu sdílel.", +"Unknown error please check your system settings or contact your administrator" => "Neznámá chyba, zkontrolujte vaše systémová nastavení nebo kontaktujte vašeho správce", "Missing requirements." => "Nesplněné závislosti.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Ujistěte se prosím, že máte nainstalované PHP 5.3.3 nebo novější a že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Prozatím byla aplikace pro šifrování vypnuta.", "Following users are not set up for encryption:" => "Následující uživatelé nemají nastavené šifrování:", +"Initial encryption started... This can take some time. Please wait." => "Počáteční šifrování zahájeno... Toto může chvíli trvat. Počkejte prosím.", "Saving..." => "Ukládám...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Váš soukromý klíč není platný! Pravděpodobně bylo vaše heslo změněno zvenčí.", -"You can unlock your private key in your " => "Můžete odemknout váš soukromý klíč ve vašem", +"Go directly to your " => "Běžte přímo do vašeho", "personal settings" => "osobní nastavení", "Encryption" => "Šifrování", "Enable recovery key (allow to recover users files in case of password loss):" => "Povolit klíč pro obnovu (umožňuje obnovu uživatelských souborů v případě ztráty hesla)", "Recovery key password" => "Heslo klíče pro obnovu", +"Repeat Recovery key password" => "Zopakujte heslo klíče pro obnovu", "Enabled" => "Povoleno", "Disabled" => "Zakázáno", "Change recovery key password:" => "Změna hesla klíče pro obnovu:", "Old Recovery key password" => "Původní heslo klíče pro obnovu", "New Recovery key password" => "Nové heslo klíče pro obnovu", +"Repeat New Recovery key password" => "Zopakujte nové heslo klíče pro obnovu", "Change Password" => "Změnit heslo", "Your private key password no longer match your log-in password:" => "Heslo vašeho soukromého klíče se již neshoduje s vaším přihlašovacím heslem:", "Set your old private key password to your current log-in password." => "Změňte heslo vaše soukromého klíče na stejné jako vaše přihlašovací heslo.", diff --git a/apps/files_encryption/l10n/da.php b/apps/files_encryption/l10n/da.php index 19e6b1d2e8..9d307f1064 100644 --- a/apps/files_encryption/l10n/da.php +++ b/apps/files_encryption/l10n/da.php @@ -8,11 +8,10 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Kunne ikke ændre kodeordet. Måske var det gamle kodeord ikke korrekt.", "Private key password successfully updated." => "Privat nøgle kodeord succesfuldt opdateret.", "Could not update the private key password. Maybe the old password was not correct." => "Kunne ikke opdatere det private nøgle kodeord-. Måske var det gamle kodeord forkert.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Din private nøgle er gyldig! Sandsynligvis blev dit kodeord ændre uden for ownCloud systemet (f.eks. dit firmas register). Du kan opdatere dit private nøgle kodeord under personlige indstillinger, for at generhverve adgang til dine krypterede filer.", "Missing requirements." => "Manglende betingelser.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Sørg for at PHP 5.3.3 eller nyere er installeret og at OpenSSL sammen med PHP-udvidelsen er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.", +"Following users are not set up for encryption:" => "Følgende brugere er ikke sat op til kryptering:", "Saving..." => "Gemmer...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Din private nøgle er ikke gyldig. Måske blev dit kodeord ændre udefra.", -"You can unlock your private key in your " => "Du kan låse din private nøgle op i din ", "personal settings" => "Personlige indstillinger", "Encryption" => "Kryptering", "Enable recovery key (allow to recover users files in case of password loss):" => "Aktiver gendannelsesnøgle (Tillad gendannelse af brugerfiler i tilfælde af tab af kodeord):", diff --git a/apps/files_encryption/l10n/de.php b/apps/files_encryption/l10n/de.php index 53c7984001..3ba50f074b 100644 --- a/apps/files_encryption/l10n/de.php +++ b/apps/files_encryption/l10n/de.php @@ -1,37 +1,43 @@ "Wiederherstellungsschlüssel wurde erfolgreich aktiviert", -"Could not enable recovery key. Please check your recovery key password!" => "Der Wiederherstellungsschlüssel konnte nicht aktiviert werden. Überprüfen Sie Ihr Wiederherstellungspasswort!", +"Could not enable recovery key. Please check your recovery key password!" => "Der Wiederherstellungsschlüssel konnte nicht aktiviert werden. Überprüfe Dein Wiederherstellungspasswort!", "Recovery key successfully disabled" => "Wiederherstellungsschlüssel deaktiviert.", -"Could not disable recovery key. Please check your recovery key password!" => "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Überprüfen Sie Ihr Wiederherstellungspasswort!", +"Could not disable recovery key. Please check your recovery key password!" => "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Überprüfe Dein Wiederherstellungspasswort!", "Password successfully changed." => "Dein Passwort wurde geändert.", "Could not change the password. Maybe the old password was not correct." => "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort falsch.", "Private key password successfully updated." => "Passwort des privaten Schlüssels erfolgreich aktualisiert", "Could not update the private key password. Maybe the old password was not correct." => "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Eventuell war das alte Passwort falsch.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Dein privater Schlüssel ist ungültig. Möglicher Weise wurde von außerhalb Dein Passwort geändert (z.B. in deinem gemeinsamen Verzeichnis). Du kannst das Passwort deines privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an deine Dateien zu gelangen.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuche Dich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Dein privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Dein Passwort geändert (z.B. in Deinem gemeinsamen Verzeichnis). Du kannst das Passwort Deines privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Deine Dateien zu gelangen.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte frage den Dateibesitzer, ob er die Datei nochmals mit Dir teilt.", +"Unknown error please check your system settings or contact your administrator" => "Unbekannter Fehler, bitte prüfe Deine Systemeinstellungen oder kontaktiere Deinen Administrator", "Missing requirements." => "Fehlende Vorraussetzungen", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stelle sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", "Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", +"Initial encryption started... This can take some time. Please wait." => "Initialverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.", "Saving..." => "Speichern...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Ihr privater Schlüssel ist ungültig! Eventuell wurde Ihr Passwort von außerhalb geändert.", -"You can unlock your private key in your " => "Du kannst den privaten Schlüssel ändern und zwar in deinem", +"Go directly to your " => "Direkt wechseln zu Deinem", "personal settings" => "Private Einstellungen", "Encryption" => "Verschlüsselung", "Enable recovery key (allow to recover users files in case of password loss):" => "Wiederherstellungsschlüssel aktivieren (ermöglicht das Wiederherstellen von Dateien, falls das Passwort vergessen wurde):", "Recovery key password" => "Wiederherstellungsschlüssel-Passwort", +"Repeat Recovery key password" => "Schlüssel-Passwort zur Wiederherstellung wiederholen", "Enabled" => "Aktiviert", "Disabled" => "Deaktiviert", "Change recovery key password:" => "Wiederherstellungsschlüssel-Passwort ändern:", "Old Recovery key password" => "Altes Wiederherstellungsschlüssel-Passwort", "New Recovery key password" => "Neues Wiederherstellungsschlüssel-Passwort", +"Repeat New Recovery key password" => "Neues Schlüssel-Passwort zur Wiederherstellung wiederholen", "Change Password" => "Passwort ändern", -"Your private key password no longer match your log-in password:" => "Ihr Passwort für ihren privaten Schlüssel stimmt nicht mehr mit ihrem Loginpasswort überein.", -"Set your old private key password to your current log-in password." => "Setzen Sie ihr altes Passwort für ihren privaten Schlüssel auf ihr aktuelles Login-Passwort", -" If you don't remember your old password you can ask your administrator to recover your files." => "Wenn Sie Ihr altes Passwort vergessen haben, können Sie den Administrator bitten, Ihre Daten wiederherzustellen.", -"Old log-in password" => "Altes login Passwort", +"Your private key password no longer match your log-in password:" => "Das Passwort für Deinen privaten Schlüssel stimmt nicht mehr mit Deinem Loginpasswort überein.", +"Set your old private key password to your current log-in password." => "Setze Dein altes Passwort für Deinen privaten Schlüssel auf Dein aktuelles Login-Passwort", +" If you don't remember your old password you can ask your administrator to recover your files." => "Wenn Du Dein altes Passwort vergessen hast, könntest Du Deinen Administrator bitten, Deine Daten wiederherzustellen.", +"Old log-in password" => "Altes Login Passwort", "Current log-in password" => "Aktuelles Passwort", "Update Private Key Password" => "Passwort für den privaten Schlüssel aktualisieren", -"Enable password recovery:" => "Passwortwiederherstellung aktivvieren:", -"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Wenn Sie diese Option aktivieren, können Sie Ihre verschlüsselten Dateien wiederherstellen, falls Sie Ihr Passwort vergessen", +"Enable password recovery:" => "Passwortwiederherstellung aktivieren:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Wenn Du diese Option aktivierst, kannst Du Deine verschlüsselten Dateien wiederherstellen, falls Du Dein Passwort vergisst", "File recovery settings updated" => "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert", "Could not update file recovery" => "Dateiwiederherstellung konnte nicht aktualisiert werden" ); diff --git a/apps/files_encryption/l10n/de_CH.php b/apps/files_encryption/l10n/de_CH.php new file mode 100644 index 0000000000..a31e82a666 --- /dev/null +++ b/apps/files_encryption/l10n/de_CH.php @@ -0,0 +1,36 @@ + "Der Wiederherstellungsschlüssel wurde erfolgreich aktiviert.", +"Could not enable recovery key. Please check your recovery key password!" => "Der Wiederherstellungsschlüssel konnte nicht aktiviert werden. Bitte überprüfen Sie das Passwort für den Wiederherstellungsschlüssel!", +"Recovery key successfully disabled" => "Der Wiederherstellungsschlüssel wurde erfolgreich deaktiviert.", +"Could not disable recovery key. Please check your recovery key password!" => "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Bitte überprüfen Sie das Passwort für den Wiederherstellungsschlüssel!", +"Password successfully changed." => "Das Passwort wurde erfolgreich geändert.", +"Could not change the password. Maybe the old password was not correct." => "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.", +"Private key password successfully updated." => "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.", +"Could not update the private key password. Maybe the old password was not correct." => "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.", +"Missing requirements." => "Fehlende Voraussetzungen", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", +"Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", +"Saving..." => "Speichern...", +"personal settings" => "Persönliche Einstellungen", +"Encryption" => "Verschlüsselung", +"Enable recovery key (allow to recover users files in case of password loss):" => "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht).", +"Recovery key password" => "Wiederherstellungschlüsselpasswort", +"Enabled" => "Aktiviert", +"Disabled" => "Deaktiviert", +"Change recovery key password:" => "Wiederherstellungsschlüsselpasswort ändern", +"Old Recovery key password" => "Altes Wiederherstellungsschlüsselpasswort", +"New Recovery key password" => "Neues Wiederherstellungsschlüsselpasswort ", +"Change Password" => "Passwort ändern", +"Your private key password no longer match your log-in password:" => "Das Privatschlüsselpasswort darf nicht länger mit den Login-Passwort übereinstimmen.", +"Set your old private key password to your current log-in password." => "Setzen Sie Ihr altes Privatschlüsselpasswort auf Ihr aktuelles LogIn-Passwort.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Falls Sie sich nicht an Ihr altes Passwort erinnern können, fragen Sie bitte Ihren Administrator, um Ihre Dateien wiederherzustellen.", +"Old log-in password" => "Altes Login-Passwort", +"Current log-in password" => "Momentanes Login-Passwort", +"Update Private Key Password" => "Das Passwort des privaten Schlüssels aktualisieren", +"Enable password recovery:" => "Die Passwort-Wiederherstellung aktivieren:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben.", +"File recovery settings updated" => "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.", +"Could not update file recovery" => "Die Dateiwiederherstellung konnte nicht aktualisiert werden." +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/de_DE.php b/apps/files_encryption/l10n/de_DE.php index 5773c35c0c..6184fd8a89 100644 --- a/apps/files_encryption/l10n/de_DE.php +++ b/apps/files_encryption/l10n/de_DE.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.", "Private key password successfully updated." => "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.", "Could not update the private key password. Maybe the old password was not correct." => "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Ihr privater Schlüssel ist ungültig. Möglicher Weise wurde von außerhalb Ihr Passwort geändert (z.B. in Ihrem gemeinsamen Verzeichnis). Sie können das Passwort Ihres privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Ihre Dateien zu gelangen.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuchen Sie sich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Ihr privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Ihr Passwort geändert (z.B. in Ihrem gemeinsamen Verzeichnis). Sie können das Passwort Ihres privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Ihre Dateien zu gelangen.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte fragen Sie den Datei-Besitzer, dass er die Datei nochmals mit Ihnen teilt.", +"Unknown error please check your system settings or contact your administrator" => "Unbekannter Fehler, bitte prüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Administrator", "Missing requirements." => "Fehlende Voraussetzungen", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", "Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", +"Initial encryption started... This can take some time. Please wait." => "Initialverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.", "Saving..." => "Speichern...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Ihr privater Schlüssel ist ungültig! Vielleicht wurde Ihr Passwort von außerhalb geändert.", -"You can unlock your private key in your " => "Sie können den privaten Schlüssel ändern und zwar in Ihrem", +"Go directly to your " => "Direkt wechseln zu Ihrem", "personal settings" => "Persönliche Einstellungen", "Encryption" => "Verschlüsselung", "Enable recovery key (allow to recover users files in case of password loss):" => "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht).", "Recovery key password" => "Wiederherstellungschlüsselpasswort", +"Repeat Recovery key password" => "Schlüssel-Passwort zur Wiederherstellung wiederholen", "Enabled" => "Aktiviert", "Disabled" => "Deaktiviert", "Change recovery key password:" => "Wiederherstellungsschlüsselpasswort ändern", "Old Recovery key password" => "Altes Wiederherstellungsschlüsselpasswort", "New Recovery key password" => "Neues Wiederherstellungsschlüsselpasswort ", +"Repeat New Recovery key password" => "Neues Schlüssel-Passwort zur Wiederherstellung wiederholen", "Change Password" => "Passwort ändern", "Your private key password no longer match your log-in password:" => "Das Privatschlüsselpasswort darf nicht länger mit den Login-Passwort übereinstimmen.", "Set your old private key password to your current log-in password." => "Setzen Sie Ihr altes Privatschlüsselpasswort auf Ihr aktuelles LogIn-Passwort.", diff --git a/apps/files_encryption/l10n/el.php b/apps/files_encryption/l10n/el.php index 70f778f0a5..6b21122027 100644 --- a/apps/files_encryption/l10n/el.php +++ b/apps/files_encryption/l10n/el.php @@ -1,13 +1,34 @@ "Επιτυχής ενεργοποίηση κλειδιού ανάκτησης", +"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!" => "Αποτυχία απενεργοποίησης κλειδιού ανάκτησης. Παρακαλώ ελέγξτε τον κωδικό του κλειδιού ανάκτησής σας!", "Password successfully changed." => "Ο κωδικός αλλάχτηκε επιτυχώς.", "Could not change the password. Maybe the old password was not correct." => "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.", +"Private key password successfully updated." => "Το Προσωπικό κλειδί πρόσβασης ενημερώθηκε επιτυχώς", +"Could not update the private key password. Maybe the old password was not correct." => "Αποτυχία ενημέρωσης του κωδικού για το προσωπικό κλειδί. Ενδεχομένως ο παλιός κωδικός δεν ήταν σωστός.", +"Unknown error please check your system settings or contact your administrator" => "Άγνωστο σφάλμα, παρακαλώ ελέγξτε τις ρυθμίσεις συστήματος ή επικοινωνήστε με τον διαχειριστή σας ", +"Missing requirements." => "Προαπαιτούμενα που απουσιάζουν.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Παρακαλώ επιβεβαιώστε ότι η PHP 5.3.3 ή νεότερη είναι εγκατεστημένη και ότι το OpenSSL μαζί με το PHP extension είναι ενεργοποιήμένο και έχει ρυθμιστεί σωστά. Προς το παρόν, η εφαρμογή κρυπτογράφησης είναι απενεργοποιημένη.", +"Following users are not set up for encryption:" => "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:", "Saving..." => "Γίνεται αποθήκευση...", +"Go directly to your " => "Πηγαίνε απευθείας στο ", "personal settings" => "προσωπικές ρυθμίσεις", "Encryption" => "Κρυπτογράφηση", +"Recovery key password" => "Επαναφορά κωδικού κλειδιού", "Enabled" => "Ενεργοποιημένο", "Disabled" => "Απενεργοποιημένο", +"New Recovery key password" => "Νέο κλειδί επαναφοράς κωδικού", "Change Password" => "Αλλαγή Κωδικού Πρόσβασης", -"File recovery settings updated" => "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν" +"Your private key password no longer match your log-in password:" => "Ο κωδικός του προσωπικού κλειδιού δεν ταιριάζει πλέον με τον κωδικό σύνδεσής σας:", +" 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" => "Τρέχον συνθηματικό πρόσβασης", +"Update Private Key Password" => "Ενημέρωση Προσωπικού Κλειδού Πρόσβασης", +"Enable password recovery:" => "Ενεργοποιήστε την ανάκτηση κωδικού πρόσβασης", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Η ενεργοποίηση αυτής της επιλογής θα σας επιτρέψει να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία σε περίπτωση απώλειας του κωδικού σας", +"File recovery settings updated" => "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν", +"Could not update file recovery" => "Αποτυχία ενημέρωσης ανάκτησης αρχείων" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/en_GB.php b/apps/files_encryption/l10n/en_GB.php new file mode 100644 index 0000000000..55d56b9533 --- /dev/null +++ b/apps/files_encryption/l10n/en_GB.php @@ -0,0 +1,44 @@ + "Recovery key enabled successfully", +"Could not enable recovery key. Please check your recovery key password!" => "Could not enable recovery key. Please check your recovery key password!", +"Recovery key successfully disabled" => "Recovery key disabled successfully", +"Could not disable recovery key. Please check your recovery key password!" => "Could not disable recovery key. Please check your recovery key password!", +"Password successfully changed." => "Password changed successfully.", +"Could not change the password. Maybe the old password was not correct." => "Could not change the password. Maybe the old password was incorrect.", +"Private key password successfully updated." => "Private key password updated successfully.", +"Could not update the private key password. Maybe the old password was not correct." => "Could not update the private key password. Maybe the old password was not correct.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Encryption app not initialised! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialise the encryption app.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Cannot decrypt this file, which is probably a shared file. Please ask the file owner to reshare the file with you.", +"Unknown error please check your system settings or contact your administrator" => "Unknown error. Please check your system settings or contact your administrator", +"Missing requirements." => "Missing requirements.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.", +"Following users are not set up for encryption:" => "Following users are not set up for encryption:", +"Initial encryption started... This can take some time. Please wait." => "Initial encryption started... This can take some time. Please wait.", +"Saving..." => "Saving...", +"Go directly to your " => "Go directly to your ", +"personal settings" => "personal settings", +"Encryption" => "Encryption", +"Enable recovery key (allow to recover users files in case of password loss):" => "Enable recovery key (allow to recover users files in case of password loss):", +"Recovery key password" => "Recovery key password", +"Repeat Recovery key password" => "Repeat recovery key password", +"Enabled" => "Enabled", +"Disabled" => "Disabled", +"Change recovery key password:" => "Change recovery key password:", +"Old Recovery key password" => "Old recovery key password", +"New Recovery key password" => "New recovery key password", +"Repeat New Recovery key password" => "Repeat new recovery key password", +"Change Password" => "Change Password", +"Your private key password no longer match your log-in password:" => "Your private key password no longer matches your login password:", +"Set your old private key password to your current log-in password." => "Set your old private key password to your current login password.", +" If you don't remember your old password you can ask your administrator to recover your files." => " If you don't remember your old password you can ask your administrator to recover your files.", +"Old log-in password" => "Old login password", +"Current log-in password" => "Current login password", +"Update Private Key Password" => "Update Private Key Password", +"Enable password recovery:" => "Enable password recovery:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss", +"File recovery settings updated" => "File recovery settings updated", +"Could not update file recovery" => "Could not update file recovery" +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/eo.php b/apps/files_encryption/l10n/eo.php index d688125302..e14c7cd7ac 100644 --- a/apps/files_encryption/l10n/eo.php +++ b/apps/files_encryption/l10n/eo.php @@ -3,7 +3,9 @@ $TRANSLATIONS = array( "Password successfully changed." => "La pasvorto sukcese ŝanĝiĝis.", "Could not change the password. Maybe the old password was not correct." => "Ne eblis ŝanĝi la pasvorton. Eble la malnova pasvorto malĝustis.", "Private key password successfully updated." => "La pasvorto de la malpublika klavo sukcese ĝisdatiĝis.", +"Missing requirements." => "Mankas neproj.", "Saving..." => "Konservante...", +"Go directly to your " => "Iri direkte al via", "personal settings" => "persona agordo", "Encryption" => "Ĉifrado", "Enabled" => "Kapabligita", diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php index 8341bafc9f..5345398688 100644 --- a/apps/files_encryption/l10n/es.php +++ b/apps/files_encryption/l10n/es.php @@ -8,20 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.", "Private key password successfully updated." => "Contraseña de clave privada actualizada con éxito.", "Could not update the private key password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Puede que la contraseña antigua no sea correcta.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. Puede actualizar su clave privada en sus opciones personales para recuperar el acceso a sus ficheros.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.", +"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.", +"Unknown error please check your system settings or contact your administrator" => "Error desconocido. Verifique la configuración de su sistema o póngase en contacto con su administrador", "Missing requirements." => "Requisitos incompletos.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", +"Following users are not set up for encryption:" => "Los siguientes usuarios no han sido configurados para el cifrado:", +"Initial encryption started... This can take some time. Please wait." => "Encriptación iniciada..... Esto puede tomar un tiempo. Por favor espere.", "Saving..." => "Guardando...", -"Your private key is not valid! Maybe the your password was changed from outside." => "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera.", -"You can unlock your private key in your " => "Puede desbloquear su clave privada en su", +"Go directly to your " => "Ir directamente a su", "personal settings" => "opciones personales", "Encryption" => "Cifrado", "Enable recovery key (allow to recover users files in case of password loss):" => "Habilitar la clave de recuperación (permite recuperar los ficheros del usuario en caso de pérdida de la contraseña);", "Recovery key password" => "Contraseña de clave de recuperación", +"Repeat Recovery key password" => "Repite la contraseña de clave de recuperación", "Enabled" => "Habilitar", "Disabled" => "Deshabilitado", "Change recovery key password:" => "Cambiar la contraseña de la clave de recuperación", "Old Recovery key password" => "Antigua clave de recuperación", "New Recovery key password" => "Nueva clave de recuperación", +"Repeat New Recovery key password" => "Repetir la nueva clave de recuperación", "Change Password" => "Cambiar contraseña", "Your private key password no longer match your log-in password:" => "Su contraseña de clave privada ya no coincide con su contraseña de acceso:", "Set your old private key password to your current log-in password." => "Establecer la contraseña de su antigua clave privada a su contraseña actual de acceso.", diff --git a/apps/files_encryption/l10n/es_AR.php b/apps/files_encryption/l10n/es_AR.php index cac8c46536..df5bd649d6 100644 --- a/apps/files_encryption/l10n/es_AR.php +++ b/apps/files_encryption/l10n/es_AR.php @@ -8,11 +8,10 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Comprobá que la contraseña actual sea correcta.", "Private key password successfully updated." => "Contraseña de clave privada actualizada con éxito.", "Could not update the private key password. Maybe the old password was not correct." => "No fue posible actualizar la contraseña de clave privada. Tal vez la contraseña anterior no es correcta.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "¡Tu clave privada no es válida! Tal vez tu contraseña fue cambiada desde fuera del sistema de ownCloud (por ej. desde tu cuenta de sistema). Podés actualizar tu clave privada en la sección de \"configuración personal\", para recuperar el acceso a tus archivos.", "Missing requirements." => "Requisitos incompletos.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o una versión más reciente esté instalado y que OpenSSL junto con la extensión PHP esté habilitado y configurado apropiadamente. Por ahora, la aplicación de encriptación ha sido deshabilitada.", +"Following users are not set up for encryption:" => "Los siguientes usuarios no fueron configurados para encriptar:", "Saving..." => "Guardando...", -"Your private key is not valid! Maybe the your password was changed from outside." => "¡Tu clave privada no es válida! Tal vez tu contraseña fue cambiada desde afuera.", -"You can unlock your private key in your " => "Podés desbloquear tu clave privada en tu", "personal settings" => "Configuración personal", "Encryption" => "Encriptación", "Enable recovery key (allow to recover users files in case of password loss):" => "Habilitar clave de recuperación (te permite recuperar los archivos de usuario en el caso que pierdas la contraseña):", diff --git a/apps/files_encryption/l10n/et_EE.php b/apps/files_encryption/l10n/et_EE.php index fd36a6fb9d..9182c5ef19 100644 --- a/apps/files_encryption/l10n/et_EE.php +++ b/apps/files_encryption/l10n/et_EE.php @@ -8,20 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.", "Private key password successfully updated." => "Privaatse võtme parool edukalt uuendatud.", "Could not update the private key password. Maybe the old password was not correct." => "Ei suutnud uuendada privaatse võtme parooli. Võib-olla polnud vana parool õige.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Sinu privaatne võti pole toimiv! Tõenäoliselt on sinu parool muutunud väljaspool ownCloud süsteemi (näiteks ettevõtte keskhaldus). Sa saad uuendada oma privaatse võtme parooli seadete all taastamaks ligipääsu oma krüpteeritud failidele.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Krüpteerimise rakend pole käivitatud. Võib-olla krüpteerimise rakend taaskäivitati sinu sessiooni kestel. Palun proovi logida välja ning uuesti sisse käivitamaks krüpteerimise rakendit.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Sinu provaatne võti pole kehtiv! Tõenäoliselt mudueti parooli väljaspool kausta %s (nt. sinu ettevõtte kaust). Sa saad uuendada oma privaatse võtme parooli oma isiklikes seadetes, et taastada ligipääs sinu krüpteeritud failidele.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Sa ei saa seda faili dekrüpteerida, see on tõenäoliselt jagatud fail. Palun lase omanikul seda faili sinuga uuesti jagada.", +"Unknown error please check your system settings or contact your administrator" => "Tundmatu tõrge. Palun kontrolli süsteemi seadeid või võta ühendust oma süsteemi administraatoriga", "Missing requirements." => "Nõutavad on puudu.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Palun veendu, et on paigaldatud PHP 5.3.3 või uuem ning PHP OpenSSL laiendus on lubatud ning seadistatud korrektselt. Hetkel krüpteerimise rakendus on peatatud.", +"Following users are not set up for encryption:" => "Järgmised kasutajad pole seadistatud krüpteeringuks:", +"Initial encryption started... This can take some time. Please wait." => "Algne krüpteerimine käivitati... See võib võtta natuke aega. Palun oota.", "Saving..." => "Salvestamine...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Sinu privaatne võti ei ole õige. Võib-olla on parool vahetatud süsteemi väliselt.", -"You can unlock your private key in your " => "Saad avada oma privaatse võtme oma", +"Go directly to your " => "Liigu otse oma", "personal settings" => "isiklikes seadetes", "Encryption" => "Krüpteerimine", -"Enable recovery key (allow to recover users files in case of password loss):" => "Luba taastevõti (võimada kasutaja failide taastamine parooli kaotuse puhul):", +"Enable recovery key (allow to recover users files in case of password loss):" => "Luba taastevõti (võimalda kasutaja failide taastamine parooli kaotuse puhul):", "Recovery key password" => "Taastevõtme parool", +"Repeat Recovery key password" => "Korda taastevõtme parooli", "Enabled" => "Sisse lülitatud", "Disabled" => "Väljalülitatud", "Change recovery key password:" => "Muuda taastevõtme parooli:", "Old Recovery key password" => "Vana taastevõtme parool", "New Recovery key password" => "Uus taastevõtme parool", +"Repeat New Recovery key password" => "Korda uut taastevõtme parooli", "Change Password" => "Muuda parooli", "Your private key password no longer match your log-in password:" => "Sinu privaatse võtme parool ei ühti enam sinu sisselogimise parooliga:", "Set your old private key password to your current log-in password." => "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.", diff --git a/apps/files_encryption/l10n/eu.php b/apps/files_encryption/l10n/eu.php index e750c85068..6b1bafdda1 100644 --- a/apps/files_encryption/l10n/eu.php +++ b/apps/files_encryption/l10n/eu.php @@ -8,20 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Ezin izan da pasahitza aldatu. Agian pasahitz zaharra okerrekoa da.", "Private key password successfully updated." => "Gako pasahitz pribatu behar bezala eguneratu da.", "Could not update the private key password. Maybe the old password was not correct." => "Ezin izan da gako pribatu pasahitza eguneratu. Agian pasahitz zaharra okerrekoa da.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Zure gako pribatua ez da egokia! Seguruaski zure pasahitza ownCloud sistematik kanpo aldatu da (adb. zure direktorio korporatiboa). Zure gako pribatuaren pasahitza eguneratu dezakezu zure ezarpen pertsonaletan zure enkriptatutako fitxategiak berreskuratzeko.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Enkriptazio aplikazioa ez dago hasieratuta! Agian aplikazioa birgaitu egin da zure saioa bitartean. Mesdez atear eta sartu berriz enkriptazio aplikazioa hasierarazteko.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Zure gako pribatua ez da egokia! Seguruaski zure pasahitza %s-tik kanpo aldatu da (adb. zure direktorio korporatiboa). Zure gako pribatuaren pasahitza eguneratu dezakezu zure ezarpen pertsonaletan zure enkriptatutako fitxategiak berreskuratzeko.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Ezin izan da fitxategi hau deszifratu, ziurrenik elkarbanatutako fitxategi bat da. Mesdez, eskatu fitxategiaren jabeari fitxategia zurekin berriz elkarbana dezan.", +"Unknown error please check your system settings or contact your administrator" => "Errore ezezaguna mesedez egiaztatu zure sistemaren ezarpenak edo harremanetan jarri zure administradorearekin", "Missing requirements." => "Eskakizun batzuk ez dira betetzen.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Mesedez ziurtatu PHP 5.3.3 edo berriago bat instalatuta dagoela eta OpenSSL PHP hedapenarekin gaitua eta ongi konfiguratuta dagoela. Oraingoz, enkriptazio aplikazioa desgaituta dago.", +"Following users are not set up for encryption:" => "Hurrengo erabiltzaileak ez daude enktriptatzeko konfiguratutak:", +"Initial encryption started... This can take some time. Please wait." => "Hasierako enkriptazioa hasi da... Honek denbora har dezake. Mesedez itxaron.", "Saving..." => "Gordetzen...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Zure gako pribatua ez da egokia! Agian zure pasahitza kanpotik aldatu da.", -"You can unlock your private key in your " => "Zure gako pribatua desblokeatu dezakezu zure", +"Go directly to your " => "Joan zuzenean zure", "personal settings" => "ezarpen pertsonalak", "Encryption" => "Enkriptazioa", "Enable recovery key (allow to recover users files in case of password loss):" => "Gaitu berreskurapen gakoa (erabiltzaileen fitxategiak berreskuratzea ahalbidetzen du pasahitza galtzen badute ere):", "Recovery key password" => "Berreskuratze gako pasahitza", +"Repeat Recovery key password" => "Errepikatu berreskuratze gakoaren pasahitza", "Enabled" => "Gaitua", "Disabled" => "Ez-gaitua", "Change recovery key password:" => "Aldatu berreskuratze gako pasahitza:", "Old Recovery key password" => "Berreskuratze gako pasahitz zaharra", "New Recovery key password" => "Berreskuratze gako pasahitz berria", +"Repeat New Recovery key password" => "Errepikatu berreskuratze gako berriaren pasahitza", "Change Password" => "Aldatu Pasahitza", "Your private key password no longer match your log-in password:" => "Zure gako pribatuaren pasahitza ez da dagoeneko zure sarrera pasahitza:", "Set your old private key password to your current log-in password." => "Ezarri zure gako pribatu zaharraren pasahitza zure oraingo sarrerako psahitzara.", diff --git a/apps/files_encryption/l10n/fa.php b/apps/files_encryption/l10n/fa.php index 461ec2b92c..ed044a4158 100644 --- a/apps/files_encryption/l10n/fa.php +++ b/apps/files_encryption/l10n/fa.php @@ -8,11 +8,8 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "رمزعبور را نمیتواند تغییر دهد. شاید رمزعبورقدیمی صحیح نمی باشد.", "Private key password successfully updated." => "رمزعبور کلید خصوصی با موفقیت به روز شد.", "Could not update the private key password. Maybe the old password was not correct." => "رمزعبور کلید خصوصی را نمی تواند به روز کند. شاید رمزعبور قدیمی صحیح نمی باشد.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "کلید خصوصی شما معتبر نمی باشد! ظاهرا رمزعبور شما بیرون از سیستم ownCloud تغییر یافته است( به عنوان مثال پوشه سازمان شما ). شما میتوانید رمزعبور کلید خصوصی خود را در تنظیمات شخصیتان به روز کنید تا بتوانید به فایل های رمزگذاری شده خود را دسترسی داشته باشید.", "Missing requirements." => "نیازمندی های گمشده", "Saving..." => "در حال ذخیره سازی...", -"Your private key is not valid! Maybe the your password was changed from outside." => "کلید خصوصی شما معتبر نیست! شاید رمزعبوراز بیرون تغییر یافته است.", -"You can unlock your private key in your " => "شما میتوانید کلید خصوصی خود را باز نمایید.", "personal settings" => "تنظیمات شخصی", "Encryption" => "رمزگذاری", "Enable recovery key (allow to recover users files in case of password loss):" => "فعال کردن کلید بازیابی(اجازه بازیابی فایل های کاربران در صورت از دست دادن رمزعبور):", diff --git a/apps/files_encryption/l10n/fi_FI.php b/apps/files_encryption/l10n/fi_FI.php index 53b0a6b25c..b3df41b1f4 100644 --- a/apps/files_encryption/l10n/fi_FI.php +++ b/apps/files_encryption/l10n/fi_FI.php @@ -1,11 +1,21 @@ "Palautusavain kytketty päälle onnistuneesti", "Password successfully changed." => "Salasana vaihdettiin onnistuneesti.", "Could not change the password. Maybe the old password was not correct." => "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.", +"Following users are not set up for encryption:" => "Seuraavat käyttäjät eivät ole määrittäneet salausta:", "Saving..." => "Tallennetaan...", +"personal settings" => "henkilökohtaiset asetukset", "Encryption" => "Salaus", +"Recovery key password" => "Palautusavaimen salasana", "Enabled" => "Käytössä", "Disabled" => "Ei käytössä", -"Change Password" => "Vaihda salasana" +"Change recovery key password:" => "Vaihda palautusavaimen salasana:", +"Old Recovery key password" => "Vanha palautusavaimen salasana", +"New Recovery key password" => "Uusi palautusavaimen salasana", +"Change Password" => "Vaihda salasana", +"Old log-in password" => "Vanha kirjautumis-salasana", +"Current log-in password" => "Nykyinen kirjautumis-salasana", +"Enable password recovery:" => "Ota salasanan palautus käyttöön:" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/fr.php b/apps/files_encryption/l10n/fr.php index 12af810139..dbccbf74dc 100644 --- a/apps/files_encryption/l10n/fr.php +++ b/apps/files_encryption/l10n/fr.php @@ -8,20 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Ne peut pas changer le mot de passe. L'ancien mot de passe est peut-être incorrect.", "Private key password successfully updated." => "Mot de passe de la clé privé mis à jour avec succès.", "Could not update the private key password. Maybe the old password was not correct." => "Impossible de mettre à jour le mot de passe de la clé privé. Peut-être que l'ancien mot de passe n'était pas correcte.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Votre clé de sécurité privée n'est pas valide! Il est probable que votre mot de passe ait été changé sans passer par le système ownCloud (par éxemple: le serveur de votre entreprise). Ain d'avoir à nouveau accès à vos fichiers cryptés, vous pouvez mettre à jour votre clé de sécurité privée dans les paramètres personnels de votre compte.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Votre clef privée est invalide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.", +"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 de ce fichier de le repartager avec vous.", +"Unknown error please check your system settings or contact your administrator" => "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter votre administrateur.", "Missing requirements." => "Système minimum requis non respecté.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Veuillez vous assurer qu'une version de PHP 5.3.3 ou supérieure est installée et qu'OpenSSL et son extension PHP sont activés et configurés correctement. En attendant, l'application de chiffrement été désactivée.", +"Following users are not set up for encryption:" => "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :", +"Initial encryption started... This can take some time. Please wait." => "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.", "Saving..." => "Enregistrement...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Votre clef privée est invalide ! Votre mot de passe a peut-être été modifié depuis l'extérieur.", -"You can unlock your private key in your " => "Vous pouvez déverrouiller votre clé privée dans votre", +"Go directly to your " => "Allez directement à votre", "personal settings" => "paramètres personnel", "Encryption" => "Chiffrement", "Enable recovery key (allow to recover users files in case of password loss):" => "Activer la clef de récupération (permet de récupérer les fichiers des utilisateurs en cas de perte de mot de passe).", "Recovery key password" => "Mot de passe de la clef de récupération", +"Repeat Recovery key password" => "Répétez le mot de passe de la clé de récupération", "Enabled" => "Activer", "Disabled" => "Désactiver", "Change recovery key password:" => "Modifier le mot de passe de la clef de récupération :", "Old Recovery key password" => "Ancien mot de passe de la clef de récupération", "New Recovery key password" => "Nouveau mot de passe de la clef de récupération", +"Repeat New Recovery key password" => "Répétez le nouveau mot de passe de la clé de récupération", "Change Password" => "Changer de mot de passe", "Your private key password no longer match your log-in password:" => "Le mot de passe de votre clef privée ne correspond plus à votre mot de passe de connexion :", "Set your old private key password to your current log-in password." => "Configurez le mot de passe de votre ancienne clef privée avec votre mot de passe courant de connexion. ", diff --git a/apps/files_encryption/l10n/gl.php b/apps/files_encryption/l10n/gl.php index 63f111bd65..7b3c899d1f 100644 --- a/apps/files_encryption/l10n/gl.php +++ b/apps/files_encryption/l10n/gl.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.", "Private key password successfully updated." => "A chave privada foi actualizada correctamente.", "Could not update the private key password. Maybe the old password was not correct." => "Non foi posíbel actualizar o contrasinal da chave privada. É probábel que o contrasinal antigo non sexa correcto.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Non se iniciou o aplicativo de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala que tamén se inicie o aplicativo de cifrado.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pidalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.", +"Unknown error please check your system settings or contact your administrator" => "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou póñase en contacto co administrador", "Missing requirements." => "Non se cumpren os requisitos.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivado o aplicativo de cifrado.", "Following users are not set up for encryption:" => "Os seguintes usuarios non teñen configuración para o cifrado:", +"Initial encryption started... This can take some time. Please wait." => "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.", "Saving..." => "Gardando...", -"Your private key is not valid! Maybe the your password was changed from outside." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior. ", -"You can unlock your private key in your " => "Pode desbloquear a chave privada nos seus", +"Go directly to your " => "Vaia directamente ao seu", "personal settings" => "axustes persoais", "Encryption" => "Cifrado", "Enable recovery key (allow to recover users files in case of password loss):" => "Activar a chave de recuperación (permitirá recuperar os ficheiros dos usuarios no caso de perda do contrasinal):", "Recovery key password" => "Contrasinal da chave de recuperación", +"Repeat Recovery key password" => "Repita o contrasinal da chave da recuperación", "Enabled" => "Activado", "Disabled" => "Desactivado", "Change recovery key password:" => "Cambiar o contrasinal da chave de la recuperación:", "Old Recovery key password" => "Antigo contrasinal da chave de recuperación", "New Recovery key password" => "Novo contrasinal da chave de recuperación", +"Repeat New Recovery key password" => "Repita o novo contrasinal da chave da recuperación", "Change Password" => "Cambiar o contrasinal", "Your private key password no longer match your log-in password:" => "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.", "Set your old private key password to your current log-in password." => "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual", diff --git a/apps/files_encryption/l10n/hu_HU.php b/apps/files_encryption/l10n/hu_HU.php index 49dcf817fb..a8e5a00953 100644 --- a/apps/files_encryption/l10n/hu_HU.php +++ b/apps/files_encryption/l10n/hu_HU.php @@ -1,6 +1,38 @@ "Visszaállítási kulcs sikeresen bekapcsolva", +"Could not enable recovery key. Please check your recovery key password!" => "Visszaállítási kulcsot nem lehetett engedélyezni. Ellenörizd a visszaállítási kulcsod jelszavát!", +"Recovery key successfully disabled" => "Visszaállítási kulcs sikeresen kikapcsolva", +"Could not disable recovery key. Please check your recovery key password!" => "Visszaállítási kulcsot nem lehetett kikapcsolni. Ellenörizd a visszaállítási kulcsod jelszavát!", +"Password successfully changed." => "Jelszó sikeresen megváltoztatva.", +"Could not change the password. Maybe the old password was not correct." => "A jelszót nem lehet megváltoztatni! Lehet, hogy hibás volt a régi jelszó.", +"Private key password successfully updated." => "Privát kulcs jelszava sikeresen frissült.", +"Could not update the private key password. Maybe the old password was not correct." => "A privát kulcs jelszavát nem lehetet frissiteni. Lehet, hogy hibás volt a régi jelszó.", +"Unknown error please check your system settings or contact your administrator" => "Ismeretlen hiba. Ellenörizd a rendszer beállításokat vagy keresd meg az adminisztrátort", +"Missing requirements." => "Hiányzó követelmények.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Kérlek győződj meg arról, hogy PHP 5.3.3 vagy annál frissebb van telepítve, valamint a PHP-hez tartozó OpenSSL bővítmény be van-e kapcsolva és az helyesen van-e konfigurálva! Ki lett kapcsolva ideiglenesen a titkosító alkalmazás.", +"Following users are not set up for encryption:" => "A következő felhasználók nem állították be a titkosítást:", +"Initial encryption started... This can take some time. Please wait." => "Első titkosítás elkezdődött... Ez eltarhat hosszabb ideig. Kérlek várj.", "Saving..." => "Mentés...", -"Encryption" => "Titkosítás" +"Go directly to your " => "Rövid úton a dolgaidhoz", +"personal settings" => "személyes beállítások", +"Encryption" => "Titkosítás", +"Recovery key password" => "A helyreállítási kulcs jelszava", +"Repeat Recovery key password" => "Ismételd a Helyreállítási kulcs jelszavát", +"Enabled" => "Bekapcsolva", +"Disabled" => "Kikapcsolva", +"Change recovery key password:" => "A helyreállítási kulcs jelszavának módosítása:", +"Old Recovery key password" => "Régi Helyreállítási Kulcs Jelszava", +"New Recovery key password" => "Új Helyreállítási kulcs jelszava", +"Repeat New Recovery key password" => "Ismételd az Új Helyreállítási kulcs jelszavát", +"Change Password" => "Jelszó megváltoztatása", +"Your private key password no longer match your log-in password:" => "A privát kulcs jelszavad mostantól nem azonos a belépési jelszavaddal:", +"Set your old private key password to your current log-in password." => "Állítsd vissza a régi privát kulcs jelszavát a jelenlegi bejelentkezési jelszavadra.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Ha nem emlékszel a régi jelszavadra akkor keresed meg a rendszeradminisztátort a file-jaid visszaállításával kapcsolatban.", +"Old log-in password" => "Régi bejelentkezési jelszó", +"Current log-in password" => "Jelenlegi bejelentkezési jelszó", +"Update Private Key Password" => "Privát kulcs jelszó frissítése", +"Enable password recovery:" => "Jelszó-visszaállítás bekapcsolása", +"File recovery settings updated" => "File helyreállítási beállításai frissültek" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/it.php b/apps/files_encryption/l10n/it.php index 09a562a64b..fc1aaffc02 100644 --- a/apps/files_encryption/l10n/it.php +++ b/apps/files_encryption/l10n/it.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Impossibile cambiare la password. Forse la vecchia password non era corretta.", "Private key password successfully updated." => "Password della chiave privata aggiornata correttamente.", "Could not update the private key password. Maybe the old password was not correct." => "Impossibile aggiornare la password della chiave privata. Forse la vecchia password non era corretta.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "La chiave privata non è valida! Forse la password è stata cambiata esternamente al sistema di ownCloud (ad es. la directory aziendale). Puoi aggiornare la password della chiave privata nelle impostazioni personali per ottenere nuovamente l'accesso ai file.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Applicazione di cifratura non inizializzata. Forse l'applicazione è stata riabilitata durante la tua sessione. Prova a disconnetterti e ad effettuare nuovamente l'accesso per inizializzarla.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "La tua chiave privata non è valida! Forse la password è stata cambiata al di fuori di %s (ad es. la directory aziendale). Puoi aggiornare la password della chiave privata nelle impostazioni personali per ottenere nuovamente l'accesso ai file cifrati.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Impossibile decifrare questo file, probabilmente è un file condiviso. Chiedi al proprietario del file di condividere nuovamente il file con te.", +"Unknown error please check your system settings or contact your administrator" => "Errore sconosciuto, controlla le impostazioni di sistema o contatta il tuo amministratore", "Missing requirements." => "Requisiti mancanti.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Assicurati che sia installato PHP 5.3.3 o versioni successive e che l'estensione OpenSSL di PHP sia abilitata e configurata correttamente. Per ora, l'applicazione di cifratura è disabilitata.", "Following users are not set up for encryption:" => "I seguenti utenti non sono configurati per la cifratura:", +"Initial encryption started... This can take some time. Please wait." => "Cifratura iniziale avviata... Potrebbe richiedere del tempo. Attendi.", "Saving..." => "Salvataggio in corso...", -"Your private key is not valid! Maybe the your password was changed from outside." => "La tua chiave privata non è valida! Forse è stata modifica dall'esterno.", -"You can unlock your private key in your " => "Puoi sbloccare la chiave privata nelle tue", +"Go directly to your " => "Passa direttamente a", "personal settings" => "impostazioni personali", "Encryption" => "Cifratura", "Enable recovery key (allow to recover users files in case of password loss):" => "Abilita la chiave di recupero (permette di recuperare i file utenti in caso di perdita della password):", "Recovery key password" => "Password della chiave di recupero", +"Repeat Recovery key password" => "Ripeti la password della chiave di recupero", "Enabled" => "Abilitata", "Disabled" => "Disabilitata", "Change recovery key password:" => "Cambia la password della chiave di recupero:", "Old Recovery key password" => "Vecchia password della chiave di recupero", "New Recovery key password" => "Nuova password della chiave di recupero", +"Repeat New Recovery key password" => "Ripeti la nuova password della chiave di recupero", "Change Password" => "Modifica password", "Your private key password no longer match your log-in password:" => "La password della chiave privata non corrisponde più alla password di accesso:", "Set your old private key password to your current log-in password." => "Imposta la vecchia password della chiave privata sull'attuale password di accesso.", diff --git a/apps/files_encryption/l10n/ja_JP.php b/apps/files_encryption/l10n/ja_JP.php index 4490fcddfc..1206969746 100644 --- a/apps/files_encryption/l10n/ja_JP.php +++ b/apps/files_encryption/l10n/ja_JP.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。", "Private key password successfully updated." => "秘密鍵のパスワードが正常に更新されました。", "Could not update the private key password. Maybe the old password was not correct." => "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "秘密鍵が有効ではありません。パスワードがownCloudシステムの外部(例えば、企業ディレクトリ)から変更された恐れがあります。個人設定で秘密鍵のパスワードを更新して、暗号化されたファイルを回復出来ます。", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "暗号化アプリが初期化されていません。暗号化アプリが接続中に再度有効かされた可能性があります。暗号化アプリを初期化する為に、1回ログアウトしてログインしなおしてください。", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。", +"Unknown error please check your system settings or contact your administrator" => "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。", "Missing requirements." => "必要要件が満たされていません。", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。", "Following users are not set up for encryption:" => "以下のユーザーは、暗号化設定がされていません:", +"Initial encryption started... This can take some time. Please wait." => "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。今しばらくお待ちください。", "Saving..." => "保存中...", -"Your private key is not valid! Maybe the your password was changed from outside." => "秘密鍵が有効ではありません。パスワードが外部から変更された恐れがあります。", -"You can unlock your private key in your " => "個人設定で", +"Go directly to your " => "あなたのディレクトリへ", "personal settings" => "秘密鍵をアンロックできます", "Encryption" => "暗号化", "Enable recovery key (allow to recover users files in case of password loss):" => "復旧キーを有効化 (万一パスワードを亡くした場合もユーザーのファイルを回復できる):", "Recovery key password" => "復旧キーのパスワード", +"Repeat Recovery key password" => "復旧キーのパスワードをもう一度入力", "Enabled" => "有効", "Disabled" => "無効", "Change recovery key password:" => "復旧キーのパスワードを変更:", "Old Recovery key password" => "古い復旧キーのパスワード", "New Recovery key password" => "新しい復旧キーのパスワード", +"Repeat New Recovery key password" => "新しい復旧キーのパスワードをもう一度入力", "Change Password" => "パスワードを変更", "Your private key password no longer match your log-in password:" => "もはや秘密鍵はログインパスワードと一致しません:", "Set your old private key password to your current log-in password." => "古い秘密鍵のパスワードを現在のログインパスワードに設定する。", diff --git a/apps/files_encryption/l10n/ko.php b/apps/files_encryption/l10n/ko.php index cfe9f99fa1..cf06136c9b 100644 --- a/apps/files_encryption/l10n/ko.php +++ b/apps/files_encryption/l10n/ko.php @@ -1,5 +1,9 @@ "복구키가 성공적으로 활성화 되었습니다", +"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!" => "복구키를 비활성화 할수 없습니다. 복구키의 비밀번호를 확인해주세요!", "Password successfully changed." => "암호가 성공적으로 변경되었습니다", "Could not change the password. Maybe the old password was not correct." => "암호를 변경할수 없습니다. 아마도 예전 암호가 정확하지 않은것 같습니다.", "Private key password successfully updated." => "개인키 암호가 성공적으로 업데이트 됨.", @@ -7,6 +11,8 @@ $TRANSLATIONS = array( "personal settings" => "개인 설정", "Encryption" => "암호화", "Recovery key password" => "키 비밀번호 복구", +"Enabled" => "활성화", +"Disabled" => "비활성화", "Change recovery key password:" => "복구 키 비밀번호 변경", "Old Recovery key password" => "예전 복구 키 비밀번호", "New Recovery key password" => "새 복구 키 비밀번호", diff --git a/apps/files_encryption/l10n/lt_LT.php b/apps/files_encryption/l10n/lt_LT.php index 9fbf7b2960..993e03388d 100644 --- a/apps/files_encryption/l10n/lt_LT.php +++ b/apps/files_encryption/l10n/lt_LT.php @@ -6,12 +6,37 @@ $TRANSLATIONS = array( "Could not disable recovery key. Please check your recovery key password!" => "Neišėjo išjungti jūsų atkūrimo rakto. Prašome jį patikrinti!", "Password successfully changed." => "Slaptažodis sėkmingai pakeistas", "Could not change the password. Maybe the old password was not correct." => "Slaptažodis nebuvo pakeistas. Gali būti, kad buvo neteisingai suvestas senasis.", +"Private key password successfully updated." => "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.", +"Could not update the private key password. Maybe the old password was not correct." => "Nepavyko atnaujinti privataus rakto slaptažodžio. Gali būti, kad buvo neteisingai suvestas senasis.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Šifravimo programa nepaleista! Galbūt šifravimo programa buvo įjungta dar kartą Jūsų sesijos metu. Prašome atsijungti ir vėl prisijungti, kad paleisti šifravimo programą.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Failo iššifruoti nepavyko, gali būti jog jis yra pasidalintas su jumis. Paprašykite failo savininko, kad jums iš naujo pateiktų šį failą.", +"Unknown error please check your system settings or contact your administrator" => "Neatpažinta klaida, patikrinkite sistemos nustatymus arba kreipkitės į savo sistemos aministratorių", +"Missing requirements." => "Trūkstami laukai.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Prašome įsitikinti, kad PHP 5.3.3 ar naujesnė yra įdiegta ir kad OpenSSL kartu su PHP plėtiniu yra šjungti ir teisingai sukonfigūruoti. Kol kas šifravimo programa bus išjungta.", +"Following users are not set up for encryption:" => "Sekantys naudotojai nenustatyti šifravimui:", "Saving..." => "Saugoma...", +"Go directly to your " => "Eiti tiesiai į Jūsų", +"personal settings" => "asmeniniai nustatymai", "Encryption" => "Šifravimas", +"Enable recovery key (allow to recover users files in case of password loss):" => "Įjunkite atkūrimo raktą, (leisti atkurti naudotojų failus praradus slaptažodį):", +"Recovery key password" => "Atkūrimo rakto slaptažodis", +"Repeat Recovery key password" => "Pakartokite atkūrimo rakto slaptažodį", "Enabled" => "Įjungta", "Disabled" => "Išjungta", +"Change recovery key password:" => "Pakeisti atkūrimo rakto slaptažodį:", +"Old Recovery key password" => "Senas atkūrimo rakto slaptažodis", +"New Recovery key password" => "Naujas atkūrimo rakto slaptažodis", +"Repeat New Recovery key password" => "Pakartokite naują atkūrimo rakto slaptažodį", "Change Password" => "Pakeisti slaptažodį", -"File recovery settings updated" => "Failų atstatymo nustatymai pakeisti", +"Your private key password no longer match your log-in password:" => "Privatus rakto slaptažodis daugiau neatitinka Jūsų prisijungimo slaptažodžio:", +"Set your old private key password to your current log-in password." => "Nustatyti Jūsų privataus rakto slaptažodį į Jūsų dabartinį prisijungimo.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Jei nepamenate savo seno slaptažodžio, galite paprašyti administratoriaus atkurti Jūsų failus.", +"Old log-in password" => "Senas prisijungimo slaptažodis", +"Current log-in password" => "Dabartinis prisijungimo slaptažodis", +"Update Private Key Password" => "Atnaujinti privataus rakto slaptažodį", +"Enable password recovery:" => "Įjungti slaptažodžio atkūrimą:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Įjungus šią funkciją jums bus suteiktas pakartotinis priėjimas prie Jūsų šifruotų failų pamiršus slaptažodį.", +"File recovery settings updated" => "Failų atkūrimo nustatymai pakeisti", "Could not update file recovery" => "Neišėjo atnaujinti failų atkūrimo" ); $PLURAL_FORMS = "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_encryption/l10n/mk.php b/apps/files_encryption/l10n/mk.php index fd8dd4e51c..098f4d635b 100644 --- a/apps/files_encryption/l10n/mk.php +++ b/apps/files_encryption/l10n/mk.php @@ -1,6 +1,20 @@ "Лозинката е успешно променета.", +"Could not change the password. Maybe the old password was not correct." => "Лозинката не можеше да се промени. Можеби старата лозинка не беше исправна.", +"Missing requirements." => "Барања кои недостасуваат.", "Saving..." => "Снимам...", -"Encryption" => "Енкрипција" +"Go directly to your " => "Одете директно на вашиот", +"personal settings" => "лични подесувања", +"Encryption" => "Енкрипција", +"Repeat Recovery key password" => "Повтори ја лозинката за клучот на обновување", +"Enabled" => "Овозможен", +"Disabled" => "Оневозможен", +"Old Recovery key password" => "Старата лозинка за клучот на обновување ", +"Repeat New Recovery key password" => "Повтори ја лозинката за клучот на обновувањето", +"Change Password" => "Смени лозинка", +"Old log-in password" => "Старата лозинка за најавување", +"Current log-in password" => "Тековната лозинка за најавување", +"Enable password recovery:" => "Овозможи го обновувањето на лозинката:" ); $PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"; diff --git a/apps/files_encryption/l10n/nl.php b/apps/files_encryption/l10n/nl.php index 8a94b806ac..081e46a785 100644 --- a/apps/files_encryption/l10n/nl.php +++ b/apps/files_encryption/l10n/nl.php @@ -8,20 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.", "Private key password successfully updated." => "Privésleutel succesvol bijgewerkt.", "Could not update the private key password. Maybe the old password was not correct." => "Kon het wachtwoord van de privésleutel niet wijzigen. Misschien was het oude wachtwoord onjuist.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Uw privésleutel is niet geldig! Misschien was uw wachtwoord van buitenaf gewijzigd. U kunt het wachtwoord van uw privésleutel aanpassen in uw persoonlijke instellingen om toegang tot uw versleutelde bestanden te vergaren.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Uw privésleutel is niet geldig! Waarschijnlijk is uw wachtwoord gewijzigd buiten %s (bijv. uw corporate directory). U kunt uw privésleutel wachtwoord in uw persoonlijke instellingen bijwerken om toegang te krijgen tot uw versleutelde bestanden.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.", +"Unknown error please check your system settings or contact your administrator" => "Onbekende fout, Controleer uw systeeminstellingen of neem contact op met uw systeembeheerder", "Missing requirements." => "Missende benodigdheden.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Wees er zeker van dat PHP5.3.3 of nieuwer is geïstalleerd en dat de OpenSSL PHP extensie is ingeschakeld en correct geconfigureerd. De versleutel-app is voorlopig uitgeschakeld.", +"Following users are not set up for encryption:" => "De volgende gebruikers hebben geen configuratie voor encryptie:", +"Initial encryption started... This can take some time. Please wait." => "initiële versleuteling gestart... Dit kan even duren, geduld a.u.b.", "Saving..." => "Opslaan", -"Your private key is not valid! Maybe the your password was changed from outside." => "Uw privésleutel is niet geldig. Misschien was uw wachtwoord van buitenaf gewijzigd.", -"You can unlock your private key in your " => "U kunt uw privésleutel deblokkeren in uw", +"Go directly to your " => "Ga meteen naar uw", "personal settings" => "persoonlijke instellingen", "Encryption" => "Versleuteling", "Enable recovery key (allow to recover users files in case of password loss):" => "Activeren herstelsleutel (maakt het mogelijk om gebruikersbestanden terug te halen in geval van verlies van het wachtwoord):", "Recovery key password" => "Wachtwoord herstelsleulel", +"Repeat Recovery key password" => "Herhaal het herstelsleutel wachtwoord", "Enabled" => "Geactiveerd", "Disabled" => "Gedeactiveerd", "Change recovery key password:" => "Wijzig wachtwoord herstelsleutel:", "Old Recovery key password" => "Oude wachtwoord herstelsleutel", "New Recovery key password" => "Nieuwe wachtwoord herstelsleutel", +"Repeat New Recovery key password" => "Herhaal het nieuwe herstelsleutel wachtwoord", "Change Password" => "Wijzigen wachtwoord", "Your private key password no longer match your log-in password:" => "Het wachtwoord van uw privésleutel komt niet meer overeen met uw inlogwachtwoord:", "Set your old private key password to your current log-in password." => "Stel het wachtwoord van uw oude privésleutel in op uw huidige inlogwachtwoord.", diff --git a/apps/files_encryption/l10n/nn_NO.php b/apps/files_encryption/l10n/nn_NO.php index b99d075154..bb30d69c59 100644 --- a/apps/files_encryption/l10n/nn_NO.php +++ b/apps/files_encryption/l10n/nn_NO.php @@ -1,5 +1,6 @@ "Lagrar …" +"Saving..." => "Lagrar …", +"Encryption" => "Kryptering" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/pa.php b/apps/files_encryption/l10n/pa.php new file mode 100644 index 0000000000..5867099040 --- /dev/null +++ b/apps/files_encryption/l10n/pa.php @@ -0,0 +1,5 @@ + "...ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ" +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/pl.php b/apps/files_encryption/l10n/pl.php index 66c06c6088..b768bd46f8 100644 --- a/apps/files_encryption/l10n/pl.php +++ b/apps/files_encryption/l10n/pl.php @@ -8,18 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Nie można zmienić hasła. Może stare hasło nie było poprawne.", "Private key password successfully updated." => "Pomyślnie zaktualizowano hasło klucza prywatnego.", "Could not update the private key password. Maybe the old password was not correct." => "Nie można zmienić prywatnego hasła. Może stare hasło nie było poprawne.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Szyfrowanie aplikacja nie została zainicjowane! Może szyfrowanie aplikacji zostało ponownie włączone podczas tej sesji. Spróbuj się wylogować i zalogować ponownie aby zainicjować szyfrowanie aplikacji.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Klucz prywatny nie jest poprawny! Prawdopodobnie Twoje hasło zostało zmienione poza %s (np. w katalogu firmy). Aby odzyskać dostęp do zaszyfrowanych plików można zaktualizować hasło klucza prywatnego w ustawieniach osobistych.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.", +"Unknown error please check your system settings or contact your administrator" => "Nieznany błąd proszę sprawdzić ustawienia systemu lub skontaktuj się z administratorem", +"Missing requirements." => "Brak wymagań.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Proszę upewnić się, że PHP 5.3.3 lub nowszy jest zainstalowany i że OpenSSL oraz rozszerzenie PHP jest włączone i poprawnie skonfigurowane. Obecnie szyfrowanie aplikacji zostało wyłączone.", +"Following users are not set up for encryption:" => "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:", +"Initial encryption started... This can take some time. Please wait." => "Rozpoczęto szyfrowanie... To może chwilę potrwać. Proszę czekać.", "Saving..." => "Zapisywanie...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Klucz prywatny nie jest poprawny! Może Twoje hasło zostało zmienione z zewnątrz.", -"You can unlock your private key in your " => "Możesz odblokować swój klucz prywatny w swojej", +"Go directly to your " => "Przejdź bezpośrednio do", "personal settings" => "Ustawienia osobiste", "Encryption" => "Szyfrowanie", "Enable recovery key (allow to recover users files in case of password loss):" => "Włączhasło klucza odzyskiwania (pozwala odzyskać pliki użytkowników w przypadku utraty hasła):", "Recovery key password" => "Hasło klucza odzyskiwania", +"Repeat Recovery key password" => "Powtórz hasło klucza odzyskiwania", "Enabled" => "Włączone", "Disabled" => "Wyłączone", "Change recovery key password:" => "Zmień hasło klucza odzyskiwania", "Old Recovery key password" => "Stare hasło klucza odzyskiwania", "New Recovery key password" => "Nowe hasło klucza odzyskiwania", +"Repeat New Recovery key password" => "Powtórz nowe hasło klucza odzyskiwania", "Change Password" => "Zmień hasło", "Your private key password no longer match your log-in password:" => "Hasło klucza prywatnego nie pasuje do hasła logowania:", "Set your old private key password to your current log-in password." => "Podaj swoje stare prywatne hasło aby ustawić nowe", diff --git a/apps/files_encryption/l10n/pt_BR.php b/apps/files_encryption/l10n/pt_BR.php index 9e8122b9ce..2fce7fd13a 100644 --- a/apps/files_encryption/l10n/pt_BR.php +++ b/apps/files_encryption/l10n/pt_BR.php @@ -8,21 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.", "Private key password successfully updated." => "Senha de chave privada atualizada com sucesso.", "Could not update the private key password. Maybe the old password was not correct." => "Não foi possível atualizar a senha de chave privada. Talvez a senha antiga esteja incorreta.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Sua chave privada não é válida! Provavelmente sua senha foi alterada fora do sistema ownCloud (por exemplo, seu diretório corporativo). Você pode atualizar sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Aplicativo de criptografia não foi inicializado! Talvez o aplicativo de criptografia tenha sido reativado durante essa sessão. Por favor, tente fazer logoff e login novamente para inicializar o aplicativo de criptografia.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Sua chave privada não é válida! Provavelmente sua senha foi alterada fora de %s (por exemplo, seu diretório corporativo). Você pode atualizar sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Poe favoe peça ao dono do arquivo para compartilha-lo com você.", +"Unknown error please check your system settings or contact your administrator" => "Erro desconhecido, por favor verifique suas configurações ou faça contato com o administrador", "Missing requirements." => "Requisitos não encontrados.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, certifique-se que o PHP 5.3.3 ou mais recente está instalado e que a extensão PHP OpenSSL está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.", "Following users are not set up for encryption:" => "Seguintes usuários não estão configurados para criptografia:", +"Initial encryption started... This can take some time. Please wait." => "Criptografia inicial inicializada... Isto pode tomar algum tempo. Por favor espere.", "Saving..." => "Salvando...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Sua chave privada não é válida! Talvez sua senha tenha sido mudada.", -"You can unlock your private key in your " => "Você pode desbloquear sua chave privada nas suas", +"Go directly to your " => "Ir diretamente para o seu", "personal settings" => "configurações pessoais.", "Encryption" => "Criptografia", "Enable recovery key (allow to recover users files in case of password loss):" => "Habilitar chave de recuperação (permite recuperar arquivos de usuários em caso de perda de senha):", "Recovery key password" => "Senha da chave de recuperação", +"Repeat Recovery key password" => "Repita Recuperação de senha da chave", "Enabled" => "Habilitado", "Disabled" => "Desabilitado", "Change recovery key password:" => "Mudar a senha da chave de recuperação:", "Old Recovery key password" => "Senha antiga da chave de recuperação", "New Recovery key password" => "Nova senha da chave de recuperação", +"Repeat New Recovery key password" => "Repita Nova senha da chave de recuperação", "Change Password" => "Trocar Senha", "Your private key password no longer match your log-in password:" => "Sua senha de chave privada não coincide mais com sua senha de login:", "Set your old private key password to your current log-in password." => "Configure sua antiga senha de chave privada para sua atual senha de login.", diff --git a/apps/files_encryption/l10n/pt_PT.php b/apps/files_encryption/l10n/pt_PT.php index 53335ab729..77424005c3 100644 --- a/apps/files_encryption/l10n/pt_PT.php +++ b/apps/files_encryption/l10n/pt_PT.php @@ -7,8 +7,8 @@ $TRANSLATIONS = array( "Password successfully changed." => "Password alterada com sucesso.", "Could not change the password. Maybe the old password was not correct." => "Não foi possivel alterar a password. Possivelmente a password antiga não está correcta.", "Could not update the private key password. Maybe the old password was not correct." => "Não foi possível alterar a chave. Possivelmente a password antiga não está correcta.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Chave privada não é válida! Provavelmente senha foi alterada fora do sistema ownCloud (exemplo, o diretório corporativo). Pode atualizar password da chave privada em configurações personalizadas para recuperar o acesso aos seus arquivos encriptados.", "Missing requirements." => "Faltam alguns requisitos.", +"Following users are not set up for encryption:" => "Os utilizadores seguintes não estão marcados para cifragem:", "Saving..." => "A guardar...", "personal settings" => "configurações personalizadas ", "Encryption" => "Encriptação", diff --git a/apps/files_encryption/l10n/ru.php b/apps/files_encryption/l10n/ru.php index 76fd8c5ba5..e9744b3db4 100644 --- a/apps/files_encryption/l10n/ru.php +++ b/apps/files_encryption/l10n/ru.php @@ -8,20 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Невозможно изменить пароль. Возможно старый пароль не был верен.", "Private key password successfully updated." => "Пароль секретного ключа успешно обновлён.", "Could not update the private key password. Maybe the old password was not correct." => "Невозможно обновить пароль от секретного ключа. Возможно, старый пароль указан неверно.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Ваш секретный ключ не действителен! Вероятно, ваш пароль был изменен вне системы OwnCloud (например, корпоративный каталог). Вы можете обновить секретный ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Приложение шифрации не инициализированно! Возможно приложение шифрации было реактивировано во время вашей сессии. Пожалуйста, попробуйте выйти и войти снова чтобы проинициализировать приложение шифрации.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Ваш секретный ключ не действителен! Вероятно, ваш пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить секретный ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Не могу расшифровать файл, возможно это опубликованный файл. Пожалуйста, попросите владельца файла поделиться им с вами еще раз.", +"Unknown error please check your system settings or contact your administrator" => "Неизвестная ошибка, пожалуйста, проверьте системные настройки или свяжитесь с администратором", "Missing requirements." => "Требования отсутствуют.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Пожалуйста, убедитесь, что версия PHP 5.3.3 или новее, а также, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования отключено.", +"Following users are not set up for encryption:" => "Для следующих пользователей шифрование не настроено:", +"Initial encryption started... This can take some time. Please wait." => "Начато начальное шифрование... Это может занять какое-то время. Пожалуйста, подождите.", "Saving..." => "Сохранение...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Секретный ключ недействителен! Возможно, Ваш пароль был изменён в другой программе.", -"You can unlock your private key in your " => "Вы можете разблокировать закрытый ключ в своём ", +"Go directly to your " => "Перейти прямо в", "personal settings" => "персональные настройки", "Encryption" => "Шифрование", "Enable recovery key (allow to recover users files in case of password loss):" => "Включить ключ восстановления (позволяет пользователям восстановить файлы при потере пароля):", "Recovery key password" => "Пароль для ключа восстановления", +"Repeat Recovery key password" => "Повторите пароль восстановления ключа", "Enabled" => "Включено", "Disabled" => "Отключено", "Change recovery key password:" => "Сменить пароль для ключа восстановления:", "Old Recovery key password" => "Старый пароль для ключа восстановления", "New Recovery key password" => "Новый пароль для ключа восстановления", +"Repeat New Recovery key password" => "Повторите новый пароль восстановления ключа", "Change Password" => "Изменить пароль", "Your private key password no longer match your log-in password:" => "Пароль от секретного ключа больше не соответствует паролю входа:", "Set your old private key password to your current log-in password." => "Замените старый пароль от секретного ключа на новый пароль входа.", diff --git a/apps/files_encryption/l10n/sk_SK.php b/apps/files_encryption/l10n/sk_SK.php index a723d80773..9e2c01eba3 100644 --- a/apps/files_encryption/l10n/sk_SK.php +++ b/apps/files_encryption/l10n/sk_SK.php @@ -8,12 +8,27 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "Nemožno zmeniť heslo. Pravdepodobne nebolo staré heslo zadané správne.", "Private key password successfully updated." => "Heslo súkromného kľúča je úspešne aktualizované.", "Could not update the private key password. Maybe the old password was not correct." => "Nemožno aktualizovať heslo súkromného kľúča. Možno nebolo staré heslo správne.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Šifrovacia aplikácia nie je inicializovaná. Je možné, že aplikácia bola znova aktivovaná počas vášho prihlasovania. Pokúste sa odhlásiť a znova prihlásiť pre inicializáciu šifrovania.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Váš súkromný kľúč nie je platný! Možno bolo vaše heslo zmenené mimo %s (napr. firemný priečinok). Môžete si aktualizovať heslo svojho ​​súkromného kľúča vo vašom osobnom nastavení, ak si chcete obnoviť prístup k šifrovaným súborom.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Tento súbor sa nepodarilo dešifrovať, pravdepodobne je zdieľaný. Požiadajte majiteľa súboru, aby ho s vami znovu vyzdieľal.", +"Unknown error please check your system settings or contact your administrator" => "Neznáma chyba, skontrolujte si vaše systémové nastavenia alebo kontaktujte administrátora", +"Missing requirements." => "Chýbajúce požiadavky.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Prosím uistite sa, že PHP verzie 5.3.3 alebo novšej je nainštalované a tiež, že OpenSSL knižnica spolu z PHP rozšírením je povolená a konfigurovaná správne. Nateraz bola aplikácia šifrovania zablokovaná.", +"Following users are not set up for encryption:" => "Nasledujúci používatelia nie sú nastavení pre šifrovanie:", +"Initial encryption started... This can take some time. Please wait." => "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.", "Saving..." => "Ukladám...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Váš súkromný kľúč je neplatný. Možno bolo Vaše heslo zmenené z vonku.", +"Go directly to your " => "Choďte priamo do vášho", "personal settings" => "osobné nastavenia", "Encryption" => "Šifrovanie", +"Enable recovery key (allow to recover users files in case of password loss):" => "Povoliť obnovovací kľúč (umožňuje obnoviť používateľské súbory v prípade straty hesla):", +"Recovery key password" => "Heslo obnovovacieho kľúča", +"Repeat Recovery key password" => "Zopakujte heslo kľúča pre obnovu", "Enabled" => "Povolené", "Disabled" => "Zakázané", +"Change recovery key password:" => "Zmeniť heslo obnovovacieho kľúča:", +"Old Recovery key password" => "Staré heslo obnovovacieho kľúča", +"New Recovery key password" => "Nové heslo obnovovacieho kľúča", +"Repeat New Recovery key password" => "Zopakujte nové heslo kľúča pre obnovu", "Change Password" => "Zmeniť heslo", "Your private key password no longer match your log-in password:" => "Vaše heslo súkromného kľúča je rovnaké ako Vaše prihlasovacie heslo:", "Set your old private key password to your current log-in password." => "Nastavte si staré heslo súkromného kľúča k Vášmu súčasnému prihlasovaciemu heslu.", diff --git a/apps/files_encryption/l10n/sl.php b/apps/files_encryption/l10n/sl.php index e5a0cf269b..60faf34cf8 100644 --- a/apps/files_encryption/l10n/sl.php +++ b/apps/files_encryption/l10n/sl.php @@ -1,37 +1,44 @@ "Ključ za obnovitev gesla je bil uspešno nastavljen", -"Could not enable recovery key. Please check your recovery key password!" => "Ključa za obnovitev gesla ni bilo mogoče nastaviti. Preverite ključ!", -"Recovery key successfully disabled" => "Ključ za obnovitev gesla je bil uspešno onemogočen", -"Could not disable recovery key. Please check your recovery key password!" => "Ključa za obnovitev gesla ni bilo mogoče onemogočiti. Preverite ključ!", -"Password successfully changed." => "Geslo je bilo uspešno spremenjeno.", -"Could not change the password. Maybe the old password was not correct." => "Gesla ni bilo mogoče spremeniti. Morda vnos starega gesla ni bil pravilen.", -"Private key password successfully updated." => "Zasebni ključ za geslo je bil uspešno posodobljen.", -"Could not update the private key password. Maybe the old password was not correct." => "Zasebnega ključa za geslo ni bilo mogoče posodobiti. Morda vnos starega gesla ni bil pravilen.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Vaš zasebni ključ ni veljaven. Morda je bilo vaše geslo spremenjeno zunaj sistema ownCloud (npr. v skupnem imeniku). Svoj zasebni ključ, ki vam bo omogočil dostop do šifriranih dokumentov, lahko posodobite v osebnih nastavitvah.", +"Recovery key successfully enabled" => "Ključ za obnovitev gesla je uspešno nastavljen", +"Could not enable recovery key. Please check your recovery key password!" => "Ključa za obnovitev gesla ni mogoče nastaviti. Preverite ključ!", +"Recovery key successfully disabled" => "Ključ za obnovitev gesla je uspešno onemogočen", +"Could not disable recovery key. Please check your recovery key password!" => "Ključa za obnovitev gesla ni mogoče onemogočiti. Preverite ključ!", +"Password successfully changed." => "Geslo je uspešno spremenjeno.", +"Could not change the password. Maybe the old password was not correct." => "Gesla ni mogoče spremeniti. Morda vnos starega gesla ni pravilen.", +"Private key password successfully updated." => "Zasebni ključ za geslo je uspešno posodobljen.", +"Could not update the private key password. Maybe the old password was not correct." => "Zasebnega ključa za geslo ni mogoče posodobiti. Morda vnos starega gesla ni bil pravilen.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Program za šifriranje ni začet. Morda je bil program ponovno omogočen šele med zagonom trenutne seje. Odjavite se in se nato prijavite nazaj. S tem morda razrešite napako.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Zasebni ključ ni veljaven. Najverjetneje je bilo geslo spremenjeno izven %s (najverjetneje je to poslovna mapa). Geslo lahko posodobite med osebnimi nastavitvami in s tem obnovite dostop do šifriranih datotek.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Te datoteke ni mogoče šifrirati, ker je to najverjetneje datoteka v souporabi. Prosite lastnika datoteke, da jo da ponovno v souporabo.", +"Unknown error please check your system settings or contact your administrator" => "Prišlo je do neznane napake. Preverite nastavitve sistema ali pa stopite v stik s skrbnikom sistema.", "Missing requirements." => "Manjkajoče zahteve", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Preverite, ali je na strežniku nameščen paket PHP 5.3.3 ali novejši, da je omogočen in pravilno nastavljen PHP OpenSSL. Z obstoječimi možnostmi šifriranje ni mogoče.", +"Following users are not set up for encryption:" => "Navedeni uporabniki še nimajo nastavljenega šifriranja:", +"Initial encryption started... This can take some time. Please wait." => "Začetno šifriranje je začeto ... Opravilo je lahko dolgotrajno.", "Saving..." => "Poteka shranjevanje ...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Vaš zasebni ključ ni veljaven. Morda je bilo vaše geslo spremenjeno.", -"You can unlock your private key in your " => "Svoj zasebni ključ lahko odklenite v", +"Go directly to your " => "Skočite neposredno na", "personal settings" => "osebne nastavitve", "Encryption" => "Šifriranje", -"Enable recovery key (allow to recover users files in case of password loss):" => "Omogoči ključ za obnovitev datotek (v primeru izgube gesla)", +"Enable recovery key (allow to recover users files in case of password loss):" => "Omogoči ključ za obnovitev datotek (v primeru izgube gesla):", "Recovery key password" => "Ključ za obnovitev gesla", +"Repeat Recovery key password" => "Ponovi ključ za obnovitev gesla", "Enabled" => "Omogočeno", "Disabled" => "Onemogočeno", "Change recovery key password:" => "Spremeni ključ za obnovitev gesla:", "Old Recovery key password" => "Stari ključ za obnovitev gesla", -"New Recovery key password" => "Nov ključ za obnovitev gesla", +"New Recovery key password" => "Novi ključ za obnovitev gesla", +"Repeat New Recovery key password" => "Ponovi novi ključ za obnovitev gesla", "Change Password" => "Spremeni geslo", -"Your private key password no longer match your log-in password:" => "Vaš zasebni ključ za geslo se ne ujema z vnešenim geslom ob prijavi:", -"Set your old private key password to your current log-in password." => "Nastavite svoj star zasebni ključ v geslo, vnešeno ob prijavi.", -" If you don't remember your old password you can ask your administrator to recover your files." => "Če ste svoje geslo pozabili, lahko vaše datoteke obnovi skrbnik sistema.", +"Your private key password no longer match your log-in password:" => "Vaš zasebni ključ za geslo se ne ujema z geslom, vnesenim ob prijavi:", +"Set your old private key password to your current log-in password." => "Nastavite svoj star zasebni ključ v geslo, vneseno ob prijavi.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Če ste pozabili svoje geslo, lahko vaše datoteke obnovi le skrbnik sistema.", "Old log-in password" => "Staro geslo", "Current log-in password" => "Trenutno geslo", "Update Private Key Password" => "Posodobi zasebni ključ", "Enable password recovery:" => "Omogoči obnovitev gesla:", -"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Nastavitev te možnosti omogoča ponovno pridobitev dostopa do šifriranih datotek, v primeru da boste geslo pozabili.", -"File recovery settings updated" => "Nastavitve obnavljanja dokumentov so bile posodobljene", -"Could not update file recovery" => "Nastavitev za obnavljanje dokumentov ni bilo mogoče posodobiti" +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Nastavitev te možnosti omogoča ponovno pridobitev dostopa do šifriranih datotek, v primeru, da boste geslo pozabili.", +"File recovery settings updated" => "Nastavitve obnavljanja dokumentov so posodobljene", +"Could not update file recovery" => "Nastavitev za obnavljanje dokumentov ni mogoče posodobiti" ); $PLURAL_FORMS = "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"; diff --git a/apps/files_encryption/l10n/sq.php b/apps/files_encryption/l10n/sq.php new file mode 100644 index 0000000000..dc156ff3bf --- /dev/null +++ b/apps/files_encryption/l10n/sq.php @@ -0,0 +1,5 @@ + "Duke ruajtur..." +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/sv.php b/apps/files_encryption/l10n/sv.php index ce43d7d5cf..1e509ea08e 100644 --- a/apps/files_encryption/l10n/sv.php +++ b/apps/files_encryption/l10n/sv.php @@ -6,30 +6,35 @@ $TRANSLATIONS = array( "Could not disable recovery key. Please check your recovery key password!" => "Kunde inte inaktivera återställningsnyckeln. Vänligen kontrollera ditt lösenord för återställningsnyckeln!", "Password successfully changed." => "Ändringen av lösenordet lyckades.", "Could not change the password. Maybe the old password was not correct." => "Kunde inte ändra lösenordet. Kanske det gamla lösenordet inte var rätt.", -"Private key password successfully updated." => "Den privata lösenordsnyckeln uppdaterades utan problem.", -"Could not update the private key password. Maybe the old password was not correct." => "Kunde inte uppdatera den privata lösenordsnyckeln. Kanske var det gamla lösenordet fel.", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Din privata lösenordsnyckel är inte giltig! Troligen har ditt lösenord ändrats utanför ownCloud (t.ex. i företagets katalogtjänst). Du kan uppdatera den privata lösenordsnyckeln under dina personliga inställningar för att återfå tillgång till dina filer.", +"Private key password successfully updated." => "Den privata nyckelns lösenord uppdaterades utan problem.", +"Could not update the private key password. Maybe the old password was not correct." => "Kunde inte uppdatera lösenordet för den privata nyckeln. Kanske var det gamla lösenordet fel.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Krypteringsprogrammet kunde inte initieras! Möjligen blev krypteringsprogrammet återaktiverad under din session. Försök med att logga ut och in igen för att initiera krypteringsprogrammet.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Din privata lösenordsnyckel är inte giltig! Troligen har ditt lösenord ändrats utanför %s (t.ex. i företagets katalogtjänst). Du kan uppdatera den privata lösenordsnyckeln under dina personliga inställningar för att återfå tillgång till dina filer.", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.", +"Unknown error please check your system settings or contact your administrator" => "Oväntat fel, kolla dina system inställningar eller kontakta din administratör", "Missing requirements." => "Krav som saknas", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Kontrollera att PHP 5.3.3 eller senare är installerad och att tillägget OpenSSL PHP är aktiverad och korrekt konfigurerad. Kryptering är tillsvidare inaktiverad.", "Following users are not set up for encryption:" => "Följande användare har inte aktiverat kryptering:", "Saving..." => "Sparar...", -"Your private key is not valid! Maybe the your password was changed from outside." => "Din privata lösenordsnyckel är inte giltig! Kanske byttes ditt lösenord från utsidan.", -"You can unlock your private key in your " => "Du kan låsa upp din privata nyckel i dina", +"Go directly to your " => "Gå direkt till din", "personal settings" => "personliga inställningar", "Encryption" => "Kryptering", -"Enable recovery key (allow to recover users files in case of password loss):" => "Aktivera lösenordsnyckel (för att kunna återfå användarens filer vid glömt eller förlorat lösenord):", -"Recovery key password" => "Lösenordsnyckel", +"Enable recovery key (allow to recover users files in case of password loss):" => "Aktivera återställningsnyckel (för att kunna återfå användarens filer vid glömt eller förlorat lösenord):", +"Recovery key password" => "Lösenord för återställningsnyckel", +"Repeat Recovery key password" => "Upprepa återställningsnyckelns lösenord", "Enabled" => "Aktiverad", "Disabled" => "Inaktiverad", -"Change recovery key password:" => "Ändra lösenordsnyckel:", -"Old Recovery key password" => "Gammal lösenordsnyckel", -"New Recovery key password" => "Ny lösenordsnyckel", +"Change recovery key password:" => "Ändra lösenord för återställningsnyckel:", +"Old Recovery key password" => "Gammalt lösenord för återställningsnyckel", +"New Recovery key password" => "Nytt lösenord för återställningsnyckel", +"Repeat New Recovery key password" => "Upprepa lösenord för ny återställningsnyckel", "Change Password" => "Byt lösenord", -"Your private key password no longer match your log-in password:" => "Din privata lösenordsnyckel stämmer inte längre överrens med ditt inloggningslösenord:", -"Set your old private key password to your current log-in password." => "Ställ in din gamla privata lösenordsnyckel till ditt aktuella inloggningslösenord.", +"Your private key password no longer match your log-in password:" => "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord:", +"Set your old private key password to your current log-in password." => "Använd din gamla privata nyckels lösenord som ditt aktuella inloggningslösenord.", " If you don't remember your old password you can ask your administrator to recover your files." => "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.", "Old log-in password" => "Gammalt inloggningslösenord", "Current log-in password" => "Nuvarande inloggningslösenord", -"Update Private Key Password" => "Uppdatera den privata lösenordsnyckeln", +"Update Private Key Password" => "Uppdatera lösenordet för din privata nyckel", "Enable password recovery:" => "Aktivera lösenordsåterställning", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Genom att aktivera detta alternativ kommer du kunna återfå tillgång till dina krypterade filer om du skulle förlora/glömma ditt lösenord", "File recovery settings updated" => "Inställningarna för filåterställning har uppdaterats", diff --git a/apps/files_encryption/l10n/te.php b/apps/files_encryption/l10n/te.php new file mode 100644 index 0000000000..10c7a08a55 --- /dev/null +++ b/apps/files_encryption/l10n/te.php @@ -0,0 +1,5 @@ + "వ్యక్తిగత అమరికలు" +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_encryption/l10n/tr.php b/apps/files_encryption/l10n/tr.php index 7fdda1a5bf..b8289ab71f 100644 --- a/apps/files_encryption/l10n/tr.php +++ b/apps/files_encryption/l10n/tr.php @@ -4,13 +4,40 @@ $TRANSLATIONS = array( "Could not enable recovery key. Please check your recovery key password!" => "Kurtarma anahtarı etkinleştirilemedi. Lütfen kurtarma anahtarı parolanızı kontrol edin!", "Recovery key successfully disabled" => "Kurtarma anahtarı başarıyla devre dışı bırakıldı", "Could not disable recovery key. Please check your recovery key password!" => "Kurtarma anahtarı devre dışı bırakılamadı. Lütfen kurtarma anahtarı parolanızı kontrol edin!", -"Password successfully changed." => "Şifreniz başarıyla değiştirildi.", -"Could not change the password. Maybe the old password was not correct." => "Parola değiştirilemedi. Eski parolanız doğru olmayabilir", +"Password successfully changed." => "Parola başarıyla değiştirildi.", +"Could not change the password. Maybe the old password was not correct." => "Parola değiştirilemedi. Eski parolanız doğru olmayabilir.", +"Private key password successfully updated." => "Gizli anahtar parolası başarıyla güncellendi", +"Could not update the private key password. Maybe the old password was not correct." => "Gizli anahtar parolası güncellenemedi. Eski parola hatalı olabilir.", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Şifreleme uygulaması başlatılamadı! Oturumunuz sırasında şifreleme uygulaması tekrar etkinleştirilmiş olabilir. Lütfen şifreleme uygulamasını başlatmak için oturumu kapatıp yeniden oturum açmayı deneyin.", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Gizli anahtarınız geçerli değil! Muhtemelen parolanız ownCloud sistemi %s dışarısında değiştirildi (örn. şirket dizininde). Gizli anahtar parolanızı kişisel ayarlarınızda güncelleyerek şifreli dosyalarınıza erişimi kurtarabilirsiniz.", +"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 şifresi çözülemiyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", +"Unknown error please check your system settings or contact your administrator" => "Bilinmeyen hata. Lütfen sistem ayarlarınızı denetleyin veya yöneticiniz ile iletişime geçin", +"Missing requirements." => "Gereklilikler eksik.", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "PHP 5.3.3 veya daha sürümü ile birlikte OpenSSL ve OpenSSL PHP uzantısının birlikte etkin olduğunu ve doğru bir şekilde yapılandırıldığından emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı", +"Following users are not set up for encryption:" => "Aşağıdaki kullanıcılar şifreleme için ayarlanmadılar:", +"Initial encryption started... This can take some time. Please wait." => "İlk şifreleme başladı... Bu biraz zaman alabilir. Lütfen bekleyin.", "Saving..." => "Kaydediliyor...", +"Go directly to your " => "Doğrudan şuraya gidin:", +"personal settings" => "kişisel ayarlar", "Encryption" => "Şifreleme", +"Enable recovery key (allow to recover users files in case of password loss):" => "Kurtarma anahtarını etkinleştir (parola kaybı durumunda kullanıcı dosyalarının kurtarılmasına izin verir):", +"Recovery key password" => "Kurtarma anahtarı parolası", +"Repeat Recovery key password" => "Kurtarma anahtarı parolasını yenileyin", "Enabled" => "Etkinleştirildi", "Disabled" => "Devre dışı", -"Change Password" => "Parola değiştir", +"Change recovery key password:" => "Kurtarma anahtarı parolasını değiştir:", +"Old Recovery key password" => "Eski Kurtarma anahtar parolası", +"New Recovery key password" => "Yeni Kurtarma anahtar parolası", +"Repeat New Recovery key password" => "Yeni Kurtarma anahtarı parolasını yenileyin", +"Change Password" => "Parola Değiştir", +"Your private key password no longer match your log-in password:" => "Özel anahtar parolanız artık oturum açma parolanızla eşleşmiyor:", +"Set your old private key password to your current log-in password." => "Eski özel anahtar parolanızı geçerli oturum açma parolanız olarak ayarlayın.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Eğer eski parolanızı hatırlamıyorsanız, yöneticinizden dosyalarınızı kurtarmasını talep edebilirsiniz.", +"Old log-in password" => "Eski oturum açma parolası", +"Current log-in password" => "Geçerli oturum açma parolası", +"Update Private Key Password" => "Özel Anahtar Parolasını Güncelle", +"Enable password recovery:" => "Parola kurtarmayı etkinleştir:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Bu seçeneği etkinleştirmek, parola kaybı durumunda şifrelenmiş dosyalarınıza erişimi yeniden kazanmanızı sağlayacaktır", "File recovery settings updated" => "Dosya kurtarma ayarları güncellendi", "Could not update file recovery" => "Dosya kurtarma güncellenemedi" ); diff --git a/apps/files_encryption/l10n/uk.php b/apps/files_encryption/l10n/uk.php index 680beddfe6..5260dd3f2f 100644 --- a/apps/files_encryption/l10n/uk.php +++ b/apps/files_encryption/l10n/uk.php @@ -1,6 +1,8 @@ "Зберігаю...", -"Encryption" => "Шифрування" +"personal settings" => "особисті налаштування", +"Encryption" => "Шифрування", +"Change Password" => "Змінити Пароль" ); $PLURAL_FORMS = "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_encryption/l10n/zh_CN.php b/apps/files_encryption/l10n/zh_CN.php index c4c52f4ac2..a51856aec9 100644 --- a/apps/files_encryption/l10n/zh_CN.php +++ b/apps/files_encryption/l10n/zh_CN.php @@ -8,10 +8,7 @@ $TRANSLATIONS = array( "Could not change the password. Maybe the old password was not correct." => "不能修改密码。旧密码可能不正确。", "Private key password successfully updated." => "私钥密码成功更新。", "Could not update the private key password. Maybe the old password was not correct." => "无法更新私钥密码。可能旧密码不正确。", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "您的私有密钥无效!也许是您在 ownCloud 系统外更改了密码 (比如,在您的公司目录)。您可以在个人设置里更新您的私钥密码来恢复访问你的加密文件。", "Saving..." => "保存中", -"Your private key is not valid! Maybe the your password was changed from outside." => "您的私钥不正确!可能您在别处更改了密码。", -"You can unlock your private key in your " => "您可以在这里解锁您的私钥:", "personal settings" => "个人设置", "Encryption" => "加密", "Enable recovery key (allow to recover users files in case of password loss):" => "启用恢复密钥(允许你在密码丢失后恢复文件):", diff --git a/apps/files_encryption/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php index 02dc49cc3d..8972490ea5 100644 --- a/apps/files_encryption/l10n/zh_TW.php +++ b/apps/files_encryption/l10n/zh_TW.php @@ -1,16 +1,42 @@ "還原金鑰已成功開啟", +"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!" => "無法停用還原金鑰。請檢查您的還原金鑰密碼!", "Password successfully changed." => "成功變更密碼。", "Could not change the password. Maybe the old password was not correct." => "無法變更密碼,或許是輸入的舊密碼不正確。", -"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "您的私鑰不正確! 感覺像是密碼在 ownCloud 系統之外被改變(例:您的目錄)。 您可以在個人設定中更新私鑰密碼取回已加密的檔案。", +"Private key password successfully updated." => "私人金鑰密碼已成功更新。", +"Could not update the private key password. Maybe the old password was not correct." => "無法更新私人金鑰密碼。可能舊的密碼不正確。", +"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。", +"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "您的私人金鑰不正確!可能您的密碼已經變更在外部的 %s (例如:您的企業目錄)。您可以在您的個人設定中更新私人金鑰密碼來還原存取您的加密檔案。", +"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。", +"Unknown error please check your system settings or contact your administrator" => "未知錯誤請檢查您的系統設定或是聯絡您的管理員", +"Missing requirements." => "遺失必要條件。", +"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。", +"Following users are not set up for encryption:" => "以下的使用者無法設定加密:", "Saving..." => "儲存中...", +"Go directly to your " => "直接到您的", +"personal settings" => "個人設定", "Encryption" => "加密", +"Enable recovery key (allow to recover users files in case of password loss):" => "啟用還原金鑰 (因忘記密碼仍允許還原使用者檔案):", +"Recovery key password" => "還原金鑰密碼", +"Repeat Recovery key password" => "再輸入還原金鑰密碼一次", "Enabled" => "已啓用", "Disabled" => "已停用", +"Change recovery key password:" => "變更還原金鑰密碼:", +"Old Recovery key password" => "舊的還原金鑰密碼", +"New Recovery key password" => "新的還原金鑰密碼", +"Repeat New Recovery key password" => "再輸入新的還原金鑰密碼一次", "Change Password" => "變更密碼", +"Your private key password no longer match your log-in password:" => "您的私人金鑰密碼不符合您的登入密碼:", +"Set your old private key password to your current log-in password." => "設定您的舊私人金鑰密碼到您現在的登入密碼。", " 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" => "目前的登入密碼", +"Update Private Key Password" => "更新私人金鑰密碼", +"Enable password recovery:" => "啟用密碼還原:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "啟用這個選項將會允許您因忘記密碼但需要存取您的加密檔案", "File recovery settings updated" => "檔案還原設定已更新", "Could not update file recovery" => "無法更新檔案還原設定" ); diff --git a/apps/files_encryption/lib/capabilities.php b/apps/files_encryption/lib/capabilities.php index 72baddcd04..ef94c9e086 100644 --- a/apps/files_encryption/lib/capabilities.php +++ b/apps/files_encryption/lib/capabilities.php @@ -20,4 +20,4 @@ class Capabilities { )); } -} \ No newline at end of file +} diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php index c3e88e5944..9155d238c7 100755 --- a/apps/files_encryption/lib/crypt.php +++ b/apps/files_encryption/lib/crypt.php @@ -25,8 +25,7 @@ namespace OCA\Encryption; -//require_once '../3rdparty/Crypt_Blowfish/Blowfish.php'; -require_once realpath(dirname(__FILE__) . '/../3rdparty/Crypt_Blowfish/Blowfish.php'); +require_once __DIR__ . '/../3rdparty/Crypt_Blowfish/Blowfish.php'; /** * Class for common cryptography functionality @@ -34,6 +33,12 @@ require_once realpath(dirname(__FILE__) . '/../3rdparty/Crypt_Blowfish/Blowfish. class Crypt { + const ENCRYPTION_UNKNOWN_ERROR = -1; + const ENCRYPTION_NOT_INITIALIZED_ERROR = 1; + const ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR = 2; + const ENCRYPTION_NO_SHARE_KEY_FOUND = 3; + + /** * @brief return encryption mode client or server side encryption * @param string $user name (use system wide setting if name=null) @@ -53,14 +58,14 @@ class Crypt { $return = false; - $res = openssl_pkey_new(array('private_key_bits' => 4096)); + $res = Helper::getOpenSSLPkey(); if ($res === false) { \OCP\Util::writeLog('Encryption library', 'couldn\'t generate users key-pair for ' . \OCP\User::getUser(), \OCP\Util::ERROR); while ($msg = openssl_error_string()) { \OCP\Util::writeLog('Encryption library', 'openssl_pkey_new() fails: ' . $msg, \OCP\Util::ERROR); } - } elseif (openssl_pkey_export($res, $privateKey)) { + } elseif (openssl_pkey_export($res, $privateKey, null, Helper::getOpenSSLConfig())) { // Get public key $keyDetails = openssl_pkey_get_details($res); $publicKey = $keyDetails['key']; @@ -71,7 +76,9 @@ class Crypt { ); } else { \OCP\Util::writeLog('Encryption library', 'couldn\'t export users private key, please check your servers openSSL configuration.' . \OCP\User::getUser(), \OCP\Util::ERROR); - \OCP\Util::writeLog('Encryption library', openssl_error_string(), \OCP\Util::ERROR); + while($errMsg = openssl_error_string()) { + \OCP\Util::writeLog('Encryption library', $errMsg, \OCP\Util::ERROR); + } } return $return; @@ -86,7 +93,7 @@ class Crypt { * blocks with encryption alone, hence padding is added to achieve the * required length. */ - public static function addPadding($data) { + private static function addPadding($data) { $padded = $data . 'xx'; @@ -99,7 +106,7 @@ class Crypt { * @param string $padded padded data to remove padding from * @return string unpadded data on success, false on error */ - public static function removePadding($padded) { + private static function removePadding($padded) { if (substr($padded, -2) === 'xx') { @@ -182,8 +189,8 @@ class Crypt { // Fetch all file metadata from DB $metadata = \OC\Files\Filesystem::getFileInfo($relPath, ''); - // If a file is flagged with encryption in DB, but isn't a - // valid content + IV combination, it's probably using the + // If a file is flagged with encryption in DB, but isn't a + // valid content + IV combination, it's probably using the // legacy encryption system if (isset($metadata['encrypted']) && $metadata['encrypted'] === true @@ -207,7 +214,7 @@ class Crypt { * @param string $passphrase * @return string encrypted file content */ - public static function encrypt($plainContent, $iv, $passphrase = '') { + private static function encrypt($plainContent, $iv, $passphrase = '') { if ($encryptedContent = openssl_encrypt($plainContent, 'AES-128-CFB', $passphrase, false, $iv)) { return $encryptedContent; @@ -228,7 +235,7 @@ class Crypt { * @throws \Exception * @return string decrypted file content */ - public static function decrypt($encryptedContent, $iv, $passphrase) { + private static function decrypt($encryptedContent, $iv, $passphrase) { if ($plainContent = openssl_decrypt($encryptedContent, 'AES-128-CFB', $passphrase, false, $iv)) { @@ -248,7 +255,7 @@ class Crypt { * @param string $iv IV to be concatenated * @returns string concatenated content */ - public static function concatIv($content, $iv) { + private static function concatIv($content, $iv) { $combined = $content . '00iv00' . $iv; @@ -261,7 +268,7 @@ class Crypt { * @param string $catFile concatenated data to be split * @returns array keys: encrypted, iv */ - public static function splitIv($catFile) { + private static function splitIv($catFile) { // Fetch encryption metadata from end of file $meta = substr($catFile, -22); @@ -378,34 +385,6 @@ class Crypt { } - - /** - * @brief Creates symmetric keyfile content using a generated key - * @param string $plainContent content to be encrypted - * @returns array keys: key, encrypted - * @note symmetricDecryptFileContent() can be used to decrypt files created using this method - * - * This function decrypts a file - */ - public static function symmetricEncryptFileContentKeyfile($plainContent) { - - $key = self::generateKey(); - - if ($encryptedContent = self::symmetricEncryptFileContent($plainContent, $key)) { - - return array( - 'key' => $key, - 'encrypted' => $encryptedContent - ); - - } else { - - return false; - - } - - } - /** * @brief Create asymmetrically encrypted keyfile content using a generated key * @param string $plainContent content to be encrypted @@ -415,7 +394,7 @@ class Crypt { */ public static function multiKeyEncrypt($plainContent, array $publicKeys) { - // openssl_seal returns false without errors if $plainContent + // openssl_seal returns false without errors if $plainContent // is empty, so trigger our own error if (empty($plainContent)) { @@ -432,7 +411,7 @@ class Crypt { $i = 0; - // Ensure each shareKey is labelled with its + // Ensure each shareKey is labelled with its // corresponding userId foreach ($publicKeys as $userId => $publicKey) { @@ -488,43 +467,11 @@ class Crypt { } - /** - * @brief Asymetrically encrypt a string using a public key - * @param $plainContent - * @param $publicKey - * @return string encrypted file - */ - public static function keyEncrypt($plainContent, $publicKey) { - - openssl_public_encrypt($plainContent, $encryptedContent, $publicKey); - - return $encryptedContent; - - } - - /** - * @brief Asymetrically decrypt a file using a private key - * @param $encryptedContent - * @param $privatekey - * @return string decrypted file - */ - public static function keyDecrypt($encryptedContent, $privatekey) { - - $result = @openssl_private_decrypt($encryptedContent, $plainContent, $privatekey); - - if ($result) { - return $plainContent; - } - - return $result; - - } - /** * @brief Generates a pseudo random initialisation vector * @return String $iv generated IV */ - public static function generateIv() { + private static function generateIv() { if ($random = openssl_random_pseudo_bytes(12, $strong)) { @@ -535,7 +482,7 @@ class Crypt { } - // We encode the iv purely for string manipulation + // We encode the iv purely for string manipulation // purposes - it gets decoded before use $iv = base64_encode($random); @@ -550,7 +497,7 @@ class Crypt { } /** - * @brief Generate a pseudo random 1024kb ASCII key + * @brief Generate a pseudo random 1024kb ASCII key, used as file key * @returns $key Generated key */ public static function generateKey() { @@ -576,13 +523,13 @@ class Crypt { } /** - * @brief Get the blowfish encryption handeler for a key + * @brief Get the blowfish encryption handler for a key * @param $key string (optional) * @return \Crypt_Blowfish blowfish object * - * if the key is left out, the default handeler will be used + * if the key is left out, the default handler will be used */ - public static function getBlowfish($key = '') { + private static function getBlowfish($key = '') { if ($key) { @@ -596,38 +543,6 @@ class Crypt { } - /** - * @param $passphrase - * @return mixed - */ - public static function legacyCreateKey($passphrase) { - - // Generate a random integer - $key = mt_rand(10000, 99999) . mt_rand(10000, 99999) . mt_rand(10000, 99999) . mt_rand(10000, 99999); - - // Encrypt the key with the passphrase - $legacyEncKey = self::legacyEncrypt($key, $passphrase); - - return $legacyEncKey; - - } - - /** - * @brief encrypts content using legacy blowfish system - * @param string $content the cleartext message you want to encrypt - * @param string $passphrase - * @returns string encrypted content - * - * This function encrypts an content - */ - public static function legacyEncrypt($content, $passphrase = '') { - - $bf = self::getBlowfish($passphrase); - - return $bf->encrypt($content); - - } - /** * @brief decrypts content using legacy blowfish system * @param string $content the cleartext message you want to decrypt @@ -665,4 +580,4 @@ class Crypt { } } -} \ No newline at end of file +} diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php index b09c584c0b..17bcac5c58 100755 --- a/apps/files_encryption/lib/helper.php +++ b/apps/files_encryption/lib/helper.php @@ -69,6 +69,7 @@ class Helper { public static function registerAppHooks() { \OCP\Util::connectHook('OC_App', 'pre_disable', 'OCA\Encryption\Hooks', 'preDisable'); + \OCP\Util::connectHook('OC_App', 'post_disable', 'OCA\Encryption\Hooks', 'postEnable'); } /** @@ -156,6 +157,49 @@ class Helper { return $return; } + /** + * @brief Check if a path is a .part file + * @param string $path Path that may identify a .part file + * @return bool + */ + public static function isPartialFilePath($path) { + + $extension = pathinfo($path, PATHINFO_EXTENSION); + if ( $extension === 'part') { + return true; + } else { + return false; + } + + } + + + /** + * @brief Remove .path extension from a file path + * @param string $path Path that may identify a .part file + * @return string File path without .part extension + * @note this is needed for reusing keys + */ + public static function stripPartialFileExtension($path) { + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ( $extension === 'part') { + + $newLength = strlen($path) - 5; // 5 = strlen(".part") = strlen(".etmp") + $fPath = substr($path, 0, $newLength); + + // if path also contains a transaction id, we remove it too + $extension = pathinfo($fPath, PATHINFO_EXTENSION); + if(substr($extension, 0, 12) === 'ocTransferId') { // 12 = strlen("ocTransferId") + $newLength = strlen($fPath) - strlen($extension) -1; + $fPath = substr($fPath, 0, $newLength); + } + return $fPath; + + } else { + return $path; + } + } /** * @brief disable recovery @@ -181,10 +225,7 @@ class Helper { * @return bool */ public static function isPublicAccess() { - if (\OCP\USER::getUser() === false - || (isset($_GET['service']) && $_GET['service'] == 'files' - && isset($_GET['t'])) - ) { + if (\OCP\User::getUser() === false) { return true; } else { return false; @@ -199,23 +240,129 @@ class Helper { public static function stripUserFilesPath($path) { $trimmed = ltrim($path, '/'); $split = explode('/', $trimmed); + + // it is not a file relative to data/user/files + if (count($split) < 3 || $split[1] !== 'files') { + return false; + } + $sliced = array_slice($split, 2); $relPath = implode('/', $sliced); return $relPath; } + /** + * @brief try to get the user from the path if no user is logged in + * @param string $path + * @return mixed user or false if we couldn't determine a user + */ + public static function getUser($path) { + + $user = \OCP\User::getUser(); + + + // if we are logged in, then we return the userid + if ($user) { + return $user; + } + + // if no user is logged in we try to access a publicly shared files. + // In this case we need to try to get the user from the path + + $trimmed = ltrim($path, '/'); + $split = explode('/', $trimmed); + + // it is not a file relative to data/user/files + if (count($split) < 2 || $split[1] !== 'files') { + return false; + } + + $user = $split[0]; + + if (\OCP\User::userExists($user)) { + return $user; + } + + return false; + } + + /** + * @brief get path to the corresponding file in data/user/files if path points + * to a version or to a file in cache + * @param string $path path to a version or a file in the trash + * @return string path to corresponding file relative to data/user/files + */ + public static function getPathToRealFile($path) { + $trimmed = ltrim($path, '/'); + $split = explode('/', $trimmed); + $result = false; + + if (count($split) >= 3 && ($split[1] === "files_versions" || $split[1] === 'cache')) { + $sliced = array_slice($split, 2); + $result = implode('/', $sliced); + if ($split[1] === "files_versions") { + // we skip user/files + $sliced = array_slice($split, 2); + $relPath = implode('/', $sliced); + //remove the last .v + $result = substr($relPath, 0, strrpos($relPath, '.v')); + } + if ($split[1] === "cache") { + // we skip /user/cache/transactionId + $sliced = array_slice($split, 3); + $result = implode('/', $sliced); + //prepare the folders + self::mkdirr($path, new \OC\Files\View('/')); + } + } + + return $result; + } + + /** + * @brief create directory recursively + * @param string $path + * @param \OC\Files\View $view + */ + public static function mkdirr($path, $view) { + $dirname = \OC_Filesystem::normalizePath(dirname($path)); + $dirParts = explode('/', $dirname); + $dir = ""; + foreach ($dirParts as $part) { + $dir = $dir . '/' . $part; + if (!$view->file_exists($dir)) { + $view->mkdir($dir); + } + } + } + /** * @brief redirect to a error page */ - public static function redirectToErrorPage() { + public static function redirectToErrorPage($session, $errorCode = null) { + + if ($errorCode === null) { + $init = $session->getInitialized(); + switch ($init) { + case \OCA\Encryption\Session::INIT_EXECUTED: + $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR; + break; + case \OCA\Encryption\Session::NOT_INITIALIZED: + $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR; + break; + default: + $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_UNKNOWN_ERROR; + } + } + $location = \OC_Helper::linkToAbsolute('apps/files_encryption/files', 'error.php'); $post = 0; if(count($_POST) > 0) { $post = 1; - } - header('Location: ' . $location . '?p=' . $post); - exit(); + } + header('Location: ' . $location . '?p=' . $post . '&errorCode=' . $errorCode); + exit(); } /** @@ -232,13 +379,13 @@ class Helper { return (bool) $result; } - + /** * check some common errors if the server isn't configured properly for encryption * @return bool true if configuration seems to be OK */ public static function checkConfiguration() { - if(openssl_pkey_new(array('private_key_bits' => 4096))) { + if(self::getOpenSSLPkey()) { return true; } else { while ($msg = openssl_error_string()) { @@ -248,6 +395,26 @@ class Helper { } } + /** + * Create an openssl pkey with config-supplied settings + * WARNING: This initializes a new private keypair, which is computationally expensive + * @return resource The pkey resource created + */ + public static function getOpenSSLPkey() { + return openssl_pkey_new(self::getOpenSSLConfig()); + } + + /** + * Return an array of OpenSSL config options, default + config + * Used for multiple OpenSSL functions + * @return array The combined defaults and config settings + */ + public static function getOpenSSLConfig() { + $config = array('private_key_bits' => 4096); + $config = array_merge(\OCP\Config::getSystemValue('openssl', array()), $config); + return $config; + } + /** * @brief glob uses different pattern than regular expressions, escape glob pattern only * @param unescaped path diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php index b2fd650f18..b2c756894b 100755 --- a/apps/files_encryption/lib/keymanager.php +++ b/apps/files_encryption/lib/keymanager.php @@ -40,11 +40,14 @@ class Keymanager { public static function getPrivateKey(\OC_FilesystemView $view, $user) { $path = '/' . $user . '/' . 'files_encryption' . '/' . $user . '.private.key'; + $key = false; $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $key = $view->file_get_contents($path); + if ($view->file_exists($path)) { + $key = $view->file_get_contents($path); + } \OC_FileProxy::$enabled = $proxyStatus; @@ -109,21 +112,18 @@ class Keymanager { * @brief store file encryption key * * @param \OC_FilesystemView $view + * @param \OCA\Encryption\Util $util * @param string $path relative path of the file, including filename - * @param $userId - * @param $catfile - * @internal param string $key + * @param string $catfile keyfile content * @return bool true/false * @note The keyfile is not encrypted here. Client code must * asymmetrically encrypt the keyfile before passing it to this method */ - public static function setFileKey(\OC_FilesystemView $view, $path, $userId, $catfile) { + public static function setFileKey(\OC_FilesystemView $view, $util, $path, $catfile) { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - //here we need the currently logged in user, while userId can be a different user - $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($path); // in case of system wide mount points the keys are stored directly in the data directory @@ -149,10 +149,10 @@ class Keymanager { } // try reusing key file if part file - if (self::isPartialFilePath($targetPath)) { + if (Helper::isPartialFilePath($targetPath)) { $result = $view->file_put_contents( - $basePath . '/' . self::fixPartialFilePath($targetPath) . '.key', $catfile); + $basePath . '/' . Helper::stripPartialFileExtension($targetPath) . '.key', $catfile); } else { @@ -166,76 +166,21 @@ class Keymanager { } - /** - * @brief Remove .path extension from a file path - * @param string $path Path that may identify a .part file - * @return string File path without .part extension - * @note this is needed for reusing keys - */ - public static function fixPartialFilePath($path) { - - if (preg_match('/\.part$/', $path) || preg_match('/\.etmp$/', $path)) { - - $newLength = strlen($path) - 5; - $fPath = substr($path, 0, $newLength); - - return $fPath; - - } else { - - return $path; - - } - - } - - /** - * @brief Check if a path is a .part file - * @param string $path Path that may identify a .part file - * @return bool - */ - public static function isPartialFilePath($path) { - - if (preg_match('/\.part$/', $path) || preg_match('/\.etmp$/', $path)) { - - return true; - - } else { - - return false; - - } - - } - /** * @brief retrieve keyfile for an encrypted file * @param \OC_FilesystemView $view - * @param $userId + * @param \OCA\Encryption\Util $util * @param $filePath * @internal param \OCA\Encryption\file $string name * @return string file key or false * @note The keyfile returned is asymmetrically encrypted. Decryption * of the keyfile must be performed by client code */ - public static function getFileKey(\OC_FilesystemView $view, $userId, $filePath) { + public static function getFileKey($view, $util, $filePath) { - // try reusing key file if part file - if (self::isPartialFilePath($filePath)) { - - $result = self::getFileKey($view, $userId, self::fixPartialFilePath($filePath)); - - if ($result) { - - return $result; - - } - - } - - $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($filePath); + $filename = Helper::stripPartialFileExtension($filename); $filePath_f = ltrim($filename, '/'); // in case of system wide mount points the keys are stored directly in the data directory @@ -268,17 +213,17 @@ class Keymanager { * @brief Delete a keyfile * * @param \OC_FilesystemView $view - * @param string $userId username * @param string $path path of the file the key belongs to * @return bool Outcome of unlink operation * @note $path must be relative to data/user/files. e.g. mydoc.txt NOT * /data/admin/files/mydoc.txt */ - public static function deleteFileKey(\OC_FilesystemView $view, $userId, $path) { + public static function deleteFileKey(\OC_FilesystemView $view, $path) { $trimmed = ltrim($path, '/'); - $util = new Util($view, \OCP\User::getUser()); + $userId = Helper::getUser($path); + $util = new Util($view, $userId); if($util->isSystemWideMountPoint($path)) { $keyPath = '/files_encryption/keyfiles/' . $trimmed; @@ -367,16 +312,15 @@ class Keymanager { /** * @brief store multiple share keys for a single file * @param \OC_FilesystemView $view - * @param $path + * @param \OCA\Encryption\Util $util + * @param string $path * @param array $shareKeys * @return bool */ - public static function setShareKeys(\OC_FilesystemView $view, $path, array $shareKeys) { + public static function setShareKeys(\OC_FilesystemView $view, $util, $path, array $shareKeys) { // $shareKeys must be an array with the following format: // [userId] => [encrypted key] - // Here we need the currently logged in user, while userId can be a different user - $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($path); @@ -394,8 +338,8 @@ class Keymanager { foreach ($shareKeys as $userId => $shareKey) { // try reusing key file if part file - if (self::isPartialFilePath($shareKeyPath)) { - $writePath = $basePath . '/' . self::fixPartialFilePath($shareKeyPath) . '.' . $userId . '.shareKey'; + if (Helper::isPartialFilePath($shareKeyPath)) { + $writePath = $basePath . '/' . Helper::stripPartialFileExtension($shareKeyPath) . '.' . $userId . '.shareKey'; } else { $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; } @@ -415,35 +359,20 @@ class Keymanager { * @brief retrieve shareKey for an encrypted file * @param \OC_FilesystemView $view * @param string $userId + * @param \OCA\Encryption\Util $util * @param string $filePath - * @internal param \OCA\Encryption\file $string name * @return string file key or false * @note The sharekey returned is encrypted. Decryption * of the keyfile must be performed by client code */ - public static function getShareKey(\OC_FilesystemView $view, $userId, $filePath) { + public static function getShareKey(\OC_FilesystemView $view, $userId, $util, $filePath) { // try reusing key file if part file - if (self::isPartialFilePath($filePath)) { - - $result = self::getShareKey($view, $userId, self::fixPartialFilePath($filePath)); - - if ($result) { - - return $result; - - } - - } - $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - //here we need the currently logged in user, while userId can be a different user - $util = new Util($view, \OCP\User::getUser()); - list($owner, $filename) = $util->getUidAndFilename($filePath); - + $filename = Helper::stripPartialFileExtension($filename); // in case of system wide mount points the keys are stored directly in the data directory if ($util->isSystemWideMountPoint($filename)) { $shareKeyPath = '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; @@ -508,8 +437,9 @@ class Keymanager { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - //here we need the currently logged in user, while userId can be a different user - $util = new Util($view, \OCP\User::getUser()); + $userId = Helper::getUser($filePath); + + $util = new Util($view, $userId); list($owner, $filename) = $util->getUidAndFilename($filePath); @@ -593,4 +523,4 @@ class Keymanager { return $targetPath; } -} \ No newline at end of file +} diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 735eba911a..5ba3bfa784 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -38,8 +38,6 @@ class Proxy extends \OC_FileProxy { private static $blackList = null; //mimetypes blacklisted from encryption - private static $enableEncryption = null; - /** * Check if a file requires encryption * @param string $path @@ -49,47 +47,25 @@ class Proxy extends \OC_FileProxy { */ private static function shouldEncrypt($path) { - if (is_null(self::$enableEncryption)) { - - if ( - \OCP\Config::getAppValue('files_encryption', 'enable_encryption', 'true') === 'true' - && Crypt::mode() === 'server' - ) { - - self::$enableEncryption = true; - - } else { - - self::$enableEncryption = false; - - } - - } - - if (!self::$enableEncryption) { + $userId = Helper::getUser($path); + if (\OCP\App::isEnabled('files_encryption') === false || Crypt::mode() !== 'server' || + strpos($path, '/' . $userId . '/files') !== 0) { return false; - } if (is_null(self::$blackList)) { - self::$blackList = explode(',', \OCP\Config::getAppValue('files_encryption', 'type_blacklist', '')); - } if (Crypt::isCatfileContent($path)) { - return true; - } $extension = substr($path, strrpos($path, '.') + 1); if (array_search($extension, self::$blackList) === false) { - return true; - } return false; @@ -116,7 +92,13 @@ class Proxy extends \OC_FileProxy { return true; } - $handle = fopen('crypt://' . $relativePath . '.etmp', 'w'); + // create random cache folder + $cacheFolder = rand(); + $path_slices = explode('/', \OC_Filesystem::normalizePath($path)); + $path_slices[2] = "cache/".$cacheFolder; + $tmpPath = implode('/', $path_slices); + + $handle = fopen('crypt://' . $tmpPath, 'w'); if (is_resource($handle)) { // write data to stream @@ -130,10 +112,10 @@ class Proxy extends \OC_FileProxy { \OC_FileProxy::$enabled = false; // get encrypted content - $data = $view->file_get_contents($path . '.etmp'); + $data = $view->file_get_contents($tmpPath); // remove our temp file - $view->unlink($path . '.etmp'); + $view->deleteAll('/' . \OCP\User::getUser() . '/cache/' . $cacheFolder); // re-enable proxy - our work is done \OC_FileProxy::$enabled = $proxyStatus; @@ -154,9 +136,6 @@ class Proxy extends \OC_FileProxy { $plainData = null; $view = new \OC_FilesystemView('/'); - // get relative path - $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); - // init session $session = new \OCA\Encryption\Session($view); @@ -166,7 +145,7 @@ class Proxy extends \OC_FileProxy { && Crypt::isCatfileContent($data) ) { - $handle = fopen('crypt://' . $relativePath, 'r'); + $handle = fopen('crypt://' . $path, 'r'); if (is_resource($handle)) { while (($plainDataChunk = fgets($handle, 8192)) !== false) { @@ -203,7 +182,7 @@ class Proxy extends \OC_FileProxy { */ public function preUnlink($path) { - // let the trashbin handle this + // let the trashbin handle this if (\OCP\App::isEnabled('files_trashbin')) { return true; } @@ -224,7 +203,7 @@ class Proxy extends \OC_FileProxy { list($owner, $ownerPath) = $util->getUidAndFilename($relativePath); // Delete keyfile & shareKey so it isn't orphaned - if (!Keymanager::deleteFileKey($view, $owner, $ownerPath)) { + if (!Keymanager::deleteFileKey($view, $ownerPath)) { \OCP\Util::writeLog('Encryption library', 'Keyfile or shareKey could not be deleted for file "' . $ownerPath . '"', \OCP\Util::ERROR); } @@ -267,9 +246,6 @@ class Proxy extends \OC_FileProxy { // split the path parts $pathParts = explode('/', $path); - // get relative path - $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); - // FIXME: handling for /userId/cache used by webdav for chunking. The cache chunks are NOT encrypted if (isset($pathParts[2]) && $pathParts[2] === 'cache') { return $result; @@ -283,7 +259,8 @@ class Proxy extends \OC_FileProxy { $view = new \OC_FilesystemView(''); - $util = new Util($view, \OCP\USER::getUser()); + $userId = Helper::getUser($path); + $util = new Util($view, $userId); // If file is already encrypted, decrypt using crypto protocol if ( @@ -294,16 +271,16 @@ class Proxy extends \OC_FileProxy { // Close the original encrypted file fclose($result); - // Open the file using the crypto stream wrapper + // Open the file using the crypto stream wrapper // protocol and let it do the decryption work instead - $result = fopen('crypt://' . $relativePath, $meta['mode']); + $result = fopen('crypt://' . $path, $meta['mode']); } elseif ( self::shouldEncrypt($path) and $meta ['mode'] !== 'r' and $meta['mode'] !== 'rb' ) { - $result = fopen('crypt://' . $relativePath, $meta['mode']); + $result = fopen('crypt://' . $path, $meta['mode']); } // Re-enable the proxy @@ -321,7 +298,7 @@ class Proxy extends \OC_FileProxy { public function postGetFileInfo($path, $data) { // if path is a folder do nothing - if (is_array($data) && array_key_exists('size', $data)) { + if (\OCP\App::isEnabled('files_encryption') && is_array($data) && array_key_exists('size', $data)) { // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -346,6 +323,16 @@ class Proxy extends \OC_FileProxy { $view = new \OC_FilesystemView('/'); + $userId = Helper::getUser($path); + $util = new Util($view, $userId); + + // if encryption is no longer enabled or if the files aren't migrated yet + // we return the default file size + if(!\OCP\App::isEnabled('files_encryption') || + $util->getMigrationStatus() !== Util::MIGRATION_COMPLETED) { + return $size; + } + // if path is a folder do nothing if ($view->is_dir($path)) { return $size; @@ -361,12 +348,24 @@ class Proxy extends \OC_FileProxy { $fileInfo = false; // get file info from database/cache if not .part file - if (!Keymanager::isPartialFilePath($path)) { + if (!Helper::isPartialFilePath($path)) { + $proxyState = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; $fileInfo = $view->getFileInfo($path); + \OC_FileProxy::$enabled = $proxyState; } // if file is encrypted return real file size if (is_array($fileInfo) && $fileInfo['encrypted'] === true) { + // try to fix unencrypted file size if it doesn't look plausible + if ((int)$fileInfo['size'] > 0 && (int)$fileInfo['unencrypted_size'] === 0 ) { + $fixSize = $util->getFileSize($path); + $fileInfo['unencrypted_size'] = $fixSize; + // put file info if not .part file + if (!Helper::isPartialFilePath($relativePath)) { + $view->putFileInfo($path, $fileInfo); + } + } $size = $fileInfo['unencrypted_size']; } else { // self healing if file was removed from file cache @@ -374,8 +373,6 @@ class Proxy extends \OC_FileProxy { $fileInfo = array(); } - $userId = \OCP\User::getUser(); - $util = new Util($view, $userId); $fixSize = $util->getFileSize($path); if ($fixSize > 0) { $size = $fixSize; @@ -384,7 +381,7 @@ class Proxy extends \OC_FileProxy { $fileInfo['unencrypted_size'] = $size; // put file info if not .part file - if (!Keymanager::isPartialFilePath($relativePath)) { + if (!Helper::isPartialFilePath($relativePath)) { $view->putFileInfo($path, $fileInfo); } } @@ -404,7 +401,7 @@ class Proxy extends \OC_FileProxy { $view = new \OC_FilesystemView('/'); $session = new \OCA\Encryption\Session($view); - $userId = \OCP\User::getUser(); + $userId = Helper::getUser($path); $util = new Util($view, $userId); // split the path parts diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php index 1911386cd1..25f2198181 100644 --- a/apps/files_encryption/lib/session.php +++ b/apps/files_encryption/lib/session.php @@ -30,6 +30,11 @@ class Session { private $view; + const NOT_INITIALIZED = '0'; + const INIT_EXECUTED = '1'; + const INIT_SUCCESSFUL = '2'; + + /** * @brief if session is started, check if ownCloud key pair is set up, if not create it * @param \OC_FilesystemView $view @@ -112,6 +117,36 @@ class Session { } + /** + * @brief Sets status of encryption app + * @param string $init INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED + * @return bool + * + * @note this doesn not indicate of the init was successful, we just remeber the try! + */ + public function setInitialized($init) { + + \OC::$session->set('encryptionInitialized', $init); + + return true; + + } + + + /** + * @brief Gets status if we already tried to initialize the encryption app + * @returns init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED + * + * @note this doesn not indicate of the init was successful, we just remeber the try! + */ + public function getInitialized() { + if (!is_null(\OC::$session->get('encryptionInitialized'))) { + return \OC::$session->get('encryptionInitialized'); + } else { + return self::NOT_INITIALIZED; + } + } + /** * @brief Gets user or public share private key from session * @returns string $privateKey The user's plaintext private key diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php index 3c1eb2c5f5..7a37d2200a 100644 --- a/apps/files_encryption/lib/stream.php +++ b/apps/files_encryption/lib/stream.php @@ -55,6 +55,7 @@ class Stream { private $rawPath; // The raw path relative to the data dir private $relPath; // rel path to users file dir private $userId; + private $keyId; private $handle; // Resource returned by fopen private $meta = array(); // Header / meta for source stream private $writeCache; @@ -62,10 +63,12 @@ class Stream { private $unencryptedSize; private $publicKey; private $encKeyfile; + private $newFile; // helper var, we only need to write the keyfile for new files /** * @var \OC\Files\View */ private $rootView; // a fsview object set to '/' + /** * @var \OCA\Encryption\Session */ @@ -73,7 +76,7 @@ class Stream { private $privateKey; /** - * @param $path + * @param $path raw path relative to data/ * @param $mode * @param $options * @param $opened_path @@ -81,23 +84,40 @@ class Stream { */ public function stream_open($path, $mode, $options, &$opened_path) { + // assume that the file already exist before we decide it finally in getKey() + $this->newFile = false; + if (!isset($this->rootView)) { $this->rootView = new \OC_FilesystemView('/'); } + $this->session = new \OCA\Encryption\Session($this->rootView); - $this->privateKey = $this->session->getPrivateKey($this->userId); - - $util = new Util($this->rootView, \OCP\USER::getUser()); - - $this->userId = $util->getUserId(); - - // Strip identifier text from path, this gives us the path relative to data//files - $this->relPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path)); + $this->privateKey = $this->session->getPrivateKey(); // rawPath is relative to the data directory - $this->rawPath = $util->getUserFilesDir() . $this->relPath; + $this->rawPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path)); + + $this->userId = Helper::getUser($this->rawPath); + + $util = new Util($this->rootView, $this->userId); + + // get the key ID which we want to use, can be the users key or the + // public share key + $this->keyId = $util->getKeyId(); + + // Strip identifier text from path, this gives us the path relative to data//files + $this->relPath = Helper::stripUserFilesPath($this->rawPath); + // if raw path doesn't point to a real file, check if it is a version or a file in the trash bin + if ($this->relPath === false) { + $this->relPath = Helper::getPathToRealFile($this->rawPath); + } + + if($this->relPath === false) { + \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR); + return false; + } // Disable fileproxies so we can get the file size and open the source file without recursive encryption $proxyStatus = \OC_FileProxy::$enabled; @@ -118,7 +138,7 @@ class Stream { if($this->privateKey === false) { // if private key is not valid redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage(); + \OCA\Encryption\Helper::redirectToErrorPage($this->session); } $this->size = $this->rootView->filesize($this->rawPath, $mode); @@ -175,7 +195,7 @@ class Stream { } // Get the data from the file handle - $data = fread($this->handle, 8192); + $data = fread($this->handle, $count); $result = null; @@ -236,21 +256,26 @@ class Stream { // Fetch and decrypt keyfile // Fetch existing keyfile - $this->encKeyfile = Keymanager::getFileKey($this->rootView, $this->userId, $this->relPath); + $util = new \OCA\Encryption\Util($this->rootView, $this->userId); + $this->encKeyfile = Keymanager::getFileKey($this->rootView, $util, $this->relPath); // If a keyfile already exists if ($this->encKeyfile) { + $shareKey = Keymanager::getShareKey($this->rootView, $this->keyId, $util, $this->relPath); + // if there is no valid private key return false if ($this->privateKey === false) { - // if private key is not valid redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage(); - + \OCA\Encryption\Helper::redirectToErrorPage($this->session); return false; } - $shareKey = Keymanager::getShareKey($this->rootView, $this->userId, $this->relPath); + if ($shareKey === false) { + // if no share key is available redirect user to a error page + \OCA\Encryption\Helper::redirectToErrorPage($this->session, \OCA\Encryption\Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND); + return false; + } $this->plainKey = Crypt::multiKeyDecrypt($this->encKeyfile, $shareKey, $this->privateKey); @@ -258,6 +283,8 @@ class Stream { } else { + $this->newFile = true; + return false; } @@ -281,9 +308,9 @@ class Stream { return strlen($data); } - // Disable the file proxies so that encryption is not - // automatically attempted when the file is written to disk - - // we are handling that separately here and we don't want to + // Disable the file proxies so that encryption is not + // automatically attempted when the file is written to disk - + // we are handling that separately here and we don't want to // get into an infinite loop $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; @@ -296,7 +323,7 @@ class Stream { $pointer = ftell($this->handle); // Get / generate the keyfile for the file we're handling - // If we're writing a new file (not overwriting an existing + // If we're writing a new file (not overwriting an existing // one), save the newly generated keyfile if (!$this->getKey()) { @@ -304,7 +331,7 @@ class Stream { } - // If extra data is left over from the last round, make sure it + // If extra data is left over from the last round, make sure it // is integrated into the next 6126 / 8192 block if ($this->writeCache) { @@ -329,12 +356,12 @@ class Stream { if ($remainingLength < 6126) { // Set writeCache to contents of $data - // The writeCache will be carried over to the - // next write round, and added to the start of - // $data to ensure that written blocks are - // always the correct length. If there is still - // data in writeCache after the writing round - // has finished, then the data will be written + // The writeCache will be carried over to the + // next write round, and added to the start of + // $data to ensure that written blocks are + // always the correct length. If there is still + // data in writeCache after the writing round + // has finished, then the data will be written // to disk by $this->flush(). $this->writeCache = $data; @@ -348,7 +375,7 @@ class Stream { $encrypted = $this->preWriteEncrypt($chunk, $this->plainKey); - // Write the data chunk to disk. This will be + // Write the data chunk to disk. This will be // attended to the last data chunk if the file // being handled totals more than 6126 bytes fwrite($this->handle, $encrypted); @@ -436,9 +463,7 @@ class Stream { fwrite($this->handle, $encrypted); $this->writeCache = ''; - } - } /** @@ -451,77 +476,86 @@ class Stream { // if there is no valid private key return false if ($this->privateKey === false) { - // cleanup - if ($this->meta['mode'] !== 'r' && $this->meta['mode'] !== 'rb') { + // cleanup + if ($this->meta['mode'] !== 'r' && $this->meta['mode'] !== 'rb') { - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // Disable encryption proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - if ($this->rootView->file_exists($this->rawPath) && $this->size === 0) { - $this->rootView->unlink($this->rawPath); - } - - // Re-enable proxy - our work is done - \OC_FileProxy::$enabled = $proxyStatus; + if ($this->rootView->file_exists($this->rawPath) && $this->size === 0) { + $this->rootView->unlink($this->rawPath); } + // Re-enable proxy - our work is done + \OC_FileProxy::$enabled = $proxyStatus; + } + // if private key is not valid redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage(); + \OCA\Encryption\Helper::redirectToErrorPage($this->session); } if ( - $this->meta['mode'] !== 'r' - and $this->meta['mode'] !== 'rb' - and $this->size > 0 + $this->meta['mode'] !== 'r' && + $this->meta['mode'] !== 'rb' && + $this->size > 0 && + $this->unencryptedSize > 0 ) { - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - // Fetch user's public key - $this->publicKey = Keymanager::getPublicKey($this->rootView, $this->userId); + // only write keyfiles if it was a new file + if ($this->newFile === true) { - // Check if OC sharing api is enabled - $sharingEnabled = \OCP\Share::isEnabled(); + // Disable encryption proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - $util = new Util($this->rootView, $this->userId); + // Fetch user's public key + $this->publicKey = Keymanager::getPublicKey($this->rootView, $this->keyId); - // Get all users sharing the file includes current user - $uniqueUserIds = $util->getSharingUsersArray($sharingEnabled, $this->relPath, $this->userId); + // Check if OC sharing api is enabled + $sharingEnabled = \OCP\Share::isEnabled(); - // Fetch public keys for all sharing users - $publicKeys = Keymanager::getPublicKeys($this->rootView, $uniqueUserIds); + $util = new Util($this->rootView, $this->userId); - // Encrypt enc key for all sharing users - $this->encKeyfiles = Crypt::multiKeyEncrypt($this->plainKey, $publicKeys); + // Get all users sharing the file includes current user + $uniqueUserIds = $util->getSharingUsersArray($sharingEnabled, $this->relPath, $this->userId); + $checkedUserIds = $util->filterShareReadyUsers($uniqueUserIds); - // Save the new encrypted file key - Keymanager::setFileKey($this->rootView, $this->relPath, $this->userId, $this->encKeyfiles['data']); + // Fetch public keys for all sharing users + $publicKeys = Keymanager::getPublicKeys($this->rootView, $checkedUserIds['ready']); - // Save the sharekeys - Keymanager::setShareKeys($this->rootView, $this->relPath, $this->encKeyfiles['keys']); + // Encrypt enc key for all sharing users + $this->encKeyfiles = Crypt::multiKeyEncrypt($this->plainKey, $publicKeys); - // get file info - $fileInfo = $this->rootView->getFileInfo($this->rawPath); - if (!is_array($fileInfo)) { - $fileInfo = array(); + // Save the new encrypted file key + Keymanager::setFileKey($this->rootView, $util, $this->relPath, $this->encKeyfiles['data']); + + // Save the sharekeys + Keymanager::setShareKeys($this->rootView, $util, $this->relPath, $this->encKeyfiles['keys']); + + // Re-enable proxy - our work is done + \OC_FileProxy::$enabled = $proxyStatus; } - // Re-enable proxy - our work is done - \OC_FileProxy::$enabled = $proxyStatus; + // we need to update the file info for the real file, not for the + // part file. + $path = Helper::stripPartialFileExtension($this->rawPath); - // set encryption data - $fileInfo['encrypted'] = true; - $fileInfo['size'] = $this->size; - $fileInfo['unencrypted_size'] = $this->unencryptedSize; + // get file info + $fileInfo = $this->rootView->getFileInfo($path); + if (is_array($fileInfo)) { + // set encryption data + $fileInfo['encrypted'] = true; + $fileInfo['size'] = $this->size; + $fileInfo['unencrypted_size'] = $this->unencryptedSize; + + // set fileinfo + $this->rootView->putFileInfo($path, $fileInfo); + } - // set fileinfo - $this->rootView->putFileInfo($this->rawPath, $fileInfo); } return fclose($this->handle); - } } diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index 50e823585d..bf7c49504a 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -21,30 +21,6 @@ * */ -# Bugs -# ---- -# Sharing a file to a user without encryption set up will not provide them with access but won't notify the sharer -# Sharing all files to admin for recovery purposes still in progress -# Possibly public links are broken (not tested since last merge of master) - - -# Missing features -# ---------------- -# Make sure user knows if large files weren't encrypted - - -# Test -# ---- -# Test that writing files works when recovery is enabled, and sharing API is disabled -# Test trashbin support - - -// Old Todo: -// - Crypt/decrypt button in the userinterface -// - Setting if crypto should be on by default -// - Add a setting "Don´t encrypt files larger than xx because of performance -// reasons" - namespace OCA\Encryption; /** @@ -57,52 +33,13 @@ namespace OCA\Encryption; class Util { - // Web UI: - - //// DONE: files created via web ui are encrypted - //// DONE: file created & encrypted via web ui are readable in web ui - //// DONE: file created & encrypted via web ui are readable via webdav - - - // WebDAV: - - //// DONE: new data filled files added via webdav get encrypted - //// DONE: new data filled files added via webdav are readable via webdav - //// DONE: reading unencrypted files when encryption is enabled works via - //// webdav - //// DONE: files created & encrypted via web ui are readable via webdav - - - // Legacy support: - - //// DONE: add method to check if file is encrypted using new system - //// DONE: add method to check if file is encrypted using old system - //// DONE: add method to fetch legacy key - //// DONE: add method to decrypt legacy encrypted data - - - // Admin UI: - - //// DONE: changing user password also changes encryption passphrase - - //// TODO: add support for optional recovery in case of lost passphrase / keys - //// TODO: add admin optional required long passphrase for users - //// TODO: implement flag system to allow user to specify encryption by folder, subfolder, etc. - - - // Integration testing: - - //// TODO: test new encryption with versioning - //// DONE: test new encryption with sharing - //// TODO: test new encryption with proxies - const MIGRATION_COMPLETED = 1; // migration to new encryption completed const MIGRATION_IN_PROGRESS = -1; // migration is running const MIGRATION_OPEN = 0; // user still needs to be migrated - private $view; // OC_FilesystemView object for filesystem operations - private $userId; // ID of the currently logged-in user + private $userId; // ID of the user we use to encrypt/decrypt files + private $keyId; // ID of the key we want to manipulate private $client; // Client side encryption mode flag private $publicKeyDir; // Dir containing all public user keys private $encryptionDir; // Dir containing user's files_encryption @@ -122,47 +59,33 @@ class Util { public function __construct(\OC_FilesystemView $view, $userId, $client = false) { $this->view = $view; - $this->userId = $userId; $this->client = $client; - $this->isPublic = false; + $this->userId = $userId; $this->publicShareKeyId = \OC_Appconfig::getValue('files_encryption', 'publicShareKeyId'); $this->recoveryKeyId = \OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); - // if we are anonymous/public - if (\OCA\Encryption\Helper::isPublicAccess()) { - $this->userId = $this->publicShareKeyId; - - // only handle for files_sharing app - if (isset($GLOBALS['app']) && $GLOBALS['app'] === 'files_sharing') { - $this->userDir = '/' . $GLOBALS['fileOwner']; - $this->fileFolderName = 'files'; - $this->userFilesDir = '/' . $GLOBALS['fileOwner'] . '/' - . $this->fileFolderName; // TODO: Does this need to be user configurable? - $this->publicKeyDir = '/' . 'public-keys'; - $this->encryptionDir = '/' . $GLOBALS['fileOwner'] . '/' . 'files_encryption'; - $this->keyfilesPath = $this->encryptionDir . '/' . 'keyfiles'; - $this->shareKeysPath = $this->encryptionDir . '/' . 'share-keys'; - $this->publicKeyPath = - $this->publicKeyDir . '/' . $this->userId . '.public.key'; // e.g. data/public-keys/admin.public.key - $this->privateKeyPath = - '/owncloud_private_key/' . $this->userId . '.private.key'; // e.g. data/admin/admin.private.key - $this->isPublic = true; - } - - } else { - $this->userDir = '/' . $this->userId; - $this->fileFolderName = 'files'; - $this->userFilesDir = - '/' . $this->userId . '/' . $this->fileFolderName; // TODO: Does this need to be user configurable? - $this->publicKeyDir = '/' . 'public-keys'; - $this->encryptionDir = '/' . $this->userId . '/' . 'files_encryption'; - $this->keyfilesPath = $this->encryptionDir . '/' . 'keyfiles'; - $this->shareKeysPath = $this->encryptionDir . '/' . 'share-keys'; - $this->publicKeyPath = + $this->userDir = '/' . $this->userId; + $this->fileFolderName = 'files'; + $this->userFilesDir = + '/' . $userId . '/' . $this->fileFolderName; // TODO: Does this need to be user configurable? + $this->publicKeyDir = '/' . 'public-keys'; + $this->encryptionDir = '/' . $this->userId . '/' . 'files_encryption'; + $this->keyfilesPath = $this->encryptionDir . '/' . 'keyfiles'; + $this->shareKeysPath = $this->encryptionDir . '/' . 'share-keys'; + $this->publicKeyPath = $this->publicKeyDir . '/' . $this->userId . '.public.key'; // e.g. data/public-keys/admin.public.key - $this->privateKeyPath = + $this->privateKeyPath = $this->encryptionDir . '/' . $this->userId . '.private.key'; // e.g. data/admin/admin.private.key + // make sure that the owners home is mounted + \OC\Files\Filesystem::initMountPoints($userId); + + if (\OCA\Encryption\Helper::isPublicAccess()) { + $this->keyId = $this->publicShareKeyId; + $this->isPublic = true; + } else { + $this->keyId = $this->userId; + $this->isPublic = false; } } @@ -178,15 +101,24 @@ class Util { or !$this->view->file_exists($this->publicKeyPath) or !$this->view->file_exists($this->privateKeyPath) ) { - return false; - } else { - return true; - } + } + /** + * @brief check if the users private & public key exists + * @return boolean + */ + public function userKeysExists() { + if ( + $this->view->file_exists($this->privateKeyPath) && + $this->view->file_exists($this->publicKeyPath)) { + return true; + } else { + return false; + } } /** @@ -248,13 +180,13 @@ class Util { // check if public-key exists but private-key is missing if ($this->view->file_exists($this->publicKeyPath) && !$this->view->file_exists($this->privateKeyPath)) { \OCP\Util::writeLog('Encryption library', - 'public key exists but private key is missing for "' . $this->userId . '"', \OCP\Util::FATAL); + 'public key exists but private key is missing for "' . $this->keyId . '"', \OCP\Util::FATAL); return false; } else { if (!$this->view->file_exists($this->publicKeyPath) && $this->view->file_exists($this->privateKeyPath) ) { \OCP\Util::writeLog('Encryption library', - 'private key exists but public key is missing for "' . $this->userId . '"', \OCP\Util::FATAL); + 'private key exists but public key is missing for "' . $this->keyId . '"', \OCP\Util::FATAL); return false; } } @@ -264,11 +196,12 @@ class Util { if (false === $this->recoveryEnabledForUser()) { // create database configuration - $sql = 'INSERT INTO `*PREFIX*encryption` (`uid`,`mode`,`recovery_enabled`) VALUES (?,?,?)'; + $sql = 'INSERT INTO `*PREFIX*encryption` (`uid`,`mode`,`recovery_enabled`,`migration_status`) VALUES (?,?,?,?)'; $args = array( $this->userId, 'server-side', - 0 + 0, + self::MIGRATION_OPEN ); $query = \OCP\DB::prepare($sql); $query->execute($args); @@ -392,72 +325,73 @@ class Util { $this->view->is_dir($directory) && $handle = $this->view->opendir($directory) ) { + if(is_resource($handle)) { + while (false !== ($file = readdir($handle))) { - while (false !== ($file = readdir($handle))) { + if ( + $file !== "." + && $file !== ".." + ) { - if ( - $file !== "." - && $file !== ".." - ) { + $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file); + $relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath); - $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file); - $relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath); + // If the path is a directory, search + // its contents + if ($this->view->is_dir($filePath)) { - // If the path is a directory, search - // its contents - if ($this->view->is_dir($filePath)) { + $this->findEncFiles($filePath, $found); - $this->findEncFiles($filePath, $found); + // If the path is a file, determine + // its encryption status + } elseif ($this->view->is_file($filePath)) { - // If the path is a file, determine - // its encryption status - } elseif ($this->view->is_file($filePath)) { + // Disable proxies again, some- + // where they got re-enabled :/ + \OC_FileProxy::$enabled = false; - // Disable proxies again, some- - // where they got re-enabled :/ - \OC_FileProxy::$enabled = false; + $isEncryptedPath = $this->isEncryptedPath($filePath); + // If the file is encrypted + // NOTE: If the userId is + // empty or not set, file will + // detected as plain + // NOTE: This is inefficient; + // scanning every file like this + // will eat server resources :( + if ( + Keymanager::getFileKey($this->view, $this, $relPath) + && $isEncryptedPath + ) { - $isEncryptedPath = $this->isEncryptedPath($filePath); - // If the file is encrypted - // NOTE: If the userId is - // empty or not set, file will - // detected as plain - // NOTE: This is inefficient; - // scanning every file like this - // will eat server resources :( - if ( - Keymanager::getFileKey($this->view, $this->userId, $relPath) - && $isEncryptedPath - ) { + $found['encrypted'][] = array( + 'name' => $file, + 'path' => $filePath + ); - $found['encrypted'][] = array( - 'name' => $file, - 'path' => $filePath - ); + // If the file uses old + // encryption system + } elseif (Crypt::isLegacyEncryptedContent($isEncryptedPath, $relPath)) { - // If the file uses old - // encryption system - } elseif (Crypt::isLegacyEncryptedContent($isEncryptedPath, $relPath)) { + $found['legacy'][] = array( + 'name' => $file, + 'path' => $filePath + ); - $found['legacy'][] = array( - 'name' => $file, - 'path' => $filePath - ); + // If the file is not encrypted + } else { - // If the file is not encrypted - } else { + $found['plain'][] = array( + 'name' => $file, + 'path' => $relPath + ); - $found['plain'][] = array( - 'name' => $file, - 'path' => $relPath - ); + } } } } - } \OC_FileProxy::$enabled = true; @@ -530,22 +464,19 @@ class Util { */ public function isEncryptedPath($path) { - // Disable encryption proxy so data retrieved is in its - // original form - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + $relPath = Helper::getPathToRealFile($path); - // we only need 24 byte from the last chunk - $data = ''; - $handle = $this->view->fopen($path, 'r'); - if (is_resource($handle) && !fseek($handle, -24, SEEK_END)) { - $data = fgets($handle); + if ($relPath === false) { + $relPath = Helper::stripUserFilesPath($path); } - // re-enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + $fileKey = Keymanager::getFileKey($this->view, $this, $relPath); - return Crypt::isCatfileContent($data); + if ($fileKey === false) { + return false; + } + + return true; } @@ -565,22 +496,27 @@ class Util { // split the path parts $pathParts = explode('/', $path); - // get relative path - $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); - if (isset($pathParts[2]) && $pathParts[2] === 'files' && $this->view->file_exists($path) && $this->isEncryptedPath($path) ) { // get the size from filesystem - $fullPath = $this->view->getLocalFile($path); - $size = filesize($fullPath); + $size = $this->view->filesize($path); + + // fast path, else the calculation for $lastChunkNr is bogus + if ($size === 0) { + \OC_FileProxy::$enabled = $proxyStatus; + return 0; + } // calculate last chunk nr - $lastChunkNr = floor($size / 8192); + // next highest is end of chunks, one subtracted is last one + // we have to read the last chunk, we can't just calculate it (because of padding etc) + $lastChunkNr = ceil($size/ 8192) - 1; + $lastChunkSize = $size - ($lastChunkNr * 8192); // open stream - $stream = fopen('crypt://' . $relativePath, "r"); + $stream = fopen('crypt://' . $path, "r"); if (is_resource($stream)) { // calculate last chunk position @@ -590,7 +526,7 @@ class Util { fseek($stream, $lastChunckPos); // get the content of the last chunk - $lastChunkContent = fread($stream, 8192); + $lastChunkContent = fread($stream, $lastChunkSize); // calc the real file size with the size of the last chunk $realSize = (($lastChunkNr * 6126) + strlen($lastChunkContent)); @@ -662,6 +598,205 @@ class Util { } + /** + * @brief encrypt versions from given file + * @param array $filelist list of encrypted files, relative to data/user/files + * @return boolean + */ + private function encryptVersions($filelist) { + + $successful = true; + + if (\OCP\App::isEnabled('files_versions')) { + + foreach ($filelist as $filename) { + + $versions = \OCA\Files_Versions\Storage::getVersions($this->userId, $filename); + foreach ($versions as $version) { + + $path = '/' . $this->userId . '/files_versions/' . $version['path'] . '.v' . $version['version']; + + $encHandle = fopen('crypt://' . $path . '.part', 'wb'); + + if ($encHandle === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + $plainHandle = $this->view->fopen($path, 'rb'); + if ($plainHandle === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '.part", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + stream_copy_to_stream($plainHandle, $encHandle); + + fclose($encHandle); + fclose($plainHandle); + + $this->view->rename($path . '.part', $path); + } + } + } + + return $successful; + } + + /** + * @brief decrypt versions from given file + * @param string $filelist list of decrypted files, relative to data/user/files + * @return boolean + */ + private function decryptVersions($filelist) { + + $successful = true; + + if (\OCP\App::isEnabled('files_versions')) { + + foreach ($filelist as $filename) { + + $versions = \OCA\Files_Versions\Storage::getVersions($this->userId, $filename); + foreach ($versions as $version) { + + $path = '/' . $this->userId . '/files_versions/' . $version['path'] . '.v' . $version['version']; + + $encHandle = fopen('crypt://' . $path, 'rb'); + + if ($encHandle === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + $plainHandle = $this->view->fopen($path . '.part', 'wb'); + if ($plainHandle === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '.part", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + stream_copy_to_stream($encHandle, $plainHandle); + + fclose($encHandle); + fclose($plainHandle); + + $this->view->rename($path . '.part', $path); + } + } + } + + return $successful; + } + + /** + * @brief Decrypt all files + * @return bool + */ + public function decryptAll() { + + $found = $this->findEncFiles($this->userId . '/files'); + + $successful = true; + + if ($found) { + + $versionStatus = \OCP\App::isEnabled('files_versions'); + \OC_App::disable('files_versions'); + + $decryptedFiles = array(); + + // Encrypt unencrypted files + foreach ($found['encrypted'] as $encryptedFile) { + + //relative to data//file + $relPath = Helper::stripUserFilesPath($encryptedFile['path']); + + //get file info + $fileInfo = \OC\Files\Filesystem::getFileInfo($relPath); + + //relative to /data + $rawPath = $encryptedFile['path']; + + //get timestamp + $timestamp = $fileInfo['mtime']; + + //enable proxy to use OC\Files\View to access the original file + \OC_FileProxy::$enabled = true; + + // Open enc file handle for binary reading + $encHandle = $this->view->fopen($rawPath, 'rb'); + + // Disable proxy to prevent file being encrypted again + \OC_FileProxy::$enabled = false; + + if ($encHandle === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $rawPath . '", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + // Open plain file handle for binary writing, with same filename as original plain file + $plainHandle = $this->view->fopen($rawPath . '.part', 'wb'); + if ($plainHandle === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $rawPath . '.part", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + // Move plain file to a temporary location + $size = stream_copy_to_stream($encHandle, $plainHandle); + if ($size === 0) { + \OCP\Util::writeLog('Encryption library', 'Zero bytes copied of "' . $rawPath . '", decryption failed!', \OCP\Util::FATAL); + $successful = false; + continue; + } + + fclose($encHandle); + fclose($plainHandle); + + $fakeRoot = $this->view->getRoot(); + $this->view->chroot('/' . $this->userId . '/files'); + + $this->view->rename($relPath . '.part', $relPath); + + //set timestamp + $this->view->touch($relPath, $timestamp); + + $this->view->chroot($fakeRoot); + + // Add the file to the cache + \OC\Files\Filesystem::putFileInfo($relPath, array( + 'encrypted' => false, + 'size' => $size, + 'unencrypted_size' => 0, + 'etag' => $fileInfo['etag'] + )); + + $decryptedFiles[] = $relPath; + + } + + if ($versionStatus) { + \OC_App::enable('files_versions'); + } + + if (!$this->decryptVersions($decryptedFiles)) { + $successful = false; + } + + if ($successful) { + $this->view->deleteAll($this->keyfilesPath); + $this->view->deleteAll($this->shareKeysPath); + } + + \OC_FileProxy::$enabled = true; + } + + return $successful; + } + /** * @brief Encrypt all files in a directory * @param string $dirPath the directory whose files will be encrypted @@ -672,44 +807,68 @@ class Util { */ public function encryptAll($dirPath, $legacyPassphrase = null, $newPassphrase = null) { - if ($found = $this->findEncFiles($dirPath)) { + $found = $this->findEncFiles($dirPath); + + if ($found) { // Disable proxy to prevent file being encrypted twice \OC_FileProxy::$enabled = false; + $versionStatus = \OCP\App::isEnabled('files_versions'); + \OC_App::disable('files_versions'); + + $encryptedFiles = array(); + // Encrypt unencrypted files foreach ($found['plain'] as $plainFile) { + //get file info + $fileInfo = \OC\Files\Filesystem::getFileInfo($plainFile['path']); + //relative to data//file $relPath = $plainFile['path']; //relative to /data $rawPath = '/' . $this->userId . '/files/' . $plainFile['path']; + // keep timestamp + $timestamp = $fileInfo['mtime']; + // Open plain file handle for binary reading $plainHandle = $this->view->fopen($rawPath, 'rb'); // Open enc file handle for binary writing, with same filename as original plain file - $encHandle = fopen('crypt://' . $relPath . '.part', 'wb'); + $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb'); - // Move plain file to a temporary location - $size = stream_copy_to_stream($plainHandle, $encHandle); + if (is_resource($encHandle)) { + // Move plain file to a temporary location + $size = stream_copy_to_stream($plainHandle, $encHandle); - fclose($encHandle); + fclose($encHandle); + fclose($plainHandle); - $fakeRoot = $this->view->getRoot(); - $this->view->chroot('/' . $this->userId . '/files'); + $fakeRoot = $this->view->getRoot(); + $this->view->chroot('/' . $this->userId . '/files'); - $this->view->rename($relPath . '.part', $relPath); + $this->view->rename($relPath . '.part', $relPath); - $this->view->chroot($fakeRoot); + // set timestamp + $this->view->touch($relPath, $timestamp); - // Add the file to the cache - \OC\Files\Filesystem::putFileInfo($relPath, array( - 'encrypted' => true, - 'size' => $size, - 'unencrypted_size' => $size - )); + $encSize = $this->view->filesize($relPath); + + $this->view->chroot($fakeRoot); + + // Add the file to the cache + \OC\Files\Filesystem::putFileInfo($relPath, array( + 'encrypted' => true, + 'size' => $encSize, + 'unencrypted_size' => $size, + 'etag' => $fileInfo['etag'] + )); + + $encryptedFiles[] = $relPath; + } } // Encrypt legacy encrypted files @@ -750,6 +909,12 @@ class Util { \OC_FileProxy::$enabled = true; + if ($versionStatus) { + \OC_App::enable('files_versions'); + } + + $this->encryptVersions($encryptedFiles); + // If files were found, return true return true; } else { @@ -878,46 +1043,22 @@ class Util { } /** - * @brief Decrypt a keyfile without knowing how it was encrypted + * @brief Decrypt a keyfile * @param string $filePath - * @param string $fileOwner * @param string $privateKey * @return bool|string - * @note Checks whether file was encrypted with openssl_seal or - * openssl_encrypt, and decrypts accrdingly - * @note This was used when 2 types of encryption for keyfiles was used, - * but now we've switched to exclusively using openssl_seal() */ - public function decryptUnknownKeyfile($filePath, $fileOwner, $privateKey) { + private function decryptKeyfile($filePath, $privateKey) { // Get the encrypted keyfile - // NOTE: the keyfile format depends on how it was encrypted! At - // this stage we don't know how it was encrypted - $encKeyfile = Keymanager::getFileKey($this->view, $this->userId, $filePath); + $encKeyfile = Keymanager::getFileKey($this->view, $this, $filePath); - // We need to decrypt the keyfile - // Has the file been shared yet? - if ( - $this->userId === $fileOwner - && !Keymanager::getShareKey($this->view, $this->userId, $filePath) // NOTE: we can't use isShared() here because it's a post share hook so it always returns true - ) { + // The file has a shareKey and must use it for decryption + $shareKey = Keymanager::getShareKey($this->view, $this->keyId, $this, $filePath); - // The file has no shareKey, and its keyfile must be - // decrypted conventionally - $plainKeyfile = Crypt::keyDecrypt($encKeyfile, $privateKey); - - - } else { - - // The file has a shareKey and must use it for decryption - $shareKey = Keymanager::getShareKey($this->view, $this->userId, $filePath); - - $plainKeyfile = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey); - - } + $plainKeyfile = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey); return $plainKeyfile; - } /** @@ -956,7 +1097,7 @@ class Util { $fileOwner = \OC\Files\Filesystem::getOwner($filePath); // Decrypt keyfile - $plainKeyfile = $this->decryptUnknownKeyfile($filePath, $fileOwner, $privateKey); + $plainKeyfile = $this->decryptKeyfile($filePath, $privateKey); // Re-enc keyfile to (additional) sharekeys $multiEncKey = Crypt::multiKeyEncrypt($plainKeyfile, $userPubKeys); @@ -964,8 +1105,8 @@ class Util { // Save the recrypted key to it's owner's keyfiles directory // Save new sharekeys to all necessary user directory if ( - !Keymanager::setFileKey($this->view, $filePath, $fileOwner, $multiEncKey['data']) - || !Keymanager::setShareKeys($this->view, $filePath, $multiEncKey['keys']) + !Keymanager::setFileKey($this->view, $this, $filePath, $multiEncKey['data']) + || !Keymanager::setShareKeys($this->view, $this, $filePath, $multiEncKey['keys']) ) { \OCP\Util::writeLog('Encryption library', @@ -1000,6 +1141,8 @@ class Util { // Make sure that a share key is generated for the owner too list($owner, $ownerPath) = $this->getUidAndFilename($filePath); + $ownerPath = \OCA\Encryption\Helper::stripPartialFileExtension($ownerPath); + $userIds = array(); if ($sharingEnabled) { @@ -1012,7 +1155,7 @@ class Util { } - // If recovery is enabled, add the + // If recovery is enabled, add the // Admin UID to list of users to share to if ($recoveryEnabled) { // Find recoveryAdmin user ID @@ -1114,7 +1257,6 @@ class Util { $sql = 'SELECT `migration_status` FROM `*PREFIX*encryption` WHERE `uid` = ?'; $args = array($this->userId); - $query = \OCP\DB::prepare($sql); $result = $query->execute($args); @@ -1135,9 +1277,23 @@ class Util { // If no record is found if (empty($migrationStatus)) { \OCP\Util::writeLog('Encryption library', "Could not get migration status for " . $this->userId . ", no record found", \OCP\Util::ERROR); - return false; - // If a record is found - } else { + // insert missing entry in DB with status open if the user exists + if (\OCP\User::userExists($this->userId)) { + $sql = 'INSERT INTO `*PREFIX*encryption` (`uid`,`mode`,`recovery_enabled`,`migration_status`) VALUES (?,?,?,?)'; + $args = array( + $this->userId, + 'server-side', + 0, + self::MIGRATION_OPEN + ); + $query = \OCP\DB::prepare($sql); + $query->execute($args); + + return self::MIGRATION_OPEN; + } else { + return false; + } + } else { // If a record is found return (int)$migrationStatus[0]; } @@ -1153,13 +1309,30 @@ class Util { */ public function getUidAndFilename($path) { + $pathinfo = pathinfo($path); + $partfile = false; + $parentFolder = false; + if (array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') { + // if the real file exists we check this file + $filePath = $this->userFilesDir . '/' .$pathinfo['dirname'] . '/' . $pathinfo['filename']; + if ($this->view->file_exists($filePath)) { + $pathToCheck = $pathinfo['dirname'] . '/' . $pathinfo['filename']; + } else { // otherwise we look for the parent + $pathToCheck = $pathinfo['dirname']; + $parentFolder = true; + } + $partfile = true; + } else { + $pathToCheck = $path; + } + $view = new \OC\Files\View($this->userFilesDir); - $fileOwnerUid = $view->getOwner($path); + $fileOwnerUid = $view->getOwner($pathToCheck); // handle public access if ($this->isPublic) { $filename = $path; - $fileOwnerUid = $GLOBALS['fileOwner']; + $fileOwnerUid = $this->userId; return array( $fileOwnerUid, @@ -1183,12 +1356,18 @@ class Util { $filename = $path; } else { - - $info = $view->getFileInfo($path); + $info = $view->getFileInfo($pathToCheck); $ownerView = new \OC\Files\View('/' . $fileOwnerUid . '/files'); // Fetch real file path from DB - $filename = $ownerView->getPath($info['fileid']); // TODO: Check that this returns a path without including the user data dir + $filename = $ownerView->getPath($info['fileid']); + if ($parentFolder) { + $filename = $filename . '/'. $pathinfo['filename']; + } + + if ($partfile) { + $filename = $filename . '.' . $pathinfo['extension']; + } } @@ -1197,10 +1376,9 @@ class Util { \OC_Filesystem::normalizePath($filename) ); } - - } + /** * @brief go recursively through a dir and collect all files and sub files. * @param string $dir relative to the users files folder @@ -1379,6 +1557,13 @@ class Util { return $this->userId; } + /** + * @return string + */ + public function getKeyId() { + return $this->keyId; + } + /** * @return string */ @@ -1579,4 +1764,32 @@ class Util { return false; } + /** + * @brief decrypt private key and add it to the current session + * @param array $params with 'uid' and 'password' + * @return mixed session or false + */ + public function initEncryption($params) { + + $session = new \OCA\Encryption\Session($this->view); + + // we tried to initialize the encryption app for this session + $session->setInitialized(\OCA\Encryption\Session::INIT_EXECUTED); + + $encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']); + + $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']); + + if ($privateKey === false) { + \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid'] + . '" is not valid! Maybe the user password was changed from outside if so please change it back to gain access', \OCP\Util::ERROR); + return false; + } + + $session->setPrivateKey($privateKey); + $session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL); + + return $session; + } + } diff --git a/apps/files_encryption/settings-admin.php b/apps/files_encryption/settings-admin.php index 5367605898..9ad9bfb887 100644 --- a/apps/files_encryption/settings-admin.php +++ b/apps/files_encryption/settings-admin.php @@ -11,9 +11,7 @@ $tmpl = new OCP\Template('files_encryption', 'settings-admin'); // Check if an adminRecovery account is enabled for recovering files after lost pwd -$view = new OC_FilesystemView(''); - -$recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'); +$recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled', '0'); $tmpl->assign('recoveryEnabled', $recoveryAdminEnabled); diff --git a/apps/files_encryption/settings-personal.php b/apps/files_encryption/settings-personal.php index fddc3ea5ee..ffcb99602e 100644 --- a/apps/files_encryption/settings-personal.php +++ b/apps/files_encryption/settings-personal.php @@ -16,7 +16,9 @@ $view = new \OC_FilesystemView('/'); $util = new \OCA\Encryption\Util($view, $user); $session = new \OCA\Encryption\Session($view); -$privateKeySet = ($session->getPrivateKey() !== false) ? true : false; +$privateKeySet = $session->getPrivateKey() !== false; +// did we tried to initialize the keys for this session? +$initialized = $session->getInitialized(); $recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'); $recoveryEnabledForUser = $util->recoveryEnabledForUser(); @@ -31,6 +33,7 @@ if ($recoveryAdminEnabled || !$privateKeySet) { $tmpl->assign('recoveryEnabled', $recoveryAdminEnabled); $tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser); $tmpl->assign('privateKeySet', $privateKeySet); + $tmpl->assign('initialized', $initialized); $result = $tmpl->fetchPage(); } diff --git a/apps/files_encryption/templates/invalid_private_key.php b/apps/files_encryption/templates/invalid_private_key.php index 5c086d6514..a3cae60b1d 100644 --- a/apps/files_encryption/templates/invalid_private_key.php +++ b/apps/files_encryption/templates/invalid_private_key.php @@ -2,9 +2,11 @@
  • - t('Your private key is not valid! Maybe the your password was changed from outside.')); ?> +
    - t('You can unlock your private key in your ')); ?> t('personal settings')); ?>. + + p($l->t('Go directly to your ')); ?> t('personal settings')); ?>. +
  • diff --git a/apps/files_encryption/templates/settings-admin.php b/apps/files_encryption/templates/settings-admin.php index f5f7582c2a..231a68b6a5 100644 --- a/apps/files_encryption/templates/settings-admin.php +++ b/apps/files_encryption/templates/settings-admin.php @@ -1,23 +1,23 @@
    -

    - t('Encryption')); ?> -
    -

    +

    t('Encryption')); ?>

    t("Enable recovery key (allow to recover users files in case of password loss):")); ?>

    - +
    + + +
    /> + /> t("Enabled")); ?>
    @@ -25,27 +25,32 @@ type='radio' name='adminEnableRecovery' value='0' - /> + /> t("Disabled")); ?>



    -

    +

    > t("Change recovery key password:")); ?>

    /> - + id="oldEncryptionRecoveryPassword" + +

    /> - + id="newEncryptionRecoveryPassword" + +
    + t("Repeat New Recovery key password")); ?>
    -

    - - diff --git a/core/templates/error.php b/core/templates/error.php index ac91357b35..e8b7a49264 100644 --- a/core/templates/error.php +++ b/core/templates/error.php @@ -1,4 +1,4 @@ -
      +

      • diff --git a/core/templates/filetemplates/template.html b/core/templates/filetemplates/template.html new file mode 100644 index 0000000000..f16e80cb7e --- /dev/null +++ b/core/templates/filetemplates/template.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/core/templates/filetemplates/template.odp b/core/templates/filetemplates/template.odp new file mode 100644 index 0000000000..f6371165b8 Binary files /dev/null and b/core/templates/filetemplates/template.odp differ diff --git a/core/templates/filetemplates/template.ods b/core/templates/filetemplates/template.ods new file mode 100644 index 0000000000..e5e8b0bed8 Binary files /dev/null and b/core/templates/filetemplates/template.ods differ diff --git a/core/templates/filetemplates/template.odt b/core/templates/filetemplates/template.odt new file mode 100644 index 0000000000..9bdb351b92 Binary files /dev/null and b/core/templates/filetemplates/template.odt differ diff --git a/core/templates/installation.php b/core/templates/installation.php index 77c455304d..325eb20486 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -6,18 +6,19 @@
        0): ?> -
          +
          + t('Error'));?> -
        • +

          -

          + -
        • +

          -
        +
    @@ -39,7 +40,7 @@

    t('Your data directory and files are probably accessible from the internet because the .htaccess file does not work.'));?>
    t( 'For information how to properly configure your server, please see the documentation.', - $theme->getDocBaseUrl().'/server/5.0/admin_manual/installation.html' + link_to_docs('admin-install') )); ?>

    @@ -61,8 +62,14 @@

    + 0): ?> +
    + t( 'Advanced' )); ?> +
    + + + 0): ?>
    - t( 'Advanced' )); ?>
    + + 0): ?>
    @@ -171,6 +180,7 @@
    + -
    +
    diff --git a/core/templates/layout.base.php b/core/templates/layout.base.php index ea10c3042b..8cd237deea 100644 --- a/core/templates/layout.base.php +++ b/core/templates/layout.base.php @@ -11,6 +11,7 @@ getTitle()); ?> + diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index 9c9eb63382..47ca5903da 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -11,6 +11,7 @@ getTitle()); ?> + diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 3c1114492c..45b7e39686 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -8,12 +8,14 @@ - <?php p(!empty($_['application'])?$_['application'].' | ':''); - p($theme->getTitle()); - p(trim($_['user_displayname']) != '' ?' ('.$_['user_displayname'].') ':'') ?> + <?php + p(!empty($_['application'])?$_['application'].' - ':''); + p($theme->getTitle()); + ?> + @@ -35,6 +37,7 @@ +
    @@ -49,6 +52,9 @@ + +
    +
    @@ -61,7 +67,7 @@
  • - + > t('Log out'));?> @@ -78,6 +84,7 @@