diff --git a/.gitignore b/.gitignore index fe89c74ab3..43f33783e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,24 @@ # the default generated dir + db file -data -owncloud -config/config.php -config/mount.php -apps/inc.php +/data +/owncloud +/config/config.php +/config/mount.php +/apps/inc.php # ignore all apps except core ones -apps/* -!apps/files -!apps/files_encryption -!apps/files_external -!apps/files_sharing -!apps/files_trashbin -!apps/files_versions -!apps/user_ldap -!apps/user_webdavauth +/apps* +!/apps/files +!/apps/files_encryption +!/apps/files_external +!/apps/files_sharing +!/apps/files_trashbin +!/apps/files_versions +!/apps/user_ldap +!/apps/user_webdavauth # ignore themes except the README -themes/* -!themes/README +/themes/* +!/themes/README # just sane ignores .*.sw[po] @@ -72,8 +72,11 @@ nbproject .well-known /.buildpath -#tests - autogenerated filed -data-autotest +# Tests +/tests/phpunit.xml + +# Tests - auto-generated files +/data-autotest /tests/coverage* /tests/autoconfig* -/tests/autotest* \ No newline at end of file +/tests/autotest* diff --git a/3rdparty b/3rdparty index a13af72fbe..2176267239 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit a13af72fbe8983686fc47489a750e60319f68ac2 +Subproject commit 217626723957161191572ea50172a3943c30696d diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fd87513ec2..a79fcc08d6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,11 +1,15 @@ ## Submitting issues -If you have questions about how to use ownCloud, please direct these to the [mailing list][mailinglist] or our [forum][forum]. We are also available on [IRC][irc]. +If you have questions about how to install or use ownCloud, please direct these to the [mailing list][mailinglist] or our [forum][forum]. We are also available on [IRC][irc]. + +### TL;DR + + * The [issue template can be found here][template] but be aware of the different repositories! See list below. ### Guidelines -* Please search the existing issues first, it's likely that your issue was already reported. -* [Report the issue](https://github.com/owncloud/core/issues/new) using our [template][template], it includes all the informations we need to track down the issue. -* This repository is *only* for issues within the ownCloud core code. Issues in other compontents should be reported in their own repositores: +* 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 +* 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) - [Desktop client](https://github.com/owncloud/mirall/issues) @@ -14,12 +18,12 @@ If you have questions about how to use ownCloud, please direct these to the [mai - [Calendar](https://github.com/owncloud/calendar/issues) - [Contacts](https://github.com/owncloud/contacts/issues) - [Mail](https://github.com/owncloud/mail/issues) + - [Media/Music](https://github.com/owncloud/media/issues) - [News](https://github.com/owncloud/news/issues) - [Notes](https://github.com/owncloud/notes/issues) - [Shorty](https://github.com/owncloud/shorty/issues) - - [other apps](https://github.com/owncloud/apps/issues) (e.g. Pictures, Music, Tasks, ...) - -If your issue appears to be a bug, and hasn't been reported, open a new issue. + - [All other apps](https://github.com/owncloud/apps/issues) (e.g. Pictures, Tasks, ...) +* Report the issue using our [template][template], it includes all the information we need to track down the issue. Help us to maximize the effort we can spend fixing issues and adding new features, by not reporting duplicate issues. @@ -34,7 +38,7 @@ Thanks for wanting to contribute source code to ownCloud. That's great! Before we're able to merge your code into the ownCloud core, you need to sign our [Contributor Agreement][agreement]. -Please read the [Developer Manuals][devmanual] to get useful infos like how to create your first application or how to test the ownCloud code with phpunit. +Please read the [Developer Manuals][devmanual] to learn how to create your first application or how to test the ownCloud code with PHPUnit. [agreement]: http://owncloud.org/about/contributor-agreement/ [devmanual]: http://owncloud.org/dev/ diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php index 391b98608b..0706d4e782 100644 --- a/apps/files/ajax/scan.php +++ b/apps/files/ajax/scan.php @@ -4,6 +4,16 @@ session_write_close(); $force = (isset($_GET['force']) and ($_GET['force'] === 'true')); $dir = isset($_GET['dir']) ? $_GET['dir'] : ''; +if (isset($_GET['users'])) { + OC_JSON::checkAdminUser(); + if ($_GET['users'] === 'all') { + $users = OC_User::getUsers(); + } else { + $users = json_decode($_GET['users']); + } +} else { + $users = array(OC_User::getUser()); +} $eventSource = new OC_EventSource(); ScanListener::$eventSource = $eventSource; @@ -12,21 +22,27 @@ ScanListener::$view = \OC\Files\Filesystem::getView(); OC_Hook::connect('\OC\Files\Cache\Scanner', 'scan_folder', 'ScanListener', 'folder'); OC_Hook::connect('\OC\Files\Cache\Scanner', 'scan_file', 'ScanListener', 'file'); -$absolutePath = \OC\Files\Filesystem::getView()->getAbsolutePath($dir); +foreach ($users as $user) { + $eventSource->send('user', $user); + OC_Util::tearDownFS(); + OC_Util::setupFS($user); -$mountPoints = \OC\Files\Filesystem::getMountPoints($absolutePath); -$mountPoints[] = \OC\Files\Filesystem::getMountPoint($absolutePath); -$mountPoints = array_reverse($mountPoints); //start with the mount point of $dir + $absolutePath = \OC\Files\Filesystem::getView()->getAbsolutePath($dir); -foreach ($mountPoints as $mountPoint) { - $storage = \OC\Files\Filesystem::getStorage($mountPoint); - if ($storage) { - ScanListener::$mountPoints[$storage->getId()] = $mountPoint; - $scanner = $storage->getScanner(); - if ($force) { - $scanner->scan(''); - } else { - $scanner->backgroundScan(); + $mountPoints = \OC\Files\Filesystem::getMountPoints($absolutePath); + $mountPoints[] = \OC\Files\Filesystem::getMountPoint($absolutePath); + $mountPoints = array_reverse($mountPoints); //start with the mount point of $dir + + foreach ($mountPoints as $mountPoint) { + $storage = \OC\Files\Filesystem::getStorage($mountPoint); + if ($storage) { + ScanListener::$mountPoints[$storage->getId()] = $mountPoint; + $scanner = $storage->getScanner(); + if ($force) { + $scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG); + } else { + $scanner->backgroundScan(); + } } } } diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index e1263744e1..dde5d3c50a 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -1,17 +1,57 @@ array_merge(array('message' => $l->t('Unable to set upload directory.'))))); + die(); + } +} else { + $linkItem = OCP\Share::getShareByToken($_POST['dirToken']); + if ($linkItem === false) { + OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('Invalid Token'))))); + die(); + } + + if (!($linkItem['permissions'] & OCP\PERMISSION_CREATE)) { + OCP\JSON::checkLoggedIn(); + } else { + // resolve reshares + $rootLinkItem = OCP\Share::resolveReShare($linkItem); + + // Setup FS with owner + OC_Util::tearDownFS(); + OC_Util::setupFS($rootLinkItem['uid_owner']); + + // The token defines the target directory (security reasons) + $path = \OC\Files\Filesystem::getPath($linkItem['file_source']); + $dir = sprintf( + "/%s/%s", + $path, + isset($_POST['subdir']) ? $_POST['subdir'] : '' + ); + + if (!$dir || empty($dir) || $dir === false) { + OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('Unable to set upload directory.'))))); + die(); + } + } +} + + +OCP\JSON::callCheck(); -$dir = $_POST['dir']; // get array with current storage stats (e.g. max file size) $storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir); @@ -25,7 +65,7 @@ foreach ($_FILES['files']['error'] as $error) { $errors = array( UPLOAD_ERR_OK => $l->t('There is no error, the file uploaded with success'), UPLOAD_ERR_INI_SIZE => $l->t('The uploaded file exceeds the upload_max_filesize directive in php.ini: ') - . ini_get('upload_max_filesize'), + . ini_get('upload_max_filesize'), UPLOAD_ERR_FORM_SIZE => $l->t('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'), UPLOAD_ERR_PARTIAL => $l->t('The uploaded file was only partially uploaded'), UPLOAD_ERR_NO_FILE => $l->t('No file was uploaded'), @@ -40,17 +80,17 @@ $files = $_FILES['files']; $error = ''; -$maxUploadFilesize = OCP\Util::maxUploadFilesize($dir); -$maxHumanFilesize = OCP\Util::humanFileSize($maxUploadFilesize); +$maxUploadFileSize = $storageStats['uploadMaxFilesize']; +$maxHumanFileSize = OCP\Util::humanFileSize($maxUploadFileSize); $totalSize = 0; foreach ($files['size'] as $size) { $totalSize += $size; } -if ($maxUploadFilesize >= 0 and $totalSize > $maxUploadFilesize) { +if ($maxUploadFileSize >= 0 and $totalSize > $maxUploadFileSize) { OCP\JSON::error(array('data' => array('message' => $l->t('Not enough storage available'), - 'uploadMaxFilesize' => $maxUploadFilesize, - 'maxHumanFilesize' => $maxHumanFilesize))); + 'uploadMaxFilesize' => $maxUploadFileSize, + 'maxHumanFilesize' => $maxHumanFileSize))); exit(); } @@ -71,9 +111,9 @@ if (strpos($dir, '..') === false) { 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), - 'originalname'=>$files['name'][$i], - 'uploadMaxFilesize' => $maxUploadFilesize, - 'maxHumanFilesize' => $maxHumanFilesize + 'originalname' => $files['name'][$i], + 'uploadMaxFilesize' => $maxUploadFileSize, + 'maxHumanFilesize' => $maxHumanFileSize ); } } diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php index 05ab1722b3..99739cb4ce 100644 --- a/apps/files/appinfo/app.php +++ b/apps/files/appinfo/app.php @@ -20,4 +20,4 @@ OC_Search::registerProvider('OC_Search_Provider_File'); \OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Updater', 'deleteHook'); \OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook'); -\OC_BackgroundJob_RegularTask::register('\OC\Files\Cache\BackgroundWatcher', 'checkNext'); +\OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext'); diff --git a/apps/files/css/files.css b/apps/files/css/files.css index f788949b1b..f2ca1065ec 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -63,8 +63,12 @@ } #filestable { position: relative; top:37px; width:100%; } tbody tr { background-color:#fff; height:2.5em; } -tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; } -tbody tr.selected { background-color:#eee; } +tbody tr:hover, tbody tr:active { + background-color: rgb(240,240,240); +} +tbody tr.selected { + background-color: rgb(230,230,230); +} 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; } @@ -81,7 +85,12 @@ table th#headerDate, table td.date { min-width:11em; padding:0 .1em 0 1em; text- /* 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%; } -table.multiselect thead th { background:rgba(230,230,230,.8); color:#000; font-weight:bold; border-bottom:0; } +table.multiselect thead th { + background-color: rgba(210,210,210,.7); + color: #000; + font-weight: bold; + border-bottom: 0; +} table.multiselect #headerName { 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; } @@ -115,10 +124,12 @@ table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; } } #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:rgba(248,248,248,.9); box-shadow:-5px 0 7px rgba(248,248,248,.9); + 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:rgba(238,238,238,.9); box-shadow:-5px 0 7px rgba(238,238,238,.9); + 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; } @@ -148,6 +159,14 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; } display:inline; } +.summary { + opacity: .5; +} + +.summary .info { + margin-left: 3em; +} + #scanning-message{ top:40%; left:40%; position:absolute; display:none; } div.crumb a{ padding:0.9em 0 0.7em 0; color:#555; } diff --git a/apps/files/index.php b/apps/files/index.php index 20fbf7f93b..2338cf439e 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::addscript('files', 'file-upload'); OCP\Util::addscript('files', 'jquery.iframe-transport'); OCP\Util::addscript('files', 'jquery.fileupload'); OCP\Util::addscript('files', 'jquery-visibility'); @@ -136,5 +137,6 @@ if ($needUpgrade) { $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); $tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); $tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']); + $tmpl->assign('isPublic', false); $tmpl->printPage(); -} \ No newline at end of file +} diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js new file mode 100644 index 0000000000..942a07dfcc --- /dev/null +++ b/apps/files/js/file-upload.js @@ -0,0 +1,343 @@ +$(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(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 totalSize=0; + $.each(data.originalFiles, function(i,file){ + totalSize+=file.size; + }); + + 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 + } + + // start the actual file upload + var jqXHR = data.submit(); + + // 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; + } + + //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); + + 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')); + } + } + ); + 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(); + }); + }); +}); diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 14fca6f148..aa66a57a7b 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -200,7 +200,11 @@ FileActions.register('all', 'Rename', OC.PERMISSION_UPDATE, function () { FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename) { - window.location = OC.linkTo('files', 'index.php') + '?dir=' + encodeURIComponent($('#dir').val()).replace(/%2F/g, '/') + '/' + encodeURIComponent(filename); + var dir = $('#dir').val() + if (dir !== '/') { + dir = dir + '/'; + } + window.location = OC.linkTo('files', 'index.php') + '?dir=' + encodeURIComponent(dir + filename); }); FileActions.setDefault('dir', 'Open'); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index c24d1fd824..cf3ce2e508 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -51,7 +51,7 @@ var FileList={ }else{ simpleSize=t('files', 'Pending'); } - var sizeColor = Math.round(200-Math.pow((size/(1024*1024)),2)); + var sizeColor = Math.round(160-Math.pow((size/(1024*1024)),2)); var lastModifiedTime = Math.round(lastModified.getTime() / 1000); td = $('').attr({ "class": "filesize", @@ -71,8 +71,20 @@ var FileList={ tr.append(td); return tr; }, - addFile:function(name,size,lastModified,loading,hidden){ + addFile:function(name,size,lastModified,loading,hidden,param){ var imgurl; + + if (!param) { + param = {}; + } + + var download_url = null; + if (!param.download_url) { + download_url = OC.Router.generate('download', { file: $('#dir').val()+'/'+name }); + } else { + download_url = param.download_url; + } + if (loading) { imgurl = OC.imagePath('core', 'loading.gif'); } else { @@ -82,7 +94,7 @@ var FileList={ 'file', name, imgurl, - OC.Router.generate('download', { file: $('#dir').val()+'/'+name }), + download_url, size, lastModified, $('#permissions').val() @@ -197,7 +209,7 @@ var FileList={ len = input.val().length; } input.selectRange(0,len); - + form.submit(function(event){ event.stopPropagation(); event.preventDefault(); @@ -208,13 +220,44 @@ var FileList={ if (FileList.checkName(name, newname, false)) { newname = name; } else { - $.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(result) { - if (!result || result.status == 'error') { - OC.dialogs.alert(result.data.message, 'Error moving file'); - newname = name; + // save background image, because it's replaced by a spinner while async request + var oldBackgroundImage = td.css('background-image'); + // mark as loading + td.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); + $.ajax({ + url: OC.filePath('files','ajax','rename.php'), + data: { + dir : $('#dir').val(), + newname: newname, + file: name + }, + success: function(result) { + if (!result || result.status === 'error') { + OC.Notification.show(result.data.message); + newname = name; + // revert changes + 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(''); + } + 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); } }); - } } tr.data('renaming',false); @@ -423,8 +466,12 @@ $(document).ready(function(){ 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; + } // create new file context - data.context = FileList.addFile(uniqueName,size,date,true,false); + data.context = FileList.addFile(uniqueName,size,date,true,false,param); } } diff --git a/apps/files/js/files.js b/apps/files/js/files.js index a79d34c9b2..51b3f31fb9 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -251,153 +251,6 @@ $(document).ready(function() { e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone }); - if ( document.getElementById('data-upload-form') ) { - $(function() { - $('#file_upload_start').fileupload({ - 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(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 totalSize=0; - $.each(data.originalFiles, function(i,file){ - totalSize+=file.size; - }); - - 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 - } - - // start the actual file upload - var jqXHR = data.submit(); - - // 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; - } - - //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); - - 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(); - } - }) - }); - } $.assocArraySize = function(obj) { // http://stackoverflow.com/a/6700/11236 var size = 0, key; @@ -695,7 +548,7 @@ $(document).ready(function() { } }); -function scanFiles(force, dir){ +function scanFiles(force, dir, users){ if (!OC.currentUser) { return; } @@ -705,7 +558,18 @@ function scanFiles(force, dir){ } force = !!force; //cast to bool scanFiles.scanning = true; - var scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force,dir:dir}); + var scannerEventSource; + if (users) { + var usersString; + if (users === 'all') { + usersString = users; + } else { + usersString = JSON.stringify(users); + } + scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir, users: usersString}); + } else { + 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') @@ -717,6 +581,9 @@ function scanFiles(force, dir){ scanFiles.scanning=false; console.log('done after ' + count + ' files'); }); + scannerEventSource.listen('user',function(user){ + console.log('scanning files for ' + user); + }); } scanFiles.scanning=false; @@ -790,7 +657,7 @@ var dragOptions={ // sane browsers support using the distance option if ( $('html.ie').length === 0) { dragOptions['distance'] = 20; -} +} var folderDropOptions={ drop: function( event, ui ) { diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php index ca198b7efe..e000bc966c 100644 --- a/apps/files/l10n/ar.php +++ b/apps/files/l10n/ar.php @@ -12,6 +12,11 @@ "Not enough storage available" => "لا يوجد مساحة تخزينية كافية", "Invalid directory." => "مسار غير صحيح.", "Files" => "الملفات", +"Unable to upload your file as it is a directory or has 0 bytes" => "فشل في رفع ملفاتك , إما أنها مجلد أو حجمها 0 بايت", +"Upload cancelled." => "تم إلغاء عملية رفع الملفات .", +"File upload is in progress. Leaving the page now will cancel the upload." => "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", +"URL cannot be empty." => "عنوان ال URL لا يجوز أن يكون فارغا.", +"Error" => "خطأ", "Share" => "شارك", "Delete permanently" => "حذف بشكل دائم", "Delete" => "إلغاء", @@ -31,12 +36,7 @@ "Your storage is full, files can not be updated or synced anymore!" => "مساحتك التخزينية ممتلئة, لا يمكم تحديث ملفاتك أو مزامنتها بعد الآن !", "Your storage is almost full ({usedSpacePercent}%)" => "مساحتك التخزينية امتلأت تقريبا ", "Your download is being prepared. This might take some time if the files are big." => "جاري تجهيز عملية التحميل. قد تستغرق بعض الوقت اذا كان حجم الملفات كبير.", -"Unable to upload your file as it is a directory or has 0 bytes" => "فشل في رفع ملفاتك , إما أنها مجلد أو حجمها 0 بايت", -"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\" محجوز للنظام", -"Error" => "خطأ", "Name" => "اسم", "Size" => "حجم", "Modified" => "معدل", @@ -44,7 +44,6 @@ "{count} folders" => "{count} مجلدات", "1 file" => "ملف واحد", "{count} files" => "{count} ملفات", -"Unable to rename file" => "فشل في اعادة تسمية الملف", "Upload" => "رفع", "File handling" => "التعامل مع الملف", "Maximum upload size" => "الحد الأقصى لحجم الملفات التي يمكن رفعها", diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php index 661bb5718a..f4424f9257 100644 --- a/apps/files/l10n/bg_BG.php +++ b/apps/files/l10n/bg_BG.php @@ -7,6 +7,8 @@ "Failed to write to disk" => "Възникна проблем при запис в диска", "Invalid directory." => "Невалидна директория.", "Files" => "Файлове", +"Upload cancelled." => "Качването е спряно.", +"Error" => "Грешка", "Share" => "Споделяне", "Delete permanently" => "Изтриване завинаги", "Delete" => "Изтриване", @@ -15,8 +17,6 @@ "replace" => "препокриване", "cancel" => "отказ", "undo" => "възтановяване", -"Upload cancelled." => "Качването е спряно.", -"Error" => "Грешка", "Name" => "Име", "Size" => "Размер", "Modified" => "Променено", @@ -36,5 +36,6 @@ "Download" => "Изтегляне", "Upload too large" => "Файлът който сте избрали за качване е прекалено голям", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра.", -"Files are being scanned, please wait." => "Файловете се претърсват, изчакайте." +"Files are being scanned, please wait." => "Файловете се претърсват, изчакайте.", +"file" => "файл" ); diff --git a/apps/files/l10n/bn_BD.php b/apps/files/l10n/bn_BD.php index 83dd4dc36d..6d755bccc8 100644 --- a/apps/files/l10n/bn_BD.php +++ b/apps/files/l10n/bn_BD.php @@ -11,6 +11,12 @@ "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" => "সমস্যা", "Share" => "ভাগাভাগি কর", "Delete" => "মুছে", "Rename" => "পূনঃনামকরণ", @@ -25,13 +31,7 @@ "'.' is an invalid file name." => "টি একটি অননুমোদিত নাম।", "File name cannot be empty." => "ফাইলের নামটি ফাঁকা রাখা যাবে না।", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "নামটি সঠিক নয়, '\\', '/', '<', '>', ':', '\"', '|', '?' এবং '*' অনুমোদিত নয়।", -"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" => "ফোল্ডারের নামটি সঠিক নয়। 'ভাগাভাগি করা' শুধুমাত্র Owncloud এর জন্য সংরক্ষিত।", -"Error" => "সমস্যা", "Name" => "রাম", "Size" => "আকার", "Modified" => "পরিবর্তিত", @@ -39,7 +39,6 @@ "{count} folders" => "{count} টি ফোল্ডার", "1 file" => "১টি ফাইল", "{count} files" => "{count} টি ফাইল", -"Unable to rename file" => "ফাইলের নাম পরিবর্তন করা সম্ভব হলো না", "Upload" => "আপলোড", "File handling" => "ফাইল হ্যার্ডলিং", "Maximum upload size" => "আপলোডের সর্বোচ্চ আকার", diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index c1c94b9900..8d5f69f331 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -1,6 +1,8 @@ "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom", "Could not move %s" => " No s'ha pogut moure %s", +"Unable to set upload directory." => "No es pot establir la carpeta de pujada.", +"Invalid Token" => "Testimoni no vàlid", "No file was uploaded. Unknown error" => "No s'ha carregat cap fitxer. Error desconegut", "There is no error, the file uploaded with success" => "No hi ha errors, el fitxer s'ha carregat correctament", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "No hi ha prou espai disponible", "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", +"Not enough space available" => "No hi ha prou espai disponible", +"Upload cancelled." => "La pujada s'ha cancel·lat.", +"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", "Share" => "Comparteix", "Delete permanently" => "Esborra permanentment", "Delete" => "Esborra", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "No hi ha prou espai disponible", -"Upload cancelled." => "La pujada s'ha cancel·lat.", -"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", "Name" => "Nom", "Size" => "Mida", "Modified" => "Modificat", @@ -46,8 +49,7 @@ "{count} folders" => "{count} carpetes", "1 file" => "1 fitxer", "{count} files" => "{count} fitxers", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de carpeta no vàlid. L'ús de 'Shared' està reservat per Owncloud", -"Unable to rename file" => "No es pot canviar el nom del fitxer", +"%s could not be renamed" => "%s no es pot canviar el nom", "Upload" => "Puja", "File handling" => "Gestió de fitxers", "Maximum upload size" => "Mida màxima de pujada", @@ -71,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index de6a154242..c16d32e9c2 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -1,6 +1,8 @@ "Nelze přesunout %s - existuje soubor se stejným názvem", "Could not move %s" => "Nelze přesunout %s", +"Unable to set upload directory." => "Nelze nastavit adresář pro nahrané soubory.", +"Invalid Token" => "Neplatný token", "No file was uploaded. Unknown error" => "Soubor nebyl odeslán. Neznámá chyba", "There is no error, the file uploaded with success" => "Soubor byl odeslán úspěšně", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Odesílaný soubor přesahuje velikost upload_max_filesize povolenou v php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Nedostatek dostupného úložného prostoru", "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 je jeho velikost 0 bajtů", +"Not enough space available" => "Nedostatek dostupného místa", +"Upload cancelled." => "Odesílání zrušeno.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Probíhá odesílání souboru. Opuštění stránky vyústí ve 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", "Share" => "Sdílet", "Delete permanently" => "Trvale odstranit", "Delete" => "Smazat", @@ -32,13 +41,7 @@ "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}%)", "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.", -"Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář, nebo je jeho velikost 0 bajtů", -"Not enough space available" => "Nedostatek dostupného místa", -"Upload cancelled." => "Odesílání zrušeno.", -"File upload is in progress. Leaving the page now will cancel the upload." => "Probíhá odesílání souboru. Opuštění stránky vyústí ve 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" => "Neplatný název složky. Použití 'Shared' je rezervováno pro vnitřní potřeby Owncloud", -"Error" => "Chyba", "Name" => "Název", "Size" => "Velikost", "Modified" => "Upraveno", @@ -46,7 +49,6 @@ "{count} folders" => "{count} složky", "1 file" => "1 soubor", "{count} files" => "{count} soubory", -"Unable to rename file" => "Nelze přejmenovat soubor", "Upload" => "Odeslat", "File handling" => "Zacházení se soubory", "Maximum upload size" => "Maximální velikost pro odesílání", @@ -70,5 +72,7 @@ "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í", +"file" => "soubor", +"files" => "soubory", "Upgrading filesystem cache..." => "Aktualizuji mezipaměť souborového systému..." ); diff --git a/apps/files/l10n/cy_GB.php b/apps/files/l10n/cy_GB.php index ae33948891..0aab1a18bc 100644 --- a/apps/files/l10n/cy_GB.php +++ b/apps/files/l10n/cy_GB.php @@ -12,6 +12,12 @@ "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", "Share" => "Rhannu", "Delete permanently" => "Dileu'n barhaol", "Delete" => "Dileu", @@ -32,13 +38,7 @@ "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.", -"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.", "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", @@ -46,7 +46,6 @@ "{count} folders" => "{count} plygell", "1 file" => "1 ffeil", "{count} files" => "{count} ffeil", -"Unable to rename file" => "Methu ailenwi ffeil", "Upload" => "Llwytho i fyny", "File handling" => "Trafod ffeiliau", "Maximum upload size" => "Maint mwyaf llwytho i fyny", diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php index 879fbc8451..c2f200e476 100644 --- a/apps/files/l10n/da.php +++ b/apps/files/l10n/da.php @@ -12,6 +12,13 @@ "Not enough storage available" => "Der er ikke nok plads til rådlighed", "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.", +"Not enough space available" => "ikke nok tilgængelig ledig plads ", +"Upload cancelled." => "Upload afbrudt.", +"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", "Share" => "Del", "Delete permanently" => "Slet permanent", "Delete" => "Slet", @@ -32,13 +39,7 @@ "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}%)", "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.", -"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.", -"Not enough space available" => "ikke nok tilgængelig ledig plads ", -"Upload cancelled." => "Upload afbrudt.", -"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 Owncloud", -"Error" => "Fejl", "Name" => "Navn", "Size" => "Størrelse", "Modified" => "Ændret", @@ -46,7 +47,6 @@ "{count} folders" => "{count} mapper", "1 file" => "1 fil", "{count} files" => "{count} filer", -"Unable to rename file" => "Kunne ikke omdøbe fil", "Upload" => "Upload", "File handling" => "Filhåndtering", "Maximum upload size" => "Maksimal upload-størrelse", @@ -70,5 +70,7 @@ "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", +"file" => "fil", +"files" => "filer", "Upgrading filesystem cache..." => "Opgraderer filsystems cachen..." ); diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index bcc3a4c6c9..435c821400 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -1,6 +1,8 @@ "Konnte %s nicht verschieben. Eine Datei mit diesem Namen existiert bereits", "Could not move %s" => "Konnte %s nicht verschieben", +"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", @@ -12,6 +14,13 @@ "Not enough storage available" => "Nicht genug Speicher vorhanden.", "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.", +"Not enough space available" => "Nicht genug Speicherplatz verfügbar", +"Upload cancelled." => "Upload abgebrochen.", +"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", "Share" => "Teilen", "Delete permanently" => "Endgültig löschen", "Delete" => "Löschen", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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.", -"Not enough space available" => "Nicht genug Speicherplatz verfügbar", -"Upload cancelled." => "Upload abgebrochen.", -"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" => "Ungültiger Verzeichnisname. Die Nutzung von \"Shared\" ist ownCloud vorbehalten.", -"Error" => "Fehler", "Name" => "Name", "Size" => "Größe", "Modified" => "Geändert", @@ -46,7 +49,7 @@ "{count} folders" => "{count} Ordner", "1 file" => "1 Datei", "{count} files" => "{count} Dateien", -"Unable to rename file" => "Konnte Datei nicht umbenennen", +"%s could not be renamed" => "%s konnte nicht umbenannt werden", "Upload" => "Hochladen", "File handling" => "Dateibehandlung", "Maximum upload size" => "Maximale Upload-Größe", @@ -65,10 +68,15 @@ "You don’t have write permissions here." => "Du hast hier keine Schreib-Berechtigung.", "Nothing in here. Upload something!" => "Alles leer. Lade etwas hoch!", "Download" => "Herunterladen", +"Size (MB)" => "Größe (MB)", "Unshare" => "Freigabe aufheben", "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 ..." ); diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php index 3c06c1ac83..3a323321ba 100644 --- a/apps/files/l10n/de_DE.php +++ b/apps/files/l10n/de_DE.php @@ -1,6 +1,8 @@ "Konnte %s nicht verschieben. Eine Datei mit diesem Namen existiert bereits", "Could not move %s" => "Konnte %s nicht verschieben", +"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", @@ -12,6 +14,13 @@ "Not enough storage available" => "Nicht genug Speicher vorhanden.", "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.", +"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.", +"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", "Share" => "Teilen", "Delete permanently" => "Endgültig löschen", "Delete" => "Löschen", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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.", -"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.", -"URL cannot be empty." => "Die URL darf nicht leer sein.", "Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Ungültiger Verzeichnisname. Die Nutzung von \"Shared\" ist ownCloud vorbehalten", -"Error" => "Fehler", "Name" => "Name", "Size" => "Größe", "Modified" => "Geändert", @@ -46,8 +49,7 @@ "{count} folders" => "{count} Ordner", "1 file" => "1 Datei", "{count} files" => "{count} Dateien", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten.", -"Unable to rename file" => "Konnte Datei nicht umbenennen", +"%s could not be renamed" => "%s konnte nicht umbenannt werden", "Upload" => "Hochladen", "File handling" => "Dateibehandlung", "Maximum upload size" => "Maximale Upload-Größe", @@ -66,10 +68,15 @@ "You don’t have write permissions here." => "Sie haben hier keine Schreib-Berechtigungen.", "Nothing in here. Upload something!" => "Alles leer. Laden Sie etwas hoch!", "Download" => "Herunterladen", +"Size (MB)" => "Größe (MB)", "Unshare" => "Freigabe aufheben", "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 ..." ); diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php index b273f6b522..7291dbbf15 100644 --- a/apps/files/l10n/el.php +++ b/apps/files/l10n/el.php @@ -12,6 +12,13 @@ "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" => "Σφάλμα", "Share" => "Διαμοιρασμός", "Delete permanently" => "Μόνιμη διαγραφή", "Delete" => "Διαγραφή", @@ -32,13 +39,7 @@ "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." => "Η λήψη προετοιμάζεται. Αυτό μπορεί να πάρει ώρα εάν τα αρχεία έχουν μεγάλο μέγεθος.", -"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" => "Σφάλμα", "Name" => "Όνομα", "Size" => "Μέγεθος", "Modified" => "Τροποποιήθηκε", @@ -46,8 +47,6 @@ "{count} folders" => "{count} φάκελοι", "1 file" => "1 αρχείο", "{count} files" => "{count} αρχεία", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Μη έγκυρο όνομα φακέλου. Η χρήση του 'Κοινόχρηστος' χρησιμοποιείται από το ownCloud", -"Unable to rename file" => "Αδυναμία μετονομασίας αρχείου", "Upload" => "Μεταφόρτωση", "File handling" => "Διαχείριση αρχείων", "Maximum upload size" => "Μέγιστο μέγεθος αποστολής", @@ -71,5 +70,9 @@ "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 του συστήματος αρχείων..." ); diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index 3eeb88754c..561545ec6a 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -9,9 +9,18 @@ "No file was uploaded" => "Neniu dosiero alŝutiĝis.", "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", "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", +"Not enough space available" => "Ne haveblas sufiĉa spaco", +"Upload cancelled." => "La alŝuto nuliĝis.", +"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", "Share" => "Kunhavigi", +"Delete permanently" => "Forigi por ĉiam", "Delete" => "Forigi", "Rename" => "Alinomigi", "Pending" => "Traktotaj", @@ -21,19 +30,16 @@ "cancel" => "nuligi", "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", "'.' 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.", -"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", -"Not enough space available" => "Ne haveblas sufiĉa spaco", -"Upload cancelled." => "La alŝuto nuliĝis.", -"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. Uzo de “Shared” rezervatas de Owncloud.", -"Error" => "Eraro", "Name" => "Nomo", "Size" => "Grando", "Modified" => "Modifita", @@ -41,7 +47,6 @@ "{count} folders" => "{count} dosierujoj", "1 file" => "1 dosiero", "{count} files" => "{count} dosierujoj", -"Unable to rename file" => "Ne eblis alinomigi dosieron", "Upload" => "Alŝuti", "File handling" => "Dosieradministro", "Maximum upload size" => "Maksimuma alŝutogrando", @@ -55,12 +60,17 @@ "Text file" => "Tekstodosiero", "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.", "Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!", "Download" => "Elŝuti", "Unshare" => "Malkunhavigi", "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" +"Current scanning" => "Nuna skano", +"file" => "dosiero", +"files" => "dosieroj", +"Upgrading filesystem cache..." => "Ĝisdatiĝas dosiersistema kaŝmemoro..." ); diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index b11adfabeb..2d5ac06ff9 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -1,44 +1,47 @@ "No se puede mover %s - Ya existe un archivo con ese nombre", -"Could not move %s" => "No se puede mover %s", +"Could not move %s - File with this name already exists" => "No se pudo mover %s - Un archivo con ese nombre ya existe.", +"Could not move %s" => "No se pudo mover %s", +"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 que intentas subir sobrepasa el tamaño definido por la variable upload_max_filesize en php.ini", +"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 se ha subido parcialmente", -"No file was uploaded" => "No se ha subido ningún archivo", +"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" => "La escritura en disco ha fallado", +"Failed to write to disk" => "Falló al escribir al disco", "Not enough storage available" => "No hay suficiente espacio disponible", -"Invalid directory." => "Directorio invalido.", +"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", +"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", "Share" => "Compartir", "Delete permanently" => "Eliminar permanentemente", "Delete" => "Eliminar", "Rename" => "Renombrar", -"Pending" => "Pendientes", +"Pending" => "Pendiente", "{new_name} already exists" => "{new_name} ya existe", "replace" => "reemplazar", "suggest name" => "sugerir nombre", "cancel" => "cancelar", "replaced {new_name} with {old_name}" => "reemplazado {new_name} con {old_name}", "undo" => "deshacer", -"perform delete operation" => "Eliminar", +"perform delete operation" => "Realizar operación de borrado", "1 file uploading" => "subiendo 1 archivo", "files uploading" => "subiendo 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 ni sincronizar archivos!", +"Your storage is full, files can not be updated or synced anymore!" => "Su almacenamiento está lleno, ¡no se pueden actualizar o sincronizar 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 muy grandes.", -"Unable to upload your file as it is a directory or has 0 bytes" => "Imposible subir su archivo, 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, se cancelará la subida.", -"URL cannot be empty." => "La URL no puede estar vacía.", -"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "El nombre de carpeta no es válido. El uso de \"Shared\" está reservado para Owncloud", -"Error" => "Error", +"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", "Name" => "Nombre", "Size" => "Tamaño", "Modified" => "Modificado", @@ -46,13 +49,12 @@ "{count} folders" => "{count} carpetas", "1 file" => "1 archivo", "{count} files" => "{count} archivos", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nombre de carpeta invalido. El uso de \"Shared\" esta reservado para ownCloud", -"Unable to rename file" => "No se puede renombrar el archivo", +"%s could not be renamed" => "%s no se pudo renombrar", "Upload" => "Subir", -"File handling" => "Tratamiento de archivos", +"File handling" => "Manejo de archivos", "Maximum upload size" => "Tamaño máximo de subida", "max. possible: " => "máx. posible:", -"Needed for multi-file and folder downloads." => "Se necesita para descargas multi-archivo y de carpetas", +"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", "Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada", @@ -60,16 +62,21 @@ "New" => "Nuevo", "Text file" => "Archivo de texto", "Folder" => "Carpeta", -"From link" => "Desde el enlace", +"From link" => "Desde enlace", "Deleted files" => "Archivos eliminados", "Cancel upload" => "Cancelar subida", -"You don’t have write permissions here." => "No tienes permisos para escribir aquí.", -"Nothing in here. Upload something!" => "Aquí no hay nada. ¡Sube algo!", +"You don’t have write permissions here." => "No tiene permisos de escritura aquí.", +"Nothing in here. Upload something!" => "No hay nada aquí. ¡Suba algo!", "Download" => "Descargar", +"Size (MB)" => "Tamaño (MB)", "Unshare" => "Dejar de compartir", "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 por este servidor.", -"Files are being scanned, please wait." => "Se están escaneando los archivos, por favor espere.", +"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" ); diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php index 0ae47302ed..10bde4c385 100644 --- a/apps/files/l10n/es_AR.php +++ b/apps/files/l10n/es_AR.php @@ -1,6 +1,8 @@ "No se pudo mover %s - Un archivo con este nombre ya existe", "Could not move %s" => "No se pudo mover %s ", +"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", "There is no error, the file uploaded with success" => "No hay errores, el archivo fue subido con éxito", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "El archivo que intentás subir excede el tamaño definido por upload_max_filesize en el php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "No hay suficiente capacidad de almacenamiento", "Invalid directory." => "Directorio invalido.", "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 carpeta inválido. El uso de \"Shared\" está reservado por ownCloud", +"Error" => "Error", "Share" => "Compartir", "Delete permanently" => "Borrar de manera permanente", "Delete" => "Borrar", @@ -32,13 +41,7 @@ "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}%)", "Your download is being prepared. This might take some time if the files are big." => "Tu descarga esta siendo preparada. Esto puede tardar algun tiempo si los archivos son muy grandes.", -"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 carpeta inválido. El uso de 'Shared' está reservado por ownCloud", -"Error" => "Error", "Name" => "Nombre", "Size" => "Tamaño", "Modified" => "Modificado", @@ -46,8 +49,7 @@ "{count} folders" => "{count} directorios", "1 file" => "1 archivo", "{count} files" => "{count} archivos", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nombre de carpeta inválido. El uso de \"Shared\" está reservado por ownCloud", -"Unable to rename file" => "No fue posible cambiar el nombre al archivo", +"%s could not be renamed" => "%s no se pudo renombrar", "Upload" => "Subir", "File handling" => "Tratamiento de archivos", "Maximum upload size" => "Tamaño máximo de subida", @@ -66,10 +68,15 @@ "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", +"Size (MB)" => "Tamaño (MB)", "Unshare" => "Dejar de compartir", "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" ); diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index d3fab4b0bd..c58b066e28 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -1,6 +1,8 @@ "Ei saa liigutada faili %s - samanimeline fail on juba olemas", "Could not move %s" => "%s liigutamine ebaõnnestus", +"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", "There is no error, the file uploaded with success" => "Ühtegi tõrget polnud, fail on üles laetud", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Üleslaetava faili suurus ületab php.ini poolt määratud upload_max_filesize suuruse:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Saadaval pole piisavalt ruumi", "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", +"Not enough space available" => "Pole piisavalt ruumi", +"Upload cancelled." => "Üleslaadimine tühistati.", +"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", "Share" => "Jaga", "Delete permanently" => "Kustuta jäädavalt", "Delete" => "Kustuta", @@ -32,13 +41,7 @@ "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}%)", "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. ", -"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", -"Not enough space available" => "Pole piisavalt ruumi", -"Upload cancelled." => "Üleslaadimine tühistati.", -"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 kataloogi nimi. 'Shared' kasutamine on reserveeritud ownCloud poolt.", -"Error" => "Viga", "Name" => "Nimi", "Size" => "Suurus", "Modified" => "Muudetud", @@ -46,8 +49,7 @@ "{count} folders" => "{count} kausta", "1 file" => "1 fail", "{count} files" => "{count} faili", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Vigane kausta nimi. 'Shared' kasutamine on reserveeritud ownCloud poolt.", -"Unable to rename file" => "Faili ümbernimetamine ebaõnnestus", +"%s could not be renamed" => "%s ümbernimetamine ebaõnnestus", "Upload" => "Lae üles", "File handling" => "Failide käsitlemine", "Maximum upload size" => "Maksimaalne üleslaadimise suurus", @@ -71,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index a4afc2e8ca..c87e20b1ff 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -12,6 +12,12 @@ "Not enough storage available" => "Ez dago behar aina leku erabilgarri,", "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", +"Not enough space available" => "Ez dago leku nahikorik.", +"Upload cancelled." => "Igoera ezeztatuta", +"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.", +"Error" => "Errorea", "Share" => "Elkarbanatu", "Delete permanently" => "Ezabatu betirako", "Delete" => "Ezabatu", @@ -32,13 +38,7 @@ "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})", "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. ", -"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", -"Not enough space available" => "Ez dago leku nahikorik.", -"Upload cancelled." => "Igoera ezeztatuta", -"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" => "Baliogabeako karpeta izena. 'Shared' izena Owncloudek erreserbatzen du", -"Error" => "Errorea", "Name" => "Izena", "Size" => "Tamaina", "Modified" => "Aldatuta", @@ -46,7 +46,6 @@ "{count} folders" => "{count} karpeta", "1 file" => "fitxategi bat", "{count} files" => "{count} fitxategi", -"Unable to rename file" => "Ezin izan da fitxategia berrizendatu", "Upload" => "Igo", "File handling" => "Fitxategien kudeaketa", "Maximum upload size" => "Igo daitekeen gehienezko tamaina", @@ -70,5 +69,7 @@ "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", +"file" => "fitxategia", +"files" => "fitxategiak", "Upgrading filesystem cache..." => "Fitxategi sistemaren katxea eguneratzen..." ); diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php index b97067ac19..73f4b493b4 100644 --- a/apps/files/l10n/fa.php +++ b/apps/files/l10n/fa.php @@ -1,6 +1,8 @@ "%s نمی تواند حرکت کند - در حال حاضر پرونده با این نام وجود دارد. ", "Could not move %s" => "%s نمی تواند حرکت کند ", +"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 استفاده کرده است.", @@ -12,6 +14,13 @@ "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" => "خطا", "Share" => "اشتراک‌گذاری", "Delete permanently" => "حذف قطعی", "Delete" => "حذف", @@ -32,13 +41,7 @@ "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." => "دانلود شما در حال آماده شدن است. در صورتیکه پرونده ها بزرگ باشند ممکن است مدتی طول بکشد.", -"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" => "خطا", "Name" => "نام", "Size" => "اندازه", "Modified" => "تاریخ", @@ -46,7 +49,7 @@ "{count} folders" => "{ شمار} پوشه ها", "1 file" => "1 پرونده", "{count} files" => "{ شمار } فایل ها", -"Unable to rename file" => "قادر به تغییر نام پرونده نیست.", +"%s could not be renamed" => "%s نمیتواند تغییر نام دهد.", "Upload" => "بارگزاری", "File handling" => "اداره پرونده ها", "Maximum upload size" => "حداکثر اندازه بارگزاری", @@ -70,5 +73,9 @@ "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..." => "بهبود فایل سیستمی ذخیره گاه..." ); diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index 3d0d724578..c57c0ea898 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -12,6 +12,12 @@ "Not enough storage available" => "Tallennustilaa ei ole riittävästi käytettävissä", "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.", +"Not enough space available" => "Tilaa ei ole riittävästi", +"Upload cancelled." => "Lähetys peruttu.", +"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", "Share" => "Jaa", "Delete permanently" => "Poista pysyvästi", "Delete" => "Poista", @@ -29,12 +35,6 @@ "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}%)", "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.", -"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.", -"Not enough space available" => "Tilaa ei ole riittävästi", -"Upload cancelled." => "Lähetys peruttu.", -"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", "Name" => "Nimi", "Size" => "Koko", "Modified" => "Muokattu", @@ -42,7 +42,6 @@ "{count} folders" => "{count} kansiota", "1 file" => "1 tiedosto", "{count} files" => "{count} tiedostoa", -"Unable to rename file" => "Tiedoston nimeäminen uudelleen ei onnistunut", "Upload" => "Lähetä", "File handling" => "Tiedostonhallinta", "Maximum upload size" => "Lähetettävän tiedoston suurin sallittu koko", @@ -61,10 +60,15 @@ "You don’t have write permissions here." => "Tunnuksellasi ei ole kirjoitusoikeuksia tänne.", "Nothing in here. Upload something!" => "Täällä ei ole mitään. Lähetä tänne jotakin!", "Download" => "Lataa", +"Size (MB)" => "Koko (Mt)", "Unshare" => "Peru jakaminen", "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..." ); diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index 39c697396c..dc1a33ac65 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -1,6 +1,8 @@ "Impossible de déplacer %s - Un fichier possédant ce nom existe déjà", "Could not move %s" => "Impossible de déplacer %s", +"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:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Plus assez d'espace de stockage disponible", "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", +"Not enough space available" => "Espace disponible insuffisant", +"Upload cancelled." => "Envoi annulé.", +"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", "Share" => "Partager", "Delete permanently" => "Supprimer de façon définitive", "Delete" => "Supprimer", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "Espace disponible insuffisant", -"Upload cancelled." => "Envoi annulé.", -"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", "Name" => "Nom", "Size" => "Taille", "Modified" => "Modifié", @@ -46,8 +49,7 @@ "{count} folders" => "{count} dossiers", "1 file" => "1 fichier", "{count} files" => "{count} fichiers", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée à Owncloud", -"Unable to rename file" => "Impossible de renommer le fichier", +"%s could not be renamed" => "%s ne peut être renommé", "Upload" => "Envoyer", "File handling" => "Gestion des fichiers", "Maximum upload size" => "Taille max. d'envoi", @@ -66,10 +68,15 @@ "You don’t have write permissions here." => "Vous n'avez pas le droit d'écriture ici.", "Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)", "Download" => "Télécharger", +"Size (MB)" => "Taille (Mo)", "Unshare" => "Ne plus partager", "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" ); diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index d22ed4b872..4a1c7720ca 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -1,6 +1,8 @@ "Non se moveu %s - Xa existe un ficheiro con ese nome.", "Could not move %s" => "Non foi posíbel mover %s", +"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.", "There is no error, the file uploaded with success" => "Non houbo erros, o ficheiro enviouse correctamente", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O ficheiro enviado excede a directiva indicada por upload_max_filesize de php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Non hai espazo de almacenamento abondo", "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", +"Not enough space available" => "O espazo dispoñíbel é insuficiente", +"Upload cancelled." => "Envío cancelado.", +"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", "Share" => "Compartir", "Delete permanently" => "Eliminar permanentemente", "Delete" => "Eliminar", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "O espazo dispoñíbel é insuficiente", -"Upload cancelled." => "Envío cancelado.", -"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 «Shared» está reservado por Owncloud", -"Error" => "Erro", "Name" => "Nome", "Size" => "Tamaño", "Modified" => "Modificado", @@ -46,8 +49,7 @@ "{count} folders" => "{count} cartafoles", "1 file" => "1 ficheiro", "{count} files" => "{count} ficheiros", -"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", -"Unable to rename file" => "Non é posíbel renomear o ficheiro", +"%s could not be renamed" => "%s non pode cambiar de nome", "Upload" => "Enviar", "File handling" => "Manexo de ficheiro", "Maximum upload size" => "Tamaño máximo do envío", @@ -66,10 +68,15 @@ "You don’t have write permissions here." => "Non ten permisos para escribir aquí.", "Nothing in here. Upload something!" => "Aquí non hai nada. Envíe algo.", "Download" => "Descargar", +"Size (MB)" => "Tamaño (MB)", "Unshare" => "Deixar de compartir", "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..." ); diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 963f25ebed..52946bc6d0 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -1,4 +1,6 @@ "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים", +"Could not move %s" => "לא ניתן להעביר את %s", "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:", @@ -7,7 +9,14 @@ "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" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים", +"Upload cancelled." => "ההעלאה בוטלה.", +"File upload is in progress. Leaving the page now will cancel the upload." => "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", +"URL cannot be empty." => "קישור אינו יכול להיות ריק.", +"Error" => "שגיאה", "Share" => "שתף", "Delete permanently" => "מחק לצמיתות", "Delete" => "מחיקה", @@ -19,13 +28,10 @@ "cancel" => "ביטול", "replaced {new_name} with {old_name}" => "{new_name} הוחלף ב־{old_name}", "undo" => "ביטול", +"perform delete operation" => "ביצוע פעולת מחיקה", "1 file uploading" => "קובץ אחד נשלח", +"files uploading" => "קבצים בהעלאה", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'.", -"Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים", -"Upload cancelled." => "ההעלאה בוטלה.", -"File upload is in progress. Leaving the page now will cancel the upload." => "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", -"URL cannot be empty." => "קישור אינו יכול להיות ריק.", -"Error" => "שגיאה", "Name" => "שם", "Size" => "גודל", "Modified" => "זמן שינוי", @@ -53,5 +59,7 @@ "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" => "הסריקה הנוכחית" +"Current scanning" => "הסריקה הנוכחית", +"file" => "קובץ", +"files" => "קבצים" ); diff --git a/apps/files/l10n/hi.php b/apps/files/l10n/hi.php new file mode 100644 index 0000000000..151d1f497c --- /dev/null +++ b/apps/files/l10n/hi.php @@ -0,0 +1,5 @@ + "त्रुटि", +"Share" => "साझा करें", +"Save" => "सहेजें" +); diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php index d634faee75..abe8c40bd5 100644 --- a/apps/files/l10n/hr.php +++ b/apps/files/l10n/hr.php @@ -6,6 +6,10 @@ "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", @@ -16,10 +20,6 @@ "undo" => "vrati", "1 file uploading" => "1 datoteka se učitava", "files uploading" => "datoteke se učitavaju", -"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", "Name" => "Ime", "Size" => "Veličina", "Modified" => "Zadnja promjena", @@ -42,5 +42,7 @@ "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" +"Current scanning" => "Trenutno skeniranje", +"file" => "datoteka", +"files" => "datoteke" ); diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php index 76b8bd420d..b083351695 100644 --- a/apps/files/l10n/hu_HU.php +++ b/apps/files/l10n/hu_HU.php @@ -1,6 +1,8 @@ "%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", +"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", "There is no error, the file uploaded with success" => "A fájlt sikerült feltölteni", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "A feltöltött fájl mérete meghaladja a php.ini állományban megadott upload_max_filesize paraméter értékét.", @@ -12,6 +14,13 @@ "Not enough storage available" => "Nincs elég szabad hely.", "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ű", +"Not enough space available" => "Nincs elég szabad hely", +"Upload cancelled." => "A feltöltést megszakítottuk.", +"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", "Share" => "Megosztás", "Delete permanently" => "Végleges törlés", "Delete" => "Törlés", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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ű", -"Not enough space available" => "Nincs elég szabad hely", -"Upload cancelled." => "A feltöltést megszakítottuk.", -"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 név használata csak a Owncloud számára lehetséges.", -"Error" => "Hiba", "Name" => "Név", "Size" => "Méret", "Modified" => "Módosítva", @@ -46,8 +49,7 @@ "{count} folders" => "{count} mappa", "1 file" => "1 fájl", "{count} files" => "{count} fájl", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Érvénytelen mappanév. A 'Shared' az ownCloud számára fenntartott elnevezés", -"Unable to rename file" => "Nem lehet átnevezni a fájlt", +"%s could not be renamed" => "%s átnevezése nem sikerült", "Upload" => "Feltöltés", "File handling" => "Fájlkezelés", "Maximum upload size" => "Maximális feltölthető fájlméret", @@ -71,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php index 886922d954..5970a4cd55 100644 --- a/apps/files/l10n/ia.php +++ b/apps/files/l10n/ia.php @@ -3,9 +3,9 @@ "No file was uploaded" => "Nulle file esseva incargate.", "Missing a temporary folder" => "Manca un dossier temporari", "Files" => "Files", +"Error" => "Error", "Share" => "Compartir", "Delete" => "Deler", -"Error" => "Error", "Name" => "Nomine", "Size" => "Dimension", "Modified" => "Modificate", diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php index 58cc0ea7fd..bacdcc8f49 100644 --- a/apps/files/l10n/id.php +++ b/apps/files/l10n/id.php @@ -12,6 +12,12 @@ "Not enough storage available" => "Ruang penyimpanan tidak mencukupi", "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", +"Not enough space available" => "Ruang penyimpanan tidak mencukupi", +"Upload cancelled." => "Pengunggahan dibatalkan.", +"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", "Share" => "Bagikan", "Delete permanently" => "Hapus secara permanen", "Delete" => "Hapus", @@ -32,13 +38,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "Ruang penyimpanan tidak mencukupi", -"Upload cancelled." => "Pengunggahan dibatalkan.", -"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", "Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nama folder salah. Nama 'Shared' telah digunakan oleh Owncloud.", -"Error" => "Galat", "Name" => "Nama", "Size" => "Ukuran", "Modified" => "Dimodifikasi", @@ -46,7 +46,6 @@ "{count} folders" => "{count} folder", "1 file" => "1 berkas", "{count} files" => "{count} berkas", -"Unable to rename file" => "Tidak dapat mengubah nama berkas", "Upload" => "Unggah", "File handling" => "Penanganan berkas", "Maximum upload size" => "Ukuran pengunggahan maksimum", @@ -70,5 +69,7 @@ "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..." ); diff --git a/apps/files/l10n/is.php b/apps/files/l10n/is.php index aa10c838c1..97b19ae937 100644 --- a/apps/files/l10n/is.php +++ b/apps/files/l10n/is.php @@ -11,6 +11,12 @@ "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", "Share" => "Deila", "Delete" => "Eyða", "Rename" => "Endurskýra", @@ -25,13 +31,7 @@ "'.' 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ð.", -"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.", "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", @@ -39,7 +39,6 @@ "{count} folders" => "{count} möppur", "1 file" => "1 skrá", "{count} files" => "{count} skrár", -"Unable to rename file" => "Gat ekki endurskýrt skrá", "Upload" => "Senda inn", "File handling" => "Meðhöndlun skrár", "Maximum upload size" => "Hámarks stærð innsendingar", diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php index c588285aac..8ea6bb48ab 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -1,6 +1,8 @@ "Impossibile spostare %s - un file con questo nome esiste già", "Could not move %s" => "Impossibile spostare %s", +"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", "There is no error, the file uploaded with success" => "Non ci sono errori, il file è stato caricato correttamente", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Il file caricato supera la direttiva upload_max_filesize in php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Spazio di archiviazione insufficiente", "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", +"Not enough space available" => "Spazio disponibile insufficiente", +"Upload cancelled." => "Invio annullato", +"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", "Share" => "Condividi", "Delete permanently" => "Elimina definitivamente", "Delete" => "Elimina", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "Spazio disponibile insufficiente", -"Upload cancelled." => "Invio annullato", -"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 da ownCloud", -"Error" => "Errore", "Name" => "Nome", "Size" => "Dimensione", "Modified" => "Modificato", @@ -46,8 +49,7 @@ "{count} folders" => "{count} cartelle", "1 file" => "1 file", "{count} files" => "{count} file", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome della cartella non valido. L'uso di 'Shared' è riservato a ownCloud", -"Unable to rename file" => "Impossibile rinominare il file", +"%s could not be renamed" => "%s non può essere rinominato", "Upload" => "Carica", "File handling" => "Gestione file", "Maximum upload size" => "Dimensione massima upload", @@ -66,10 +68,15 @@ "You don’t have write permissions here." => "Qui non hai i permessi di scrittura.", "Nothing in here. Upload something!" => "Non c'è niente qui. Carica qualcosa!", "Download" => "Scarica", +"Size (MB)" => "Dimensione (MB)", "Unshare" => "Rimuovi condivisione", "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..." ); diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index 55dcf3640e..cb5480199e 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -1,6 +1,8 @@ "%s を移動できませんでした ― この名前のファイルはすでに存在します", "Could not move %s" => "%s を移動できませんでした", +"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 に設定されたサイズを超えています:", @@ -12,6 +14,13 @@ "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" => "無効なフォルダ名です。'Shared' の利用はownCloudで予約済みです", +"Error" => "エラー", "Share" => "共有", "Delete permanently" => "完全に削除する", "Delete" => "削除", @@ -32,13 +41,7 @@ "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." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。", -"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" => "無効なフォルダ名です。'Shared' の利用は ownCloud が予約済みです。", -"Error" => "エラー", "Name" => "名前", "Size" => "サイズ", "Modified" => "変更", @@ -46,8 +49,7 @@ "{count} folders" => "{count} フォルダ", "1 file" => "1 ファイル", "{count} files" => "{count} ファイル", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無効なフォルダ名です。'Shared' の利用はownCloudで予約済みです", -"Unable to rename file" => "ファイル名の変更ができません", +"%s could not be renamed" => "%sの名前を変更できませんでした", "Upload" => "アップロード", "File handling" => "ファイル操作", "Maximum upload size" => "最大アップロードサイズ", @@ -66,10 +68,15 @@ "You don’t have write permissions here." => "あなたには書き込み権限がありません。", "Nothing in here. Upload something!" => "ここには何もありません。何かアップロードしてください。", "Download" => "ダウンロード", +"Size (MB)" => "サイズ(MB)", "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..." => "ファイルシステムキャッシュを更新中..." ); diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php index c50ca2594b..b04e1b4536 100644 --- a/apps/files/l10n/ka_GE.php +++ b/apps/files/l10n/ka_GE.php @@ -12,6 +12,12 @@ "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" => "შეცდომა", "Share" => "გაზიარება", "Delete permanently" => "სრულად წაშლა", "Delete" => "წაშლა", @@ -32,13 +38,7 @@ "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." => "გადმოწერის მოთხოვნა მუშავდება. ის მოითხოვს გარკვეულ დროს რაგდან ფაილები არის დიდი ზომის.", -"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" => "დაუშვებელი ფოლდერის სახელი. 'Shared'–ის გამოყენება რეზერვირებულია Owncloud–ის მიერ", -"Error" => "შეცდომა", "Name" => "სახელი", "Size" => "ზომა", "Modified" => "შეცვლილია", @@ -46,7 +46,6 @@ "{count} folders" => "{count} საქაღალდე", "1 file" => "1 ფაილი", "{count} files" => "{count} ფაილი", -"Unable to rename file" => "ფაილის სახელის გადარქმევა ვერ მოხერხდა", "Upload" => "ატვირთვა", "File handling" => "ფაილის დამუშავება", "Maximum upload size" => "მაქსიმუმ ატვირთის ზომა", diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index c78f58542e..069c209ee5 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -12,6 +12,12 @@ "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을 입력해야 합니다.", +"Error" => "오류", "Share" => "공유", "Delete permanently" => "영원히 삭제", "Delete" => "삭제", @@ -32,13 +38,7 @@ "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." => "다운로드가 준비 중입니다. 파일 크기가 크다면 시간이 오래 걸릴 수도 있습니다.", -"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" => "폴더 이름이 유효하지 않습니다. ", -"Error" => "오류", "Name" => "이름", "Size" => "크기", "Modified" => "수정됨", @@ -46,7 +46,6 @@ "{count} folders" => "폴더 {count}개", "1 file" => "파일 1개", "{count} files" => "파일 {count}개", -"Unable to rename file" => "파일 이름바꾸기 할 수 없음", "Upload" => "업로드", "File handling" => "파일 처리", "Maximum upload size" => "최대 업로드 크기", @@ -70,5 +69,7 @@ "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..." => "파일 시스템 캐시 업그레이드 중..." ); diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php index 4a60295c5c..9b209a4d5c 100644 --- a/apps/files/l10n/lb.php +++ b/apps/files/l10n/lb.php @@ -6,15 +6,15 @@ "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", "undo" => "réckgängeg man", -"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", "Name" => "Numm", "Size" => "Gréisst", "Modified" => "Geännert", @@ -37,5 +37,7 @@ "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" +"Current scanning" => "Momentane Scan", +"file" => "Datei", +"files" => "Dateien" ); diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php index 3e2ea80c94..43fb4657db 100644 --- a/apps/files/l10n/lt_LT.php +++ b/apps/files/l10n/lt_LT.php @@ -1,12 +1,26 @@ "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja", +"Could not move %s" => "Nepavyko perkelti %s", +"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:", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Įkeliamo failo dydis viršija MAX_FILE_SIZE nustatymą, kuris naudojamas HTML formoje.", "The uploaded file was only partially uploaded" => "Failas buvo įkeltas tik dalinai", "No file was uploaded" => "Nebuvo įkeltas joks failas", "Missing a temporary folder" => "Nėra laikinojo katalogo", "Failed to write to disk" => "Nepavyko įrašyti į diską", +"Not enough storage available" => "Nepakanka vietos serveryje", +"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", +"Not enough space available" => "Nepakanka vietos", +"Upload cancelled." => "Įkėlimas atšauktas.", +"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", "Share" => "Dalintis", +"Delete permanently" => "Ištrinti negrįžtamai", "Delete" => "Ištrinti", "Rename" => "Pervadinti", "Pending" => "Laukiantis", @@ -16,11 +30,16 @@ "cancel" => "atšaukti", "replaced {new_name} with {old_name}" => "pakeiskite {new_name} į {old_name}", "undo" => "anuliuoti", +"perform delete operation" => "ištrinti", "1 file uploading" => "įkeliamas 1 failas", -"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", -"Upload cancelled." => "Įkėlimas atšauktas.", -"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.", -"Error" => "Klaida", +"files uploading" => "įkeliami failai", +"'.' 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}%)", +"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", "Name" => "Pavadinimas", "Size" => "Dydis", "Modified" => "Pakeista", @@ -40,12 +59,18 @@ "New" => "Naujas", "Text file" => "Teksto failas", "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.", "Nothing in here. Upload something!" => "Čia tuščia. Įkelkite ką nors!", "Download" => "Atsisiųsti", "Unshare" => "Nebesidalinti", "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" +"Current scanning" => "Šiuo metu skenuojama", +"file" => "failas", +"files" => "failai", +"Upgrading filesystem cache..." => "Atnaujinamas sistemos kešavimas..." ); diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php index f62bdd2d49..b0def1e707 100644 --- a/apps/files/l10n/lv.php +++ b/apps/files/l10n/lv.php @@ -12,6 +12,12 @@ "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", "Share" => "Dalīties", "Delete permanently" => "Dzēst pavisam", "Delete" => "Dzēst", @@ -31,13 +37,7 @@ "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}%)", "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.", -"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.", "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", @@ -45,7 +45,6 @@ "{count} folders" => "{count} mapes", "1 file" => "1 datne", "{count} files" => "{count} datnes", -"Unable to rename file" => "Nevarēja pārsaukt datni", "Upload" => "Augšupielādēt", "File handling" => "Datņu pārvaldība", "Maximum upload size" => "Maksimālais datņu augšupielādes apjoms", @@ -69,5 +68,7 @@ "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..." ); diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php index 992618f06b..2dd75f1433 100644 --- a/apps/files/l10n/mk.php +++ b/apps/files/l10n/mk.php @@ -8,6 +8,11 @@ "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 бајти", +"Upload cancelled." => "Преземањето е прекинато.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", +"URL cannot be empty." => "Адресата неможе да биде празна.", +"Error" => "Грешка", "Share" => "Сподели", "Delete" => "Избриши", "Rename" => "Преименувај", @@ -20,11 +25,6 @@ "undo" => "врати", "1 file uploading" => "1 датотека се подига", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправилно име. , '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не се дозволени.", -"Unable to upload your file as it is a directory or has 0 bytes" => "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти", -"Upload cancelled." => "Преземањето е прекинато.", -"File upload is in progress. Leaving the page now will cancel the upload." => "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", -"URL cannot be empty." => "Адресата неможе да биде празна.", -"Error" => "Грешка", "Name" => "Име", "Size" => "Големина", "Modified" => "Променето", @@ -52,5 +52,7 @@ "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" => "Моментално скенирам" +"Current scanning" => "Моментално скенирам", +"file" => "датотека", +"files" => "датотеки" ); diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php index 2ce4f16332..f96d4d4801 100644 --- a/apps/files/l10n/ms_MY.php +++ b/apps/files/l10n/ms_MY.php @@ -7,14 +7,14 @@ "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", "Pending" => "Dalam proses", "replace" => "ganti", "cancel" => "Batal", -"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", "Name" => "Nama", "Size" => "Saiz", "Modified" => "Dimodifikasi", @@ -36,5 +36,7 @@ "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" +"Current scanning" => "Imbasan semasa", +"file" => "fail", +"files" => "fail" ); diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php index d5710a4927..769dfe33ff 100644 --- a/apps/files/l10n/nb_NO.php +++ b/apps/files/l10n/nb_NO.php @@ -12,6 +12,13 @@ "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", "Share" => "Del", "Delete permanently" => "Slett permanent", "Delete" => "Slett", @@ -32,13 +39,7 @@ "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 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.", -"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", "Name" => "Navn", "Size" => "Størrelse", "Modified" => "Endret", @@ -46,8 +47,6 @@ "{count} folders" => "{count} mapper", "1 file" => "1 fil", "{count} files" => "{count} filer", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldig mappenavn. Bruk av \"Shared\" er reservert av ownCloud.", -"Unable to rename file" => "Kan ikke gi nytt navn", "Upload" => "Last opp", "File handling" => "Filhåndtering", "Maximum upload size" => "Maksimum opplastingsstørrelse", @@ -71,5 +70,7 @@ "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.", "Current scanning" => "Pågående skanning", +"file" => "fil", +"files" => "filer", "Upgrading filesystem cache..." => "Oppgraderer filsystemets mellomlager..." ); diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index bc4158df3b..914d5087af 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -1,6 +1,8 @@ "Kon %s niet verplaatsen - Er bestaat al een bestand met deze naam", "Could not move %s" => "Kon %s niet verplaatsen", +"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", "There is no error, the file uploaded with success" => "De upload van het bestand is goedgegaan.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Het geüploade bestand overscheidt de upload_max_filesize optie in php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Niet genoeg opslagruimte beschikbaar", "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", +"Not enough space available" => "Niet genoeg ruimte beschikbaar", +"Upload cancelled." => "Uploaden geannuleerd.", +"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", "Share" => "Delen", "Delete permanently" => "Verwijder definitief", "Delete" => "Verwijder", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "Niet genoeg ruimte beschikbaar", -"Upload cancelled." => "Uploaden geannuleerd.", -"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", -"Error" => "Fout", "Name" => "Naam", "Size" => "Grootte", "Modified" => "Aangepast", @@ -46,8 +49,6 @@ "{count} folders" => "{count} mappen", "1 file" => "1 bestand", "{count} files" => "{count} bestanden", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ongeldige mapnaam. Gebruik van 'Gedeeld' is voorbehouden aan Owncloud zelf", -"Unable to rename file" => "Kan bestand niet hernoemen", "Upload" => "Uploaden", "File handling" => "Bestand", "Maximum upload size" => "Maximale bestandsgrootte voor uploads", @@ -71,5 +72,7 @@ "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", +"file" => "bestand", +"files" => "bestanden", "Upgrading filesystem cache..." => "Upgraden bestandssysteem cache..." ); diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php index 29593b6f2d..dcc3373bea 100644 --- a/apps/files/l10n/nn_NO.php +++ b/apps/files/l10n/nn_NO.php @@ -12,6 +12,13 @@ "Not enough storage available" => "Ikkje nok lagringsplass tilgjengeleg", "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", +"Not enough space available" => "Ikkje nok lagringsplass tilgjengeleg", +"Upload cancelled." => "Opplasting avbroten.", +"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", "Share" => "Del", "Delete permanently" => "Slett for godt", "Delete" => "Slett", @@ -32,13 +39,7 @@ "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} %)", "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.", -"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", -"Not enough space available" => "Ikkje nok lagringsplass tilgjengeleg", -"Upload cancelled." => "Opplasting avbroten.", -"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", "Name" => "Namn", "Size" => "Storleik", "Modified" => "Endra", @@ -46,8 +47,6 @@ "{count} folders" => "{count} mapper", "1 file" => "1 fil", "{count} files" => "{count} filer", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldig mappenamn. Mappa «Shared» er reservert av ownCloud", -"Unable to rename file" => "Klarte ikkje endra filnamnet", "Upload" => "Last opp", "File handling" => "Filhandtering", "Maximum upload size" => "Maksimal opplastingsstorleik", diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php index fa31ddf9f4..703aeb3fba 100644 --- a/apps/files/l10n/oc.php +++ b/apps/files/l10n/oc.php @@ -6,6 +6,10 @@ "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", @@ -16,10 +20,6 @@ "undo" => "defar", "1 file uploading" => "1 fichièr al amontcargar", "files uploading" => "fichièrs al amontcargar", -"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", "Name" => "Nom", "Size" => "Talha", "Modified" => "Modificat", @@ -42,5 +42,7 @@ "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" +"Current scanning" => "Exploracion en cors", +"file" => "fichièr", +"files" => "fichièrs" ); diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php index 4bdac05578..a3acfea661 100644 --- a/apps/files/l10n/pl.php +++ b/apps/files/l10n/pl.php @@ -1,6 +1,8 @@ "Nie można było przenieść %s - Plik o takiej nazwie już istnieje", "Could not move %s" => "Nie można było przenieść %s", +"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", "There is no error, the file uploaded with success" => "Nie było błędów, plik wysłano poprawnie.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Wgrany plik przekracza wartość upload_max_filesize zdefiniowaną w php.ini: ", @@ -12,6 +14,13 @@ "Not enough storage available" => "Za mało dostępnego miejsca", "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", +"Not enough space available" => "Za mało miejsca", +"Upload cancelled." => "Wczytywanie anulowane.", +"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", "Share" => "Udostępnij", "Delete permanently" => "Trwale usuń", "Delete" => "Usuń", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "Za mało miejsca", -"Upload cancelled." => "Wczytywanie anulowane.", -"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. Korzystanie z nazwy „Shared” jest zarezerwowane dla ownCloud", -"Error" => "Błąd", "Name" => "Nazwa", "Size" => "Rozmiar", "Modified" => "Modyfikacja", @@ -46,8 +49,7 @@ "{count} folders" => "Ilość folderów: {count}", "1 file" => "1 plik", "{count} files" => "Ilość plików: {count}", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nieprawidłowa nazwa folderu. Wykorzystanie 'Shared' jest zarezerwowane przez ownCloud", -"Unable to rename file" => "Nie można zmienić nazwy pliku", +"%s could not be renamed" => "%s nie można zmienić nazwy", "Upload" => "Wyślij", "File handling" => "Zarządzanie plikami", "Maximum upload size" => "Maksymalny rozmiar wysyłanego pliku", @@ -71,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index 0f349b6948..3ad679f876 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -1,6 +1,8 @@ "Impossível mover %s - Um arquivo com este nome já existe", "Could not move %s" => "Impossível mover %s", +"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", "There is no error, the file uploaded with success" => "Sem erros, o arquivo foi enviado com sucesso", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O arquivo enviado excede a diretiva upload_max_filesize no php.ini: ", @@ -12,6 +14,13 @@ "Not enough storage available" => "Espaço de armazenamento insuficiente", "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.", +"Not enough space available" => "Espaço de armazenamento insuficiente", +"Upload cancelled." => "Envio cancelado.", +"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", "Share" => "Compartilhar", "Delete permanently" => "Excluir permanentemente", "Delete" => "Excluir", @@ -32,13 +41,7 @@ "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}%)", "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.", -"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.", -"Not enough space available" => "Espaço de armazenamento insuficiente", -"Upload cancelled." => "Envio cancelado.", -"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 de 'Shared' é reservado para o Owncloud", -"Error" => "Erro", "Name" => "Nome", "Size" => "Tamanho", "Modified" => "Modificado", @@ -46,8 +49,7 @@ "{count} folders" => "{count} pastas", "1 file" => "1 arquivo", "{count} files" => "{count} arquivos", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome de pasta inválido. O uso do nome 'Compartilhado' é reservado ao ownCloud", -"Unable to rename file" => "Impossível renomear arquivo", +"%s could not be renamed" => "%s não pode ser renomeado", "Upload" => "Upload", "File handling" => "Tratamento de Arquivo", "Maximum upload size" => "Tamanho máximo para carregar", @@ -71,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index d90e299970..4273de9c47 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -12,6 +12,13 @@ "Not enough storage available" => "Não há espaço suficiente em disco", "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.", +"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", "Share" => "Partilhar", "Delete permanently" => "Eliminar permanentemente", "Delete" => "Eliminar", @@ -32,13 +39,7 @@ "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}%)", "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.", -"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.", -"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 de pasta inválido. O Uso de 'shared' é reservado para o ownCloud", -"Error" => "Erro", "Name" => "Nome", "Size" => "Tamanho", "Modified" => "Modificado", @@ -46,8 +47,6 @@ "{count} folders" => "{count} pastas", "1 file" => "1 ficheiro", "{count} files" => "{count} ficheiros", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome da pasta inválido. Palavra 'Shared' é reservado pela ownCloud", -"Unable to rename file" => "Não foi possível renomear o ficheiro", "Upload" => "Carregar", "File handling" => "Manuseamento de ficheiros", "Maximum upload size" => "Tamanho máximo de envio", @@ -71,5 +70,7 @@ "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", +"file" => "ficheiro", +"files" => "ficheiros", "Upgrading filesystem cache..." => "Atualizar cache do sistema de ficheiros..." ); diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php index 8fdf62aeb3..b0cca7d7a8 100644 --- a/apps/files/l10n/ro.php +++ b/apps/files/l10n/ro.php @@ -1,6 +1,8 @@ "Nu se poate de mutat %s - Fișier cu acest nume deja există", +"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", +"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: ", @@ -12,6 +14,13 @@ "Not enough storage available" => "Nu este suficient spațiu disponibil", "Invalid directory." => "Director 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.", +"Not enough space available" => "Nu este suficient spațiu disponibil", +"Upload cancelled." => "Încărcare anulată.", +"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", @@ -32,13 +41,7 @@ "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.", -"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.", -"Not enough space available" => "Nu este suficient spațiu disponibil", -"Upload cancelled." => "Încărcare anulată.", -"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" => "Invalid folder name. Usage of 'Shared' is reserved by Ownclou", -"Error" => "Eroare", "Name" => "Nume", "Size" => "Dimensiune", "Modified" => "Modificat", @@ -46,7 +49,7 @@ "{count} folders" => "{count} foldare", "1 file" => "1 fisier", "{count} files" => "{count} fisiere", -"Unable to rename file" => "Nu s-a putut redenumi fișierul", +"%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", @@ -70,5 +73,9 @@ "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ă.", "Current scanning" => "În curs de scanare", +"directory" => "catalog", +"directories" => "cataloage", +"file" => "fișier", +"files" => "fișiere", "Upgrading filesystem cache..." => "Modernizare fisiere de sistem cache.." ); diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 83412bf2be..225de32d62 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -1,6 +1,8 @@ "Невозможно переместить %s - файл с таким именем уже существует", "Could not move %s" => "Невозможно переместить %s", +"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:", @@ -12,6 +14,13 @@ "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." => "Ссылка не может быть пустой.", +"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Неправильное имя каталога. Имя 'Shared' зарезервировано.", +"Error" => "Ошибка", "Share" => "Открыть доступ", "Delete permanently" => "Удалено навсегда", "Delete" => "Удалить", @@ -23,7 +32,7 @@ "cancel" => "отмена", "replaced {new_name} with {old_name}" => "заменено {new_name} на {old_name}", "undo" => "отмена", -"perform delete operation" => "выполняется операция удаления", +"perform delete operation" => "выполнить операцию удаления", "1 file uploading" => "загружается 1 файл", "files uploading" => "файлы загружаются", "'.' is an invalid file name." => "'.' - неправильное имя файла.", @@ -32,13 +41,7 @@ "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." => "Загрузка началась. Это может потребовать много времени, если файл большого размера.", -"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." => "Ссылка не может быть пустой.", "Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Неправильное имя каталога. Имя 'Shared' зарезервировано.", -"Error" => "Ошибка", "Name" => "Имя", "Size" => "Размер", "Modified" => "Изменён", @@ -46,7 +49,7 @@ "{count} folders" => "{count} папок", "1 file" => "1 файл", "{count} files" => "{count} файлов", -"Unable to rename file" => "Невозможно переименовать файл", +"%s could not be renamed" => "%s не может быть переименован", "Upload" => "Загрузка", "File handling" => "Управление файлами", "Maximum upload size" => "Максимальный размер загружаемого файла", @@ -65,10 +68,15 @@ "You don’t have write permissions here." => "У вас нет разрешений на запись здесь.", "Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!", "Download" => "Скачать", +"Size (MB)" => "Размер (Мб)", "Unshare" => "Закрыть общий доступ", "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" => "Текущее сканирование", -"Upgrading filesystem cache..." => "Обновление кеша файловой системы..." +"directory" => "директория", +"directories" => "директории", +"file" => "файл", +"files" => "файлы", +"Upgrading filesystem cache..." => "Обновление кэша файловой системы..." ); diff --git a/apps/files/l10n/si_LK.php b/apps/files/l10n/si_LK.php index 351021a9f8..82fca4bc75 100644 --- a/apps/files/l10n/si_LK.php +++ b/apps/files/l10n/si_LK.php @@ -7,6 +7,10 @@ "Missing a temporary folder" => "තාවකාලික ෆොල්ඩරයක් අතුරුදහන්", "Failed to write to disk" => "තැටිගත කිරීම අසාර්ථකයි", "Files" => "ගොනු", +"Upload cancelled." => "උඩුගත කිරීම අත් හරින්න ලදී", +"File upload is in progress. Leaving the page now will cancel the upload." => "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", +"URL cannot be empty." => "යොමුව හිස් විය නොහැක", +"Error" => "දෝෂයක්", "Share" => "බෙදා හදා ගන්න", "Delete" => "මකා දමන්න", "Rename" => "නැවත නම් කරන්න", @@ -15,10 +19,6 @@ "cancel" => "අත් හරින්න", "undo" => "නිෂ්ප්‍රභ කරන්න", "1 file uploading" => "1 ගොනුවක් උඩගත කෙරේ", -"Upload cancelled." => "උඩුගත කිරීම අත් හරින්න ලදී", -"File upload is in progress. Leaving the page now will cancel the upload." => "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", -"URL cannot be empty." => "යොමුව හිස් විය නොහැක", -"Error" => "දෝෂයක්", "Name" => "නම", "Size" => "ප්‍රමාණය", "Modified" => "වෙනස් කළ", @@ -44,5 +44,7 @@ "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" => "වර්තමාන පරික්ෂාව" +"Current scanning" => "වර්තමාන පරික්ෂාව", +"file" => "ගොනුව", +"files" => "ගොනු" ); diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php index ad33c9b4ee..ac71f30e90 100644 --- a/apps/files/l10n/sk_SK.php +++ b/apps/files/l10n/sk_SK.php @@ -1,6 +1,8 @@ "Nie je možné presunúť %s - súbor s týmto menom už existuje", "Could not move %s" => "Nie je možné presunúť %s", +"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", "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:", @@ -10,8 +12,15 @@ "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", -"Invalid directory." => "Neplatný priečinok", +"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", +"Not enough space available" => "Nie je k dispozícii dostatok miesta", +"Upload cancelled." => "Odosielanie zrušené.", +"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", "Share" => "Zdieľať", "Delete permanently" => "Zmazať trvalo", "Delete" => "Zmazať", @@ -32,13 +41,7 @@ "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}%)", "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ť.", -"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", -"Not enough space available" => "Nie je k dispozícii dostatok miesta", -"Upload cancelled." => "Odosielanie zrušené", -"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é meno priečinka. Používanie mena 'Shared' je vyhradené len pre Owncloud", -"Error" => "Chyba", "Name" => "Názov", "Size" => "Veľkosť", "Modified" => "Upravené", @@ -46,8 +49,7 @@ "{count} folders" => "{count} priečinkov", "1 file" => "1 súbor", "{count} files" => "{count} súborov", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Neplatný názov priečinka. Názov \"Shared\" je rezervovaný pre ownCloud", -"Unable to rename file" => "Nemožno premenovať súbor", +"%s could not be renamed" => "%s nemohol byť premenovaný", "Upload" => "Odoslať", "File handling" => "Nastavenie správania sa k súborom", "Maximum upload size" => "Maximálna veľkosť odosielaného súboru", @@ -71,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index 6902d311ab..bb01e5475d 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -1,6 +1,8 @@ "Ni mogoče premakniti %s - datoteka s tem imenom že obstaja", +"Could not move %s - File with this name already exists" => "%s ni mogoče premakniti - datoteka s tem imenom že obstaja", "Could not move %s" => "Ni mogoče premakniti %s", +"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.", "There is no error, the file uploaded with success" => "Datoteka je uspešno naložena.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Poslana datoteka presega dovoljeno velikost, ki je določena z možnostjo upload_max_filesize v datoteki php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Na voljo ni dovolj prostora", "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.", +"Not enough space available" => "Na voljo ni dovolj prostora.", +"Upload cancelled." => "Pošiljanje je preklicano.", +"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", "Share" => "Souporaba", "Delete permanently" => "Izbriši dokončno", "Delete" => "Izbriši", @@ -32,13 +41,7 @@ "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.", -"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.", -"Not enough space available" => "Na voljo ni dovolj prostora.", -"Upload cancelled." => "Pošiljanje je preklicano.", -"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" => "Neveljavno ime mape. Uporaba oznake \"Souporaba\" je zadržan za sistem ownCloud.", -"Error" => "Napaka", "Name" => "Ime", "Size" => "Velikost", "Modified" => "Spremenjeno", @@ -46,7 +49,7 @@ "{count} folders" => "{count} map", "1 file" => "1 datoteka", "{count} files" => "{count} datotek", -"Unable to rename file" => "Ni mogoče preimenovati datoteke", +"%s could not be renamed" => "%s ni bilo mogoče preimenovati", "Upload" => "Pošlji", "File handling" => "Upravljanje z datotekami", "Maximum upload size" => "Največja velikost za pošiljanja", @@ -70,5 +73,9 @@ "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 ..." ); diff --git a/apps/files/l10n/sq.php b/apps/files/l10n/sq.php index 63c95f692e..2daca10a41 100644 --- a/apps/files/l10n/sq.php +++ b/apps/files/l10n/sq.php @@ -12,6 +12,12 @@ "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", @@ -32,13 +38,7 @@ "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.", -"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.", "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.", -"Error" => "Veprim i gabuar", "Name" => "Emri", "Size" => "Dimensioni", "Modified" => "Modifikuar", @@ -46,7 +46,6 @@ "{count} folders" => "{count} dosje", "1 file" => "1 skedar", "{count} files" => "{count} skedarë", -"Unable to rename file" => "Nuk është i mundur riemërtimi i skedarit", "Upload" => "Ngarko", "File handling" => "Trajtimi i skedarit", "Maximum upload size" => "Dimensioni maksimal i ngarkimit", diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php index 3be6dde91a..68f2f5a93b 100644 --- a/apps/files/l10n/sr.php +++ b/apps/files/l10n/sr.php @@ -12,6 +12,12 @@ "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" => "Грешка", "Share" => "Дели", "Delete permanently" => "Обриши за стално", "Delete" => "Обриши", @@ -32,13 +38,7 @@ "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." => "Припремам преузимање. Ово може да потраје ако су датотеке велике.", -"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." => "Адреса не може бити празна.", "Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Неисправно име фасцикле. Фасцикла „Shared“ је резервисана за ownCloud.", -"Error" => "Грешка", "Name" => "Име", "Size" => "Величина", "Modified" => "Измењено", @@ -46,7 +46,6 @@ "{count} folders" => "{count} фасцикле/и", "1 file" => "1 датотека", "{count} files" => "{count} датотеке/а", -"Unable to rename file" => "Не могу да преименујем датотеку", "Upload" => "Отпреми", "File handling" => "Управљање датотекама", "Maximum upload size" => "Највећа величина датотеке", diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index 82d169d569..70f3121a20 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -1,6 +1,8 @@ "Kunde inte flytta %s - Det finns redan en fil med detta namn", "Could not move %s" => "Kan inte flytta %s", +"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", "There is no error, the file uploaded with success" => "Inga fel uppstod. Filen laddades upp utan problem.", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Den uppladdade filen överskrider upload_max_filesize direktivet php.ini:", @@ -12,6 +14,13 @@ "Not enough storage available" => "Inte tillräckligt med lagringsutrymme tillgängligt", "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", +"Not enough space available" => "Inte tillräckligt med utrymme tillgängligt", +"Upload cancelled." => "Uppladdning avbruten.", +"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", "Share" => "Dela", "Delete permanently" => "Radera permanent", "Delete" => "Radera", @@ -29,16 +38,10 @@ "'.' 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 ej längre laddas upp eller synkas!", +"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}%)", "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.", -"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", -"Not enough space available" => "Inte tillräckligt med utrymme tillgängligt", -"Upload cancelled." => "Uppladdning avbruten.", -"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ändande av 'Shared' är reserverat av ownCloud", -"Error" => "Fel", "Name" => "Namn", "Size" => "Storlek", "Modified" => "Ändrad", @@ -46,7 +49,7 @@ "{count} folders" => "{count} mappar", "1 file" => "1 fil", "{count} files" => "{count} filer", -"Unable to rename file" => "Kan inte byta namn på filen", +"%s could not be renamed" => "%s kunde inte namnändras", "Upload" => "Ladda upp", "File handling" => "Filhantering", "Maximum upload size" => "Maximal storlek att ladda upp", @@ -70,5 +73,9 @@ "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..." ); diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php index e5f7bbdf9b..e03b88569b 100644 --- a/apps/files/l10n/ta_LK.php +++ b/apps/files/l10n/ta_LK.php @@ -7,6 +7,11 @@ "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" => "வழு", "Share" => "பகிர்வு", "Delete" => "நீக்குக", "Rename" => "பெயர்மாற்றம்", @@ -19,11 +24,6 @@ "undo" => "முன் செயல் நீக்கம் ", "1 file uploading" => "1 கோப்பு பதிவேற்றப்படுகிறது", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "செல்லுபடியற்ற பெயர்,'\\', '/', '<', '>', ':', '\"', '|', '?' மற்றும் '*' ஆகியன அனுமதிக்கப்படமாட்டாது.", -"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" => "வழு", "Name" => "பெயர்", "Size" => "அளவு", "Modified" => "மாற்றப்பட்டது", diff --git a/apps/files/l10n/te.php b/apps/files/l10n/te.php index b280200d30..710034de12 100644 --- a/apps/files/l10n/te.php +++ b/apps/files/l10n/te.php @@ -1,9 +1,10 @@ "పొరపాటు", "Delete permanently" => "శాశ్వతంగా తొలగించు", "Delete" => "తొలగించు", "cancel" => "రద్దుచేయి", -"Error" => "పొరపాటు", "Name" => "పేరు", "Size" => "పరిమాణం", -"Save" => "భద్రపరచు" +"Save" => "భద్రపరచు", +"Folder" => "సంచయం" ); diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php index 06d26edfec..5b2eab6b3a 100644 --- a/apps/files/l10n/th_TH.php +++ b/apps/files/l10n/th_TH.php @@ -12,6 +12,12 @@ "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" => "ข้อผิดพลาด", "Share" => "แชร์", "Delete" => "ลบ", "Rename" => "เปลี่ยนชื่อ", @@ -31,13 +37,7 @@ "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." => "กำลังเตรียมดาวน์โหลดข้อมูล หากไฟล์มีขนาดใหญ่ อาจใช้เวลาสักครู่", -"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" => "ข้อผิดพลาด", "Name" => "ชื่อ", "Size" => "ขนาด", "Modified" => "แก้ไขแล้ว", @@ -45,7 +45,6 @@ "{count} folders" => "{count} โฟลเดอร์", "1 file" => "1 ไฟล์", "{count} files" => "{count} ไฟล์", -"Unable to rename file" => "ไม่สามารถเปลี่ยนชื่อไฟล์ได้", "Upload" => "อัพโหลด", "File handling" => "การจัดกาไฟล์", "Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้", @@ -67,5 +66,7 @@ "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..." => "กำลังอัพเกรดหน่วยความจำแคชของระบบไฟล์..." ); diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php index 6a096d2703..0b2dbb12dd 100644 --- a/apps/files/l10n/tr.php +++ b/apps/files/l10n/tr.php @@ -12,6 +12,13 @@ "Not enough storage available" => "Yeterli disk alanı yok", "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", +"Not enough space available" => "Yeterli disk alanı yok", +"Upload cancelled." => "Yükleme iptal edildi.", +"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", "Share" => "Paylaş", "Delete permanently" => "Kalıcı olarak sil", "Delete" => "Sil", @@ -32,13 +39,7 @@ "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}%)", "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.", -"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", -"Not enough space available" => "Yeterli disk alanı yok", -"Upload cancelled." => "Yükleme iptal edildi.", -"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 isminin kullanımı Owncloud tarafından rezerver edilmiştir.", -"Error" => "Hata", "Name" => "İsim", "Size" => "Boyut", "Modified" => "Değiştirilme", @@ -46,8 +47,6 @@ "{count} folders" => "{count} dizin", "1 file" => "1 dosya", "{count} files" => "{count} dosya", -"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.", -"Unable to rename file" => "Dosya adı değiştirilemedi", "Upload" => "Yükle", "File handling" => "Dosya taşıma", "Maximum upload size" => "Maksimum yükleme boyutu", @@ -71,5 +70,7 @@ "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", +"file" => "dosya", +"files" => "dosyalar", "Upgrading filesystem cache..." => "Sistem dosyası önbelleği güncelleniyor" ); diff --git a/apps/files/l10n/ug.php b/apps/files/l10n/ug.php index fb8f187ade..c11ffe7b9b 100644 --- a/apps/files/l10n/ug.php +++ b/apps/files/l10n/ug.php @@ -6,6 +6,10 @@ "Failed to write to disk" => "دىسكىغا يازالمىدى", "Not enough storage available" => "يېتەرلىك ساقلاش بوشلۇقى يوق", "Files" => "ھۆججەتلەر", +"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" => "خاتالىق", "Share" => "ھەمبەھىر", "Delete permanently" => "مەڭگۈلۈك ئۆچۈر", "Delete" => "ئۆچۈر", @@ -18,17 +22,12 @@ "undo" => "يېنىۋال", "1 file uploading" => "1 ھۆججەت يۈكلىنىۋاتىدۇ", "files uploading" => "ھۆججەت يۈكلىنىۋاتىدۇ", -"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" => "خاتالىق", "Name" => "ئاتى", "Size" => "چوڭلۇقى", "Modified" => "ئۆزگەرتكەن", "1 folder" => "1 قىسقۇچ", "1 file" => "1 ھۆججەت", "{count} files" => "{count} ھۆججەت", -"Unable to rename file" => "ھۆججەت ئاتىنى ئۆزگەرتكىلى بولمايدۇ", "Upload" => "يۈكلە", "Save" => "ساقلا", "New" => "يېڭى", diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index 324b28936e..261853ef20 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -12,6 +12,12 @@ "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" => "Помилка", "Share" => "Поділитися", "Delete permanently" => "Видалити назавжди", "Delete" => "Видалити", @@ -32,13 +38,7 @@ "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." => "Ваше завантаження готується. Це може зайняти деякий час, якщо файли завеликі.", -"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" => "Невірне ім'я теки. Використання \"Shared\" зарезервовано Owncloud", -"Error" => "Помилка", "Name" => "Ім'я", "Size" => "Розмір", "Modified" => "Змінено", @@ -46,7 +46,6 @@ "{count} folders" => "{count} папок", "1 file" => "1 файл", "{count} files" => "{count} файлів", -"Unable to rename file" => "Не вдалося перейменувати файл", "Upload" => "Вивантажити", "File handling" => "Робота з файлами", "Maximum upload size" => "Максимальний розмір відвантажень", @@ -70,5 +69,7 @@ "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..." => "Оновлення кеша файлової системи..." ); diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php index c8aa11295c..e3c9fd5488 100644 --- a/apps/files/l10n/vi.php +++ b/apps/files/l10n/vi.php @@ -12,6 +12,12 @@ "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", "Share" => "Chia sẻ", "Delete permanently" => "Xóa vĩnh vễn", "Delete" => "Xóa", @@ -32,13 +38,7 @@ "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.", -"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.", "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", @@ -46,7 +46,6 @@ "{count} folders" => "{count} thư mục", "1 file" => "1 tập tin", "{count} files" => "{count} tập tin", -"Unable to rename file" => "Không thể đổi tên file", "Upload" => "Tải lên", "File handling" => "Xử lý tập tin", "Maximum upload size" => "Kích thước tối đa ", @@ -70,5 +69,7 @@ "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..." ); diff --git a/apps/files/l10n/zh_CN.GB2312.php b/apps/files/l10n/zh_CN.GB2312.php index 0d87975918..4108516cda 100644 --- a/apps/files/l10n/zh_CN.GB2312.php +++ b/apps/files/l10n/zh_CN.GB2312.php @@ -7,6 +7,11 @@ "Missing a temporary folder" => "缺失临时文件夹", "Failed to write to disk" => "写磁盘失败", "Files" => "文件", +"Unable to upload your file as it is a directory or has 0 bytes" => "不能上传您的文件,由于它是文件夹或者为空文件", +"Upload cancelled." => "上传取消了", +"File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传。关闭页面会取消上传。", +"URL cannot be empty." => "网址不能为空。", +"Error" => "出错", "Share" => "分享", "Delete" => "删除", "Rename" => "重命名", @@ -19,11 +24,6 @@ "undo" => "撤销", "1 file uploading" => "1 个文件正在上传", "files uploading" => "个文件正在上传", -"Unable to upload your file as it is a directory or has 0 bytes" => "不能上传您的文件,由于它是文件夹或者为空文件", -"Upload cancelled." => "上传取消了", -"File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传。关闭页面会取消上传。", -"URL cannot be empty." => "网址不能为空。", -"Error" => "出错", "Name" => "名称", "Size" => "大小", "Modified" => "修改日期", @@ -51,5 +51,7 @@ "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" => "正在扫描" +"Current scanning" => "正在扫描", +"file" => "文件", +"files" => "文件" ); diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index c883670e84..68680676a1 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -1,6 +1,8 @@ "无法移动 %s - 同名文件已存在", "Could not move %s" => "无法移动 %s", +"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所规定的值", @@ -12,6 +14,13 @@ "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" => "错误", "Share" => "分享", "Delete permanently" => "永久删除", "Delete" => "删除", @@ -32,13 +41,7 @@ "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." => "下载正在准备中。如果文件较大可能会花费一些时间。", -"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" => "无效文件夹名。'共享' 是 Owncloud 预留的文件夹名。", -"Error" => "错误", "Name" => "名称", "Size" => "大小", "Modified" => "修改日期", @@ -46,8 +49,7 @@ "{count} folders" => "{count} 个文件夹", "1 file" => "1 个文件", "{count} files" => "{count} 个文件", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "无效的文件夹名。”Shared“ 是 Owncloud 预留的文件夹", -"Unable to rename file" => "无法重命名文件", +"%s could not be renamed" => "%s 不能被重命名", "Upload" => "上传", "File handling" => "文件处理", "Maximum upload size" => "最大上传大小", @@ -61,7 +63,7 @@ "Text file" => "文本文件", "Folder" => "文件夹", "From link" => "来自链接", -"Deleted files" => "删除文件", +"Deleted files" => "已删除文件", "Cancel upload" => "取消上传", "You don’t have write permissions here." => "您没有写权限", "Nothing in here. Upload something!" => "这里还什么都没有。上传些东西吧!", @@ -71,5 +73,7 @@ "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..." => "正在更新文件系统缓存..." ); diff --git a/apps/files/l10n/zh_HK.php b/apps/files/l10n/zh_HK.php index caafc74b85..4402812f2b 100644 --- a/apps/files/l10n/zh_HK.php +++ b/apps/files/l10n/zh_HK.php @@ -1,8 +1,8 @@ "文件", +"Error" => "錯誤", "Share" => "分享", "Delete" => "刪除", -"Error" => "錯誤", "Name" => "名稱", "{count} folders" => "{}文件夾", "Upload" => "上傳", diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php index 0bd207888d..59a332f628 100644 --- a/apps/files/l10n/zh_TW.php +++ b/apps/files/l10n/zh_TW.php @@ -12,6 +12,13 @@ "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" => "無效的資料夾名稱,'Shared' 的使用被 ownCloud 保留", +"Error" => "錯誤", "Share" => "分享", "Delete permanently" => "永久刪除", "Delete" => "刪除", @@ -32,13 +39,7 @@ "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." => "正在準備您的下載,若您的檔案較大,將會需要更多時間。", -"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" => "無效的資料夾名稱,'Shared' 的使用被 ownCloud 保留", -"Error" => "錯誤", "Name" => "名稱", "Size" => "大小", "Modified" => "修改", @@ -46,8 +47,6 @@ "{count} folders" => "{count} 個資料夾", "1 file" => "1 個檔案", "{count} files" => "{count} 個檔案", -"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無效的資料夾名稱,'Shared' 的使用被 ownCloud 保留", -"Unable to rename file" => "無法重新命名檔案", "Upload" => "上傳", "File handling" => "檔案處理", "Maximum upload size" => "最大上傳檔案大小", diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php index c2a4b9c267..f7052ef80b 100644 --- a/apps/files/lib/app.php +++ b/apps/files/lib/app.php @@ -70,7 +70,7 @@ class App { } else { // rename failed $result['data'] = array( - 'message' => $this->l10n->t('Unable to rename file') + 'message' => $this->l10n->t('%s could not be renamed', array($oldname)) ); } return $result; diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index b576253f4f..7d679bc4bf 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -50,7 +50,7 @@
- +
@@ -77,7 +77,7 @@ - t( 'Size' )); ?> + t('Size (MB)')); ?> t( 'Modified' )); ?> diff --git a/apps/files/templates/part.breadcrumb.php b/apps/files/templates/part.breadcrumb.php index 9886b42e42..9db27eb9b2 100644 --- a/apps/files/templates/part.breadcrumb.php +++ b/apps/files/templates/part.breadcrumb.php @@ -7,8 +7,7 @@ + $dir = \OCP\Util::encodePath($crumb["dir"]); ?>
svg" data-dir=''> diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php index 1719d25e66..97a9026860 100644 --- a/apps/files/templates/part.list.php +++ b/apps/files/templates/part.list.php @@ -1,18 +1,24 @@ - + 200) $relative_date_color = 200; - $name = rawurlencode($file['name']); - $name = str_replace('%2F', '/', $name); - $directory = rawurlencode($file['directory']); - $directory = str_replace('%2F', '/', $directory); ?> + if($relative_date_color>160) $relative_date_color = 160; + $name = \OCP\Util::encodePath($file['name']); + $directory = \OCP\Util::encodePath($file['directory']); ?> - + + + + 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')); + } + } ?> + + + + + + + files->rename($dir, $oldname, $newname); $expected = array( 'success' => false, - 'data' => array('message' => 'Unable to rename file') + 'data' => array('message' => '%s could not be renamed') ); $this->assertEquals($expected, $result); diff --git a/apps/files/triggerupdate.php b/apps/files/triggerupdate.php new file mode 100644 index 0000000000..0e29edbba3 --- /dev/null +++ b/apps/files/triggerupdate.php @@ -0,0 +1,22 @@ +resolvePath($file); + $watcher = $storage->getWatcher($internalPath); + $watcher->checkUpdate($internalPath); + } else { + echo "Usage: php triggerupdate.php /path/to/file\n"; + } +} else { + echo "This script can be run from the command line only\n"; +} diff --git a/apps/files_encryption/ajax/changeRecoveryPassword.php b/apps/files_encryption/ajax/changeRecoveryPassword.php index b0594f967b..366f634a51 100644 --- a/apps/files_encryption/ajax/changeRecoveryPassword.php +++ b/apps/files_encryption/ajax/changeRecoveryPassword.php @@ -22,28 +22,28 @@ $return = false; $oldPassword = $_POST['oldPassword']; $newPassword = $_POST['newPassword']; +$view = new \OC\Files\View('/'); $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), \OCP\User::getUser()); -$result = $util->checkRecoveryPassword($oldPassword); +$proxyStatus = \OC_FileProxy::$enabled; +\OC_FileProxy::$enabled = false; -if ($result) { - $keyId = $util->getRecoveryKeyId(); - $keyPath = '/owncloud_private_key/' . $keyId . '.private.key'; - $view = new \OC\Files\View('/'); +$keyId = $util->getRecoveryKeyId(); +$keyPath = '/owncloud_private_key/' . $keyId . '.private.key'; - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; +$encryptedRecoveryKey = $view->file_get_contents($keyPath); +$decryptedRecoveryKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedRecoveryKey, $oldPassword); + +if ($decryptedRecoveryKey) { - $encryptedRecoveryKey = $view->file_get_contents($keyPath); - $decryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricDecryptFileContent($encryptedRecoveryKey, $oldPassword); $encryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword); $view->file_put_contents($keyPath, $encryptedRecoveryKey); - \OC_FileProxy::$enabled = $proxyStatus; - $return = true; } +\OC_FileProxy::$enabled = $proxyStatus; + // success or failure if ($return) { \OCP\JSON::success(array('data' => array('message' => $l->t('Password successfully changed.')))); diff --git a/apps/files_encryption/ajax/updatePrivateKeyPassword.php b/apps/files_encryption/ajax/updatePrivateKeyPassword.php new file mode 100644 index 0000000000..6fd63dae9c --- /dev/null +++ b/apps/files_encryption/ajax/updatePrivateKeyPassword.php @@ -0,0 +1,54 @@ + + * This file is licensed under the Affero General Public License version 3 or later. + * See the COPYING-README file. + * + * @brief Script to change recovery key password + * + */ + +use OCA\Encryption; + +\OCP\JSON::checkLoggedIn(); +\OCP\JSON::checkAppEnabled('files_encryption'); +\OCP\JSON::callCheck(); + +$l = OC_L10N::get('core'); + +$return = false; + +$oldPassword = $_POST['oldPassword']; +$newPassword = $_POST['newPassword']; + +$view = new \OC\Files\View('/'); +$session = new \OCA\Encryption\Session($view); +$user = \OCP\User::getUser(); + +$proxyStatus = \OC_FileProxy::$enabled; +\OC_FileProxy::$enabled = false; + +$keyPath = '/' . $user . '/files_encryption/' . $user . '.private.key'; + +$encryptedKey = $view->file_get_contents($keyPath); +$decryptedKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedKey, $oldPassword); + +if ($decryptedKey) { + + $encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedKey, $newPassword); + $view->file_put_contents($keyPath, $encryptedKey); + + $session->setPrivateKey($decryptedKey); + + $return = true; +} + +\OC_FileProxy::$enabled = $proxyStatus; + +// success or failure +if ($return) { + \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/appinfo/app.php b/apps/files_encryption/appinfo/app.php index d9bb4d5e74..90a9984e27 100644 --- a/apps/files_encryption/appinfo/app.php +++ b/apps/files_encryption/appinfo/app.php @@ -10,39 +10,58 @@ 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'; -OC_FileProxy::register(new OCA\Encryption\Proxy()); +if (!OC_Config::getValue('maintenance', false)) { + OC_FileProxy::register(new OCA\Encryption\Proxy()); -// User related hooks -OCA\Encryption\Helper::registerUserHooks(); + // User related hooks + OCA\Encryption\Helper::registerUserHooks(); -// Sharing related hooks -OCA\Encryption\Helper::registerShareHooks(); + // Sharing related hooks + OCA\Encryption\Helper::registerShareHooks(); -// Filesystem related hooks -OCA\Encryption\Helper::registerFilesystemHooks(); + // Filesystem related hooks + OCA\Encryption\Helper::registerFilesystemHooks(); -stream_wrapper_register('crypt', 'OCA\Encryption\Stream'); + // App manager related hooks + OCA\Encryption\Helper::registerAppHooks(); -// check if we are logged in -if (OCP\User::isLoggedIn()) { - $view = new OC_FilesystemView('/'); - $session = new \OCA\Encryption\Session($view); + stream_wrapper_register('crypt', 'OCA\Encryption\Stream'); - // check if user has a private key - if ( - !$session->getPrivateKey(\OCP\USER::getUser()) - && OCA\Encryption\Crypt::mode() === 'server' - ) { + // check if we are logged in + if (OCP\User::isLoggedIn()) { - // 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(); + // ensure filesystem is loaded + if (!\OC\Files\Filesystem::$loaded) { + \OC_Util::setupFS(); + } - header("Location: " . OC::$WEBROOT . '/'); + $view = new OC_FilesystemView('/'); - exit(); + $sessionReady = OCA\Encryption\Helper::checkRequirements(); + 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 + OCP\User::logout(); } // Register settings scripts diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml index ea8f6cf6f3..1e97b1b221 100644 --- a/apps/files_encryption/appinfo/info.xml +++ b/apps/files_encryption/appinfo/info.xml @@ -2,7 +2,7 @@ files_encryption Encryption - WARNING: This is a preview release of the new ownCloud 5 encryption system. Testing and feedback is very welcome but don't use this in production yet. Encryption is not yet compatible with LDAP. + WARNING: This is a preview release of the new ownCloud 5 encryption system. Testing and feedback is very welcome but don't use this in production yet. After the app was enabled you need to re-login to initialize your encryption keys AGPL Sam Tuke, Bjoern Schiessle, Florin Peter 4 diff --git a/apps/files_encryption/files/error.php b/apps/files_encryption/files/error.php new file mode 100644 index 0000000000..f93c67d920 --- /dev/null +++ b/apps/files_encryption/files/error.php @@ -0,0 +1,23 @@ +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); + } + + // 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); + $tmpl = new OC_Template('files_encryption', 'invalid_private_key', 'guest'); + $tmpl->printPage(); + } + + exit; +} diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index 955425595b..b2a17f6bca 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -38,14 +38,23 @@ class Hooks { * @note This method should never be called for users using client side encryption */ public static function login($params) { - - // Manually initialise Filesystem{} singleton with correct - // fake root path, in order to avoid fatal webdav errors - // NOTE: disabled because this give errors on webdav! - //\OC\Files\Filesystem::init( $params['uid'], '/' . 'files' . '/' ); + $l = new \OC_L10N('files_encryption'); + //check if all requirements are met + if(!Helper::checkRequirements() ) { + $error_msg = $l->t("Missing requirements."); + $hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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); + } $view = new \OC_FilesystemView('/'); + // ensure filesystem is loaded + if(!\OC\Files\Filesystem::$loaded) { + \OC_Util::setupFS($params['uid']); + } + $util = new Util($view, $params['uid']); // setup user, if user not ready force relogin @@ -55,17 +64,25 @@ class Hooks { $encryptedKey = Keymanager::getPrivateKey($view, $params['uid']); - $privateKey = Crypt::symmetricDecryptFileContent($encryptedKey, $params['password']); + $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, $params['uid']); + $session->setPrivateKey($privateKey); // Check if first-run file migration has already been performed - $migrationCompleted = $util->getMigrationStatus(); + $ready = false; + if ($util->getMigrationStatus() === Util::MIGRATION_OPEN) { + $ready = $util->beginMigration(); + } // If migration not yet done - if (!$migrationCompleted) { + if ($ready) { $userView = new \OC_FilesystemView('/' . $params['uid']); @@ -76,7 +93,7 @@ class Hooks { && $encLegacyKey = $userView->file_get_contents('encryption.key') ) { - $plainLegacyKey = Crypt::legacyBlockDecrypt($encLegacyKey, $params['password']); + $plainLegacyKey = Crypt::legacyDecrypt($encLegacyKey, $params['password']); $session->setLegacyKey($plainLegacyKey); @@ -97,7 +114,7 @@ class Hooks { } // Register successful migration in DB - $util->setMigrationStatus(1); + $util->finishMigration(); } @@ -136,6 +153,15 @@ class Hooks { \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); + } + } + /** * @brief Change a user's encryption passphrase * @param array $params keys: uid, password @@ -143,7 +169,7 @@ class Hooks { public static function setPassphrase($params) { // Only attempt to change passphrase if server-side encryption - // is in use (client-side encryption does not have access to + // is in use (client-side encryption does not have access to // the necessary keys) if (Crypt::mode() === 'server') { @@ -327,6 +353,12 @@ class Hooks { $sharingEnabled = \OCP\Share::isEnabled(); + // get the path including mount point only if not a shared folder + if (strncmp($path, '/Shared', strlen('/Shared') !== 0)) { + // get path including the the storage mount point + $path = $util->getPathWithMountPoint($params['itemSource']); + } + // if a folder was shared, get a list of all (sub-)folders if ($params['itemType'] === 'folder') { $allFiles = $util->getAllFiles($path); @@ -376,17 +408,11 @@ class Hooks { // rebuild path foreach ($targetPathSplit as $pathPart) { - if ($pathPart !== $sharedPart) { - $path = '/' . $pathPart . $path; - } else { - break; - } - } // prefix path with Shared @@ -404,13 +430,16 @@ class Hooks { } } + // get the path including mount point only if not a shared folder + if (strncmp($path, '/Shared', strlen('/Shared') !== 0)) { + // get path including the the storage mount point + $path = $util->getPathWithMountPoint($params['itemSource']); + } + // if we unshare a folder we need a list of all (sub-)files if ($params['itemType'] === 'folder') { - $allFiles = $util->getAllFiles($path); - } else { - $allFiles = array($path); } @@ -447,10 +476,19 @@ class Hooks { $util = new Util($view, $userId); // Format paths to be relative to user files dir - $oldKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $params['oldpath']); - $newKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $params['newpath']); + if ($util->isSystemWideMountPoint($params['oldpath'])) { + $baseDir = 'files_encryption/'; + $oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath']; + } else { + $baseDir = $userId . '/' . 'files_encryption/'; + $oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath']; + } + + if ($util->isSystemWideMountPoint($params['newpath'])) { + $newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath']; + } else { + $newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath']; + } // add key ext if this is not an folder if (!$view->is_dir($oldKeyfilePath)) { @@ -458,8 +496,9 @@ class Hooks { $newKeyfilePath .= '.key'; // handle share-keys - $localKeyPath = $view->getLocalFile($userId . '/files_encryption/share-keys/' . $params['oldpath']); - $matches = glob(preg_quote($localKeyPath) . '*.shareKey'); + $localKeyPath = $view->getLocalFile($baseDir . 'share-keys/' . $params['oldpath']); + $escapedPath = Helper::escapeGlobPattern($localKeyPath); + $matches = glob($escapedPath . '*.shareKey'); foreach ($matches as $src) { $dst = \OC\Files\Filesystem::normalizePath(str_replace($params['oldpath'], $params['newpath'], $src)); @@ -473,10 +512,8 @@ class Hooks { } else { // handle share-keys folders - $oldShareKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $params['oldpath']); - $newShareKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $params['newpath']); + $oldShareKeyfilePath = $baseDir . 'share-keys/' . $params['oldpath']; + $newShareKeyfilePath = $baseDir . 'share-keys/' . $params['newpath']; // create destination folder if not exists if (!$view->file_exists(dirname($newShareKeyfilePath))) { @@ -514,4 +551,17 @@ class Hooks { \OC_FileProxy::$enabled = $proxyStatus; } + + /** + * set migration 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(); + } + } + } diff --git a/apps/files_encryption/js/settings-personal.js b/apps/files_encryption/js/settings-personal.js index 312b672ad4..d6535a25b7 100644 --- a/apps/files_encryption/js/settings-personal.js +++ b/apps/files_encryption/js/settings-personal.js @@ -4,7 +4,25 @@ * See the COPYING-README file. */ +function updatePrivateKeyPasswd() { + var oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val(); + var newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val(); + OC.msg.startSaving('#encryption .msg'); + $.post( + OC.filePath( 'files_encryption', 'ajax', 'updatePrivateKeyPassword.php' ) + , { oldPassword: oldPrivateKeyPassword, newPassword: newPrivateKeyPassword } + , function( data ) { + if (data.status === "error") { + OC.msg.finishedSaving('#encryption .msg', data); + } else { + OC.msg.finishedSaving('#encryption .msg', data); + } + } + ); +} + $(document).ready(function(){ + // Trigger ajax on recoveryAdmin status change $( 'input:radio[name="userEnableRecovery"]' ).change( function() { @@ -57,4 +75,24 @@ $(document).ready(function(){ } ); + + // update private key password + + $('input:password[name="changePrivateKeyPassword"]').keyup(function(event) { + var oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val(); + var newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val(); + if (newPrivateKeyPassword !== '' && oldPrivateKeyPassword !== '' ) { + $('button:button[name="submitChangePrivateKeyPassword"]').removeAttr("disabled"); + if(event.which === 13) { + updatePrivateKeyPasswd(); + } + } else { + $('button:button[name="submitChangePrivateKeyPassword"]').attr("disabled", "true"); + } + }); + + $('button:button[name="submitChangePrivateKeyPassword"]').click(function() { + updatePrivateKeyPasswd(); + }); + }); \ No newline at end of file diff --git a/apps/files_encryption/l10n/ca.php b/apps/files_encryption/l10n/ca.php index 46e91d1f07..d9d3d7b4fa 100644 --- a/apps/files_encryption/l10n/ca.php +++ b/apps/files_encryption/l10n/ca.php @@ -1,4 +1,36 @@ "La clau de recuperació s'ha activat", +"Could not enable recovery key. Please check your recovery key password!" => "No s'ha pogut activar la clau de recuperació. Comproveu contrasenya de la clau de recuperació!", +"Recovery key successfully disabled" => "La clau de recuperació s'ha descativat", +"Could not disable recovery key. Please check your recovery key password!" => "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!", +"Password successfully changed." => "La contrasenya s'ha canviat.", +"Could not change the password. Maybe the old password was not correct." => "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.", +"Private key password successfully updated." => "La contrasenya de la clau privada s'ha actualitzat.", +"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.", +"Missing requirements." => "Manca de requisits.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Assegureu-vos que teniu instal·lada la versió de PHP 5.3.3 o posterior, i que teniu l'extensió OpenSSL PHP activada i configurada correctament. Per ara, l'aplicació de xifrat esta desactivada.", "Saving..." => "Desant...", -"Encryption" => "Xifrat" +"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", +"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", +"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", +"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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Si no recordeu la contrasenya anterior podeu demanar a l'administrador que recuperi els vostres fitxers.", +"Old log-in password" => "Contrasenya anterior d'accés", +"Current log-in password" => "Contrasenya d'accés actual", +"Update Private Key Password" => "Actualitza la contrasenya de clau privada", +"Enable password recovery:" => "Habilita la recuperació de contrasenya:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Activar aquesta opció us permetrà obtenir de nou accés als vostres fitxers encriptats en cas de perdre la contrasenya", +"File recovery settings updated" => "S'han actualitzat els arranjaments de recuperació de fitxers", +"Could not update file recovery" => "No s'ha pogut actualitzar la recuperació de fitxers" ); diff --git a/apps/files_encryption/l10n/cs_CZ.php b/apps/files_encryption/l10n/cs_CZ.php index f9b2dd06b6..a402b96a51 100644 --- a/apps/files_encryption/l10n/cs_CZ.php +++ b/apps/files_encryption/l10n/cs_CZ.php @@ -1,4 +1,19 @@ "Záchranný klíč byl úspěšně povolen", +"Could not enable recovery key. Please check your recovery key password!" => "Nepodařilo se povolit záchranný klíč. Zkontrolujte prosím vaše heslo záchranného klíče!", +"Recovery key successfully disabled" => "Záchranný klíč byl úspěšně zakázán", +"Could not disable recovery key. Please check your recovery key password!" => "Nelze zakázat záchranný klíč. Zkontrolujte prosím heslo vašeho záchranného klíče.", +"Password successfully changed." => "Heslo bylo úspěšně změněno.", +"Could not change the password. Maybe the old password was not correct." => "Nelze změnit heslo. 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ě.", "Saving..." => "Ukládám...", -"Encryption" => "Šifrování" +"Encryption" => "Šifrování", +"Enabled" => "Povoleno", +"Disabled" => "Zakázáno", +"Change Password" => "Změnit heslo", +"Enable password recovery:" => "Povolit obnovu hesla:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Povolení vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo", +"File recovery settings updated" => "Možnosti obnovy souborů aktualizovány", +"Could not update file recovery" => "Nelze aktualizovat obnovu souborů" ); diff --git a/apps/files_encryption/l10n/de.php b/apps/files_encryption/l10n/de.php index 2ab77f480c..d8265906db 100644 --- a/apps/files_encryption/l10n/de.php +++ b/apps/files_encryption/l10n/de.php @@ -1,4 +1,36 @@ "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!", +"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!", +"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.", +"Missing requirements." => "Fehlende Vorraussetzungen", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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 ist und die OpenSSL-PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung wurde vorerst deaktiviert.", "Saving..." => "Speichern...", -"Encryption" => "Verschlüsselung" +"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", +"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", +"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", +"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", +"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", +"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_DE.php b/apps/files_encryption/l10n/de_DE.php index 5ab283ccab..2d7512354d 100644 --- a/apps/files_encryption/l10n/de_DE.php +++ b/apps/files_encryption/l10n/de_DE.php @@ -1,9 +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.", +"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.", +"Missing requirements." => "Fehlende Voraussetzungen", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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 die PHP-Erweiterung OpenSSL aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", "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", +"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 Password" => "Passwort ändern" +"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:" => "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." ); diff --git a/apps/files_encryption/l10n/el.php b/apps/files_encryption/l10n/el.php index 7067799cd2..990f464bc1 100644 --- a/apps/files_encryption/l10n/el.php +++ b/apps/files_encryption/l10n/el.php @@ -1,4 +1,11 @@ "Ο κωδικός αλλάχτηκε επιτυχώς.", +"Could not change the password. Maybe the old password was not correct." => "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.", "Saving..." => "Γίνεται αποθήκευση...", -"Encryption" => "Κρυπτογράφηση" +"personal settings" => "προσωπικές ρυθμίσεις", +"Encryption" => "Κρυπτογράφηση", +"Enabled" => "Ενεργοποιημένο", +"Disabled" => "Απενεργοποιημένο", +"Change Password" => "Αλλαγή Κωδικού Πρόσβασης", +"File recovery settings updated" => "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν" ); diff --git a/apps/files_encryption/l10n/eo.php b/apps/files_encryption/l10n/eo.php index ea405fda1a..997b60f8ac 100644 --- a/apps/files_encryption/l10n/eo.php +++ b/apps/files_encryption/l10n/eo.php @@ -1,4 +1,15 @@ "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.", "Saving..." => "Konservante...", -"Encryption" => "Ĉifrado" +"personal settings" => "persona agordo", +"Encryption" => "Ĉifrado", +"Enabled" => "Kapabligita", +"Disabled" => "Malkapabligita", +"Change Password" => "Ŝarĝi pasvorton", +"Your private key password no longer match your log-in password:" => "La pasvorto de via malpublika klavo ne plu kongruas kun via ensaluta pasvorto:", +"Old log-in password" => "Malnova ensaluta pasvorto", +"Current log-in password" => "Nuna ensaluta pasvorto", +"Update Private Key Password" => "Ĝisdatigi la pasvorton de la malpublika klavo" ); diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php index 7311a78f09..0b49edbd2a 100644 --- a/apps/files_encryption/l10n/es.php +++ b/apps/files_encryption/l10n/es.php @@ -1,4 +1,36 @@ "Se ha habilitado la recuperación de archivos", +"Could not enable recovery key. Please check your recovery key password!" => "No se pudo habilitar la clave de recuperación. Por favor compruebe su contraseña.", +"Recovery key successfully disabled" => "Clave de recuperación deshabilitada", +"Could not disable recovery key. Please check your recovery key password!" => "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!", +"Password successfully changed." => "Su contraseña ha sido cambiada", +"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.", +"Missing requirements." => "Requisitos incompletos.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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.", "Saving..." => "Guardando...", -"Encryption" => "Cifrado" +"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", +"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", +"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", +"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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus ficheros.", +"Old log-in password" => "Contraseña de acceso antigua", +"Current log-in password" => "Contraseña de acceso actual", +"Update Private Key Password" => "Actualizar Contraseña de Clave Privada", +"Enable password recovery:" => "Habilitar la recuperación de contraseña:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Habilitar esta opción le permitirá volver a tener acceso a sus ficheros cifrados en caso de pérdida de contraseña", +"File recovery settings updated" => "Opciones de recuperación de archivos actualizada", +"Could not update file recovery" => "No se pudo actualizar la recuperación de archivos" ); diff --git a/apps/files_encryption/l10n/es_AR.php b/apps/files_encryption/l10n/es_AR.php index 857186a55f..63c7fb7aa4 100644 --- a/apps/files_encryption/l10n/es_AR.php +++ b/apps/files_encryption/l10n/es_AR.php @@ -1,4 +1,36 @@ "Se habilitó la recuperación de archivos", +"Could not enable recovery key. Please check your recovery key password!" => "No se pudo habilitar la clave de recuperación. Por favor, comprobá tu contraseña.", +"Recovery key successfully disabled" => "Clave de recuperación deshabilitada", +"Could not disable recovery key. Please check your recovery key password!" => "No fue posible deshabilitar la clave de recuperación. Por favor, comprobá tu contraseña.", +"Password successfully changed." => "Tu contraseña fue cambiada", +"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 la clave privada. Tal vez la contraseña antigua 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 tus opciones personales, para recuperar el acceso a sus archivos.", +"Missing requirements." => "Requisitos incompletos.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegurate 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 encriptación fue deshabilitada.", "Saving..." => "Guardando...", -"Encryption" => "Encriptación" +"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 en que pierdas la contraseña):", +"Recovery key password" => "Contraseña de recuperación de clave", +"Enabled" => "Habilitado", +"Disabled" => "Deshabilitado", +"Change recovery key password:" => "Cambiar contraseña para recuperar la clave:", +"Old Recovery key password" => "Contraseña antigua de recuperación de clave", +"New Recovery key password" => "Nueva contraseña de recuperación de clave", +"Change Password" => "Cambiar contraseña", +"Your private key password no longer match your log-in password:" => "Tu contraseña de recuperación de clave ya no coincide con la contraseña de ingreso:", +"Set your old private key password to your current log-in password." => "Usá tu contraseña de recuperación de clave antigua para tu contraseña de ingreso actual.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Si no te acordás de tu contraseña antigua, pedile al administrador que recupere tus archivos", +"Old log-in password" => "Contraseña anterior", +"Current log-in password" => "Contraseña actual", +"Update Private Key Password" => "Actualizar contraseña de la clave privada", +"Enable password recovery:" => "Habilitar contraseña de recuperación:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Habilitando esta opción te va a permitir tener acceso a tus archivos encriptados incluso si perdés la contraseña", +"File recovery settings updated" => "Las opciones de recuperación de archivos fueron actualizadas", +"Could not update file recovery" => "No fue posible actualizar la recuperación de archivos" ); diff --git a/apps/files_encryption/l10n/et_EE.php b/apps/files_encryption/l10n/et_EE.php index 0501a9f4f4..c1c8164b81 100644 --- a/apps/files_encryption/l10n/et_EE.php +++ b/apps/files_encryption/l10n/et_EE.php @@ -1,18 +1,36 @@ "Taastevõtme lubamine õnnestus", +"Could not enable recovery key. Please check your recovery key password!" => "Ei suutnud lubada taastevõtit. Palun kontrolli oma taastevõtme parooli!", +"Recovery key successfully disabled" => "Taastevõtme keelamine õnnestus", +"Could not disable recovery key. Please check your recovery key password!" => "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!", "Password successfully changed." => "Parool edukalt vahetatud.", "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.", +"Missing requirements." => "Nõutavad on puudu.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Veendu, et kasutusel oleks PHP 5.3.3 või uuem versioon ning kasutusel oleks OpenSSL PHP laiendus ja see on korrektselt seadistatud. Hetkel on krüpteerimise rakenduse kasutamine peatatud.", "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", +"personal settings" => "isiklikes seadetes", "Encryption" => "Krüpteerimine", -"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Luba krüpteerimise paroolide taastevõti (võimalda parooli jagamine taastevõtmesse):", -"Recovery account password" => "Konto taasteparool", +"Enable recovery key (allow to recover users files in case of password loss):" => "Luba taastevõti (võimada kasutaja failide taastamine parooli kaotuse puhul):", +"Recovery key password" => "Taastevõtme parool", "Enabled" => "Sisse lülitatud", "Disabled" => "Väljalülitatud", -"Change encryption passwords recovery key:" => "Muuda taaste võtme krüpteerimise paroole:", -"Old Recovery account password" => "Konto vana taaste parool", -"New Recovery account password" => "Konto uus taasteparool", +"Change recovery key password:" => "Muuda taastevõtme parooli:", +"Old Recovery key password" => "Vana taastevõtme parool", +"New Recovery key password" => "Uus taastevõtme parool", "Change Password" => "Muuda parooli", -"Enable password recovery by sharing all files with your administrator:" => "Luba parooli taaste jagades kõik failid administraatoriga:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parool on kadunud", +"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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Kui sa ei mäleta oma vana parooli, siis palu oma süsteemihalduril taastada ligipääs failidele.", +"Old log-in password" => "Vana sisselogimise parool", +"Current log-in password" => "Praegune sisselogimise parool", +"Update Private Key Password" => "Uuenda privaatse võtme parooli", +"Enable password recovery:" => "Luba parooli taaste:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul", "File recovery settings updated" => "Faili taaste seaded uuendatud", "Could not update file recovery" => "Ei suuda uuendada taastefaili" ); diff --git a/apps/files_encryption/l10n/eu.php b/apps/files_encryption/l10n/eu.php index 253953e5c5..22fe793268 100644 --- a/apps/files_encryption/l10n/eu.php +++ b/apps/files_encryption/l10n/eu.php @@ -1,4 +1,24 @@ "Berreskuratze gakoa behar bezala gaitua", +"Could not enable recovery key. Please check your recovery key password!" => "Ezin da berreskuratze gako gaitu. Egiaztatu berreskuratze gako pasahitza!", +"Recovery key successfully disabled" => "Berreskuratze gakoa behar bezala desgaitu da", +"Could not disable recovery key. Please check your recovery key password!" => "Ezin da berreskuratze gako desgaitu. Egiaztatu berreskuratze gako pasahitza!", +"Password successfully changed." => "Pasahitza behar bezala aldatu da.", +"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.", "Saving..." => "Gordetzen...", -"Encryption" => "Enkriptazioa" +"personal settings" => "ezarpen pertsonalak", +"Encryption" => "Enkriptazioa", +"Recovery key password" => "Berreskuratze gako 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", +"Change Password" => "Aldatu Pasahitza", +"Update Private Key Password" => "Eguneratu gako pribatu pasahitza", +"Enable password recovery:" => "Gaitu pasahitz berreskuratzea:", +"File recovery settings updated" => "Fitxategi berreskuratze ezarpenak eguneratuak", +"Could not update file recovery" => "Ezin da fitxategi berreskuratzea eguneratu" ); diff --git a/apps/files_encryption/l10n/fa.php b/apps/files_encryption/l10n/fa.php index af2e36b2a8..8967ca1eed 100644 --- a/apps/files_encryption/l10n/fa.php +++ b/apps/files_encryption/l10n/fa.php @@ -1,4 +1,36 @@ "کلید بازیابی با موفقیت فعال شده است.", +"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." => "رمزعبور کلید خصوصی را نمی تواند به روز کند. شاید رمزعبور قدیمی صحیح نمی باشد.", +"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." => "نیازمندی های گمشده", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "لطفا مطمئن شوید که PHP 5.3.3 یا جدیدتر نصب شده و پسوند OpenSSL PHP فعال است و به درستی پیکربندی شده است. در حال حاضر، برنامه رمزگذاری غیر فعال شده است.", "Saving..." => "در حال ذخیره سازی...", -"Encryption" => "رمزگذاری" +"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):" => "فعال کردن کلید بازیابی(اجازه بازیابی فایل های کاربران در صورت از دست دادن رمزعبور):", +"Recovery key password" => "رمزعبور کلید بازیابی", +"Enabled" => "فعال شده", +"Disabled" => "غیرفعال شده", +"Change recovery key password:" => "تغییر رمزعبور کلید بازیابی:", +"Old Recovery key password" => "رمزعبور قدیمی کلید بازیابی ", +"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/l10n/fr.php b/apps/files_encryption/l10n/fr.php index 98fb70691d..174932d6e8 100644 --- a/apps/files_encryption/l10n/fr.php +++ b/apps/files_encryption/l10n/fr.php @@ -1,4 +1,36 @@ "Clé de récupération activée avec succès", +"Could not enable recovery key. Please check your recovery key password!" => "Impossible d'activer la clé de récupération. Veuillez vérifier votre mot de passe de clé de récupération !", +"Recovery key successfully disabled" => "Clé de récupération désactivée avec succès", +"Could not disable recovery key. Please check your recovery key password!" => "Impossible de désactiver la clé de récupération. Veuillez vérifier votre mot de passe de clé de récupération !", +"Password successfully changed." => "Mot de passe changé avec succès ", +"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.", +"Missing requirements." => "Système minimum requis non respecté.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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 plus récente est installée et que l'extension OpenSSL de PHP est activée et configurée correctement. En attendant, l'application de cryptage a été désactivée.", "Saving..." => "Enregistrement...", -"Encryption" => "Chiffrement" +"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", +"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", +"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", +"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. ", +" If you don't remember your old password you can ask your administrator to recover your files." => "Si vous ne vous souvenez plus de votre ancien mot de passe, vous pouvez demander à votre administrateur de récupérer vos fichiers.", +"Old log-in password" => "Ancien mot de passe de connexion", +"Current log-in password" => "Actuel mot de passe de connexion", +"Update Private Key Password" => "Mettre à jour le mot de passe de votre clé privée", +"Enable password recovery:" => "Activer la récupération du mot de passe :", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Activer cette option vous permettra d'obtenir à nouveau l'accès à vos fichiers chiffrés en cas de perte de mot de passe", +"File recovery settings updated" => "Paramètres de récupération de fichiers mis à jour", +"Could not update file recovery" => "Ne peut pas remettre à jour les fichiers de récupération" ); diff --git a/apps/files_encryption/l10n/gl.php b/apps/files_encryption/l10n/gl.php index e58fc9a1cd..db6f57bb36 100644 --- a/apps/files_encryption/l10n/gl.php +++ b/apps/files_encryption/l10n/gl.php @@ -1,18 +1,36 @@ "Activada satisfactoriamente a chave de recuperación", +"Could not enable recovery key. Please check your recovery key password!" => "Non foi posíbel activar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!", +"Recovery key successfully disabled" => "Desactivada satisfactoriamente a chave de recuperación", +"Could not disable recovery key. Please check your recovery key password!" => "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!", "Password successfully changed." => "O contrasinal foi cambiado satisfactoriamente", "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", +"Missing requirements." => "Non se cumpren os requisitos.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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 que a extensión OpenSSL PHP estea activada e configurada correctamente. Polo de agora foi desactivado o aplicativo de cifrado.", "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", +"personal settings" => "axustes persoais", "Encryption" => "Cifrado", -"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activar a chave de recuperación do cifrado de contrasinais (permite compartir a chave de recuperación):", -"Recovery account password" => "Recuperación do contrasinal da conta", +"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", "Enabled" => "Activado", "Disabled" => "Desactivado", -"Change encryption passwords recovery key:" => "Cambiar a chave de la recuperación do cifrado de contrasinais:", -"Old Recovery account password" => "Antigo contrasinal de recuperación da conta", -"New Recovery account password" => "Novo contrasinal de recuperación da conta", +"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", "Change Password" => "Cambiar o contrasinal", -"Enable password recovery by sharing all files with your administrator:" => "Activar a recuperación de contrasinais compartindo todos os ficheiros co administrador:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados se perde 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", +" If you don't remember your old password you can ask your administrator to recover your files." => " Se non lembra o seu antigo contrasinal pode pedírllelo ao seu administrador para recuperar os seus ficheiros.", +"Old log-in password" => "Contrasinal de acceso antigo", +"Current log-in password" => "Contrasinal de acceso actual", +"Update Private Key Password" => "Actualizar o contrasinal da chave privada", +"Enable password recovery:" => "Activar o contrasinal de recuperación:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados no caso de perda do contrasinal", "File recovery settings updated" => "Actualizouse o ficheiro de axustes de recuperación", "Could not update file recovery" => "Non foi posíbel actualizar o ficheiro de recuperación" ); diff --git a/apps/files_encryption/l10n/it.php b/apps/files_encryption/l10n/it.php index ecdb04a36b..8d15d1ced3 100644 --- a/apps/files_encryption/l10n/it.php +++ b/apps/files_encryption/l10n/it.php @@ -1,18 +1,36 @@ "Chiave di ripristino abilitata correttamente", +"Could not enable recovery key. Please check your recovery key password!" => "Impossibile abilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", +"Recovery key successfully disabled" => "Chiave di ripristinata disabilitata correttamente", +"Could not disable recovery key. Please check your recovery key password!" => "Impossibile disabilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", "Password successfully changed." => "Password modificata correttamente.", "Could not change the password. Maybe the old password was not correct." => "Impossibile cambiare la password. Forse la vecchia password non era corretta.", +"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.", +"Missing requirements." => "Requisiti mancanti.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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.", "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", +"personal settings" => "impostazioni personali", "Encryption" => "Cifratura", -"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Abilita la chiave di ripristino delle password di cifratura (consente di condividere la chiave di ripristino):", -"Recovery account password" => "Password di ripristino dell'account", +"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", "Enabled" => "Abilitata", "Disabled" => "Disabilitata", -"Change encryption passwords recovery key:" => "Cambia la chiave di ripristino delle password di cifratura:", -"Old Recovery account password" => "Vecchia password di ripristino dell'account", -"New Recovery account password" => "Nuova password di ripristino dell'account", +"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", "Change Password" => "Modifica password", -"Enable password recovery by sharing all files with your administrator:" => "Abilita il ripristino della password condividendo tutti i file con l'amministratore:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "L'abilitazione di questa opzione ti consentirà di ottenere nuovamente accesso ai tuoi file cifrati in caso di smarrimento della 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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Se non ricordi la vecchia password puoi chiedere al tuo amministratore di recuperare i file.", +"Old log-in password" => "Vecchia password di accesso", +"Current log-in password" => "Password di accesso attuale", +"Update Private Key Password" => "Aggiorna la password della chiave privata", +"Enable password recovery:" => "Abilita il ripristino della password:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "L'abilitazione di questa opzione ti consentirà di accedere nuovamente ai file cifrati in caso di perdita della password", "File recovery settings updated" => "Impostazioni di ripristino dei file aggiornate", "Could not update file recovery" => "Impossibile aggiornare il ripristino dei file" ); diff --git a/apps/files_encryption/l10n/ja_JP.php b/apps/files_encryption/l10n/ja_JP.php index 7f906ae5c0..a1fcbd5c54 100644 --- a/apps/files_encryption/l10n/ja_JP.php +++ b/apps/files_encryption/l10n/ja_JP.php @@ -1,18 +1,36 @@ "リカバリ用のキーは正常に有効化されました", +"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." => "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。", +"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." => "必要要件が満たされていません。", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3以上をインストールし、OpenSSLのPHP拡張を有効にして適切に設定してください。現時点では暗号化アプリは無効になっています。", "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 encryption passwords recovery key (allow sharing to recovery key):" => "暗号化パスワードの復旧キーを有効にする(復旧キーを共有することを許可):", -"Recovery account password" => "復旧アカウントのパスワード", +"Enable recovery key (allow to recover users files in case of password loss):" => "復旧キーを有効化 (万一パスワードを亡くした場合もユーザーのファイルを回復できる):", +"Recovery key password" => "復旧キーのパスワード", "Enabled" => "有効", "Disabled" => "無効", -"Change encryption passwords recovery key:" => "復旧キーの暗号化パスワードを変更:", -"Old Recovery account password" => "古い復旧アカウントのパスワード", -"New Recovery account password" => "新しい復旧アカウントのパスワード", +"Change recovery key password:" => "復旧キーのパスワードを変更:", +"Old Recovery key password" => "古い復旧キーのパスワード", +"New Recovery key password" => "新しい復旧キーのパスワード", "Change Password" => "パスワードを変更", -"Enable password recovery by sharing all files with your administrator:" => "管理者が全ての共有ファイルに対してパスワードによる復旧を有効にする:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "このオプションを有効にすると、もしパスワードが分からなくなったとしても、暗号化されたファイルに再度アクセスすることが出来るようになります。", +"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/l10n/lt_LT.php b/apps/files_encryption/l10n/lt_LT.php index 6bc80ff44a..84fa902dc6 100644 --- a/apps/files_encryption/l10n/lt_LT.php +++ b/apps/files_encryption/l10n/lt_LT.php @@ -1,4 +1,15 @@ "Atkūrimo raktas sėkmingai įjungtas", +"Could not enable recovery key. Please check your recovery key password!" => "Neišėjo įjungti jūsų atkūrimo rakto. Prašome jį patikrinti!", +"Recovery key successfully disabled" => "Atkūrimo raktas sėkmingai išjungtas", +"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.", "Saving..." => "Saugoma...", -"Encryption" => "Šifravimas" +"Encryption" => "Šifravimas", +"Enabled" => "Įjungta", +"Disabled" => "Išjungta", +"Change Password" => "Pakeisti slaptažodį", +"File recovery settings updated" => "Failų atstatymo nustatymai pakeisti", +"Could not update file recovery" => "Neišėjo atnaujinti failų atkūrimo" ); diff --git a/apps/files_encryption/l10n/nl.php b/apps/files_encryption/l10n/nl.php index ebcbdfab15..093ed2c29c 100644 --- a/apps/files_encryption/l10n/nl.php +++ b/apps/files_encryption/l10n/nl.php @@ -1,18 +1,33 @@ "Herstelsleutel succesvol geactiveerd", +"Could not enable recovery key. Please check your recovery key password!" => "Kon herstelsleutel niet activeren. Controleer het wachtwoord van uw herstelsleutel!", +"Recovery key successfully disabled" => "Herstelsleutel succesvol gedeactiveerd", +"Could not disable recovery key. Please check your recovery key password!" => "Kon herstelsleutel niet deactiveren. Controleer het wachtwoord van uw herstelsleutel!", "Password successfully changed." => "Wachtwoord succesvol gewijzigd.", "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.", "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", +"personal settings" => "persoonlijke instellingen", "Encryption" => "Versleuteling", -"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activeer versleuteling van wachtwoorden herstelsleutel (maak delen met herstel sleutel mogelijk):", -"Recovery account password" => "Herstel account wachtwoord", +"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", "Enabled" => "Geactiveerd", "Disabled" => "Gedeactiveerd", -"Change encryption passwords recovery key:" => "Wijzig versleuteling wachtwoord herstelsleutel", -"Old Recovery account password" => "Oude herstel account wachtwoord", -"New Recovery account password" => "Nieuwe herstel account wachtwoord", +"Change recovery key password:" => "Wijzig wachtwoord herstelsleutel:", +"Old Recovery key password" => "Oude wachtwoord herstelsleutel", +"New Recovery key password" => "Nieuwe wachtwoord herstelsleutel", "Change Password" => "Wijzigen wachtwoord", -"Enable password recovery by sharing all files with your administrator:" => "Activeer wachtwoordherstel door alle bestanden met uw beheerder te delen:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Door deze optie te activeren kunt u toegang tot uw versleutelde bestanden krijgen als u uw wachtwoord kwijt bent", +"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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Als u uw oude wachtwoord niet meer weet, kunt u uw beheerder vragen uw bestanden terug te halen.", +"Old log-in password" => "Oude wachtwoord", +"Current log-in password" => "Huidige wachtwoord", +"Update Private Key Password" => "Bijwerken wachtwoord Privésleutel", +"Enable password recovery:" => "Activeren wachtwoord herstel:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Het activeren van deze optie maakt het mogelijk om uw versleutelde bestanden te benaderen als uw wachtwoord kwijt is", "File recovery settings updated" => "Bestandsherstel instellingen bijgewerkt", "Could not update file recovery" => "Kon bestandsherstel niet bijwerken" ); diff --git a/apps/files_encryption/l10n/pl.php b/apps/files_encryption/l10n/pl.php index a6f90db4cd..3928afb1d5 100644 --- a/apps/files_encryption/l10n/pl.php +++ b/apps/files_encryption/l10n/pl.php @@ -1,18 +1,33 @@ "Klucz odzyskiwania włączony", +"Could not enable recovery key. Please check your recovery key password!" => "Nie można włączyć klucza odzyskiwania. Proszę sprawdzić swoje hasło odzyskiwania!", +"Recovery key successfully disabled" => "Klucz odzyskiwania wyłączony", +"Could not disable recovery key. Please check your recovery key password!" => "Nie można wyłączyć klucza odzyskiwania. Proszę sprawdzić swoje hasło odzyskiwania!", "Password successfully changed." => "Zmiana hasła udana.", "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.", "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", +"personal settings" => "Ustawienia osobiste", "Encryption" => "Szyfrowanie", -"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Włącz szyfrowanie odzyskiwanych haseł klucza (zezwalaj na odzyskiwanie klucza):", -"Recovery account password" => "Odzyskiwanie hasła konta", +"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", "Enabled" => "Włączone", "Disabled" => "Wyłączone", -"Change encryption passwords recovery key:" => "Zmiana klucza szyfrowania haseł odzyskiwania:", -"Old Recovery account password" => "Stare hasło odzyskiwania", -"New Recovery account password" => "Nowe hasło odzyskiwania", +"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", "Change Password" => "Zmień hasło", -"Enable password recovery by sharing all files with your administrator:" => "Włączyć hasło odzyskiwania przez udostępnianie wszystkich plików z administratorem:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Włączenie tej opcji umożliwia otrzymać dostęp do zaszyfrowanych plików w przypadku utraty hasła", +"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", +" If you don't remember your old password you can ask your administrator to recover your files." => "Jeśli nie pamiętasz swojego starego hasła, poproś swojego administratora, aby odzyskać pliki.", +"Old log-in password" => "Stare hasło logowania", +"Current log-in password" => "Bieżące hasło logowania", +"Update Private Key Password" => "Aktualizacja hasła klucza prywatnego", +"Enable password recovery:" => "Włącz hasło odzyskiwania:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Włączenie tej opcji umożliwia otrzymać dostęp do zaszyfrowanych plików w przypadku utraty hasła", "File recovery settings updated" => "Ustawienia odzyskiwania plików zmienione", "Could not update file recovery" => "Nie można zmienić pliku odzyskiwania" ); diff --git a/apps/files_encryption/l10n/pt_BR.php b/apps/files_encryption/l10n/pt_BR.php index ce8814c233..1563243c99 100644 --- a/apps/files_encryption/l10n/pt_BR.php +++ b/apps/files_encryption/l10n/pt_BR.php @@ -1,18 +1,36 @@ "Recuperação de chave habilitada com sucesso", +"Could not enable recovery key. Please check your recovery key password!" => "Impossível habilitar recuperação de chave. Por favor verifique sua senha para recuperação de chave!", +"Recovery key successfully disabled" => "Recuperação de chave desabilitada com sucesso", +"Could not disable recovery key. Please check your recovery key password!" => "Impossível desabilitar recuperação de chave. Por favor verifique sua senha para recuperação de chave!", "Password successfully changed." => "Senha alterada com sucesso.", "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.", +"Missing requirements." => "Requisitos em falta.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL 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.", "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", +"personal settings" => "configurações pessoais.", "Encryption" => "Criptografia", -"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Ativar a criptografia de chave de recuperação de senhas (permitir compartilhar a chave de recuperação):", -"Recovery account password" => "Recuperar a senha da conta", +"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", "Enabled" => "Habilidado", "Disabled" => "Desabilitado", -"Change encryption passwords recovery key:" => "Mudar a criptografia de chave de recuperação de senhas:", -"Old Recovery account password" => "Recuperação de senha de conta antiga", -"New Recovery account password" => "Senha Nova da conta de Recuperação", +"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", "Change Password" => "Trocar Senha", -"Enable password recovery by sharing all files with your administrator:" => "Habilitar recuperação de senha através da partilha de todos os arquivos com o administrador:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Ativando esta opção irá permitir que você reobtainha acesso aos seus arquivos criptografados se sua senha for perdida", +"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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Se você não se lembra de sua antiga senha você pode pedir ao administrador que recupere seus arquivos.", +"Old log-in password" => "Senha antiga de login", +"Current log-in password" => "Atual senha de login", +"Update Private Key Password" => "Atualizar senha de chave privada", +"Enable password recovery:" => "Habilitar recuperação de senha:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Habilitar essa opção vai permitir que você obtenha novamente acesso aos seus arquivos encriptados em caso de perda de senha", "File recovery settings updated" => "Configurações de recuperação de arquivo atualizado", "Could not update file recovery" => "Não foi possível atualizar a recuperação de arquivos" ); diff --git a/apps/files_encryption/l10n/pt_PT.php b/apps/files_encryption/l10n/pt_PT.php index e1bb17ecaa..f485f373a5 100644 --- a/apps/files_encryption/l10n/pt_PT.php +++ b/apps/files_encryption/l10n/pt_PT.php @@ -1,9 +1,15 @@ "Chave de recuperação activada com sucesso", +"Could not enable recovery key. Please check your recovery key password!" => "Não foi possível activar a chave de recuperação. Por favor verifique a password da chave de recuperação!", +"Recovery key successfully disabled" => "Chave de recuperação descativada com sucesso", +"Could not disable recovery key. Please check your recovery key password!" => "Não foi possível desactivar a chave de recuperação. Por favor verifique a password da chave de recuperação.", "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.", "Saving..." => "A guardar...", "Encryption" => "Encriptação", "Enabled" => "Activado", "Disabled" => "Desactivado", -"Change Password" => "Mudar a Password" +"Change Password" => "Mudar a Password", +"File recovery settings updated" => "Actualizadas as definições de recuperação de ficheiros", +"Could not update file recovery" => "Não foi possível actualizar a recuperação de ficheiros" ); diff --git a/apps/files_encryption/l10n/ru.php b/apps/files_encryption/l10n/ru.php index aaf7f0997c..5bb803de2d 100644 --- a/apps/files_encryption/l10n/ru.php +++ b/apps/files_encryption/l10n/ru.php @@ -1,18 +1,36 @@ "Ключ восстановления успешно установлен", +"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." => "Невозможно обновить пароль от секретного ключа. Возможно, старый пароль указан неверно.", +"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." => "Требования отсутствуют.", +"Please make sure that PHP 5.3.3 or newer is installed and that the OpenSSL PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Пожалуйста, убедитесь, что PHP 5.3.3 или новее установлен и что расширение OpenSSL PHP включен и настроен. В настоящее время, шифрование для приложения было отключено.", "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 encryption passwords recovery key (allow sharing to recovery key):" => "Включить шифрование пароля ключа восстановления (понадобится разрешение для восстановления ключа)", -"Recovery account password" => "Восстановление пароля учетной записи", +"Enable recovery key (allow to recover users files in case of password loss):" => "Включить ключ восстановления (позволяет пользователям восстановить файлы при потере пароля):", +"Recovery key password" => "Пароль для ключа восстановления", "Enabled" => "Включено", "Disabled" => "Отключено", -"Change encryption passwords recovery key:" => "Изменить шифрование пароля ключа восстановления:", -"Old Recovery account password" => "Старое Восстановление пароля учетной записи", -"New Recovery account password" => "Новое Восстановление пароля учетной записи", +"Change recovery key password:" => "Сменить пароль для ключа восстановления:", +"Old Recovery key password" => "Старый пароль для ключа восстановления", +"New Recovery key password" => "Новый пароль для ключа восстановления", "Change Password" => "Изменить пароль", -"Enable password recovery by sharing all files with your administrator:" => "Включить восстановление пароля путем доступа Вашего администратора ко всем файлам", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Включение этой опции позволит вам получить доступ к зашифрованным файлам, в случае утери пароля", +"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/l10n/sk_SK.php b/apps/files_encryption/l10n/sk_SK.php index 279481fbd4..d8894e5370 100644 --- a/apps/files_encryption/l10n/sk_SK.php +++ b/apps/files_encryption/l10n/sk_SK.php @@ -1,11 +1,27 @@ "Záchranný kľúč bol úspešne povolený", +"Could not enable recovery key. Please check your recovery key password!" => "Nepodarilo sa povoliť záchranný kľúč. Skontrolujte prosím Vaše heslo záchranného kľúča!", +"Recovery key successfully disabled" => "Záchranný kľúč bol úspešne zakázaný", +"Could not disable recovery key. Please check your recovery key password!" => "Nepodarilo sa zakázať záchranný kľúč. Skontrolujte prosím Vaše heslo záchranného kľúča!", "Password successfully changed." => "Heslo úspešne zmenené.", +"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.", "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.", +"personal settings" => "osobné nastavenia", "Encryption" => "Šifrovanie", "Enabled" => "Povolené", "Disabled" => "Zakázané", -"Change encryption passwords recovery key:" => "Zmeniť šifrovacie heslo obnovovacieho kľúča:", "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.", +" If you don't remember your old password you can ask your administrator to recover your files." => "Ak si nepamätáte svoje staré heslo, môžete požiadať správcu o obnovenie svojich súborov.", +"Old log-in password" => "Staré prihlasovacie heslo", +"Current log-in password" => "Súčasné prihlasovacie heslo", +"Update Private Key Password" => "Aktualizovať heslo súkromného kľúča", +"Enable password recovery:" => "Povoliť obnovu hesla:", +"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Povolenie Vám umožní znovu získať prístup k Vašim zašifrovaným súborom, ak stratíte heslo", "File recovery settings updated" => "Nastavenie obnovy súborov aktualizované", "Could not update file recovery" => "Nemožno aktualizovať obnovenie súborov" ); diff --git a/apps/files_encryption/l10n/sl.php b/apps/files_encryption/l10n/sl.php index a420fe161d..8b28ba0115 100644 --- a/apps/files_encryption/l10n/sl.php +++ b/apps/files_encryption/l10n/sl.php @@ -1,4 +1,34 @@ "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.", "Saving..." => "Poteka shranjevanje ...", -"Encryption" => "Šifriranje" +"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", +"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)", +"Recovery key password" => "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", +"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.", +"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" ); diff --git a/apps/files_encryption/l10n/sv.php b/apps/files_encryption/l10n/sv.php index 966963b554..3659e22bb4 100644 --- a/apps/files_encryption/l10n/sv.php +++ b/apps/files_encryption/l10n/sv.php @@ -1,4 +1,34 @@ "Återställningsnyckeln har framgångsrikt aktiverats", +"Could not enable recovery key. Please check your recovery key password!" => "Kunde inte aktivera återställningsnyckeln. Vänligen kontrollera ditt lösenord för återställningsnyckeln!", +"Recovery key successfully disabled" => "Återställningsnyckeln har framgångsrikt inaktiverats", +"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.", "Saving..." => "Sparar...", -"Encryption" => "Kryptering" +"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", +"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", +"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 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.", +" 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", +"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", +"Could not update file recovery" => "Kunde inte uppdatera filåterställning" ); diff --git a/apps/files_encryption/l10n/tr.php b/apps/files_encryption/l10n/tr.php index 917ff0a0ea..24c6fa4727 100644 --- a/apps/files_encryption/l10n/tr.php +++ b/apps/files_encryption/l10n/tr.php @@ -1,4 +1,15 @@ "Kurtarma anahtarı başarıyla etkinleştirildi", +"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", "Saving..." => "Kaydediliyor...", -"Encryption" => "Şifreleme" +"Encryption" => "Şifreleme", +"Enabled" => "Etkinleştirildi", +"Disabled" => "Devre dışı", +"Change Password" => "Parola değiştir", +"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/vi.php b/apps/files_encryption/l10n/vi.php index 0af5bdc9a6..d11569bb94 100644 --- a/apps/files_encryption/l10n/vi.php +++ b/apps/files_encryption/l10n/vi.php @@ -1,4 +1,9 @@ "Đã đổi mật khẩu.", +"Could not change the password. Maybe the old password was not correct." => "Không thể đổi mật khẩu. Có lẽ do mật khẩu cũ không đúng.", "Saving..." => "Đang lưu...", -"Encryption" => "Mã hóa" +"Encryption" => "Mã hóa", +"Enabled" => "Bật", +"Disabled" => "Tắt", +"Change Password" => "Đổi Mật khẩu" ); diff --git a/apps/files_encryption/l10n/zh_CN.php b/apps/files_encryption/l10n/zh_CN.php index e565fce801..a3939165c7 100644 --- a/apps/files_encryption/l10n/zh_CN.php +++ b/apps/files_encryption/l10n/zh_CN.php @@ -1,4 +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." => "无法更新私钥密码。可能旧密码不正确。", +"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..." => "保存中", -"Encryption" => "加密" +"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):" => "启用恢复密钥(允许你在密码丢失后恢复文件):", +"Recovery key password" => "恢复密钥密码", +"Enabled" => "开启", +"Disabled" => "禁用", +"Change recovery key password:" => "更改恢复密钥密码", +"Old Recovery key password" => "旧的恢复密钥密码", +"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/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php index faea3f54a1..d34f51c487 100644 --- a/apps/files_encryption/l10n/zh_TW.php +++ b/apps/files_encryption/l10n/zh_TW.php @@ -5,10 +5,7 @@ "Encryption" => "加密", "Enabled" => "已啓用", "Disabled" => "已停用", -"Change encryption passwords recovery key:" => "變更加密密碼還原金鑰:", "Change Password" => "變更密碼", -"Enable password recovery by sharing all files with your administrator:" => "與管理員分享所有檔案以啓用密碼還原功能:", -"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "啓用此選項允許您未來遺失密碼時重新取得已加密的檔案", "File recovery settings updated" => "檔案還原設定已更新", "Could not update file recovery" => "無法更新檔案還原設定" ); diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php index ddeb3590f6..6543a0de5f 100755 --- a/apps/files_encryption/lib/crypt.php +++ b/apps/files_encryption/lib/crypt.php @@ -51,21 +51,28 @@ class Crypt { */ public static function createKeypair() { + $return = false; + $res = openssl_pkey_new(array('private_key_bits' => 4096)); - // Get private key - openssl_pkey_export($res, $privateKey); + if ($res === false) { + \OCP\Util::writeLog('Encryption library', 'couldn\'t generate users key-pair for ' . \OCP\User::getUser(), \OCP\Util::ERROR); + \OCP\Util::writeLog('Encryption library', openssl_error_string(), \OCP\Util::ERROR); + } elseif (openssl_pkey_export($res, $privateKey)) { + // Get public key + $keyDetails = openssl_pkey_get_details($res); + $publicKey = $keyDetails['key']; - // Get public key - $publicKey = openssl_pkey_get_details($res); - - $publicKey = $publicKey['key']; - - return (array( - 'publicKey' => $publicKey, - 'privateKey' => $privateKey - )); + $return = array( + 'publicKey' => $publicKey, + 'privateKey' => $privateKey + ); + } 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); + } + return $return; } /** @@ -168,7 +175,7 @@ class Crypt { * e.g. filename or /Docs/filename, NOT admin/files/filename * @return boolean */ - public static function isLegacyEncryptedContent($data, $relPath) { + public static function isLegacyEncryptedContent($isCatFileContent, $relPath) { // Fetch all file metadata from DB $metadata = \OC\Files\Filesystem::getFileInfo($relPath, ''); @@ -178,7 +185,7 @@ class Crypt { // legacy encryption system if (isset($metadata['encrypted']) && $metadata['encrypted'] === true - && !self::isCatfileContent($data) + && $isCatFileContent === false ) { return true; @@ -201,13 +208,10 @@ class Crypt { public static function encrypt($plainContent, $iv, $passphrase = '') { if ($encryptedContent = openssl_encrypt($plainContent, 'AES-128-CFB', $passphrase, false, $iv)) { - return $encryptedContent; - } else { - \OCP\Util::writeLog('Encryption library', 'Encryption (symmetric) of content failed', \OCP\Util::ERROR); - + \OCP\Util::writeLog('Encryption library', openssl_error_string(), \OCP\Util::ERROR); return false; } @@ -287,28 +291,22 @@ class Crypt { public static function symmetricEncryptFileContent($plainContent, $passphrase = '') { if (!$plainContent) { - + \OCP\Util::writeLog('Encryption library', 'symmetrically encryption failed, no content given.', \OCP\Util::ERROR); return false; - } $iv = self::generateIv(); if ($encryptedContent = self::encrypt($plainContent, $iv, $passphrase)) { - // Combine content to encrypt with IV identifier and actual IV $catfile = self::concatIv($encryptedContent, $iv); - $padded = self::addPadding($catfile); return $padded; } else { - \OCP\Util::writeLog('Encryption library', 'Encryption (symmetric) of keyfile content failed', \OCP\Util::ERROR); - return false; - } } @@ -351,6 +349,34 @@ class Crypt { } + /** + * @brief Decrypt private key and check if the result is a valid keyfile + * @param string $encryptedKey encrypted keyfile + * @param string $passphrase to decrypt keyfile + * @returns encrypted private key or false + * + * This function decrypts a file + */ + public static function decryptPrivateKey($encryptedKey, $passphrase) { + + $plainKey = self::symmetricDecryptFileContent($encryptedKey, $passphrase); + + // check if this a valid private key + $res = openssl_pkey_get_private($plainKey); + if (is_resource($res)) { + $sslInfo = openssl_pkey_get_details($res); + if (!isset($sslInfo['key'])) { + $plainKey = false; + } + } else { + $plainKey = false; + } + + return $plainKey; + + } + + /** * @brief Creates symmetric keyfile content using a generated key * @param string $plainContent content to be encrypted @@ -452,7 +478,7 @@ class Crypt { } else { - \OCP\Util::writeLog('Encryption library', 'Decryption (asymmetric) of sealed content failed', \OCP\Util::ERROR); + \OCP\Util::writeLog('Encryption library', 'Decryption (asymmetric) of sealed content with share-key "'.$shareKey.'" failed', \OCP\Util::ERROR); return false; @@ -608,7 +634,7 @@ class Crypt { * * This function decrypts an content */ - private static function legacyDecrypt($content, $passphrase = '') { + public static function legacyDecrypt($content, $passphrase = '') { $bf = self::getBlowfish($passphrase); @@ -637,28 +663,4 @@ class Crypt { } } - /** - * @param $legacyEncryptedContent - * @param $legacyPassphrase - * @param $publicKeys - * @return array - */ - public static function legacyKeyRecryptKeyfile($legacyEncryptedContent, $legacyPassphrase, $publicKeys) { - - $decrypted = self::legacyBlockDecrypt($legacyEncryptedContent, $legacyPassphrase); - - // Encrypt plain data, generate keyfile & encrypted file - $cryptedData = self::symmetricEncryptFileContentKeyfile($decrypted); - - // Encrypt plain keyfile to multiple sharefiles - $multiEncrypted = Crypt::multiKeyEncrypt($cryptedData['key'], $publicKeys); - - return array( - 'data' => $cryptedData['encrypted'], - 'filekey' => $multiEncrypted['data'], - 'sharekeys' => $multiEncrypted['keys'] - ); - - } - } \ No newline at end of file diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php index 1b3e5b1a64..6eee8fed6a 100755 --- a/apps/files_encryption/lib/helper.php +++ b/apps/files_encryption/lib/helper.php @@ -48,6 +48,7 @@ class Helper { \OCP\Util::connectHook('OC_User', 'post_login', 'OCA\Encryption\Hooks', 'login'); \OCP\Util::connectHook('OC_User', 'post_setPassword', 'OCA\Encryption\Hooks', 'setPassphrase'); + \OCP\Util::connectHook('OC_User', 'pre_setPassword', 'OCA\Encryption\Hooks', 'preSetPassphrase'); \OCP\Util::connectHook('OC_User', 'post_createUser', 'OCA\Encryption\Hooks', 'postCreateUser'); \OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OCA\Encryption\Hooks', 'postDeleteUser'); } @@ -61,6 +62,15 @@ class Helper { \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Encryption\Hooks', 'postRename'); } + /** + * @brief register app management related hooks + * + */ + public static function registerAppHooks() { + + \OCP\Util::connectHook('OC_App', 'pre_disable', 'OCA\Encryption\Hooks', 'preDisable'); + } + /** * @brief setup user for files_encryption * @@ -73,7 +83,7 @@ class Helper { if (!$util->ready()) { \OCP\Util::writeLog('Encryption library', 'User account "' . $util->getUserId() - . '" is not ready for encryption; configuration started', \OCP\Util::DEBUG); + . '" is not ready for encryption; configuration started', \OCP\Util::DEBUG); if (!$util->setupServerSide($password)) { return false; @@ -93,6 +103,7 @@ class Helper { * @return bool */ public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) { + $view = new \OC\Files\View('/'); if ($recoveryKeyId === null) { @@ -121,19 +132,12 @@ class Helper { $view->file_put_contents('/public-keys/' . $recoveryKeyId . '.public.key', $keypair['publicKey']); - // Encrypt private key empthy passphrase + // Encrypt private key empty passphrase $encryptedPrivateKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($keypair['privateKey'], $recoveryPassword); // Save private key $view->file_put_contents('/owncloud_private_key/' . $recoveryKeyId . '.private.key', $encryptedPrivateKey); - // create control file which let us check later on if the entered password was correct. - $encryptedControlData = \OCA\Encryption\Crypt::keyEncrypt("ownCloud", $keypair['publicKey']); - if (!$view->is_dir('/control-file')) { - $view->mkdir('/control-file'); - } - $view->file_put_contents('/control-file/controlfile.enc', $encryptedControlData); - \OC_FileProxy::$enabled = true; // Set recoveryAdmin as enabled @@ -186,4 +190,56 @@ class Helper { return false; } } -} \ No newline at end of file + + /** + * @brief Format a path to be relative to the /user/files/ directory + * @param string $path the absolute path + * @return string e.g. turns '/admin/files/test.txt' into 'test.txt' + */ + public static function stripUserFilesPath($path) { + $trimmed = ltrim($path, '/'); + $split = explode('/', $trimmed); + $sliced = array_slice($split, 2); + $relPath = implode('/', $sliced); + + return $relPath; + } + + /** + * @brief redirect to a error page + */ + public static function redirectToErrorPage() { + $location = \OC_Helper::linkToAbsolute('apps/files_encryption/files', 'error.php'); + $post = 0; + if(count($_POST) > 0) { + $post = 1; + } + header('Location: ' . $location . '?p=' . $post); + exit(); + } + + /** + * check requirements for encryption app. + * @return bool true if requirements are met + */ + public static function checkRequirements() { + $result = true; + + //openssl extension needs to be loaded + $result &= extension_loaded("openssl"); + // we need php >= 5.3.3 + $result &= version_compare(phpversion(), '5.3.3', '>='); + + return (bool) $result; + } + + /** + * @brief glob uses different pattern than regular expressions, escape glob pattern only + * @param unescaped path + * @return escaped path + */ + public static function escapeGlobPattern($path) { + return preg_replace('/(\*|\?|\[)/', '[$1]', $path); + } +} + diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php index 9bb854325d..b2fd650f18 100755 --- a/apps/files_encryption/lib/keymanager.php +++ b/apps/files_encryption/lib/keymanager.php @@ -126,7 +126,12 @@ class Keymanager { $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($path); - $basePath = '/' . $owner . '/files_encryption/keyfiles'; + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $basePath = '/files_encryption/keyfiles'; + } else { + $basePath = '/' . $owner . '/files_encryption/keyfiles'; + } $targetPath = self::keySetPreparation($view, $filename, $basePath, $owner); @@ -169,7 +174,7 @@ class Keymanager { */ public static function fixPartialFilePath($path) { - if (preg_match('/\.part$/', $path)) { + if (preg_match('/\.part$/', $path) || preg_match('/\.etmp$/', $path)) { $newLength = strlen($path) - 5; $fPath = substr($path, 0, $newLength); @@ -191,7 +196,7 @@ class Keymanager { */ public static function isPartialFilePath($path) { - if (preg_match('/\.part$/', $path)) { + if (preg_match('/\.part$/', $path) || preg_match('/\.etmp$/', $path)) { return true; @@ -233,7 +238,12 @@ class Keymanager { list($owner, $filename) = $util->getUidAndFilename($filePath); $filePath_f = ltrim($filename, '/'); - $keyfilePath = '/' . $owner . '/files_encryption/keyfiles/' . $filePath_f . '.key'; + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $keyfilePath = '/files_encryption/keyfiles/' . $filePath_f . '.key'; + } else { + $keyfilePath = '/' . $owner . '/files_encryption/keyfiles/' . $filePath_f . '.key'; + } $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; @@ -267,7 +277,14 @@ class Keymanager { public static function deleteFileKey(\OC_FilesystemView $view, $userId, $path) { $trimmed = ltrim($path, '/'); - $keyPath = '/' . $userId . '/files_encryption/keyfiles/' . $trimmed; + + $util = new Util($view, \OCP\User::getUser()); + + if($util->isSystemWideMountPoint($path)) { + $keyPath = '/files_encryption/keyfiles/' . $trimmed; + } else { + $keyPath = '/' . $userId . '/files_encryption/keyfiles/' . $trimmed; + } $result = false; @@ -325,57 +342,26 @@ class Keymanager { * @brief store share key * * @param \OC_FilesystemView $view - * @param string $path relative path of the file, including filename - * @param $userId + * @param string $path where the share key is stored * @param $shareKey - * @internal param string $key - * @internal param string $dbClassName * @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 setShareKey(\OC_FilesystemView $view, $path, $userId, $shareKey) { - - // 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); - - $basePath = '/' . $owner . '/files_encryption/share-keys'; - - $shareKeyPath = self::keySetPreparation($view, $filename, $basePath, $owner); - - // try reusing key file if part file - if (self::isPartialFilePath($shareKeyPath)) { - - $writePath = $basePath . '/' . self::fixPartialFilePath($shareKeyPath) . '.' . $userId . '.shareKey'; - - } else { - - $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; - - } + private static function setShareKey(\OC_FilesystemView $view, $path, $shareKey) { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $result = $view->file_put_contents($writePath, $shareKey); + $result = $view->file_put_contents($path, $shareKey); \OC_FileProxy::$enabled = $proxyStatus; - if ( - is_int($result) - && $result > 0 - ) { - + if (is_int($result) && $result > 0) { return true; - } else { - return false; - } - } /** @@ -389,23 +375,40 @@ class Keymanager { // $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); + + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $basePath = '/files_encryption/share-keys'; + } else { + $basePath = '/' . $owner . '/files_encryption/share-keys'; + } + + $shareKeyPath = self::keySetPreparation($view, $filename, $basePath, $owner); $result = true; foreach ($shareKeys as $userId => $shareKey) { - if (!self::setShareKey($view, $path, $userId, $shareKey)) { + // try reusing key file if part file + if (self::isPartialFilePath($shareKeyPath)) { + $writePath = $basePath . '/' . self::fixPartialFilePath($shareKeyPath) . '.' . $userId . '.shareKey'; + } else { + $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; + } + + if (!self::setShareKey($view, $writePath, $shareKey)) { // If any of the keys are not set, flag false $result = false; - } - } // Returns false if any of the keys weren't set return $result; - } /** @@ -440,8 +443,13 @@ class Keymanager { $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($filePath); - $shareKeyPath = \OC\Files\Filesystem::normalizePath( - '/' . $owner . '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'); + + // 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'; + } else { + $shareKeyPath = '/' . $owner . '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; + } if ($view->file_exists($shareKeyPath)) { @@ -467,11 +475,21 @@ class Keymanager { */ public static function delAllShareKeys(\OC_FilesystemView $view, $userId, $filePath) { - if ($view->is_dir($userId . '/files/' . $filePath)) { - $view->unlink($userId . '/files_encryption/share-keys/' . $filePath); + $util = new util($view, $userId); + + if ($util->isSystemWideMountPoint($filePath)) { + $baseDir = '/files_encryption/share-keys/'; } else { - $localKeyPath = $view->getLocalFile($userId . '/files_encryption/share-keys/' . $filePath); - $matches = glob(preg_quote($localKeyPath) . '*.shareKey'); + $baseDir = $userId . '/files_encryption/share-keys/'; + } + + + if ($view->is_dir($userId . '/files/' . $filePath)) { + $view->unlink($baseDir . $filePath); + } else { + $localKeyPath = $view->getLocalFile($baseDir . $filePath); + $escapedPath = Helper::escapeGlobPattern($localKeyPath); + $matches = glob($escapedPath . '*.shareKey'); foreach ($matches as $ma) { $result = unlink($ma); if (!$result) { @@ -495,7 +513,11 @@ class Keymanager { list($owner, $filename) = $util->getUidAndFilename($filePath); - $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename); + if ($util->isSystemWideMountPoint($filename)) { + $shareKeyPath = \OC\Files\Filesystem::normalizePath('/files_encryption/share-keys/' . $filename); + } else { + $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename); + } if ($view->is_dir($shareKeyPath)) { @@ -526,7 +548,10 @@ class Keymanager { */ private static function recursiveDelShareKeys($dir, $userIds) { foreach ($userIds as $userId) { - $matches = glob(preg_quote($dir) . '/*' . preg_quote('.' . $userId . '.shareKey')); + $extension = '.' . $userId . '.shareKey'; + $escapedDir = Helper::escapeGlobPattern($dir); + $escapedExtension = Helper::escapeGlobPattern($extension); + $matches = glob($escapedDir . '/*' . $escapedExtension); } /** @var $matches array */ foreach ($matches as $ma) { @@ -535,7 +560,7 @@ class Keymanager { 'Could not delete shareKey; does not exist: "' . $ma . '"', \OCP\Util::ERROR); } } - $subdirs = $directories = glob(preg_quote($dir) . '/*', GLOB_ONLYDIR); + $subdirs = $directories = glob($escapedDir . '/*', GLOB_ONLYDIR); foreach ($subdirs as $subdir) { self::recursiveDelShareKeys($subdir, $userIds); } diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 11308612da..735eba911a 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -104,78 +104,40 @@ class Proxy extends \OC_FileProxy { if (self::shouldEncrypt($path)) { - // Stream put contents should have been converted to fopen if (!is_resource($data)) { - $userId = \OCP\USER::getUser(); + // get root view $view = new \OC_FilesystemView('/'); - $util = new Util($view, $userId); - $session = new \OCA\Encryption\Session($view); - $privateKey = $session->getPrivateKey(); - $filePath = $util->stripUserFilesPath($path); - // Set the filesize for userland, before encrypting - $size = strlen($data); - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - // Check if there is an existing key we can reuse - if ($encKeyfile = Keymanager::getFileKey($view, $userId, $filePath)) { - - // Fetch shareKey - $shareKey = Keymanager::getShareKey($view, $userId, $filePath); - - // Decrypt the keyfile - $plainKey = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey); - - } else { - - // Make a new key - $plainKey = Crypt::generateKey(); + // get relative path + $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); + if (!isset($relativePath)) { + return true; } - // Encrypt data - $encData = Crypt::symmetricEncryptFileContent($data, $plainKey); + $handle = fopen('crypt://' . $relativePath . '.etmp', 'w'); + if (is_resource($handle)) { - $sharingEnabled = \OCP\Share::isEnabled(); + // write data to stream + fwrite($handle, $data); - // if file exists try to get sharing users - if ($view->file_exists($path)) { - $uniqueUserIds = $util->getSharingUsersArray($sharingEnabled, $filePath, $userId); - } else { - $uniqueUserIds[] = $userId; + // close stream + fclose($handle); + + // disable encryption proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; + + // get encrypted content + $data = $view->file_get_contents($path . '.etmp'); + + // remove our temp file + $view->unlink($path . '.etmp'); + + // re-enable proxy - our work is done + \OC_FileProxy::$enabled = $proxyStatus; } - - // Fetch public keys for all users who will share the file - $publicKeys = Keymanager::getPublicKeys($view, $uniqueUserIds); - - // Encrypt plain keyfile to multiple sharefiles - $multiEncrypted = Crypt::multiKeyEncrypt($plainKey, $publicKeys); - - // Save sharekeys to user folders - Keymanager::setShareKeys($view, $filePath, $multiEncrypted['keys']); - - // Set encrypted keyfile as common varname - $encKey = $multiEncrypted['data']; - - // Save keyfile for newly encrypted file in parallel directory tree - Keymanager::setFileKey($view, $filePath, $userId, $encKey); - - // Replace plain content with encrypted content by reference - $data = $encData; - - // Update the file cache with file info - \OC\Files\Filesystem::putFileInfo($filePath, array( - 'encrypted' => true, - 'size' => strlen($data), - 'unencrypted_size' => $size - ), ''); - - // Re-enable proxy - our work is done - \OC_FileProxy::$enabled = $proxyStatus; - } } @@ -189,15 +151,11 @@ class Proxy extends \OC_FileProxy { */ public function postFile_get_contents($path, $data) { - $userId = \OCP\USER::getUser(); + $plainData = null; $view = new \OC_FilesystemView('/'); - $util = new Util($view, $userId); - $relPath = $util->stripUserFilesPath($path); - - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // get relative path + $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); // init session $session = new \OCA\Encryption\Session($view); @@ -208,28 +166,27 @@ class Proxy extends \OC_FileProxy { && Crypt::isCatfileContent($data) ) { - $privateKey = $session->getPrivateKey($userId); + $handle = fopen('crypt://' . $relativePath, 'r'); - // Get the encrypted keyfile - $encKeyfile = Keymanager::getFileKey($view, $userId, $relPath); - - // Attempt to fetch the user's shareKey - $shareKey = Keymanager::getShareKey($view, $userId, $relPath); - - // Decrypt keyfile with shareKey - $plainKeyfile = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey); - - $plainData = Crypt::symmetricDecryptFileContent($data, $plainKeyfile); + if (is_resource($handle)) { + while (($plainDataChunk = fgets($handle, 8192)) !== false) { + $plainData .= $plainDataChunk; + } + } } elseif ( Crypt::mode() == 'server' && \OC::$session->exists('legacyenckey') && Crypt::isEncryptedMeta($path) ) { - $plainData = Crypt::legacyBlockDecrypt($data, $session->getLegacyKey()); - } + // Disable encryption proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - \OC_FileProxy::$enabled = $proxyStatus; + $plainData = Crypt::legacyBlockDecrypt($data, $session->getLegacyKey()); + + \OC_FileProxy::$enabled = $proxyStatus; + } if (!isset($plainData)) { @@ -261,10 +218,10 @@ class Proxy extends \OC_FileProxy { $util = new Util($view, $userId); - // Format path to be relative to user files dir - $relPath = $util->stripUserFilesPath($path); + // get relative path + $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); - list($owner, $ownerPath) = $util->getUidAndFilename($relPath); + list($owner, $ownerPath) = $util->getUidAndFilename($relativePath); // Delete keyfile & shareKey so it isn't orphaned if (!Keymanager::deleteFileKey($view, $owner, $ownerPath)) { @@ -299,18 +256,22 @@ class Proxy extends \OC_FileProxy { */ public function postFopen($path, &$result) { + $path = \OC\Files\Filesystem::normalizePath($path); + if (!$result) { return $result; } - // Reformat path for use with OC_FSV - $path_split = explode('/', $path); - $path_f = implode('/', array_slice($path_split, 3)); + // 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($path_split) && $path_split[2] === 'cache') { + if (isset($pathParts[2]) && $pathParts[2] === 'cache') { return $result; } @@ -335,14 +296,14 @@ class Proxy extends \OC_FileProxy { // Open the file using the crypto stream wrapper // protocol and let it do the decryption work instead - $result = fopen('crypt://' . $path_f, $meta['mode']); + $result = fopen('crypt://' . $relativePath, $meta['mode']); } elseif ( self::shouldEncrypt($path) and $meta ['mode'] !== 'r' and $meta['mode'] !== 'rb' ) { - $result = fopen('crypt://' . $path_f, $meta['mode']); + $result = fopen('crypt://' . $relativePath, $meta['mode']); } // Re-enable the proxy @@ -390,12 +351,11 @@ class Proxy extends \OC_FileProxy { return $size; } - // Reformat path for use with OC_FSV - $path_split = explode('/', $path); - $path_f = implode('/', array_slice($path_split, 3)); + // get relative path + $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); // if path is empty we cannot resolve anything - if (empty($path_f)) { + if (empty($relativePath)) { return $size; } @@ -424,7 +384,7 @@ class Proxy extends \OC_FileProxy { $fileInfo['unencrypted_size'] = $size; // put file info if not .part file - if (!Keymanager::isPartialFilePath($path_f)) { + if (!Keymanager::isPartialFilePath($relativePath)) { $view->putFileInfo($path, $fileInfo); } } @@ -447,21 +407,23 @@ class Proxy extends \OC_FileProxy { $userId = \OCP\User::getUser(); $util = new Util($view, $userId); - // Reformat path for use with OC_FSV - $path_split = explode('/', $path); - $path_f = implode('/', array_slice($path_split, 3)); + // split the path parts + $pathParts = explode('/', $path); + + // get relative path + $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); // only if file is on 'files' folder fix file size and sharing - if (isset($path_split) && $path_split[2] === 'files' && $util->fixFileSize($path)) { + if (isset($pathParts[2]) && $pathParts[2] === 'files' && $util->fixFileSize($path)) { // get sharing app state $sharingEnabled = \OCP\Share::isEnabled(); // get users - $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path_f); + $usersSharing = $util->getSharingUsersArray($sharingEnabled, $relativePath); // update sharing-keys - $util->setSharedFileKeyfiles($session, $usersSharing, $path_f); + $util->setSharedFileKeyfiles($session, $usersSharing, $relativePath); } \OC_FileProxy::$enabled = $proxyStatus; diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php index bff1737554..1911386cd1 100644 --- a/apps/files_encryption/lib/session.php +++ b/apps/files_encryption/lib/session.php @@ -88,9 +88,10 @@ class Session { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $encryptedKey = $this->view->file_get_contents( '/owncloud_private_key/' . $publicShareKeyId . '.private.key' ); - $privateKey = Crypt::symmetricDecryptFileContent( $encryptedKey, '' ); - $this->setPublicSharePrivateKey( $privateKey ); + $encryptedKey = $this->view->file_get_contents( + '/owncloud_private_key/' . $publicShareKeyId . '.private.key'); + $privateKey = Crypt::decryptPrivateKey($encryptedKey, ''); + $this->setPublicSharePrivateKey($privateKey); \OC_FileProxy::$enabled = $proxyStatus; } @@ -121,7 +122,7 @@ class Session { if (\OCA\Encryption\Helper::isPublicAccess()) { return $this->getPublicSharePrivateKey(); } else { - if (!is_null( \OC::$session->get('privateKey') )) { + if (!is_null(\OC::$session->get('privateKey'))) { return \OC::$session->get('privateKey'); } else { return false; @@ -136,7 +137,7 @@ class Session { */ public function setPublicSharePrivateKey($privateKey) { - \OC::$session->set('publicSharePrivateKey', $privateKey); + \OC::$session->set('publicSharePrivateKey', $privateKey); return true; @@ -149,7 +150,7 @@ class Session { */ public function getPublicSharePrivateKey() { - if (!is_null( \OC::$session->get('publicSharePrivateKey') )) { + if (!is_null(\OC::$session->get('publicSharePrivateKey'))) { return \OC::$session->get('publicSharePrivateKey'); } else { return false; @@ -176,7 +177,7 @@ class Session { */ public function getLegacyKey() { - if ( !is_null( \OC::$session->get('legacyKey') ) ) { + if (!is_null(\OC::$session->get('legacyKey'))) { return \OC::$session->get('legacyKey'); diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php index 072c528664..3c1eb2c5f5 100644 --- a/apps/files_encryption/lib/stream.php +++ b/apps/files_encryption/lib/stream.php @@ -56,18 +56,21 @@ class Stream { private $relPath; // rel path to users file dir private $userId; private $handle; // Resource returned by fopen - private $path; - private $readBuffer; // For streams that dont support seeking private $meta = array(); // Header / meta for source stream - private $count; private $writeCache; private $size; private $unencryptedSize; private $publicKey; - private $keyfile; private $encKeyfile; - private static $view; // a fsview object set to user dir + /** + * @var \OC\Files\View + */ private $rootView; // a fsview object set to '/' + /** + * @var \OCA\Encryption\Session + */ + private $session; + private $privateKey; /** * @param $path @@ -82,6 +85,10 @@ class Stream { $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(); @@ -109,6 +116,11 @@ class Stream { } else { + if($this->privateKey === false) { + // if private key is not valid redirect user to a error page + \OCA\Encryption\Helper::redirectToErrorPage(); + } + $this->size = $this->rootView->filesize($this->rawPath, $mode); } @@ -118,7 +130,7 @@ class Stream { if (!is_resource($this->handle)) { - \OCP\Util::writeLog('files_encryption', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR); + \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR); } else { @@ -156,7 +168,7 @@ class Stream { // $count will always be 8192 https://bugs.php.net/bug.php?id=21641 // This makes this function a lot simpler, but will break this class if the above 'bug' gets 'fixed' - \OCP\Util::writeLog('files_encryption', 'PHP "bug" 21641 no longer holds, decryption system requires refactoring', \OCP\Util::FATAL); + \OCP\Util::writeLog('Encryption library', 'PHP "bug" 21641 no longer holds, decryption system requires refactoring', \OCP\Util::FATAL); die(); @@ -165,7 +177,7 @@ class Stream { // Get the data from the file handle $data = fread($this->handle, 8192); - $result = ''; + $result = null; if (strlen($data)) { @@ -175,10 +187,11 @@ class Stream { throw new \Exception( 'Encryption key not found for "' . $this->rawPath . '" during attempted read via stream'); - } + } else { - // Decrypt data - $result = Crypt::symmetricDecryptFileContent($data, $this->plainKey); + // Decrypt data + $result = Crypt::symmetricDecryptFileContent($data, $this->plainKey); + } } @@ -228,13 +241,18 @@ class Stream { // If a keyfile already exists if ($this->encKeyfile) { - $session = new \OCA\Encryption\Session( $this->rootView ); + // if there is no valid private key return false + if ($this->privateKey === false) { - $privateKey = $session->getPrivateKey($this->userId); + // if private key is not valid redirect user to a error page + \OCA\Encryption\Helper::redirectToErrorPage(); + + return false; + } $shareKey = Keymanager::getShareKey($this->rootView, $this->userId, $this->relPath); - $this->plainKey = Crypt::multiKeyDecrypt($this->encKeyfile, $shareKey, $privateKey); + $this->plainKey = Crypt::multiKeyDecrypt($this->encKeyfile, $shareKey, $this->privateKey); return true; @@ -257,6 +275,12 @@ class Stream { */ public function stream_write($data) { + // if there is no valid private key return false + if ($this->privateKey === false) { + $this->size = 0; + 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 @@ -424,6 +448,28 @@ class Stream { $this->flush(); + // if there is no valid private key return false + if ($this->privateKey === false) { + + // 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; + + 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(); + } + if ( $this->meta['mode'] !== 'r' and $this->meta['mode'] !== 'rb' @@ -450,16 +496,14 @@ class Stream { // Encrypt enc key for all sharing users $this->encKeyfiles = Crypt::multiKeyEncrypt($this->plainKey, $publicKeys); - $view = new \OC_FilesystemView('/'); - // Save the new encrypted file key Keymanager::setFileKey($this->rootView, $this->relPath, $this->userId, $this->encKeyfiles['data']); // Save the sharekeys - Keymanager::setShareKeys($view, $this->relPath, $this->encKeyfiles['keys']); + Keymanager::setShareKeys($this->rootView, $this->relPath, $this->encKeyfiles['keys']); // get file info - $fileInfo = $view->getFileInfo($this->rawPath); + $fileInfo = $this->rootView->getFileInfo($this->rawPath); if (!is_array($fileInfo)) { $fileInfo = array(); } @@ -473,7 +517,7 @@ class Stream { $fileInfo['unencrypted_size'] = $this->unencryptedSize; // set fileinfo - $view->putFileInfo($this->rawPath, $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 0d663549bf..50e823585d 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -96,10 +96,13 @@ class Util { //// 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 $pwd; // User Password private $client; // Client side encryption mode flag private $publicKeyDir; // Dir containing all public user keys private $encryptionDir; // Dir containing user's files_encryption @@ -188,7 +191,9 @@ class Util { /** * @brief Sets up user folders and keys for serverside encryption - * @param string $passphrase passphrase to encrypt server-stored private key with + * + * @param string $passphrase to encrypt server-stored private key with + * @return bool */ public function setupServerSide($passphrase = null) { @@ -223,18 +228,21 @@ class Util { // Generate keypair $keypair = Crypt::createKeypair(); - \OC_FileProxy::$enabled = false; + if ($keypair) { - // Save public key - $this->view->file_put_contents($this->publicKeyPath, $keypair['publicKey']); + \OC_FileProxy::$enabled = false; - // Encrypt private key with user pwd as passphrase - $encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $passphrase); + // Encrypt private key with user pwd as passphrase + $encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $passphrase); - // Save private key - $this->view->file_put_contents($this->privateKeyPath, $encryptedPrivateKey); + // Save key-pair + if ($encryptedPrivateKey) { + $this->view->file_put_contents($this->privateKeyPath, $encryptedPrivateKey); + $this->view->file_put_contents($this->publicKeyPath, $keypair['publicKey']); + } - \OC_FileProxy::$enabled = true; + \OC_FileProxy::$enabled = true; + } } else { // check if public-key exists but private-key is missing @@ -287,7 +295,7 @@ class Util { */ public function recoveryEnabledForUser() { - $sql = 'SELECT `recovery_enabled` FROM `*PREFIX*encryption` WHERE uid = ?'; + $sql = 'SELECT `recovery_enabled` FROM `*PREFIX*encryption` WHERE `uid` = ?'; $args = array($this->userId); @@ -300,7 +308,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $row = $result->fetchRow(); if (isset($row['recovery_enabled'])) { $recoveryEnabled[] = $row['recovery_enabled']; @@ -345,7 +353,7 @@ class Util { // Create a new record instead } else { - $sql = 'UPDATE `*PREFIX*encryption` SET recovery_enabled = ? WHERE uid = ?'; + $sql = 'UPDATE `*PREFIX*encryption` SET `recovery_enabled` = ? WHERE `uid` = ?'; $args = array( $enabled, @@ -354,17 +362,7 @@ class Util { } - $query = \OCP\DB::prepare($sql); - - if ($query->execute($args)) { - - return true; - - } else { - - return false; - - } + return is_numeric(\OC_DB::executeAudited($sql, $args)); } @@ -403,7 +401,7 @@ class Util { ) { $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file); - $relPath = $this->stripUserFilesPath($filePath); + $relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath); // If the path is a directory, search // its contents @@ -419,8 +417,7 @@ class Util { // where they got re-enabled :/ \OC_FileProxy::$enabled = false; - $data = $this->view->file_get_contents($filePath); - + $isEncryptedPath = $this->isEncryptedPath($filePath); // If the file is encrypted // NOTE: If the userId is // empty or not set, file will @@ -430,7 +427,7 @@ class Util { // will eat server resources :( if ( Keymanager::getFileKey($this->view, $this->userId, $relPath) - && Crypt::isCatfileContent($data) + && $isEncryptedPath ) { $found['encrypted'][] = array( @@ -440,7 +437,7 @@ class Util { // If the file uses old // encryption system - } elseif ( Crypt::isLegacyEncryptedContent( $data, $relPath ) ) { + } elseif (Crypt::isLegacyEncryptedContent($isEncryptedPath, $relPath)) { $found['legacy'][] = array( 'name' => $file, @@ -528,7 +525,7 @@ class Util { /** * @brief Check if a given path identifies an encrypted file - * @param $path + * @param string $path * @return boolean */ public function isEncryptedPath($path) { @@ -541,7 +538,7 @@ class Util { // we only need 24 byte from the last chunk $data = ''; $handle = $this->view->fopen($path, 'r'); - if (!fseek($handle, -24, SEEK_END)) { + if (is_resource($handle) && !fseek($handle, -24, SEEK_END)) { $data = fgets($handle); } @@ -565,11 +562,15 @@ class Util { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - // Reformat path for use with OC_FSV - $pathSplit = explode('/', $path); - $pathRelative = implode('/', array_slice($pathSplit, 3)); + // split the path parts + $pathParts = explode('/', $path); - if (isset($pathSplit[2]) && $pathSplit[2] === 'files' && $this->view->file_exists($path) && $this->isEncryptedPath($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); @@ -579,7 +580,7 @@ class Util { $lastChunkNr = floor($size / 8192); // open stream - $stream = fopen('crypt://' . $pathRelative, "r"); + $stream = fopen('crypt://' . $relativePath, "r"); if (is_resource($stream)) { // calculate last chunk position @@ -639,20 +640,6 @@ class Util { return $result; } - /** - * @brief Format a path to be relative to the /user/files/ directory - * @note e.g. turns '/admin/files/test.txt' into 'test.txt' - */ - public function stripUserFilesPath($path) { - - $trimmed = ltrim($path, '/'); - $split = explode('/', $trimmed); - $sliced = array_slice($split, 2); - $relPath = implode('/', $sliced); - - return $relPath; - - } /** * @param $path @@ -697,28 +684,32 @@ class Util { $relPath = $plainFile['path']; //relative to /data - $rawPath = '/'.$this->userId . '/files/' . $plainFile['path']; + $rawPath = '/' . $this->userId . '/files/' . $plainFile['path']; // Open plain file handle for binary reading - $plainHandle = $this->view->fopen( $rawPath, 'rb' ); + $plainHandle = $this->view->fopen($rawPath, 'rb'); // Open enc file handle for binary writing, with same filename as original plain file - $encHandle = fopen( 'crypt://' . $relPath.'.tmp', 'wb' ); + $encHandle = fopen('crypt://' . $relPath . '.part', 'wb'); // Move plain file to a temporary location - $size = stream_copy_to_stream( $plainHandle, $encHandle ); + $size = stream_copy_to_stream($plainHandle, $encHandle); fclose($encHandle); $fakeRoot = $this->view->getRoot(); - $this->view->chroot('/'.$this->userId.'/files'); + $this->view->chroot('/' . $this->userId . '/files'); - $this->view->rename($relPath . '.tmp', $relPath); + $this->view->rename($relPath . '.part', $relPath); $this->view->chroot($fakeRoot); // Add the file to the cache - \OC\Files\Filesystem::putFileInfo( $relPath, array( 'encrypted' => true, 'size' => $size, 'unencrypted_size' => $size ) ); + \OC\Files\Filesystem::putFileInfo($relPath, array( + 'encrypted' => true, + 'size' => $size, + 'unencrypted_size' => $size + )); } // Encrypt legacy encrypted files @@ -732,40 +723,28 @@ class Util { // Fetch data from file $legacyData = $this->view->file_get_contents($legacyFile['path']); - $sharingEnabled = \OCP\Share::isEnabled(); - - // if file exists try to get sharing users - if ($this->view->file_exists($legacyFile['path'])) { - $uniqueUserIds = $this->getSharingUsersArray($sharingEnabled, $legacyFile['path'], $this->userId); - } else { - $uniqueUserIds[] = $this->userId; - } - - // Fetch public keys for all users who will share the file - $publicKeys = Keymanager::getPublicKeys($this->view, $uniqueUserIds); - - // Recrypt data, generate catfile - $recrypted = Crypt::legacyKeyRecryptKeyfile( $legacyData, $legacyPassphrase, $publicKeys ); + // decrypt data, generate catfile + $decrypted = Crypt::legacyBlockDecrypt($legacyData, $legacyPassphrase); $rawPath = $legacyFile['path']; - $relPath = $this->stripUserFilesPath($rawPath); - // Save keyfile - Keymanager::setFileKey($this->view, $relPath, $this->userId, $recrypted['filekey']); + // enable proxy the ensure encryption is handled + \OC_FileProxy::$enabled = true; - // Save sharekeys to user folders - Keymanager::setShareKeys($this->view, $relPath, $recrypted['sharekeys']); + // Open enc file handle for binary writing, with same filename as original plain file + $encHandle = $this->view->fopen( $rawPath, 'wb' ); - // Overwrite the existing file with the encrypted one - $this->view->file_put_contents($rawPath, $recrypted['data']); + if (is_resource($encHandle)) { - $size = strlen($recrypted['data']); + // write data to stream + fwrite($encHandle, $decrypted); - // Add the file to the cache - \OC\Files\Filesystem::putFileInfo($rawPath, array( - 'encrypted' => true, - 'size' => $size - ), ''); + // close stream + fclose($encHandle); + } + + // disable proxy to prevent file being encrypted twice + \OC_FileProxy::$enabled = false; } } @@ -841,7 +820,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $row = $result->fetchRow(); $path = substr($row['path'], strlen('files')); } @@ -903,6 +882,7 @@ class Util { * @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, @@ -1012,13 +992,9 @@ class Util { \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled') && $this->recoveryEnabledForUser() ) { - $recoveryEnabled = true; - } else { - $recoveryEnabled = false; - } // Make sure that a share key is generated for the owner too @@ -1028,7 +1004,7 @@ class Util { if ($sharingEnabled) { // Find out who, if anyone, is sharing the file - $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner, true, true, true); + $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner, true); $userIds = $result['users']; if ($result['public']) { $userIds[] = $this->publicShareKeyId; @@ -1039,20 +1015,25 @@ class Util { // If recovery is enabled, add the // Admin UID to list of users to share to if ($recoveryEnabled) { - // Find recoveryAdmin user ID $recoveryKeyId = \OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); - // Add recoveryAdmin to list of users sharing $userIds[] = $recoveryKeyId; - } // add current user if given if ($currentUserId !== false) { - $userIds[] = $currentUserId; + } + // check if it is a group mount + if (\OCP\App::isEnabled("files_external")) { + $mount = \OC_Mount_Config::getSystemMountPoints(); + foreach ($mount as $mountPoint => $data) { + if ($mountPoint == substr($ownerPath, 1, strlen($mountPoint))) { + $userIds = array_merge($userIds, $this->getUserWithAccessToMountPoint($data['applicable']['users'], $data['applicable']['groups'])); + } + } } // Remove duplicate UIDs @@ -1062,43 +1043,75 @@ class Util { } - /** - * @brief Set file migration status for user - * @param $status - * @return bool - */ - public function setMigrationStatus($status) { - - $sql = 'UPDATE `*PREFIX*encryption` SET migration_status = ? WHERE uid = ?'; - - $args = array( - $status, - $this->userId - ); - - $query = \OCP\DB::prepare($sql); - - if ($query->execute($args)) { - - return true; - + private function getUserWithAccessToMountPoint($users, $groups) { + $result = array(); + if (in_array('all', $users)) { + $result = \OCP\User::getUsers(); } else { - - return false; - + $result = array_merge($result, $users); + foreach ($groups as $group) { + $result = array_merge($result, \OC_Group::usersInGroup($group)); + } } + return $result; } /** - * @brief Check whether pwd recovery is enabled for a given user - * @return bool 1 = yes, 0 = no, false = no record + * @brief start migration mode to initially encrypt users data + * @return boolean + */ + public function beginMigration() { + + $return = false; + + $sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ? and `migration_status` = ?'; + $args = array(self::MIGRATION_IN_PROGRESS, $this->userId, self::MIGRATION_OPEN); + $query = \OCP\DB::prepare($sql); + $manipulatedRows = $query->execute($args); + + if ($manipulatedRows === 1) { + $return = true; + \OCP\Util::writeLog('Encryption library', "Start migration to encryption mode for " . $this->userId, \OCP\Util::INFO); + } else { + \OCP\Util::writeLog('Encryption library', "Could not activate migration mode for " . $this->userId . ". Probably another process already started the initial encryption", \OCP\Util::WARN); + } + + return $return; + } + + /** + * @brief close migration mode after users data has been encrypted successfully + * @return boolean + */ + public function finishMigration() { + + $return = false; + + $sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ? and `migration_status` = ?'; + $args = array(self::MIGRATION_COMPLETED, $this->userId, self::MIGRATION_IN_PROGRESS); + $query = \OCP\DB::prepare($sql); + $manipulatedRows = $query->execute($args); + + if ($manipulatedRows === 1) { + $return = true; + \OCP\Util::writeLog('Encryption library', "Finish migration successfully for " . $this->userId, \OCP\Util::INFO); + } else { + \OCP\Util::writeLog('Encryption library', "Could not deactivate migration mode for " . $this->userId, \OCP\Util::WARN); + } + + return $return; + } + + /** + * @brief check if files are already migrated to the encryption system + * @return migration status, false = in case of no record * @note If records are not being returned, check for a hidden space * at the start of the uid in db */ public function getMigrationStatus() { - $sql = 'SELECT `migration_status` FROM `*PREFIX*encryption` WHERE uid = ?'; + $sql = 'SELECT `migration_status` FROM `*PREFIX*encryption` WHERE `uid` = ?'; $args = array($this->userId); @@ -1111,7 +1124,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $row = $result->fetchRow(); if (isset($row['migration_status'])) { $migrationStatus[] = $row['migration_status']; @@ -1121,14 +1134,11 @@ 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 { - - return $migrationStatus[0]; - + return (int)$migrationStatus[0]; } } @@ -1136,6 +1146,7 @@ class Util { /** * @brief get uid of the owners of the file and the path to the file * @param string $path Path of the file to check + * @throws \Exception * @note $shareFilePath must be relative to data/UID/files. Files * relative to /Shared are also acceptable * @return array @@ -1183,7 +1194,7 @@ class Util { return array( $fileOwnerUid, - $filename + \OC_Filesystem::normalizePath($filename) ); } @@ -1199,14 +1210,15 @@ class Util { $result = array(); - $content = $this->view->getDirectoryContent($this->userFilesDir . $dir); + $content = $this->view->getDirectoryContent(\OC\Files\Filesystem::normalizePath( + $this->userFilesDir . '/' . $dir)); // handling for re shared folders - $path_split = explode('/', $dir); + $pathSplit = explode('/', $dir); foreach ($content as $c) { - $sharedPart = $path_split[sizeof($path_split) - 1]; + $sharedPart = $pathSplit[sizeof($pathSplit) - 1]; $targetPathSplit = array_reverse(explode('/', $c['path'])); $path = ''; @@ -1260,7 +1272,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $row = $result->fetchRow(); } } @@ -1286,7 +1298,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $row = $result->fetchRow(); } } @@ -1311,7 +1323,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $source = $result->fetchRow(); } } @@ -1332,7 +1344,7 @@ class Util { if (\OCP\DB::isError($result)) { \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); } else { - if($result->numRows() > 0) { + if ($result->numRows() > 0) { $item = $result->fetchRow(); } } @@ -1380,26 +1392,24 @@ class Util { */ public function checkRecoveryPassword($password) { + $result = false; $pathKey = '/owncloud_private_key/' . $this->recoveryKeyId . ".private.key"; - $pathControlData = '/control-file/controlfile.enc'; $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; $recoveryKey = $this->view->file_get_contents($pathKey); - $decryptedRecoveryKey = Crypt::symmetricDecryptFileContent($recoveryKey, $password); + $decryptedRecoveryKey = Crypt::decryptPrivateKey($recoveryKey, $password); - $controlData = $this->view->file_get_contents($pathControlData); - $decryptedControlData = Crypt::keyDecrypt($controlData, $decryptedRecoveryKey); + if ($decryptedRecoveryKey) { + $result = true; + } \OC_FileProxy::$enabled = $proxyStatus; - if ($decryptedControlData === 'ownCloud') { - return true; - } - return false; + return $result; } /** @@ -1459,7 +1469,7 @@ class Util { // Find out who, if anyone, is sharing the file if ($sharingEnabled) { - $result = \OCP\Share::getUsersSharingFile($file, $this->userId, true, true, true); + $result = \OCP\Share::getUsersSharingFile($file, $this->userId, true); $userIds = $result['users']; $userIds[] = $this->recoveryKeyId; if ($result['public']) { @@ -1528,11 +1538,45 @@ class Util { $encryptedKey = $this->view->file_get_contents( '/owncloud_private_key/' . $this->recoveryKeyId . '.private.key'); - $privateKey = Crypt::symmetricDecryptFileContent($encryptedKey, $recoveryPassword); + $privateKey = Crypt::decryptPrivateKey($encryptedKey, $recoveryPassword); \OC_FileProxy::$enabled = $proxyStatus; $this->recoverAllFiles('/', $privateKey); } + /** + * Get the path including the storage mount point + * @param int $id + * @return string the path including the mount point like AmazonS3/folder/file.txt + */ + public function getPathWithMountPoint($id) { + list($storage, $internalPath) = \OC\Files\Cache\Cache::getById($id); + $mount = \OC\Files\Filesystem::getMountByStorageId($storage); + $mountPoint = $mount[0]->getMountPoint(); + $path = \OC\Files\Filesystem::normalizePath($mountPoint . '/' . $internalPath); + + // reformat the path to be relative e.g. /user/files/folder becomes /folder/ + $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); + + return $relativePath; + } + + /** + * @brief check if the file is stored on a system wide mount point + * @param $path relative to /data/user with leading '/' + * @return boolean + */ + public function isSystemWideMountPoint($path) { + if (\OCP\App::isEnabled("files_external")) { + $mount = \OC_Mount_Config::getSystemMountPoints(); + foreach ($mount as $mountPoint => $data) { + if ($mountPoint == substr($path, 1, strlen($mountPoint))) { + return true; + } + } + } + return false; + } + } diff --git a/apps/files_encryption/settings-personal.php b/apps/files_encryption/settings-personal.php index 3e96565949..fddc3ea5ee 100644 --- a/apps/files_encryption/settings-personal.php +++ b/apps/files_encryption/settings-personal.php @@ -14,15 +14,26 @@ $tmpl = new OCP\Template('files_encryption', 'settings-personal'); $user = \OCP\USER::getUser(); $view = new \OC_FilesystemView('/'); $util = new \OCA\Encryption\Util($view, $user); +$session = new \OCA\Encryption\Session($view); + +$privateKeySet = ($session->getPrivateKey() !== false) ? true : false; $recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'); $recoveryEnabledForUser = $util->recoveryEnabledForUser(); -\OCP\Util::addscript('files_encryption', 'settings-personal'); -\OCP\Util::addScript('settings', 'personal'); +$result = false; -$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled); -$tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser); +if ($recoveryAdminEnabled || !$privateKeySet) { -return $tmpl->fetchPage(); + \OCP\Util::addscript('files_encryption', 'settings-personal'); + \OCP\Util::addScript('settings', 'personal'); + + $tmpl->assign('recoveryEnabled', $recoveryAdminEnabled); + $tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser); + $tmpl->assign('privateKeySet', $privateKeySet); + + $result = $tmpl->fetchPage(); +} + +return $result; diff --git a/apps/files_encryption/templates/invalid_private_key.php b/apps/files_encryption/templates/invalid_private_key.php new file mode 100644 index 0000000000..5c086d6514 --- /dev/null +++ b/apps/files_encryption/templates/invalid_private_key.php @@ -0,0 +1,10 @@ + diff --git a/apps/files_encryption/templates/settings-admin.php b/apps/files_encryption/templates/settings-admin.php index 18fea1845f..f5f7582c2a 100644 --- a/apps/files_encryption/templates/settings-admin.php +++ b/apps/files_encryption/templates/settings-admin.php @@ -1,54 +1,56 @@
- +

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

+

- t( "Enable encryption passwords recovery key (allow sharing to recovery key):" )); ?> -
-
- - -
- /> - t( "Enabled" )); ?> -
- - /> - t( "Disabled" )); ?> + t("Enable recovery key (allow to recover users files in case of password loss):")); ?> +
+
+ + +
+ /> + t("Enabled")); ?> +
+ + /> + t("Disabled")); ?>

-

+

+

- t( "Change encryption passwords recovery key:" )); ?> -

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

+ /> - -
- /> + +
+ /> - -
+ /> + +

diff --git a/apps/files_encryption/templates/settings-personal.php b/apps/files_encryption/templates/settings-personal.php index 04d6e79179..3851245320 100644 --- a/apps/files_encryption/templates/settings-personal.php +++ b/apps/files_encryption/templates/settings-personal.php @@ -3,12 +3,48 @@ t( 'Encryption' ) ); ?> - - + +

- + +
- t( "Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" ) ); ?> + t( "Set your old private key password to your current log-in password." ) ); ?> + t( " If you don't remember your old password you can ask your administrator to recover your files." ) ); + endif; ?> + +
+ + +
+ + +
+ + +

+ + +
+ + +

+ +
+ t( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" ) ); ?>
t( 'Could not update file recovery' ) ); ?>

+
diff --git a/apps/files_encryption/tests/crypt.php b/apps/files_encryption/tests/crypt.php index 32156eea27..9b97df22d1 100755 --- a/apps/files_encryption/tests/crypt.php +++ b/apps/files_encryption/tests/crypt.php @@ -92,8 +92,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { // reset app files_trashbin if ($this->stateFilesTrashbin) { OC_App::enable('files_trashbin'); - } - else { + } else { OC_App::disable('files_trashbin'); } } @@ -103,6 +102,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { \OC_User::deleteUser(\Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1); } + /** + * @medium + */ function testGenerateKey() { # TODO: use more accurate (larger) string length for test confirmation @@ -114,6 +116,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @large * @return String */ function testGenerateIv() { @@ -127,6 +130,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @large * @depends testGenerateIv */ function testConcatIv($iv) { @@ -159,6 +163,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @depends testConcatIv */ function testSplitIv($testConcatIv) { @@ -175,6 +180,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @return string padded */ function testAddPadding() { @@ -190,6 +196,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @depends testAddPadding */ function testRemovePadding($padded) { @@ -200,6 +207,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testEncrypt() { $random = openssl_random_pseudo_bytes(13); @@ -212,6 +222,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testDecrypt() { $random = openssl_random_pseudo_bytes(13); @@ -226,6 +239,26 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + function testDecryptPrivateKey() { + + // test successful decrypt + $crypted = Encryption\Crypt::symmetricEncryptFileContent($this->genPrivateKey, 'hat'); + + $decrypted = Encryption\Crypt::decryptPrivateKey($crypted, 'hat'); + + $this->assertEquals($this->genPrivateKey, $decrypted); + + //test private key decrypt with wrong password + $wrongPasswd = Encryption\Crypt::decryptPrivateKey($crypted, 'hat2'); + + $this->assertEquals(false, $wrongPasswd); + + } + + + /** + * @medium + */ function testSymmetricEncryptFileContent() { # TODO: search in keyfile for actual content as IV will ensure this test always passes @@ -241,6 +274,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testSymmetricStreamEncryptShortFileContent() { $filename = 'tmp-' . time() . '.test'; @@ -291,6 +327,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief Test that data that is written by the crypto stream wrapper * @note Encrypted data is manually prepared and decrypted here to avoid dependency on success of stream_read * @note If this test fails with truncate content, check that enough array slices are being rejoined to form $e, as the crypt.php file may have gotten longer and broken the manual @@ -377,6 +414,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief Test that data that is read by the crypto stream wrapper */ function testSymmetricStreamDecryptShortFileContent() { @@ -406,6 +444,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->view->unlink($this->userId . '/files/' . $filename); } + /** + * @medium + */ function testSymmetricStreamDecryptLongFileContent() { $filename = 'tmp-' . time(); @@ -425,6 +466,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->view->unlink($this->userId . '/files/' . $filename); } + /** + * @medium + */ function testSymmetricEncryptFileContentKeyfile() { # TODO: search in keyfile for actual content as IV will ensure this test always passes @@ -440,6 +484,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testIsEncryptedContent() { $this->assertFalse(Encryption\Crypt::isCatfileContent($this->dataUrl)); @@ -452,6 +499,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + /** + * @large + */ function testMultiKeyEncrypt() { # TODO: search in keyfile for actual content as IV will ensure this test always passes @@ -476,6 +526,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testKeyEncrypt() { // Generate keypair @@ -494,6 +547,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test encryption using legacy blowfish method */ function testLegacyEncryptShort() { @@ -510,6 +564,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test decryption using legacy blowfish method * @depends testLegacyEncryptShort */ @@ -522,6 +577,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test encryption using legacy blowfish method */ function testLegacyEncryptLong() { @@ -538,6 +594,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test decryption using legacy blowfish method * @depends testLegacyEncryptLong */ @@ -551,6 +608,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test generation of legacy encryption key * @depends testLegacyDecryptShort */ @@ -570,22 +628,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { } /** - * @brief test decryption using legacy blowfish method - * @depends testLegacyEncryptLong + * @medium */ - function testLegacyKeyRecryptKeyfileEncrypt($crypted) { - - $recrypted = Encryption\Crypt::LegacyKeyRecryptKeyfile($crypted, $this->pass, array($this->genPublicKey)); - - $this->assertNotEquals($this->dataLong, $recrypted['data']); - - return $recrypted; - - # TODO: search inencrypted text for actual content to ensure it - # genuine transformation - - } - function testRenameFile() { $filename = 'tmp-' . time(); @@ -614,6 +658,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink($newFilename); } + /** + * @medium + */ function testMoveFileIntoFolder() { $filename = 'tmp-' . time(); @@ -644,6 +691,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink($newFolder); } + /** + * @medium + */ function testMoveFolder() { $view = new \OC\Files\View('/' . $this->userId . '/files'); @@ -679,6 +729,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink('/newfolder'); } + /** + * @medium + */ function testChangePassphrase() { $filename = 'tmp-' . time(); @@ -713,6 +766,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink($filename); } + /** + * @medium + */ function testViewFilePutAndGetContents() { $filename = '/tmp-' . time(); @@ -744,6 +800,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink($filename); } + /** + * @large + */ function testTouchExistingFile() { $filename = '/tmp-' . time(); $view = new \OC\Files\View('/' . $this->userId . '/files'); @@ -765,6 +824,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink($filename); } + /** + * @medium + */ function testTouchFile() { $filename = '/tmp-' . time(); $view = new \OC\Files\View('/' . $this->userId . '/files'); @@ -786,6 +848,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $view->unlink($filename); } + /** + * @medium + */ function testFopenFile() { $filename = '/tmp-' . time(); $view = new \OC\Files\View('/' . $this->userId . '/files'); diff --git a/apps/files_encryption/tests/keymanager.php b/apps/files_encryption/tests/keymanager.php index 40ae1659a5..19ba9a8117 100644 --- a/apps/files_encryption/tests/keymanager.php +++ b/apps/files_encryption/tests/keymanager.php @@ -103,6 +103,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = true; } + /** + * @medium + */ function testGetPrivateKey() { $key = Encryption\Keymanager::getPrivateKey($this->view, $this->userId); @@ -119,6 +122,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testGetPublicKey() { $publiceKey = Encryption\Keymanager::getPublicKey($this->view, $this->userId); @@ -132,6 +138,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $this->assertArrayHasKey('key', $sslInfo); } + /** + * @medium + */ function testSetFileKey() { # NOTE: This cannot be tested until we are able to break out @@ -165,6 +174,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testGetUserKeys() { $keys = Encryption\Keymanager::getUserKeys($this->view, $this->userId); @@ -188,6 +200,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $this->assertArrayHasKey('key', $sslInfoPrivate); } + /** + * @medium + */ function testFixPartialFilePath() { $partFilename = 'testfile.txt.part'; @@ -202,6 +217,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $this->assertEquals('testfile.txt', Encryption\Keymanager::fixPartialFilePath($filename)); } + /** + * @medium + */ function testRecursiveDelShareKeys() { // generate filename diff --git a/apps/files_encryption/tests/share.php b/apps/files_encryption/tests/share.php index 6d92881ceb..6b53031585 100755 --- a/apps/files_encryption/tests/share.php +++ b/apps/files_encryption/tests/share.php @@ -111,8 +111,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // reset app files_trashbin if ($this->stateFilesTrashbin) { OC_App::enable('files_trashbin'); - } - else { + } else { OC_App::disable('files_trashbin'); } } @@ -129,6 +128,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { } /** + * @medium * @param bool $withTeardown */ function testShareFile($withTeardown = true) { @@ -205,6 +205,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { } /** + * @medium * @param bool $withTeardown */ function testReShareFile($withTeardown = true) { @@ -275,6 +276,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { } /** + * @medium * @param bool $withTeardown * @return array */ @@ -363,6 +365,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { } /** + * @medium * @param bool $withTeardown */ function testReShareFolder($withTeardown = true) { @@ -534,7 +537,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // some hacking to simulate public link $GLOBALS['app'] = 'files_sharing'; $GLOBALS['fileOwner'] = \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1; - \OC_User::setUserId(''); + \OC_User::setUserId(false); // get file contents $retrievedCryptedFile = file_get_contents('crypt://' . $this->filename); @@ -564,6 +567,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } + /** + * @medium + */ function testShareFileWithGroup() { // login as admin \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); @@ -639,6 +645,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { } + /** + * @large + */ function testRecoveryFile() { // login as admin \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); @@ -646,9 +655,6 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'); $recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); - // check if control file created - $this->assertTrue($this->view->file_exists('/control-file/controlfile.enc')); - // login as admin \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); @@ -741,6 +747,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled')); } + /** + * @large + */ function testRecoveryForUser() { // login as admin \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); @@ -748,9 +757,6 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'); $recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); - // check if control file created - $this->assertTrue($this->view->file_exists('/control-file/controlfile.enc')); - // login as user1 \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); @@ -837,6 +843,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled')); } + /** + * @medium + */ function testFailShareFile() { // login as admin \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php index 3d97876754..50ac41e453 100644 --- a/apps/files_encryption/tests/stream.php +++ b/apps/files_encryption/tests/stream.php @@ -140,6 +140,9 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { $view->unlink($filename); } + /** + * @medium + */ function testStreamSetTimeout() { $filename = '/tmp-' . time(); $view = new \OC\Files\View('/' . $this->userId . '/files'); diff --git a/apps/files_encryption/tests/trashbin.php b/apps/files_encryption/tests/trashbin.php index 29f8fb5a39..ade968fbec 100755 --- a/apps/files_encryption/tests/trashbin.php +++ b/apps/files_encryption/tests/trashbin.php @@ -113,6 +113,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test delete file */ function testDeleteFile() { @@ -184,6 +185,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test restore file * * @depends testDeleteFile @@ -215,6 +217,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test delete file forever */ function testPermanentDeleteFile() { diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php index 0dc452a41c..368b7b3dc3 100755 --- a/apps/files_encryption/tests/util.php +++ b/apps/files_encryption/tests/util.php @@ -75,7 +75,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->legacyData = realpath(dirname(__FILE__) . '/legacy-text.txt'); $this->legacyEncryptedData = realpath(dirname(__FILE__) . '/legacy-encrypted-text.txt'); $this->legacyEncryptedDataKey = realpath(dirname(__FILE__) . '/encryption.key'); - $this->legacyKey = '30943623843030686906'; + $this->legacyKey = "30943623843030686906\0\0\0\0"; $keypair = Encryption\Crypt::createKeypair(); @@ -118,6 +118,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test that paths set during User construction are correct */ function testKeyPaths() { @@ -132,6 +133,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test setup of encryption directories */ function testSetupServerSide() { @@ -139,6 +141,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { } /** + * @medium * @brief test checking whether account is ready for encryption, */ function testUserIsReady() { @@ -159,6 +162,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // } /** + * @medium * @brief test checking whether account is not ready for encryption, */ function testIsLegacyUser() { @@ -178,14 +182,16 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $params['uid'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER; $params['password'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER; - $util = new Encryption\Util($this->view, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); - $util->setMigrationStatus(0); + $this->setMigrationStatus(0, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); $this->assertTrue(OCA\Encryption\Hooks::login($params)); $this->assertEquals($this->legacyKey, \OC::$session->get('legacyKey')); } + /** + * @medium + */ function testRecoveryEnabledForUser() { $util = new Encryption\Util($this->view, $this->userId); @@ -206,11 +212,14 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { } + /** + * @medium + */ function testGetUidAndFilename() { \OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); - $filename = 'tmp-' . time() . '.test'; + $filename = '/tmp-' . time() . '.test'; // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -232,6 +241,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->view->unlink($this->userId . '/files/' . $filename); } + /** + * @medium + */ function testIsSharedPath() { $sharedPath = '/user1/files/Shared/test'; $path = '/user1/files/test'; @@ -241,6 +253,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->assertFalse($this->util->isSharedPath($path)); } + /** + * @large + */ function testEncryptLegacyFiles() { \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); @@ -269,7 +284,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $params['password'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER; $util = new Encryption\Util($this->view, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); - $util->setMigrationStatus(0); + $this->setMigrationStatus(0, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); $this->assertTrue(OCA\Encryption\Hooks::login($params)); @@ -314,4 +329,28 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $params['password'] = $password; OCA\Encryption\Hooks::login($params); } + + /** + * helper function to set migration status to the right value + * to be able to test the migration path + * + * @param $status needed migration status for test + * @param $user for which user the status should be set + * @return boolean + */ + private function setMigrationStatus($status, $user) { + $sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ?'; + $args = array( + $status, + $user + ); + + $query = \OCP\DB::prepare($sql); + if ($query->execute($args)) { + return true; + } else { + return false; + } + } + } diff --git a/apps/files_encryption/tests/webdav.php b/apps/files_encryption/tests/webdav.php index 0b3bed93e1..1d406789f0 100755 --- a/apps/files_encryption/tests/webdav.php +++ b/apps/files_encryption/tests/webdav.php @@ -216,7 +216,7 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { * * @param bool $body * - * @note this init procedure is copied from /apps/files/remote.php + * @note this init procedure is copied from /apps/files/appinfo/remote.php */ function handleWebdavRequest($body = false) { // Backends diff --git a/apps/files_external/ajax/addRootCertificate.php b/apps/files_external/ajax/addRootCertificate.php index 43fd6752c4..ae349bfcd3 100644 --- a/apps/files_external/ajax/addRootCertificate.php +++ b/apps/files_external/ajax/addRootCertificate.php @@ -29,8 +29,12 @@ if ($isValid == false) { // add the certificate if it could be verified if ( $isValid ) { + // disable proxy to prevent multiple fopen calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; $view->file_put_contents($filename, $data); OC_Mount_Config::createCertificateBundle(); + \OC_FileProxy::$enabled = $proxyStatus; } else { OCP\Util::writeLog('files_external', 'Couldn\'t import SSL root certificate ('.$filename.'), allowed formats: PEM and DER', diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index ac408786ff..3e605c59a9 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -88,7 +88,7 @@ OC.MountConfig={ url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), data: { mountPoint: mountPoint, - class: backendClass, + 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, @@ -103,7 +103,7 @@ OC.MountConfig={ url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), data: { mountPoint: mountPoint, - class: backendClass, + 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, @@ -247,15 +247,18 @@ $(document).ready(function() { OC.MountConfig.saveStorage($(this).parent().parent()); }); + $('#sslCertificate').on('click', 'td.remove>img', function() { + var $tr = $(this).parent().parent(); + var row = this.parentNode.parentNode; + $.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), {cert: row.id}); + $tr.remove(); + return true; + }); + $('#externalStorage').on('click', 'td.remove>img', function() { var tr = $(this).parent().parent(); var mountPoint = $(tr).find('.mountPoint input').val(); - if ( ! mountPoint) { - var row=this.parentNode.parentNode; - $.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), { cert: row.id }); - $(tr).remove(); - return true; - } + if ($('#externalStorage').data('admin') === true) { var isPersonal = false; var multiselect = $(tr).find('.chzn-select').val(); diff --git a/apps/files_external/l10n/es.php b/apps/files_external/l10n/es.php index f83562dd64..d145a176f7 100644 --- a/apps/files_external/l10n/es.php +++ b/apps/files_external/l10n/es.php @@ -1,12 +1,12 @@ "Acceso garantizado", +"Access granted" => "Acceso concedido", "Error configuring Dropbox storage" => "Error configurando el almacenamiento de Dropbox", -"Grant access" => "Garantizar acceso", -"Please provide a valid Dropbox app key and secret." => "Por favor , proporcione un secreto y una contraseña válida de la app Dropbox.", +"Grant access" => "Conceder acceso", +"Please provide a valid Dropbox app key and secret." => "Por favor, proporcione un una clave válida de la app Dropbox y una clave secreta.", "Error configuring Google Drive storage" => "Error configurando el almacenamiento de Google Drive", "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Advertencia: El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.", "Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.", -"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de Curl en PHP no está activado ni instalado. El montado de ownCloud, WebDAV o GoogleDrive no es posible. Pida al administrador de su sistema que lo instale.", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de Curl en PHP no está activado ni instalado. El montado de ownCloud, WebDAV o GoogleDrive no es posible. Pida al administrador de su sistema que lo instale.", "External Storage" => "Almacenamiento externo", "Folder name" => "Nombre de la carpeta", "External storage" => "Almacenamiento externo", @@ -19,8 +19,8 @@ "Groups" => "Grupos", "Users" => "Usuarios", "Delete" => "Eliminar", -"Enable User External Storage" => "Habilitar almacenamiento de usuario externo", +"Enable User External Storage" => "Habilitar almacenamiento externo de usuario", "Allow users to mount their own external storage" => "Permitir a los usuarios montar su propio almacenamiento externo", -"SSL root certificates" => "Raíz de certificados SSL ", +"SSL root certificates" => "Certificados raíz SSL", "Import Root Certificate" => "Importar certificado raíz" ); diff --git a/apps/files_external/l10n/es_AR.php b/apps/files_external/l10n/es_AR.php index 6706aa43a3..c1b3ac6388 100644 --- a/apps/files_external/l10n/es_AR.php +++ b/apps/files_external/l10n/es_AR.php @@ -4,8 +4,9 @@ "Grant access" => "Permitir acceso", "Please provide a valid Dropbox app key and secret." => "Por favor, proporcioná un secreto y una contraseña válida para la aplicación Dropbox.", "Error configuring Google Drive storage" => "Error al configurar el almacenamiento de Google Drive", -"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Advertencia: El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.", -"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Advertencia: El cliente smb \"smbclient\" no está instalado. Montar archivos CIFS/SMB no es posible. Por favor, pedile al administrador de tu sistema que lo instale.", +"Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de FTP en PHP no está instalado. Montar archivos FTP no es posible. Por favor, pedile al administrador de tu sistema que lo instale.", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "Advertencia: El soporte de Curl de PHP no está activo ni instalado. Montar servicios ownCloud, WebDAV y/o GoogleDrive no será posible. Pedile al administrador del sistema que lo instale.", "External Storage" => "Almacenamiento externo", "Folder name" => "Nombre de la carpeta", "External storage" => "Almacenamiento externo", diff --git a/apps/files_external/l10n/eu.php b/apps/files_external/l10n/eu.php index 83be50deb0..9dc1f3e9c0 100644 --- a/apps/files_external/l10n/eu.php +++ b/apps/files_external/l10n/eu.php @@ -6,6 +6,7 @@ "Error configuring Google Drive storage" => "Errore bat egon da Google Drive biltegiratzea konfiguratzean", "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Abisua: \"smbclient\" ez dago instalatuta. CIFS/SMB partekatutako karpetak montatzea ez da posible. Mesedez eskatu zure sistema kudeatzaileari instalatzea.", "Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Abisua: PHPren FTP modulua ez dago instalatuta edo gaitua. FTP partekatutako karpetak montatzea ez da posible. Mesedez eskatu zure sistema kudeatzaileari instalatzea.", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "Abisua: Curl euskarri PHP modulua ez dago instalatuta edo gaitua. Ezinezko da ownCloud /WebDAV GoogleDrive-n muntatzea. Mesedez eskatu sistema kudeatzaileari instala dezan. ", "External Storage" => "Kanpoko Biltegiratzea", "Folder name" => "Karpetaren izena", "External storage" => "Kanpoko biltegiratzea", diff --git a/apps/files_external/l10n/fa.php b/apps/files_external/l10n/fa.php index 1921ba9f2a..82d3676e17 100644 --- a/apps/files_external/l10n/fa.php +++ b/apps/files_external/l10n/fa.php @@ -1,5 +1,12 @@ "مجوز دسترسی صادر شد", +"Error configuring Dropbox storage" => "خطا به هنگام تنظیم فضای دراپ باکس", +"Grant access" => " مجوز اعطا دسترسی", +"Please provide a valid Dropbox app key and secret." => "لطفا یک کلید و کد امنیتی صحیح دراپ باکس وارد کنید.", +"Error configuring Google Drive storage" => "خطا به هنگام تنظیم فضای Google Drive", +"Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "خطا: \"smbclient\" نصب نشده است. نصب و راه اندازی سهام CIFS/SMB امکان پذیر نمیباشد. لطفا از مدیریت سازمان خود برای راه اندازی آن درخواست نمایید.", "External Storage" => "حافظه خارجی", +"Folder name" => "نام پوشه", "Configuration" => "پیکربندی", "Options" => "تنظیمات", "Applicable" => "قابل اجرا", diff --git a/apps/files_external/l10n/ko.php b/apps/files_external/l10n/ko.php index 47de9aad5e..803b489c21 100644 --- a/apps/files_external/l10n/ko.php +++ b/apps/files_external/l10n/ko.php @@ -6,11 +6,14 @@ "Error configuring Google Drive storage" => "Google 드라이브 저장소 설정 오류", "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "경고: \"smbclient\"가 설치되지 않았습니다. CIFS/SMB 공유 자원에 연결할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", "Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "경고: PHP FTP 지원이 비활성화되어 있거나 설치되지 않았습니다. FTP 공유를 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "경고: PHP Curl 지원이 비활성화되어 있거나 설치되지 않았습니다. 다른 ownCloud, WebDAV, Google 드라이브 공유를 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", "External Storage" => "외부 저장소", "Folder name" => "폴더 이름", +"External storage" => "외부 저장소", "Configuration" => "설정", "Options" => "옵션", "Applicable" => "적용 가능", +"Add storage" => "저장소 추가", "None set" => "설정되지 않음", "All Users" => "모든 사용자", "Groups" => "그룹", diff --git a/apps/files_external/l10n/lt_LT.php b/apps/files_external/l10n/lt_LT.php index 9bf997d87c..29c962d9a8 100644 --- a/apps/files_external/l10n/lt_LT.php +++ b/apps/files_external/l10n/lt_LT.php @@ -6,6 +6,7 @@ "Error configuring Google Drive storage" => "Klaida nustatinėjant Google Drive talpyklą", "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Įspėjimas: \"smbclient\" nėra įdiegtas. CIFS/SMB dalinimasis nėra galimas. Prašome susisiekti su sistemos administratoriumi kad būtų įdiegtas \"smbclient\"", "Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Įspėjimas: FTP palaikymas PHP sistemoje nėra įjungtas arba nėra įdiegtas. FTP dalinimosi įjungimas nėra galimas. Prašome susisiekti su sistemos administratoriumi kad būtų įdiegtas FTP palaikymas. ", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "Įspėjimas: \"Curl\" palaikymas PHP terpėje nėra įjungtas arba įdiegtas. ownCloud/WebDAV ar GoogleDrive įjungimas nebus įmanomas. Prašome susisiekti su sistemos administratoriumi kad būtų įdiegtas arba įjungtas \"Curl\" palaikymas.", "External Storage" => "Išorinės saugyklos", "Folder name" => "Katalogo pavadinimas", "External storage" => "Išorinė saugykla", diff --git a/apps/files_external/l10n/nn_NO.php b/apps/files_external/l10n/nn_NO.php index 4b4b6167d8..998c3f8245 100644 --- a/apps/files_external/l10n/nn_NO.php +++ b/apps/files_external/l10n/nn_NO.php @@ -1,4 +1,5 @@ "Innstillingar", "Groups" => "Grupper", "Users" => "Brukarar", "Delete" => "Slett" diff --git a/apps/files_external/l10n/sv.php b/apps/files_external/l10n/sv.php index 45d3589228..80e68ab6e0 100644 --- a/apps/files_external/l10n/sv.php +++ b/apps/files_external/l10n/sv.php @@ -6,6 +6,7 @@ "Error configuring Google Drive storage" => "Fel vid konfigurering av Google Drive", "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "Varning: \"smb-klienten\" är inte installerad. Montering av CIFS/SMB delningar är inte möjligt. Kontakta din systemadministratör för att få den installerad.", "Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "Varning: Stöd för FTP i PHP är inte aktiverat eller installerat. Montering av FTP-delningar är inte möjligt. Kontakta din systemadministratör för att få det installerat.", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "Varning: Curl-stöd i PHP är inte aktiverat eller installerat. Montering av ownCloud / WebDAV eller GoogleDrive är inte möjligt. Vänligen be din administratör att installera det.", "External Storage" => "Extern lagring", "Folder name" => "Mappnamn", "External storage" => "Extern lagring", diff --git a/apps/files_external/l10n/te.php b/apps/files_external/l10n/te.php index f557dda559..3d31f6438f 100644 --- a/apps/files_external/l10n/te.php +++ b/apps/files_external/l10n/te.php @@ -1,4 +1,5 @@ "సంచయం పేరు", "Users" => "వాడుకరులు", "Delete" => "తొలగించు" ); diff --git a/apps/files_external/l10n/zh_CN.GB2312.php b/apps/files_external/l10n/zh_CN.GB2312.php index c74323db17..47298f8007 100644 --- a/apps/files_external/l10n/zh_CN.GB2312.php +++ b/apps/files_external/l10n/zh_CN.GB2312.php @@ -6,6 +6,7 @@ "Error configuring Google Drive storage" => "配置 Google Drive 存储失败", "Warning: \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "注意:“SMB客户端”未安装。CIFS/SMB分享不可用。请向您的系统管理员请求安装该客户端。", "Warning: The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "注意:PHP的FTP支持尚未启用或未安装。FTP分享不可用。请向您的系统管理员请求安装。", +"Warning: The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "警告: PHP 的 Curl 支持没有安装或打开。挂载 ownCloud、WebDAV 或 Google Drive 的功能将不可用。请询问您的系统管理员去安装它。", "External Storage" => "外部存储", "Folder name" => "文件夹名", "External storage" => "外部存储", diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php index 655c3c9a81..81a6c95638 100644 --- a/apps/files_external/lib/smb.php +++ b/apps/files_external/lib/smb.php @@ -57,12 +57,22 @@ class SMB extends \OC\Files\Storage\StreamWrapper{ public function stat($path) { if ( ! $path and $this->root=='/') {//mtime doesn't work for shares - $mtime=$this->shareMTime(); $stat=stat($this->constructUrl($path)); + if (empty($stat)) { + return false; + } + $mtime=$this->shareMTime(); $stat['mtime']=$mtime; return $stat; } else { - return stat($this->constructUrl($path)); + $stat = stat($this->constructUrl($path)); + + // smb4php can return an empty array if the connection could not be established + if (empty($stat)) { + return false; + } + + return $stat; } } diff --git a/apps/files_external/tests/config.php b/apps/files_external/tests/config.php index 1d4f30c713..bac594b485 100644 --- a/apps/files_external/tests/config.php +++ b/apps/files_external/tests/config.php @@ -1,4 +1,13 @@ use them +$privateConfigFile = $_SERVER['HOME'] . '/owncloud-extfs-test-config.php'; +if (file_exists($privateConfigFile)) { + $config = include($privateConfigFile); + return $config; +} + +// this is now more a template now for your private configurations return array( 'ftp'=>array( 'run'=>false, diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css index 13298f113f..b6511cb57c 100644 --- a/apps/files_sharing/css/public.css +++ b/apps/files_sharing/css/public.css @@ -17,14 +17,29 @@ body { #details { color:#fff; + float: left; } -#header #download { +#public_upload, +#download { font-weight:700; - margin-left:2em; + margin: 0 0.4em 0 0; + padding: 0 5px; + height: 27px; + float: left; + } -#header #download img { +.header-right #details { + margin-right: 2em; +} + +#public_upload { + margin-left: 0.3em; +} + +#public_upload img, +#download img { padding-left:.1em; padding-right:.3em; vertical-align:text-bottom; @@ -73,3 +88,49 @@ thead{ background-color: white; padding-left:0 !important; /* fixes multiselect bar offset on shared page */ } + +#data-upload-form { + position: relative; + right: 0; + height: 27px; + overflow: hidden; + padding: 0; + float: right; + display: inline; + margin: 0; +} + +#file_upload_start { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + z-index: 20; + position: absolute !important; + top: 0; + left: 0; + width: 100% !important; +} + +#download span { + position: relative; + bottom: 3px; +} + +#publicUploadButtonMock { + 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; +} + +#publicUploadButtonMock span { + margin: 0 5px 0 28px; + position: relative; + top: -2px; + color: #555; +} diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 916e35419c..294223aa09 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -7,8 +7,12 @@ function fileDownloadPath(dir, file) { return url; } +var form_data; + $(document).ready(function() { + $('#data-upload-form').tipsy({gravity:'ne', fade:true}); + if (typeof FileActions !== 'undefined') { var mimetype = $('#mimetype').val(); // Show file preview if previewer is available, images are already handled by the template @@ -46,4 +50,19 @@ $(document).ready(function() { }); } -}); \ No newline at end of file + // Add some form data to the upload handler + file_upload_param.formData = { + MAX_FILE_SIZE: $('#uploadMaxFilesize').val(), + requesttoken: $('#publicUploadRequestToken').val(), + dirToken: $('#dirToken').val(), + appname: 'files_sharing', + subdir: $('input#dir').val() + }; + + // Add Uploadprogress Wrapper to controls bar + $('#controls').append($('#additional_controls div#uploadprogresswrapper')); + + // Cancel upload trigger + $('#cancel_upload_button').click(Files.cancelUploads); + +}); diff --git a/apps/files_sharing/l10n/af_ZA.php b/apps/files_sharing/l10n/af_ZA.php index 344585a62f..04e194530b 100644 --- a/apps/files_sharing/l10n/af_ZA.php +++ b/apps/files_sharing/l10n/af_ZA.php @@ -1,4 +1,3 @@ "Wagwoord", -"web services under your control" => "webdienste onder jou beheer" +"Password" => "Wagwoord" ); diff --git a/apps/files_sharing/l10n/ar.php b/apps/files_sharing/l10n/ar.php index 4cf3f8c092..043c7ee1b2 100644 --- a/apps/files_sharing/l10n/ar.php +++ b/apps/files_sharing/l10n/ar.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s شارك المجلد %s معك", "%s shared the file %s with you" => "%s شارك الملف %s معك", "Download" => "تحميل", -"No preview available for" => "لا يوجد عرض مسبق لـ", -"web services under your control" => "خدمات الشبكة تحت سيطرتك" +"Upload" => "رفع", +"Cancel upload" => "إلغاء رفع الملفات", +"No preview available for" => "لا يوجد عرض مسبق لـ" ); diff --git a/apps/files_sharing/l10n/bg_BG.php b/apps/files_sharing/l10n/bg_BG.php index ac94358c4f..8e719ba235 100644 --- a/apps/files_sharing/l10n/bg_BG.php +++ b/apps/files_sharing/l10n/bg_BG.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s сподели папката %s с Вас", "%s shared the file %s with you" => "%s сподели файла %s с Вас", "Download" => "Изтегляне", -"No preview available for" => "Няма наличен преглед за", -"web services under your control" => "уеб услуги под Ваш контрол" +"Upload" => "Качване", +"Cancel upload" => "Спри качването", +"No preview available for" => "Няма наличен преглед за" ); diff --git a/apps/files_sharing/l10n/bn_BD.php b/apps/files_sharing/l10n/bn_BD.php index 5fdf6de50c..baa0c5c707 100644 --- a/apps/files_sharing/l10n/bn_BD.php +++ b/apps/files_sharing/l10n/bn_BD.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s আপনার সাথে %s ফোল্ডারটি ভাগাভাগি করেছেন", "%s shared the file %s with you" => "%s আপনার সাথে %s ফাইলটি ভাগাভাগি করেছেন", "Download" => "ডাউনলোড", -"No preview available for" => "এর জন্য কোন প্রাকবীক্ষণ সুলভ নয়", -"web services under your control" => "ওয়েব সার্ভিস আপনার হাতের মুঠোয়" +"Upload" => "আপলোড", +"Cancel upload" => "আপলোড বাতিল কর", +"No preview available for" => "এর জন্য কোন প্রাকবীক্ষণ সুলভ নয়" ); diff --git a/apps/files_sharing/l10n/ca.php b/apps/files_sharing/l10n/ca.php index 223495455f..9d2ab5031c 100644 --- a/apps/files_sharing/l10n/ca.php +++ b/apps/files_sharing/l10n/ca.php @@ -1,9 +1,11 @@ "la contrasenya és incorrecta. Intenteu-ho de nou.", "Password" => "Contrasenya", "Submit" => "Envia", "%s shared the folder %s with you" => "%s ha compartit la carpeta %s amb vós", "%s shared the file %s with you" => "%s ha compartit el fitxer %s amb vós", "Download" => "Baixa", -"No preview available for" => "No hi ha vista prèvia disponible per a", -"web services under your control" => "controleu els vostres serveis web" +"Upload" => "Puja", +"Cancel upload" => "Cancel·la la pujada", +"No preview available for" => "No hi ha vista prèvia disponible per a" ); diff --git a/apps/files_sharing/l10n/cs_CZ.php b/apps/files_sharing/l10n/cs_CZ.php index 9889fae488..a57764a18b 100644 --- a/apps/files_sharing/l10n/cs_CZ.php +++ b/apps/files_sharing/l10n/cs_CZ.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s s Vámi sdílí složku %s", "%s shared the file %s with you" => "%s s Vámi sdílí soubor %s", "Download" => "Stáhnout", -"No preview available for" => "Náhled není dostupný pro", -"web services under your control" => "služby webu pod Vaší kontrolou" +"Upload" => "Odeslat", +"Cancel upload" => "Zrušit odesílání", +"No preview available for" => "Náhled není dostupný pro" ); diff --git a/apps/files_sharing/l10n/cy_GB.php b/apps/files_sharing/l10n/cy_GB.php index dec9af4ebe..6ff3e274c3 100644 --- a/apps/files_sharing/l10n/cy_GB.php +++ b/apps/files_sharing/l10n/cy_GB.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "Rhannodd %s blygell %s â chi", "%s shared the file %s with you" => "Rhannodd %s ffeil %s â chi", "Download" => "Llwytho i lawr", -"No preview available for" => "Does dim rhagolwg ar gael ar gyfer", -"web services under your control" => "gwasanaethau gwe a reolir gennych" +"Upload" => "Llwytho i fyny", +"Cancel upload" => "Diddymu llwytho i fyny", +"No preview available for" => "Does dim rhagolwg ar gael ar gyfer" ); diff --git a/apps/files_sharing/l10n/da.php b/apps/files_sharing/l10n/da.php index 75fbdabe16..e3e469a4e5 100644 --- a/apps/files_sharing/l10n/da.php +++ b/apps/files_sharing/l10n/da.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s delte mappen %s med dig", "%s shared the file %s with you" => "%s delte filen %s med dig", "Download" => "Download", -"No preview available for" => "Forhåndsvisning ikke tilgængelig for", -"web services under your control" => "Webtjenester under din kontrol" +"Upload" => "Upload", +"Cancel upload" => "Fortryd upload", +"No preview available for" => "Forhåndsvisning ikke tilgængelig for" ); diff --git a/apps/files_sharing/l10n/de.php b/apps/files_sharing/l10n/de.php index 7f4cbb1ada..ad2d171aa9 100644 --- a/apps/files_sharing/l10n/de.php +++ b/apps/files_sharing/l10n/de.php @@ -1,9 +1,11 @@ "Bitte überprüfen sie Ihr Passwort und versuchen Sie es erneut.", "Password" => "Passwort", "Submit" => "Absenden", "%s shared the folder %s with you" => "%s hat den Ordner %s mit Dir geteilt", "%s shared the file %s with you" => "%s hat die Datei %s mit Dir geteilt", "Download" => "Download", -"No preview available for" => "Es ist keine Vorschau verfügbar für", -"web services under your control" => "Web-Services unter Deiner Kontrolle" +"Upload" => "Hochladen", +"Cancel upload" => "Upload abbrechen", +"No preview available for" => "Es ist keine Vorschau verfügbar für" ); diff --git a/apps/files_sharing/l10n/de_DE.php b/apps/files_sharing/l10n/de_DE.php index ab81589b0e..cac7b7591d 100644 --- a/apps/files_sharing/l10n/de_DE.php +++ b/apps/files_sharing/l10n/de_DE.php @@ -1,9 +1,11 @@ "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", "Password" => "Passwort", "Submit" => "Bestätigen", "%s shared the folder %s with you" => "%s hat den Ordner %s mit Ihnen geteilt", "%s shared the file %s with you" => "%s hat die Datei %s mit Ihnen geteilt", "Download" => "Herunterladen", -"No preview available for" => "Es ist keine Vorschau verfügbar für", -"web services under your control" => "Web-Services unter Ihrer Kontrolle" +"Upload" => "Hochladen", +"Cancel upload" => "Upload abbrechen", +"No preview available for" => "Es ist keine Vorschau verfügbar für" ); diff --git a/apps/files_sharing/l10n/el.php b/apps/files_sharing/l10n/el.php index 5305eedd48..b7b8935371 100644 --- a/apps/files_sharing/l10n/el.php +++ b/apps/files_sharing/l10n/el.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s μοιράστηκε τον φάκελο %s μαζί σας", "%s shared the file %s with you" => "%s μοιράστηκε το αρχείο %s μαζί σας", "Download" => "Λήψη", -"No preview available for" => "Δεν υπάρχει διαθέσιμη προεπισκόπηση για", -"web services under your control" => "υπηρεσίες δικτύου υπό τον έλεγχό σας" +"Upload" => "Μεταφόρτωση", +"Cancel upload" => "Ακύρωση αποστολής", +"No preview available for" => "Δεν υπάρχει διαθέσιμη προεπισκόπηση για" ); diff --git a/apps/files_sharing/l10n/en@pirate.php b/apps/files_sharing/l10n/en@pirate.php index 02ee844048..cb40c5a168 100644 --- a/apps/files_sharing/l10n/en@pirate.php +++ b/apps/files_sharing/l10n/en@pirate.php @@ -4,6 +4,5 @@ "%s shared the folder %s with you" => "%s shared the folder %s with you", "%s shared the file %s with you" => "%s shared the file %s with you", "Download" => "Download", -"No preview available for" => "No preview available for", -"web services under your control" => "web services under your control" +"No preview available for" => "No preview available for" ); diff --git a/apps/files_sharing/l10n/eo.php b/apps/files_sharing/l10n/eo.php index c598d3aa2c..d3ca5370a2 100644 --- a/apps/files_sharing/l10n/eo.php +++ b/apps/files_sharing/l10n/eo.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s kunhavigis la dosierujon %s kun vi", "%s shared the file %s with you" => "%s kunhavigis la dosieron %s kun vi", "Download" => "Elŝuti", -"No preview available for" => "Ne haveblas antaŭvido por", -"web services under your control" => "TTT-servoj regataj de vi" +"Upload" => "Alŝuti", +"Cancel upload" => "Nuligi alŝuton", +"No preview available for" => "Ne haveblas antaŭvido por" ); diff --git a/apps/files_sharing/l10n/es.php b/apps/files_sharing/l10n/es.php index 2023d35903..1b65cf0c19 100644 --- a/apps/files_sharing/l10n/es.php +++ b/apps/files_sharing/l10n/es.php @@ -1,9 +1,11 @@ "La contraseña introducida es errónea. Inténtelo de nuevo.", "Password" => "Contraseña", "Submit" => "Enviar", "%s shared the folder %s with you" => "%s compartió la carpeta %s contigo", "%s shared the file %s with you" => "%s compartió el fichero %s contigo", "Download" => "Descargar", -"No preview available for" => "No hay vista previa disponible para", -"web services under your control" => "Servicios web bajo su control" +"Upload" => "Subir", +"Cancel upload" => "Cancelar subida", +"No preview available for" => "No hay vista previa disponible para" ); diff --git a/apps/files_sharing/l10n/es_AR.php b/apps/files_sharing/l10n/es_AR.php index a2d6e232f2..90bfe704d2 100644 --- a/apps/files_sharing/l10n/es_AR.php +++ b/apps/files_sharing/l10n/es_AR.php @@ -1,9 +1,11 @@ "La contraseña no es correcta. Probá de nuevo.", "Password" => "Contraseña", "Submit" => "Enviar", "%s shared the folder %s with you" => "%s compartió la carpeta %s con vos", "%s shared the file %s with you" => "%s compartió el archivo %s con vos", "Download" => "Descargar", -"No preview available for" => "La vista preliminar no está disponible para", -"web services under your control" => "servicios web controlados por vos" +"Upload" => "Subir", +"Cancel upload" => "Cancelar subida", +"No preview available for" => "La vista preliminar no está disponible para" ); diff --git a/apps/files_sharing/l10n/et_EE.php b/apps/files_sharing/l10n/et_EE.php index 36290ad278..78fe436398 100644 --- a/apps/files_sharing/l10n/et_EE.php +++ b/apps/files_sharing/l10n/et_EE.php @@ -1,9 +1,11 @@ "Parool on vale. Proovi uuesti.", "Password" => "Parool", "Submit" => "Saada", "%s shared the folder %s with you" => "%s jagas sinuga kausta %s", "%s shared the file %s with you" => "%s jagas sinuga faili %s", "Download" => "Lae alla", -"No preview available for" => "Eelvaadet pole saadaval", -"web services under your control" => "veebitenused sinu kontrolli all" +"Upload" => "Lae üles", +"Cancel upload" => "Tühista üleslaadimine", +"No preview available for" => "Eelvaadet pole saadaval" ); diff --git a/apps/files_sharing/l10n/eu.php b/apps/files_sharing/l10n/eu.php index ebef0f445e..7a4559cb65 100644 --- a/apps/files_sharing/l10n/eu.php +++ b/apps/files_sharing/l10n/eu.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%sk zurekin %s karpeta elkarbanatu du", "%s shared the file %s with you" => "%sk zurekin %s fitxategia elkarbanatu du", "Download" => "Deskargatu", -"No preview available for" => "Ez dago aurrebista eskuragarririk hauentzat ", -"web services under your control" => "web zerbitzuak zure kontrolpean" +"Upload" => "Igo", +"Cancel upload" => "Ezeztatu igoera", +"No preview available for" => "Ez dago aurrebista eskuragarririk hauentzat " ); diff --git a/apps/files_sharing/l10n/fa.php b/apps/files_sharing/l10n/fa.php index 4313acae1a..7a744c8463 100644 --- a/apps/files_sharing/l10n/fa.php +++ b/apps/files_sharing/l10n/fa.php @@ -1,9 +1,11 @@ "رمزعبور اشتباه می باشد. دوباره امتحان کنید.", "Password" => "گذرواژه", "Submit" => "ثبت", "%s shared the folder %s with you" => "%sپوشه %s را با شما به اشتراک گذاشت", "%s shared the file %s with you" => "%sفایل %s را با شما به اشتراک گذاشت", "Download" => "دانلود", -"No preview available for" => "هیچگونه پیش نمایشی موجود نیست", -"web services under your control" => "سرویس های تحت وب در کنترل شما" +"Upload" => "بارگزاری", +"Cancel upload" => "متوقف کردن بار گذاری", +"No preview available for" => "هیچگونه پیش نمایشی موجود نیست" ); diff --git a/apps/files_sharing/l10n/fi_FI.php b/apps/files_sharing/l10n/fi_FI.php index 6c44134213..03931bf298 100644 --- a/apps/files_sharing/l10n/fi_FI.php +++ b/apps/files_sharing/l10n/fi_FI.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s jakoi kansion %s kanssasi", "%s shared the file %s with you" => "%s jakoi tiedoston %s kanssasi", "Download" => "Lataa", -"No preview available for" => "Ei esikatselua kohteelle", -"web services under your control" => "verkkopalvelut hallinnassasi" +"Upload" => "Lähetä", +"Cancel upload" => "Peru lähetys", +"No preview available for" => "Ei esikatselua kohteelle" ); diff --git a/apps/files_sharing/l10n/fr.php b/apps/files_sharing/l10n/fr.php index 1038d81933..32aa6e0065 100644 --- a/apps/files_sharing/l10n/fr.php +++ b/apps/files_sharing/l10n/fr.php @@ -1,9 +1,11 @@ "Le mot de passe est incorrect. Veuillez réessayer.", "Password" => "Mot de passe", "Submit" => "Envoyer", "%s shared the folder %s with you" => "%s a partagé le répertoire %s avec vous", "%s shared the file %s with you" => "%s a partagé le fichier %s avec vous", "Download" => "Télécharger", -"No preview available for" => "Pas d'aperçu disponible pour", -"web services under your control" => "services web sous votre contrôle" +"Upload" => "Envoyer", +"Cancel upload" => "Annuler l'envoi", +"No preview available for" => "Pas d'aperçu disponible pour" ); diff --git a/apps/files_sharing/l10n/gl.php b/apps/files_sharing/l10n/gl.php index d03f1a5005..2d8de8e101 100644 --- a/apps/files_sharing/l10n/gl.php +++ b/apps/files_sharing/l10n/gl.php @@ -1,9 +1,11 @@ "O contrasinal é incorrecto. Ténteo de novo.", "Password" => "Contrasinal", "Submit" => "Enviar", "%s shared the folder %s with you" => "%s compartiu o cartafol %s con vostede", "%s shared the file %s with you" => "%s compartiu o ficheiro %s con vostede", "Download" => "Descargar", -"No preview available for" => "Sen vista previa dispoñíbel para", -"web services under your control" => "servizos web baixo o seu control" +"Upload" => "Enviar", +"Cancel upload" => "Cancelar o envío", +"No preview available for" => "Sen vista previa dispoñíbel para" ); diff --git a/apps/files_sharing/l10n/he.php b/apps/files_sharing/l10n/he.php index 2ea5ba76ab..41fc314f3c 100644 --- a/apps/files_sharing/l10n/he.php +++ b/apps/files_sharing/l10n/he.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s שיתף עמך את התיקייה %s", "%s shared the file %s with you" => "%s שיתף עמך את הקובץ %s", "Download" => "הורדה", -"No preview available for" => "אין תצוגה מקדימה זמינה עבור", -"web services under your control" => "שירותי רשת תחת השליטה שלך" +"Upload" => "העלאה", +"Cancel upload" => "ביטול ההעלאה", +"No preview available for" => "אין תצוגה מקדימה זמינה עבור" ); diff --git a/apps/files_sharing/l10n/hr.php b/apps/files_sharing/l10n/hr.php index b2dca866bb..d5763a8ddb 100644 --- a/apps/files_sharing/l10n/hr.php +++ b/apps/files_sharing/l10n/hr.php @@ -2,5 +2,6 @@ "Password" => "Lozinka", "Submit" => "Pošalji", "Download" => "Preuzimanje", -"web services under your control" => "web usluge pod vašom kontrolom" +"Upload" => "Učitaj", +"Cancel upload" => "Prekini upload" ); diff --git a/apps/files_sharing/l10n/hu_HU.php b/apps/files_sharing/l10n/hu_HU.php index f8ca541260..15ff6ff3c2 100644 --- a/apps/files_sharing/l10n/hu_HU.php +++ b/apps/files_sharing/l10n/hu_HU.php @@ -1,9 +1,11 @@ "A megadott jelszó nem megfelelő. Próbálja újra!", "Password" => "Jelszó", "Submit" => "Elküld", "%s shared the folder %s with you" => "%s megosztotta Önnel ezt a mappát: %s", "%s shared the file %s with you" => "%s megosztotta Önnel ezt az állományt: %s", "Download" => "Letöltés", -"No preview available for" => "Nem áll rendelkezésre előnézet ehhez: ", -"web services under your control" => "webszolgáltatások saját kézben" +"Upload" => "Feltöltés", +"Cancel upload" => "A feltöltés megszakítása", +"No preview available for" => "Nem áll rendelkezésre előnézet ehhez: " ); diff --git a/apps/files_sharing/l10n/ia.php b/apps/files_sharing/l10n/ia.php index d229135a71..01acba5108 100644 --- a/apps/files_sharing/l10n/ia.php +++ b/apps/files_sharing/l10n/ia.php @@ -2,5 +2,5 @@ "Password" => "Contrasigno", "Submit" => "Submitter", "Download" => "Discargar", -"web services under your control" => "servicios web sub tu controlo" +"Upload" => "Incargar" ); diff --git a/apps/files_sharing/l10n/id.php b/apps/files_sharing/l10n/id.php index 95cf84312c..cc6e591834 100644 --- a/apps/files_sharing/l10n/id.php +++ b/apps/files_sharing/l10n/id.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s membagikan folder %s dengan Anda", "%s shared the file %s with you" => "%s membagikan file %s dengan Anda", "Download" => "Unduh", -"No preview available for" => "Tidak ada pratinjau tersedia untuk", -"web services under your control" => "layanan web dalam kontrol Anda" +"Upload" => "Unggah", +"Cancel upload" => "Batal pengunggahan", +"No preview available for" => "Tidak ada pratinjau tersedia untuk" ); diff --git a/apps/files_sharing/l10n/is.php b/apps/files_sharing/l10n/is.php index bf1975c54a..222459f7a0 100644 --- a/apps/files_sharing/l10n/is.php +++ b/apps/files_sharing/l10n/is.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s deildi möppunni %s með þér", "%s shared the file %s with you" => "%s deildi skránni %s með þér", "Download" => "Niðurhal", -"No preview available for" => "Yfirlit ekki í boði fyrir", -"web services under your control" => "vefþjónusta undir þinni stjórn" +"Upload" => "Senda inn", +"Cancel upload" => "Hætta við innsendingu", +"No preview available for" => "Yfirlit ekki í boði fyrir" ); diff --git a/apps/files_sharing/l10n/it.php b/apps/files_sharing/l10n/it.php index f83ca1446d..cf25c53ca3 100644 --- a/apps/files_sharing/l10n/it.php +++ b/apps/files_sharing/l10n/it.php @@ -1,9 +1,11 @@ "La password è errata. Prova ancora.", "Password" => "Password", "Submit" => "Invia", "%s shared the folder %s with you" => "%s ha condiviso la cartella %s con te", "%s shared the file %s with you" => "%s ha condiviso il file %s con te", "Download" => "Scarica", -"No preview available for" => "Nessuna anteprima disponibile per", -"web services under your control" => "servizi web nelle tue mani" +"Upload" => "Carica", +"Cancel upload" => "Annulla il caricamento", +"No preview available for" => "Nessuna anteprima disponibile per" ); diff --git a/apps/files_sharing/l10n/ja_JP.php b/apps/files_sharing/l10n/ja_JP.php index 02142e2879..d2bc2d1124 100644 --- a/apps/files_sharing/l10n/ja_JP.php +++ b/apps/files_sharing/l10n/ja_JP.php @@ -1,9 +1,11 @@ "パスワードが間違っています。再試行してください。", "Password" => "パスワード", "Submit" => "送信", "%s shared the folder %s with you" => "%s はフォルダー %s をあなたと共有中です", "%s shared the file %s with you" => "%s はファイル %s をあなたと共有中です", "Download" => "ダウンロード", -"No preview available for" => "プレビューはありません", -"web services under your control" => "管理下のウェブサービス" +"Upload" => "アップロード", +"Cancel upload" => "アップロードをキャンセル", +"No preview available for" => "プレビューはありません" ); diff --git a/apps/files_sharing/l10n/ka_GE.php b/apps/files_sharing/l10n/ka_GE.php index 6da1a8b019..c88cc59cf8 100644 --- a/apps/files_sharing/l10n/ka_GE.php +++ b/apps/files_sharing/l10n/ka_GE.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s–მა გაგიზიარათ ფოლდერი %s", "%s shared the file %s with you" => "%s–მა გაგიზიარათ ფაილი %s", "Download" => "ჩამოტვირთვა", -"No preview available for" => "წინასწარი დათვალიერება შეუძლებელია", -"web services under your control" => "web services under your control" +"Upload" => "ატვირთვა", +"Cancel upload" => "ატვირთვის გაუქმება", +"No preview available for" => "წინასწარი დათვალიერება შეუძლებელია" ); diff --git a/apps/files_sharing/l10n/ko.php b/apps/files_sharing/l10n/ko.php index 600168d9bf..d2cf52447f 100644 --- a/apps/files_sharing/l10n/ko.php +++ b/apps/files_sharing/l10n/ko.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다", "%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다", "Download" => "다운로드", -"No preview available for" => "다음 항목을 미리 볼 수 없음:", -"web services under your control" => "내가 관리하는 웹 서비스" +"Upload" => "업로드", +"Cancel upload" => "업로드 취소", +"No preview available for" => "다음 항목을 미리 볼 수 없음:" ); diff --git a/apps/files_sharing/l10n/ku_IQ.php b/apps/files_sharing/l10n/ku_IQ.php index 675fc372e1..576671aaa7 100644 --- a/apps/files_sharing/l10n/ku_IQ.php +++ b/apps/files_sharing/l10n/ku_IQ.php @@ -4,6 +4,6 @@ "%s shared the folder %s with you" => "%s دابه‌شی کردووه‌ بوخچه‌ی %s له‌گه‌ڵ تۆ", "%s shared the file %s with you" => "%s دابه‌شی کردووه‌ په‌ڕگه‌یی %s له‌گه‌ڵ تۆ", "Download" => "داگرتن", -"No preview available for" => "هیچ پێشبینیه‌ك ئاماده‌ نیه بۆ", -"web services under your control" => "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه" +"Upload" => "بارکردن", +"No preview available for" => "هیچ پێشبینیه‌ك ئاماده‌ نیه بۆ" ); diff --git a/apps/files_sharing/l10n/lb.php b/apps/files_sharing/l10n/lb.php index 630866ab4c..a604affee6 100644 --- a/apps/files_sharing/l10n/lb.php +++ b/apps/files_sharing/l10n/lb.php @@ -1,6 +1,11 @@ "Den Passwuert ass incorrect. Probeier ed nach eng keier.", "Password" => "Passwuert", "Submit" => "Fortschécken", +"%s shared the folder %s with you" => "%s huet den Dossier %s mad der gedeelt", +"%s shared the file %s with you" => "%s deelt den Fichier %s mad dir", "Download" => "Download", -"web services under your control" => "Web Servicer ënnert denger Kontroll" +"Upload" => "Eroplueden", +"Cancel upload" => "Upload ofbriechen", +"No preview available for" => "Keeng Preview do fir" ); diff --git a/apps/files_sharing/l10n/lt_LT.php b/apps/files_sharing/l10n/lt_LT.php index 96ab48cd2c..0f9347377c 100644 --- a/apps/files_sharing/l10n/lt_LT.php +++ b/apps/files_sharing/l10n/lt_LT.php @@ -1,6 +1,10 @@ "Slaptažodis", "Submit" => "Išsaugoti", +"%s shared the folder %s with you" => "%s pasidalino su jumis %s aplanku", +"%s shared the file %s with you" => "%s pasidalino su jumis %s failu", "Download" => "Atsisiųsti", -"web services under your control" => "jūsų valdomos web paslaugos" +"Upload" => "Įkelti", +"Cancel upload" => "Atšaukti siuntimą", +"No preview available for" => "Peržiūra nėra galima" ); diff --git a/apps/files_sharing/l10n/lv.php b/apps/files_sharing/l10n/lv.php index 88faeaf9f1..be021b8e7a 100644 --- a/apps/files_sharing/l10n/lv.php +++ b/apps/files_sharing/l10n/lv.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s ar jums dalījās ar mapi %s", "%s shared the file %s with you" => "%s ar jums dalījās ar datni %s", "Download" => "Lejupielādēt", -"No preview available for" => "Nav pieejams priekšskatījums priekš", -"web services under your control" => "tīmekļa servisi tavā varā" +"Upload" => "Augšupielādēt", +"Cancel upload" => "Atcelt augšupielādi", +"No preview available for" => "Nav pieejams priekšskatījums priekš" ); diff --git a/apps/files_sharing/l10n/mk.php b/apps/files_sharing/l10n/mk.php index 16c7ee0eb0..ed04035ea5 100644 --- a/apps/files_sharing/l10n/mk.php +++ b/apps/files_sharing/l10n/mk.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s ја сподели папката %s со Вас", "%s shared the file %s with you" => "%s ја сподели датотеката %s со Вас", "Download" => "Преземи", -"No preview available for" => "Нема достапно преглед за", -"web services under your control" => "веб сервиси под Ваша контрола" +"Upload" => "Подигни", +"Cancel upload" => "Откажи прикачување", +"No preview available for" => "Нема достапно преглед за" ); diff --git a/apps/files_sharing/l10n/ms_MY.php b/apps/files_sharing/l10n/ms_MY.php index 879524afce..0a6a05b778 100644 --- a/apps/files_sharing/l10n/ms_MY.php +++ b/apps/files_sharing/l10n/ms_MY.php @@ -2,5 +2,6 @@ "Password" => "Kata laluan", "Submit" => "Hantar", "Download" => "Muat turun", -"web services under your control" => "Perkhidmatan web di bawah kawalan anda" +"Upload" => "Muat naik", +"Cancel upload" => "Batal muat naik" ); diff --git a/apps/files_sharing/l10n/my_MM.php b/apps/files_sharing/l10n/my_MM.php index dc7ec17e9c..4b37ab8b48 100644 --- a/apps/files_sharing/l10n/my_MM.php +++ b/apps/files_sharing/l10n/my_MM.php @@ -1,6 +1,5 @@ "စကားဝှက်", "Submit" => "ထည့်သွင်းမည်", -"Download" => "ဒေါင်းလုတ်", -"web services under your control" => "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services" +"Download" => "ဒေါင်းလုတ်" ); diff --git a/apps/files_sharing/l10n/nb_NO.php b/apps/files_sharing/l10n/nb_NO.php index 4934c34106..9c736f97d7 100644 --- a/apps/files_sharing/l10n/nb_NO.php +++ b/apps/files_sharing/l10n/nb_NO.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s delte mappen %s med deg", "%s shared the file %s with you" => "%s delte filen %s med deg", "Download" => "Last ned", -"No preview available for" => "Forhåndsvisning ikke tilgjengelig for", -"web services under your control" => "web tjenester du kontrollerer" +"Upload" => "Last opp", +"Cancel upload" => "Avbryt opplasting", +"No preview available for" => "Forhåndsvisning ikke tilgjengelig for" ); diff --git a/apps/files_sharing/l10n/nl.php b/apps/files_sharing/l10n/nl.php index 2cef025439..6c1bf7a53f 100644 --- a/apps/files_sharing/l10n/nl.php +++ b/apps/files_sharing/l10n/nl.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s deelt de map %s met u", "%s shared the file %s with you" => "%s deelt het bestand %s met u", "Download" => "Downloaden", -"No preview available for" => "Geen voorbeeldweergave beschikbaar voor", -"web services under your control" => "Webdiensten in eigen beheer" +"Upload" => "Uploaden", +"Cancel upload" => "Upload afbreken", +"No preview available for" => "Geen voorbeeldweergave beschikbaar voor" ); diff --git a/apps/files_sharing/l10n/nn_NO.php b/apps/files_sharing/l10n/nn_NO.php index aeba545dab..afa3eabe8c 100644 --- a/apps/files_sharing/l10n/nn_NO.php +++ b/apps/files_sharing/l10n/nn_NO.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s delte mappa %s med deg", "%s shared the file %s with you" => "%s delte fila %s med deg", "Download" => "Last ned", -"No preview available for" => "Inga førehandsvising tilgjengeleg for", -"web services under your control" => "Vev tjenester under din kontroll" +"Upload" => "Last opp", +"Cancel upload" => "Avbryt opplasting", +"No preview available for" => "Inga førehandsvising tilgjengeleg for" ); diff --git a/apps/files_sharing/l10n/oc.php b/apps/files_sharing/l10n/oc.php index 07bc26ecdd..4ec48b151a 100644 --- a/apps/files_sharing/l10n/oc.php +++ b/apps/files_sharing/l10n/oc.php @@ -2,5 +2,6 @@ "Password" => "Senhal", "Submit" => "Sosmetre", "Download" => "Avalcarga", -"web services under your control" => "Services web jos ton contraròtle" +"Upload" => "Amontcarga", +"Cancel upload" => " Anulla l'amontcargar" ); diff --git a/apps/files_sharing/l10n/pl.php b/apps/files_sharing/l10n/pl.php index 9db5e87c9b..39039da77b 100644 --- a/apps/files_sharing/l10n/pl.php +++ b/apps/files_sharing/l10n/pl.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s współdzieli folder z tobą %s", "%s shared the file %s with you" => "%s współdzieli z tobą plik %s", "Download" => "Pobierz", -"No preview available for" => "Podgląd nie jest dostępny dla", -"web services under your control" => "Kontrolowane serwisy" +"Upload" => "Wyślij", +"Cancel upload" => "Anuluj wysyłanie", +"No preview available for" => "Podgląd nie jest dostępny dla" ); diff --git a/apps/files_sharing/l10n/pt_BR.php b/apps/files_sharing/l10n/pt_BR.php index ce4c28ddcb..c82989857a 100644 --- a/apps/files_sharing/l10n/pt_BR.php +++ b/apps/files_sharing/l10n/pt_BR.php @@ -1,9 +1,11 @@ "Senha incorreta. Tente novamente.", "Password" => "Senha", "Submit" => "Submeter", "%s shared the folder %s with you" => "%s compartilhou a pasta %s com você", "%s shared the file %s with you" => "%s compartilhou o arquivo %s com você", "Download" => "Baixar", -"No preview available for" => "Nenhuma visualização disponível para", -"web services under your control" => "serviços web sob seu controle" +"Upload" => "Upload", +"Cancel upload" => "Cancelar upload", +"No preview available for" => "Nenhuma visualização disponível para" ); diff --git a/apps/files_sharing/l10n/pt_PT.php b/apps/files_sharing/l10n/pt_PT.php index 43e8f3c4b6..2f41abca1f 100644 --- a/apps/files_sharing/l10n/pt_PT.php +++ b/apps/files_sharing/l10n/pt_PT.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s partilhou a pasta %s consigo", "%s shared the file %s with you" => "%s partilhou o ficheiro %s consigo", "Download" => "Transferir", -"No preview available for" => "Não há pré-visualização para", -"web services under your control" => "serviços web sob o seu controlo" +"Upload" => "Carregar", +"Cancel upload" => "Cancelar envio", +"No preview available for" => "Não há pré-visualização para" ); diff --git a/apps/files_sharing/l10n/ro.php b/apps/files_sharing/l10n/ro.php index eb9977dc58..3197068cdd 100644 --- a/apps/files_sharing/l10n/ro.php +++ b/apps/files_sharing/l10n/ro.php @@ -1,9 +1,11 @@ "Parola este incorectă. Încercaţi din nou.", "Password" => "Parolă", "Submit" => "Trimite", "%s shared the folder %s with you" => "%s a partajat directorul %s cu tine", "%s shared the file %s with you" => "%s a partajat fișierul %s cu tine", "Download" => "Descarcă", -"No preview available for" => "Nici o previzualizare disponibilă pentru ", -"web services under your control" => "servicii web controlate de tine" +"Upload" => "Încărcare", +"Cancel upload" => "Anulează încărcarea", +"No preview available for" => "Nici o previzualizare disponibilă pentru " ); diff --git a/apps/files_sharing/l10n/ru.php b/apps/files_sharing/l10n/ru.php index 7fd116e0aa..77332c183f 100644 --- a/apps/files_sharing/l10n/ru.php +++ b/apps/files_sharing/l10n/ru.php @@ -1,9 +1,11 @@ "Неверный пароль. Попробуйте еще раз.", "Password" => "Пароль", "Submit" => "Отправить", "%s shared the folder %s with you" => "%s открыл доступ к папке %s для Вас", "%s shared the file %s with you" => "%s открыл доступ к файлу %s для Вас", "Download" => "Скачать", -"No preview available for" => "Предпросмотр недоступен для", -"web services under your control" => "веб-сервисы под вашим управлением" +"Upload" => "Загрузка", +"Cancel upload" => "Отмена загрузки", +"No preview available for" => "Предпросмотр недоступен для" ); diff --git a/apps/files_sharing/l10n/si_LK.php b/apps/files_sharing/l10n/si_LK.php index 580f7b1990..27b9d649a0 100644 --- a/apps/files_sharing/l10n/si_LK.php +++ b/apps/files_sharing/l10n/si_LK.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s ඔබව %s ෆෝල්ඩරයට හවුල් කරගත්තේය", "%s shared the file %s with you" => "%s ඔබ සමඟ %s ගොනුව බෙදාහදාගත්තේය", "Download" => "බාන්න", -"No preview available for" => "පූර්වදර්ශනයක් නොමැත", -"web services under your control" => "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්" +"Upload" => "උඩුගත කරන්න", +"Cancel upload" => "උඩුගත කිරීම අත් හරින්න", +"No preview available for" => "පූර්වදර්ශනයක් නොමැත" ); diff --git a/apps/files_sharing/l10n/sk_SK.php b/apps/files_sharing/l10n/sk_SK.php index 14124eeb87..77173b4434 100644 --- a/apps/files_sharing/l10n/sk_SK.php +++ b/apps/files_sharing/l10n/sk_SK.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s zdieľa s vami priečinok %s", "%s shared the file %s with you" => "%s zdieľa s vami súbor %s", "Download" => "Sťahovanie", -"No preview available for" => "Žiaden náhľad k dispozícii pre", -"web services under your control" => "webové služby pod Vašou kontrolou" +"Upload" => "Odoslať", +"Cancel upload" => "Zrušiť odosielanie", +"No preview available for" => "Žiaden náhľad k dispozícii pre" ); diff --git a/apps/files_sharing/l10n/sl.php b/apps/files_sharing/l10n/sl.php index 6bcbb0070b..39d2fca81c 100644 --- a/apps/files_sharing/l10n/sl.php +++ b/apps/files_sharing/l10n/sl.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "Oseba %s je določila mapo %s za souporabo", "%s shared the file %s with you" => "Oseba %s je določila datoteko %s za souporabo", "Download" => "Prejmi", -"No preview available for" => "Predogled ni na voljo za", -"web services under your control" => "spletne storitve pod vašim nadzorom" +"Upload" => "Pošlji", +"Cancel upload" => "Prekliči pošiljanje", +"No preview available for" => "Predogled ni na voljo za" ); diff --git a/apps/files_sharing/l10n/sq.php b/apps/files_sharing/l10n/sq.php index 244ca87c55..1c0e0aa2bd 100644 --- a/apps/files_sharing/l10n/sq.php +++ b/apps/files_sharing/l10n/sq.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s ndau me ju dosjen %s", "%s shared the file %s with you" => "%s ndau me ju skedarin %s", "Download" => "Shkarko", -"No preview available for" => "Shikimi paraprak nuk është i mundur për", -"web services under your control" => "shërbime web nën kontrollin tënd" +"Upload" => "Ngarko", +"Cancel upload" => "Anulo ngarkimin", +"No preview available for" => "Shikimi paraprak nuk është i mundur për" ); diff --git a/apps/files_sharing/l10n/sr.php b/apps/files_sharing/l10n/sr.php index be24c06e46..f893ec0ab4 100644 --- a/apps/files_sharing/l10n/sr.php +++ b/apps/files_sharing/l10n/sr.php @@ -2,5 +2,6 @@ "Password" => "Лозинка", "Submit" => "Пошаљи", "Download" => "Преузми", -"web services under your control" => "веб сервиси под контролом" +"Upload" => "Отпреми", +"Cancel upload" => "Прекини отпремање" ); diff --git a/apps/files_sharing/l10n/sr@latin.php b/apps/files_sharing/l10n/sr@latin.php index cce6bd1f77..c45f711e15 100644 --- a/apps/files_sharing/l10n/sr@latin.php +++ b/apps/files_sharing/l10n/sr@latin.php @@ -1,5 +1,6 @@ "Lozinka", "Submit" => "Pošalji", -"Download" => "Preuzmi" +"Download" => "Preuzmi", +"Upload" => "Pošalji" ); diff --git a/apps/files_sharing/l10n/sv.php b/apps/files_sharing/l10n/sv.php index d1c9afff07..21e4e542d8 100644 --- a/apps/files_sharing/l10n/sv.php +++ b/apps/files_sharing/l10n/sv.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s delade mappen %s med dig", "%s shared the file %s with you" => "%s delade filen %s med dig", "Download" => "Ladda ner", -"No preview available for" => "Ingen förhandsgranskning tillgänglig för", -"web services under your control" => "webbtjänster under din kontroll" +"Upload" => "Ladda upp", +"Cancel upload" => "Avbryt uppladdning", +"No preview available for" => "Ingen förhandsgranskning tillgänglig för" ); diff --git a/apps/files_sharing/l10n/ta_LK.php b/apps/files_sharing/l10n/ta_LK.php index 6cf6f6236b..6e69855be1 100644 --- a/apps/files_sharing/l10n/ta_LK.php +++ b/apps/files_sharing/l10n/ta_LK.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s கோப்புறையானது %s உடன் பகிரப்பட்டது", "%s shared the file %s with you" => "%s கோப்பானது %s உடன் பகிரப்பட்டது", "Download" => "பதிவிறக்குக", -"No preview available for" => "அதற்கு முன்னோக்கு ஒன்றும் இல்லை", -"web services under your control" => "வலைய சேவைகள் உங்களுடைய கட்டுப்பாட்டின் கீழ் உள்ளது" +"Upload" => "பதிவேற்றுக", +"Cancel upload" => "பதிவேற்றலை இரத்து செய்க", +"No preview available for" => "அதற்கு முன்னோக்கு ஒன்றும் இல்லை" ); diff --git a/apps/files_sharing/l10n/th_TH.php b/apps/files_sharing/l10n/th_TH.php index 9d53d65f8a..608c86d586 100644 --- a/apps/files_sharing/l10n/th_TH.php +++ b/apps/files_sharing/l10n/th_TH.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s ได้แชร์โฟลเดอร์ %s ให้กับคุณ", "%s shared the file %s with you" => "%s ได้แชร์ไฟล์ %s ให้กับคุณ", "Download" => "ดาวน์โหลด", -"No preview available for" => "ไม่สามารถดูตัวอย่างได้สำหรับ", -"web services under your control" => "เว็บเซอร์วิสที่คุณควบคุมการใช้งานได้" +"Upload" => "อัพโหลด", +"Cancel upload" => "ยกเลิกการอัพโหลด", +"No preview available for" => "ไม่สามารถดูตัวอย่างได้สำหรับ" ); diff --git a/apps/files_sharing/l10n/tr.php b/apps/files_sharing/l10n/tr.php index 42dfec8cc6..4da9c17c7e 100644 --- a/apps/files_sharing/l10n/tr.php +++ b/apps/files_sharing/l10n/tr.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s sizinle paylaşılan %s klasör", "%s shared the file %s with you" => "%s sizinle paylaşılan %s klasör", "Download" => "İndir", -"No preview available for" => "Kullanılabilir önizleme yok", -"web services under your control" => "Bilgileriniz güvenli ve şifreli" +"Upload" => "Yükle", +"Cancel upload" => "Yüklemeyi iptal et", +"No preview available for" => "Kullanılabilir önizleme yok" ); diff --git a/apps/files_sharing/l10n/ug.php b/apps/files_sharing/l10n/ug.php index 348acc4a89..9f9c7beb41 100644 --- a/apps/files_sharing/l10n/ug.php +++ b/apps/files_sharing/l10n/ug.php @@ -1,5 +1,7 @@ "ئىم", "Submit" => "تاپشۇر", -"Download" => "چۈشۈر" +"Download" => "چۈشۈر", +"Upload" => "يۈكلە", +"Cancel upload" => "يۈكلەشتىن ۋاز كەچ" ); diff --git a/apps/files_sharing/l10n/uk.php b/apps/files_sharing/l10n/uk.php index 8e1fa4bc98..8ef7f1bd8a 100644 --- a/apps/files_sharing/l10n/uk.php +++ b/apps/files_sharing/l10n/uk.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s опублікував каталог %s для Вас", "%s shared the file %s with you" => "%s опублікував файл %s для Вас", "Download" => "Завантажити", -"No preview available for" => "Попередній перегляд недоступний для", -"web services under your control" => "підконтрольні Вам веб-сервіси" +"Upload" => "Вивантажити", +"Cancel upload" => "Перервати завантаження", +"No preview available for" => "Попередній перегляд недоступний для" ); diff --git a/apps/files_sharing/l10n/ur_PK.php b/apps/files_sharing/l10n/ur_PK.php index f68b714350..745f2f930d 100644 --- a/apps/files_sharing/l10n/ur_PK.php +++ b/apps/files_sharing/l10n/ur_PK.php @@ -1,4 +1,3 @@ "پاسورڈ", -"web services under your control" => "آپ کے اختیار میں ویب سروسیز" +"Password" => "پاسورڈ" ); diff --git a/apps/files_sharing/l10n/vi.php b/apps/files_sharing/l10n/vi.php index afeec5c648..d75fb1dc53 100644 --- a/apps/files_sharing/l10n/vi.php +++ b/apps/files_sharing/l10n/vi.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s đã chia sẻ thư mục %s với bạn", "%s shared the file %s with you" => "%s đã chia sẻ tập tin %s với bạn", "Download" => "Tải về", -"No preview available for" => "Không có xem trước cho", -"web services under your control" => "dịch vụ web dưới sự kiểm soát của bạn" +"Upload" => "Tải lên", +"Cancel upload" => "Hủy upload", +"No preview available for" => "Không có xem trước cho" ); diff --git a/apps/files_sharing/l10n/zh_CN.GB2312.php b/apps/files_sharing/l10n/zh_CN.GB2312.php index 117ec8f406..2dd79ec38d 100644 --- a/apps/files_sharing/l10n/zh_CN.GB2312.php +++ b/apps/files_sharing/l10n/zh_CN.GB2312.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s 与您分享了文件夹 %s", "%s shared the file %s with you" => "%s 与您分享了文件 %s", "Download" => "下载", -"No preview available for" => "没有预览可用于", -"web services under your control" => "您控制的网络服务" +"Upload" => "上传", +"Cancel upload" => "取消上传", +"No preview available for" => "没有预览可用于" ); diff --git a/apps/files_sharing/l10n/zh_CN.php b/apps/files_sharing/l10n/zh_CN.php index 64e7af3e0c..c7fa08b81f 100644 --- a/apps/files_sharing/l10n/zh_CN.php +++ b/apps/files_sharing/l10n/zh_CN.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s与您共享了%s文件夹", "%s shared the file %s with you" => "%s与您共享了%s文件", "Download" => "下载", -"No preview available for" => "没有预览", -"web services under your control" => "您控制的web服务" +"Upload" => "上传", +"Cancel upload" => "取消上传", +"No preview available for" => "没有预览" ); diff --git a/apps/files_sharing/l10n/zh_HK.php b/apps/files_sharing/l10n/zh_HK.php index 7ef0f19ca4..8f9b7900c2 100644 --- a/apps/files_sharing/l10n/zh_HK.php +++ b/apps/files_sharing/l10n/zh_HK.php @@ -1,4 +1,5 @@ "密碼", -"Download" => "下載" +"Download" => "下載", +"Upload" => "上傳" ); diff --git a/apps/files_sharing/l10n/zh_TW.php b/apps/files_sharing/l10n/zh_TW.php index 14e4466ecb..b172879469 100644 --- a/apps/files_sharing/l10n/zh_TW.php +++ b/apps/files_sharing/l10n/zh_TW.php @@ -4,6 +4,7 @@ "%s shared the folder %s with you" => "%s 和您分享了資料夾 %s ", "%s shared the file %s with you" => "%s 和您分享了檔案 %s", "Download" => "下載", -"No preview available for" => "無法預覽", -"web services under your control" => "由您控制的網路服務" +"Upload" => "上傳", +"Cancel upload" => "取消上傳", +"No preview available for" => "無法預覽" ); diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index 98d2a84fb6..9462844a82 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -27,23 +27,9 @@ if (isset($_GET['t'])) { $type = $linkItem['item_type']; $fileSource = $linkItem['file_source']; $shareOwner = $linkItem['uid_owner']; - $fileOwner = null; $path = null; - if (isset($linkItem['parent'])) { - $parent = $linkItem['parent']; - while (isset($parent)) { - $query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1); - $item = $query->execute(array($parent))->fetchRow(); - if (isset($item['parent'])) { - $parent = $item['parent']; - } else { - $fileOwner = $item['uid_owner']; - break; - } - } - } else { - $fileOwner = $shareOwner; - } + $rootLinkItem = OCP\Share::resolveReShare($linkItem); + $fileOwner = $rootLinkItem['uid_owner']; if (isset($fileOwner)) { OC_Util::tearDownFS(); OC_Util::setupFS($fileOwner); @@ -79,7 +65,7 @@ if (isset($path)) { $linkItem['share_with']))) { $tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest'); $tmpl->assign('URL', $url); - $tmpl->assign('error', true); + $tmpl->assign('wrongpw', true); $tmpl->printPage(); exit(); } else { @@ -132,15 +118,32 @@ if (isset($path)) { } exit(); } else { + OCP\Util::addScript('files', 'file-upload'); OCP\Util::addStyle('files_sharing', 'public'); OCP\Util::addScript('files_sharing', 'public'); OCP\Util::addScript('files', 'fileactions'); + OCP\Util::addScript('files', 'jquery.iframe-transport'); + OCP\Util::addScript('files', 'jquery.fileupload'); + $maxUploadFilesize=OCP\Util::maxUploadFilesize($path); $tmpl = new OCP\Template('files_sharing', 'public', 'base'); $tmpl->assign('uidOwner', $shareOwner); $tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner)); $tmpl->assign('filename', $file); + $tmpl->assign('directory_path', $linkItem['file_target']); $tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path)); $tmpl->assign('fileTarget', basename($linkItem['file_target'])); + $tmpl->assign('dirToken', $linkItem['token']); + $allowPublicUploadEnabled = (($linkItem['permissions'] & OCP\PERMISSION_CREATE) ? true : false ); + if (\OCP\App::isEnabled('files_encryption')) { + $allowPublicUploadEnabled = false; + } + if ($linkItem['item_type'] !== 'folder') { + $allowPublicUploadEnabled = false; + } + $tmpl->assign('allowPublicUploadEnabled', $allowPublicUploadEnabled); + $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); + $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); + $urlLinkIdentifiers= (isset($token)?'&t='.$token:'') .(isset($_GET['dir'])?'&dir='.$_GET['dir']:'') .(isset($_GET['file'])?'&file='.$_GET['file']:''); @@ -191,15 +194,17 @@ if (isset($path)) { $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', ''); $breadcrumbNav->assign('breadcrumb', $breadcrumb); $breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&path='); + $maxUploadFilesize=OCP\Util::maxUploadFilesize($path); $folder = new OCP\Template('files', 'index', ''); $folder->assign('fileList', $list->fetchPage()); $folder->assign('breadcrumb', $breadcrumbNav->fetchPage()); $folder->assign('dir', $getPath); $folder->assign('isCreatable', false); - $folder->assign('permissions', 0); + $folder->assign('permissions', OCP\PERMISSION_READ); + $folder->assign('isPublic',true); $folder->assign('files', $files); - $folder->assign('uploadMaxFilesize', 0); - $folder->assign('uploadMaxHumanFilesize', 0); + $folder->assign('uploadMaxFilesize', $maxUploadFilesize); + $folder->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); $folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true))); $folder->assign('usedSpacePercent', 0); $tmpl->assign('folder', $folder->fetchPage()); diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php index 7a67b6e550..fa03f41913 100644 --- a/apps/files_sharing/templates/authenticate.php +++ b/apps/files_sharing/templates/authenticate.php @@ -1,5 +1,8 @@
+ +
t('The password is wrong. Try again.')); ?>
+

diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index 88a4cc242b..e8bf80b872 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -1,50 +1,100 @@ +

+ +
+ + +
+
+
+ + + + +
+ +
+ +
+ +
+ + +
-
-
- - - - -
- -
- -
- -
- - - - -
-

ownCloud – -t('web services under your control')); ?>

+
+

+ getLongFooter()); ?> +

+
diff --git a/apps/files_trashbin/index.php b/apps/files_trashbin/index.php index a32b7414ac..6f1c364737 100644 --- a/apps/files_trashbin/index.php +++ b/apps/files_trashbin/index.php @@ -101,12 +101,15 @@ $breadcrumbNav->assign('home', OCP\Util::linkTo('files', 'index.php')); $list = new OCP\Template('files_trashbin', 'part.list', ''); $list->assign('files', $files); -$list->assign('baseURL', OCP\Util::linkTo('files_trashbin', 'index.php'). '?dir='.$dir); -$list->assign('downloadURL', OCP\Util::linkTo('files_trashbin', 'download.php') . '?file='.$dir); + +$encodedDir = \OCP\Util::encodePath($dir); +$list->assign('baseURL', OCP\Util::linkTo('files_trashbin', 'index.php'). '?dir='.$encodedDir); +$list->assign('downloadURL', OCP\Util::linkTo('files_trashbin', 'download.php') . '?file='.$encodedDir); $list->assign('disableSharing', true); $list->assign('dirlisting', $dirlisting); -$tmpl->assign('dirlisting', $dirlisting); $list->assign('disableDownloadActions', true); + +$tmpl->assign('dirlisting', $dirlisting); $tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage()); $tmpl->assign('fileList', $list->fetchPage()); $tmpl->assign('files', $files); diff --git a/apps/files_trashbin/js/trash.js b/apps/files_trashbin/js/trash.js index 691642811b..87dfea491e 100644 --- a/apps/files_trashbin/js/trash.js +++ b/apps/files_trashbin/js/trash.js @@ -2,9 +2,9 @@ $(document).ready(function() { if (typeof FileActions !== 'undefined') { - FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/undelete.png'), function(filename) { + FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename) { var tr=$('tr').filterAttr('data-file', filename); - var spinner = ''; + var spinner = ''; var undeleteAction = $('tr').filterAttr('data-file',filename).children("td.date"); var files = tr.attr('data-file'); undeleteAction[0].innerHTML = undeleteAction[0].innerHTML+spinner; @@ -94,7 +94,7 @@ $(document).ready(function() { $('.undelete').click('click',function(event) { event.preventDefault(); - var spinner = ''; + var spinner = ''; var files=getSelectedFiles('file'); var fileslist = JSON.stringify(files); var dirlisting=getSelectedFiles('dirlisting')[0]; diff --git a/apps/files_trashbin/l10n/bg_BG.php b/apps/files_trashbin/l10n/bg_BG.php index 288518e1a4..1e0953b013 100644 --- a/apps/files_trashbin/l10n/bg_BG.php +++ b/apps/files_trashbin/l10n/bg_BG.php @@ -1,5 +1,5 @@ "Невъзможно изтриване на %s завинаги", +"Couldn't delete %s permanently" => "Невъзможно перманентното изтриване на %s", "Couldn't restore %s" => "Невъзможно възтановяване на %s", "perform restore operation" => "извършване на действие по възстановяване", "Error" => "Грешка", diff --git a/apps/files_trashbin/l10n/eo.php b/apps/files_trashbin/l10n/eo.php index 3288c4fcdc..161e9c3e88 100644 --- a/apps/files_trashbin/l10n/eo.php +++ b/apps/files_trashbin/l10n/eo.php @@ -1,5 +1,6 @@ "Eraro", +"Delete permanently" => "Forigi por ĉiam", "Name" => "Nomo", "1 folder" => "1 dosierujo", "{count} folders" => "{count} dosierujoj", diff --git a/apps/files_trashbin/l10n/es.php b/apps/files_trashbin/l10n/es.php index c267db7358..b2d5a2aed2 100644 --- a/apps/files_trashbin/l10n/es.php +++ b/apps/files_trashbin/l10n/es.php @@ -1,9 +1,9 @@ "No se puede eliminar %s permanentemente", "Couldn't restore %s" => "No se puede restaurar %s", -"perform restore operation" => "Restaurar", +"perform restore operation" => "restaurar", "Error" => "Error", -"delete file permanently" => "Eliminar archivo permanentemente", +"delete file permanently" => "eliminar archivo permanentemente", "Delete permanently" => "Eliminar permanentemente", "Name" => "Nombre", "Deleted" => "Eliminado", diff --git a/apps/files_trashbin/l10n/he.php b/apps/files_trashbin/l10n/he.php index e31fdb952e..853d4e1925 100644 --- a/apps/files_trashbin/l10n/he.php +++ b/apps/files_trashbin/l10n/he.php @@ -1,17 +1,18 @@ "בלתי אפשרי למחוק את %s לצמיתות", -"Couldn't restore %s" => "בלתי אפשרי לשחזר את %s", -"perform restore operation" => "בצע פעולת שחזור", +"Couldn't delete %s permanently" => "לא ניתן למחוק את %s לצמיתות", +"Couldn't restore %s" => "לא ניתן לשחזר את %s", +"perform restore operation" => "ביצוע פעולת שחזור", "Error" => "שגיאה", -"delete file permanently" => "מחק קובץ לצמיתות", -"Delete permanently" => "מחק לצמיתות", +"delete file permanently" => "מחיקת קובץ לצמיתות", +"Delete permanently" => "מחיקה לצמיתות", "Name" => "שם", "Deleted" => "נמחק", "1 folder" => "תיקייה אחת", "{count} folders" => "{count} תיקיות", "1 file" => "קובץ אחד", "{count} files" => "{count} קבצים", -"Nothing in here. Your trash bin is empty!" => "שום דבר כאן. סל המחזור שלך ריק!", -"Restore" => "שחזר", -"Delete" => "מחיקה" +"Nothing in here. Your trash bin is empty!" => "אין כאן שום דבר. סל המיחזור שלך ריק!", +"Restore" => "שחזור", +"Delete" => "מחיקה", +"Deleted Files" => "קבצים שנמחקו" ); diff --git a/apps/files_trashbin/l10n/lt_LT.php b/apps/files_trashbin/l10n/lt_LT.php index 011de161e4..7df63bd7f2 100644 --- a/apps/files_trashbin/l10n/lt_LT.php +++ b/apps/files_trashbin/l10n/lt_LT.php @@ -1,9 +1,18 @@ "Nepavyko negrįžtamai ištrinti %s", +"Couldn't restore %s" => "Nepavyko atkurti %s", +"perform restore operation" => "atkurti", "Error" => "Klaida", +"delete file permanently" => "failą ištrinti negrįžtamai", +"Delete permanently" => "Ištrinti negrįžtamai", "Name" => "Pavadinimas", +"Deleted" => "Ištrinti", "1 folder" => "1 aplankalas", "{count} folders" => "{count} aplankalai", "1 file" => "1 failas", "{count} files" => "{count} failai", -"Delete" => "Ištrinti" +"Nothing in here. Your trash bin is empty!" => "Nieko nėra. Jūsų šiukšliadėžė tuščia!", +"Restore" => "Atstatyti", +"Delete" => "Ištrinti", +"Deleted Files" => "Ištrinti failai" ); diff --git a/apps/files_trashbin/lib/trash.php b/apps/files_trashbin/lib/trash.php index 2d1830a38f..b9d900dfab 100644 --- a/apps/files_trashbin/lib/trash.php +++ b/apps/files_trashbin/lib/trash.php @@ -24,17 +24,18 @@ namespace OCA\Files_Trashbin; class Trashbin { // how long do we keep files in the trash bin if no other value is defined in the config file (unit: days) - const DEFAULT_RETENTION_OBLIGATION=180; + + const DEFAULT_RETENTION_OBLIGATION = 180; // unit: percentage; 50% of available disk space/quota - const DEFAULTMAXSIZE=50; + const DEFAULTMAXSIZE = 50; public static function getUidAndFilename($filename) { $uid = \OC\Files\Filesystem::getOwner($filename); \OC\Files\Filesystem::initMountPoints($uid); - if ( $uid != \OCP\User::getUser() ) { + if ($uid != \OCP\User::getUser()) { $info = \OC\Files\Filesystem::getFileInfo($filename); - $ownerView = new \OC\Files\View('/'.$uid.'/files'); + $ownerView = new \OC\Files\View('/' . $uid . '/files'); $filename = $ownerView->getPath($info['fileid']); } return array($uid, $filename); @@ -47,115 +48,119 @@ class Trashbin { */ public static function move2trash($file_path) { $user = \OCP\User::getUser(); - $view = new \OC\Files\View('/'. $user); + $view = new \OC\Files\View('/' . $user); if (!$view->is_dir('files_trashbin')) { $view->mkdir('files_trashbin'); - $view->mkdir('files_trashbin/files'); - $view->mkdir('files_trashbin/versions'); - $view->mkdir('files_trashbin/keyfiles'); - $view->mkdir('files_trashbin/share-keys'); } - + if (!$view->is_dir('files_trashbin/files')) { + $view->mkdir('files_trashbin/files'); + } + if (!$view->is_dir('files_trashbin/versions')) { + $view->mkdir('files_trashbin/versions'); + } + if (!$view->is_dir('files_trashbin/keyfiles')) { + $view->mkdir('files_trashbin/keyfiles'); + } + if (!$view->is_dir('files_trashbin/share-keys')) { + $view->mkdir('files_trashbin/share-keys'); + } $path_parts = pathinfo($file_path); $filename = $path_parts['basename']; $location = $path_parts['dirname']; $timestamp = time(); - $mime = $view->getMimeType('files'.$file_path); + $mime = $view->getMimeType('files' . $file_path); - if ( $view->is_dir('files'.$file_path) ) { + if ($view->is_dir('files' . $file_path)) { $type = 'dir'; } else { $type = 'file'; } - + $trashbinSize = self::getTrashbinSize($user); - if ( $trashbinSize === false || $trashbinSize < 0 ) { - $trashbinSize = self::calculateSize(new \OC\Files\View('/'. $user.'/files_trashbin')); + if ($trashbinSize === false || $trashbinSize < 0) { + $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin')); } // disable proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $sizeOfAddedFiles = self::copy_recursive($file_path, 'files_trashbin/files/'.$filename.'.d'.$timestamp, $view); + $sizeOfAddedFiles = self::copy_recursive($file_path, 'files_trashbin/files/' . $filename . '.d' . $timestamp, $view); \OC_FileProxy::$enabled = $proxyStatus; - if ( $view->file_exists('files_trashbin/files/'.$filename.'.d'.$timestamp) ) { + if ($view->file_exists('files_trashbin/files/' . $filename . '.d' . $timestamp)) { $trashbinSize += $sizeOfAddedFiles; $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`type`,`mime`,`user`) VALUES (?,?,?,?,?,?)"); $result = $query->execute(array($filename, $timestamp, $location, $type, $mime, $user)); - if ( !$result ) { // if file couldn't be added to the database than also don't store it in the trash bin. - $view->deleteAll('files_trashbin/files/'.$filename.'.d'.$timestamp); + if (!$result) { // if file couldn't be added to the database than also don't store it in the trash bin. + $view->deleteAll('files_trashbin/files/' . $filename . '.d' . $timestamp); \OC_Log::write('files_trashbin', 'trash bin database couldn\'t be updated', \OC_log::ERROR); return; } - \OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_moveToTrash', - array('filePath' => \OC\Files\Filesystem::normalizePath($file_path), - 'trashPath' => \OC\Files\Filesystem::normalizePath($filename.'.d'.$timestamp))); + \OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_moveToTrash', array('filePath' => \OC\Files\Filesystem::normalizePath($file_path), + 'trashPath' => \OC\Files\Filesystem::normalizePath($filename . '.d' . $timestamp))); $trashbinSize += self::retainVersions($view, $file_path, $filename, $timestamp); $trashbinSize += self::retainEncryptionKeys($view, $file_path, $filename, $timestamp); - } else { - \OC_Log::write('files_trashbin', 'Couldn\'t move '.$file_path.' to the trash bin', \OC_log::ERROR); + \OC_Log::write('files_trashbin', 'Couldn\'t move ' . $file_path . ' to the trash bin', \OC_log::ERROR); } $trashbinSize -= self::expire($trashbinSize); - - self::setTrashbinSize($user, $trashbinSize); + self::setTrashbinSize($user, $trashbinSize); } - /** - * Move file versions to trash so that they can be restored later - * - * @param \OC\Files\View $view - * @param $file_path path to original file - * @param $filename of deleted file - * @param $timestamp when the file was deleted - * - * @return size of stored versions - */ + /** + * Move file versions to trash so that they can be restored later + * + * @param \OC\Files\View $view + * @param $file_path path to original file + * @param $filename of deleted file + * @param $timestamp when the file was deleted + * + * @return size of stored versions + */ private static function retainVersions($view, $file_path, $filename, $timestamp) { $size = 0; - if (\OCP\App::isEnabled('files_versions')) { + if (\OCP\App::isEnabled('files_versions')) { - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // disable proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - $user = \OCP\User::getUser(); + $user = \OCP\User::getUser(); $rootView = new \OC\Files\View('/'); list($owner, $ownerPath) = self::getUidAndFilename($file_path); - if ($rootView->is_dir($owner.'/files_versions/' . $ownerPath)) { - $size += self::calculateSize(new \OC\Files\View('/' . $owner . '/files_versions/' . $ownerPath)); - $rootView->rename($owner.'/files_versions/' . $ownerPath, $user.'/files_trashbin/versions/' . $filename . '.d' . $timestamp); + if ($rootView->is_dir($owner . '/files_versions/' . $ownerPath)) { + $size += self::calculateSize(new \OC\Files\View('/' . $owner . '/files_versions/' . $ownerPath)); + $rootView->rename($owner . '/files_versions/' . $ownerPath, $user . '/files_trashbin/versions/' . $filename . '.d' . $timestamp); } else if ($versions = \OCA\Files_Versions\Storage::getVersions($owner, $ownerPath)) { - foreach ($versions as $v) { - $size += $rootView->filesize($owner.'/files_versions' . $v['path'] . '.v' . $v['version']); - $rootView->rename($owner.'/files_versions' . $v['path'] . '.v' . $v['version'], $user.'/files_trashbin/versions/' . $filename . '.v' . $v['version'] . '.d' . $timestamp); + foreach ($versions as $v) { + $size += $rootView->filesize($owner . '/files_versions' . $v['path'] . '.v' . $v['version']); + $rootView->rename($owner . '/files_versions' . $v['path'] . '.v' . $v['version'], $user . '/files_trashbin/versions/' . $filename . '.v' . $v['version'] . '.d' . $timestamp); } } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + // enable proxy + \OC_FileProxy::$enabled = $proxyStatus; } return $size; } - /** - * Move encryption keys to trash so that they can be restored later - * - * @param \OC\Files\View $view - * @param $file_path path to original file - * @param $filename of deleted file - * @param $timestamp when the file was deleted - * - * @return size of encryption keys - */ + /** + * Move encryption keys to trash so that they can be restored later + * + * @param \OC\Files\View $view + * @param $file_path path to original file + * @param $filename of deleted file + * @param $timestamp when the file was deleted + * + * @return size of encryption keys + */ private static function retainEncryptionKeys($view, $file_path, $filename, $timestamp) { $size = 0; @@ -166,66 +171,72 @@ class Trashbin { list($owner, $ownerPath) = self::getUidAndFilename($file_path); + $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), $user); - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // disable proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - // retain key files - $keyfile = \OC\Files\Filesystem::normalizePath($owner.'/files_encryption/keyfiles/' . $ownerPath); + if ($util->isSystemWideMountPoint($ownerPath)) { + $baseDir = '/files_encryption/'; + } else { + $baseDir = $owner . '/files_encryption/'; + } - if ($rootView->is_dir($keyfile) || $rootView->file_exists($keyfile . '.key')) { - // move keyfiles - if ($rootView->is_dir($keyfile)) { - $size += self::calculateSize(new \OC\Files\View($keyfile)); - $rootView->rename($keyfile, $user.'/files_trashbin/keyfiles/' . $filename . '.d' . $timestamp); + $keyfile = \OC\Files\Filesystem::normalizePath($baseDir . '/keyfiles/' . $ownerPath); + + if ($rootView->is_dir($keyfile) || $rootView->file_exists($keyfile . '.key')) { + // move keyfiles + if ($rootView->is_dir($keyfile)) { + $size += self::calculateSize(new \OC\Files\View($keyfile)); + $rootView->rename($keyfile, $user . '/files_trashbin/keyfiles/' . $filename . '.d' . $timestamp); } else { $size += $rootView->filesize($keyfile . '.key'); - $rootView->rename($keyfile . '.key', $user.'/files_trashbin/keyfiles/' . $filename . '.key.d' . $timestamp); + $rootView->rename($keyfile . '.key', $user . '/files_trashbin/keyfiles/' . $filename . '.key.d' . $timestamp); } } - // retain share keys - $sharekeys = \OC\Files\Filesystem::normalizePath($owner.'/files_encryption/share-keys/' . $ownerPath); + // retain share keys + $sharekeys = \OC\Files\Filesystem::normalizePath($baseDir . '/share-keys/' . $ownerPath); if ($rootView->is_dir($sharekeys)) { $size += self::calculateSize(new \OC\Files\View($sharekeys)); - $rootView->rename($sharekeys, $user.'/files_trashbin/share-keys/' . $filename . '.d' . $timestamp); + $rootView->rename($sharekeys, $user . '/files_trashbin/share-keys/' . $filename . '.d' . $timestamp); } else { - // get local path to share-keys - $localShareKeysPath = $rootView->getLocalFile($sharekeys); + // get local path to share-keys + $localShareKeysPath = $rootView->getLocalFile($sharekeys); + $escapedLocalShareKeysPath = preg_replace('/(\*|\?|\[)/', '[$1]', $localShareKeysPath); - // handle share-keys - $matches = glob(preg_quote($localShareKeysPath).'*.shareKey'); - foreach ($matches as $src) { - // get source file parts - $pathinfo = pathinfo($src); + // handle share-keys + $matches = glob($escapedLocalShareKeysPath . '*.shareKey'); + foreach ($matches as $src) { + // get source file parts + $pathinfo = pathinfo($src); - // we only want to keep the owners key so we can access the private key - $ownerShareKey = $filename . '.' . $user. '.shareKey'; + // we only want to keep the owners key so we can access the private key + $ownerShareKey = $filename . '.' . $user . '.shareKey'; - // if we found the share-key for the owner, we need to move it to files_trashbin - if($pathinfo['basename'] == $ownerShareKey) { + // if we found the share-key for the owner, we need to move it to files_trashbin + if ($pathinfo['basename'] == $ownerShareKey) { - // calculate size - $size += $rootView->filesize($sharekeys. '.' . $user. '.shareKey'); + // calculate size + $size += $rootView->filesize($sharekeys . '.' . $user . '.shareKey'); - // move file - $rootView->rename($sharekeys. '.' . $user. '.shareKey', $user.'/files_trashbin/share-keys/' . $ownerShareKey . '.d' . $timestamp); - } else { + // move file + $rootView->rename($sharekeys . '.' . $user . '.shareKey', $user . '/files_trashbin/share-keys/' . $ownerShareKey . '.d' . $timestamp); + } else { - // calculate size - $size += filesize($src); - - // don't keep other share-keys - unlink($src); - } - } + // calculate size + $size += filesize($src); - } + // don't keep other share-keys + unlink($src); + } + } + } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + // enable proxy + \OC_FileProxy::$enabled = $proxyStatus; } return $size; } @@ -235,95 +246,94 @@ class Trashbin { * @param $file path to the deleted file * @param $filename name of the file * @param $timestamp time when the file was deleted - * - * @return bool - */ + * + * @return bool + */ public static function restore($file, $filename, $timestamp) { - $user = \OCP\User::getUser(); - $view = new \OC\Files\View('/'.$user); - + $user = \OCP\User::getUser(); + $view = new \OC\Files\View('/' . $user); + $trashbinSize = self::getTrashbinSize($user); - if ( $trashbinSize === false || $trashbinSize < 0 ) { - $trashbinSize = self::calculateSize(new \OC\Files\View('/'. $user.'/files_trashbin')); + if ($trashbinSize === false || $trashbinSize < 0) { + $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin')); } - if ( $timestamp ) { + if ($timestamp) { $query = \OC_DB::prepare('SELECT `location`,`type` FROM `*PREFIX*files_trash`' - .' WHERE `user`=? AND `id`=? AND `timestamp`=?'); - $result = $query->execute(array($user,$filename,$timestamp))->fetchAll(); - if ( count($result) != 1 ) { + . ' WHERE `user`=? AND `id`=? AND `timestamp`=?'); + $result = $query->execute(array($user, $filename, $timestamp))->fetchAll(); + if (count($result) != 1) { \OC_Log::write('files_trashbin', 'trash bin database inconsistent!', \OC_Log::ERROR); return false; } // if location no longer exists, restore file in the root directory $location = $result[0]['location']; - if ( $result[0]['location'] != '/' && - (!$view->is_dir('files'.$result[0]['location']) || - !$view->isUpdatable('files'.$result[0]['location'])) ) { + if ($result[0]['location'] != '/' && + (!$view->is_dir('files' . $result[0]['location']) || + !$view->isUpdatable('files' . $result[0]['location']))) { $location = ''; } } else { $path_parts = pathinfo($file); $result[] = array( - 'location' => $path_parts['dirname'], - 'type' => $view->is_dir('/files_trashbin/files/'.$file) ? 'dir' : 'files', - ); + 'location' => $path_parts['dirname'], + 'type' => $view->is_dir('/files_trashbin/files/' . $file) ? 'dir' : 'files', + ); $location = ''; } - - $source = \OC\Files\Filesystem::normalizePath('files_trashbin/files/'.$file); - $target = \OC\Files\Filesystem::normalizePath('files/'.$location.'/'.$filename); + + $source = \OC\Files\Filesystem::normalizePath('files_trashbin/files/' . $file); + $target = \OC\Files\Filesystem::normalizePath('files/' . $location . '/' . $filename); // we need a extension in case a file/dir with the same name already exists $ext = self::getUniqueExtension($location, $filename, $view); $mtime = $view->filemtime($source); - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // disable proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - // restore file - $restoreResult = $view->rename($source, $target.$ext); + // restore file + $restoreResult = $view->rename($source, $target . $ext); - // handle the restore result - if( $restoreResult ) { + // handle the restore result + if ($restoreResult) { $fakeRoot = $view->getRoot(); - $view->chroot('/'.$user.'/files'); - $view->touch('/'.$location.'/'.$filename.$ext, $mtime); + $view->chroot('/' . $user . '/files'); + $view->touch('/' . $location . '/' . $filename . $ext, $mtime); $view->chroot($fakeRoot); - \OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', - array('filePath' => \OC\Files\Filesystem::normalizePath('/'.$location.'/'.$filename.$ext), - 'trashPath' => \OC\Files\Filesystem::normalizePath($file))); - if ($view->is_dir($target.$ext)) { - $trashbinSize -= self::calculateSize(new \OC\Files\View('/'.$user.'/'.$target.$ext)); + \OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', array('filePath' => \OC\Files\Filesystem::normalizePath('/' . $location . '/' . $filename . $ext), + 'trashPath' => \OC\Files\Filesystem::normalizePath($file))); + if ($view->is_dir($target . $ext)) { + $trashbinSize -= self::calculateSize(new \OC\Files\View('/' . $user . '/' . $target . $ext)); } else { - $trashbinSize -= $view->filesize($target.$ext); + $trashbinSize -= $view->filesize($target . $ext); } - $trashbinSize -= self::restoreVersions($view, $file, $filename, $ext, $location, $timestamp); + $trashbinSize -= self::restoreVersions($view, $file, $filename, $ext, $location, $timestamp); $trashbinSize -= self::restoreEncryptionKeys($view, $file, $filename, $ext, $location, $timestamp); - if ( $timestamp ) { + if ($timestamp) { $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?'); - $query->execute(array($user,$filename,$timestamp)); + $query->execute(array($user, $filename, $timestamp)); } self::setTrashbinSize($user, $trashbinSize); - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + // enable proxy + \OC_FileProxy::$enabled = $proxyStatus; return true; } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + // enable proxy + \OC_FileProxy::$enabled = $proxyStatus; return false; } - /** + /** * @brief restore versions from trash bin * * @param \OC\Files\View $view file view @@ -332,20 +342,20 @@ class Trashbin { * @param $ext file extension in case a file with the same $filename already exists * @param $location location if file * @param $timestamp deleteion time - * + * * @return size of restored versions */ private static function restoreVersions($view, $file, $filename, $ext, $location, $timestamp) { $size = 0; if (\OCP\App::isEnabled('files_versions')) { - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + // disable proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - $user = \OCP\User::getUser(); + $user = \OCP\User::getUser(); $rootView = new \OC\Files\View('/'); - $target = \OC\Files\Filesystem::normalizePath('/'.$location.'/'.$filename.$ext); + $target = \OC\Files\Filesystem::normalizePath('/' . $location . '/' . $filename . $ext); list($owner, $ownerPath) = self::getUidAndFilename($target); @@ -355,190 +365,196 @@ class Trashbin { $versionedFile = $file; } - if ($view->is_dir('/files_trashbin/versions/'.$file)) { + if ($view->is_dir('/files_trashbin/versions/' . $file)) { $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . 'files_trashbin/versions/' . $file)); - $rootView->rename(\OC\Files\Filesystem::normalizePath($user.'/files_trashbin/versions/' . $file), \OC\Files\Filesystem::normalizePath($owner.'/files_versions/' . $ownerPath)); + $rootView->rename(\OC\Files\Filesystem::normalizePath($user . '/files_trashbin/versions/' . $file), \OC\Files\Filesystem::normalizePath($owner . '/files_versions/' . $ownerPath)); } else if ($versions = self::getVersionsFromTrash($versionedFile, $timestamp)) { - foreach ($versions as $v) { - if ($timestamp) { - $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp); - $rootView->rename($user.'/files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp, $owner.'/files_versions/' . $ownerPath . '.v' . $v); + foreach ($versions as $v) { + if ($timestamp) { + $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp); + $rootView->rename($user . '/files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp, $owner . '/files_versions/' . $ownerPath . '.v' . $v); } else { - $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v); - $rootView->rename($user.'/files_trashbin/versions/' . $versionedFile . '.v' . $v, $owner.'/files_versions/' . $ownerPath . '.v' . $v); + $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v); + $rootView->rename($user . '/files_trashbin/versions/' . $versionedFile . '.v' . $v, $owner . '/files_versions/' . $ownerPath . '.v' . $v); } } } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + // enable proxy + \OC_FileProxy::$enabled = $proxyStatus; } return $size; } - - /** - * @brief restore encryption keys from trash bin - * - * @param \OC\Files\View $view - * @param $file complete path to file - * @param $filename name of file - * @param $ext file extension in case a file with the same $filename already exists - * @param $location location of file - * @param $timestamp deleteion time - * - * @return size of restored encrypted file - */ - private static function restoreEncryptionKeys($view, $file, $filename, $ext, $location, $timestamp) { + /** + * @brief restore encryption keys from trash bin + * + * @param \OC\Files\View $view + * @param $file complete path to file + * @param $filename name of file + * @param $ext file extension in case a file with the same $filename already exists + * @param $location location of file + * @param $timestamp deleteion time + * + * @return size of restored encrypted file + */ + private static function restoreEncryptionKeys($view, $file, $filename, $ext, $location, $timestamp) { // Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!) $size = 0; if (\OCP\App::isEnabled('files_encryption')) { $user = \OCP\User::getUser(); $rootView = new \OC\Files\View('/'); - $target = \OC\Files\Filesystem::normalizePath('/'.$location.'/'.$filename.$ext); + $target = \OC\Files\Filesystem::normalizePath('/' . $location . '/' . $filename . $ext); list($owner, $ownerPath) = self::getUidAndFilename($target); - $path_parts = pathinfo($file); - $source_location = $path_parts['dirname']; + $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), $user); - if ($view->is_dir('/files_trashbin/keyfiles/'.$file)) { - if($source_location != '.') { - $keyfile = \OC\Files\Filesystem::normalizePath($user.'/files_trashbin/keyfiles/' . $source_location . '/' . $filename); - $sharekey = \OC\Files\Filesystem::normalizePath($user.'/files_trashbin/share-keys/' . $source_location . '/' . $filename); - } else { - $keyfile = \OC\Files\Filesystem::normalizePath($user.'/files_trashbin/keyfiles/' . $filename); - $sharekey = \OC\Files\Filesystem::normalizePath($user.'/files_trashbin/share-keys/' . $filename); - } - } else { - $keyfile = \OC\Files\Filesystem::normalizePath($user.'/files_trashbin/keyfiles/' . $source_location . '/' . $filename . '.key'); - } + if ($util->isSystemWideMountPoint($ownerPath)) { + $baseDir = '/files_encryption/'; + } else { + $baseDir = $owner . '/files_encryption/'; + } - if ($timestamp) { - $keyfile .= '.d' . $timestamp; - } - - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - if ($rootView->file_exists($keyfile)) { - // handle directory - if ($rootView->is_dir($keyfile)) { - - // handle keyfiles - $size += self::calculateSize(new \OC\Files\View($keyfile)); - $rootView->rename($keyfile, $owner.'/files_encryption/keyfiles/' . $ownerPath); - - // handle share-keys - if ($timestamp) { - $sharekey .= '.d' . $timestamp; - } - $size += self::calculateSize(new \OC\Files\View($sharekey)); - $rootView->rename($sharekey, $owner.'/files_encryption/share-keys/' . $ownerPath); + $path_parts = pathinfo($file); + $source_location = $path_parts['dirname']; + if ($view->is_dir('/files_trashbin/keyfiles/' . $file)) { + if ($source_location != '.') { + $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keyfiles/' . $source_location . '/' . $filename); + $sharekey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $source_location . '/' . $filename); } else { - // handle keyfiles + $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keyfiles/' . $filename); + $sharekey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $filename); + } + } else { + $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keyfiles/' . $source_location . '/' . $filename . '.key'); + } + + if ($timestamp) { + $keyfile .= '.d' . $timestamp; + } + + // disable proxy to prevent recursive calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; + + if ($rootView->file_exists($keyfile)) { + // handle directory + if ($rootView->is_dir($keyfile)) { + + // handle keyfiles + $size += self::calculateSize(new \OC\Files\View($keyfile)); + $rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath); + + // handle share-keys + if ($timestamp) { + $sharekey .= '.d' . $timestamp; + } + $size += self::calculateSize(new \OC\Files\View($sharekey)); + $rootView->rename($sharekey, $baseDir . '/share-keys/' . $ownerPath); + } else { + // handle keyfiles $size += $rootView->filesize($keyfile); - $rootView->rename($keyfile, $owner.'/files_encryption/keyfiles/' . $ownerPath . '.key'); + $rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath . '.key'); - // handle share-keys - $ownerShareKey = \OC\Files\Filesystem::normalizePath($user.'/files_trashbin/share-keys/' . $source_location . '/' . $filename . '.' . $user. '.shareKey'); - if ($timestamp) { - $ownerShareKey .= '.d' . $timestamp; - } + // handle share-keys + $ownerShareKey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $source_location . '/' . $filename . '.' . $user . '.shareKey'); + if ($timestamp) { + $ownerShareKey .= '.d' . $timestamp; + } - $size += $rootView->filesize($ownerShareKey); + $size += $rootView->filesize($ownerShareKey); - // move only owners key - $rootView->rename($ownerShareKey, $owner.'/files_encryption/share-keys/' . $ownerPath . '.' . $user. '.shareKey'); + // move only owners key + $rootView->rename($ownerShareKey, $baseDir . '/share-keys/' . $ownerPath . '.' . $user . '.shareKey'); - // try to re-share if file is shared - $filesystemView = new \OC_FilesystemView('/'); - $session = new \OCA\Encryption\Session($filesystemView); - $util = new \OCA\Encryption\Util($filesystemView, $user); + // try to re-share if file is shared + $filesystemView = new \OC_FilesystemView('/'); + $session = new \OCA\Encryption\Session($filesystemView); + $util = new \OCA\Encryption\Util($filesystemView, $user); - // fix the file size - $absolutePath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files/'. $ownerPath); - $util->fixFileSize($absolutePath); + // fix the file size + $absolutePath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files/' . $ownerPath); + $util->fixFileSize($absolutePath); - // get current sharing state - $sharingEnabled = \OCP\Share::isEnabled(); + // get current sharing state + $sharingEnabled = \OCP\Share::isEnabled(); - // get the final filename - $target = \OC\Files\Filesystem::normalizePath($location.'/'.$filename); + // get the final filename + $target = \OC\Files\Filesystem::normalizePath($location . '/' . $filename); - // get users sharing this file - $usersSharing = $util->getSharingUsersArray($sharingEnabled, $target.$ext, $user); + // get users sharing this file + $usersSharing = $util->getSharingUsersArray($sharingEnabled, $target . $ext, $user); - // Attempt to set shareKey - $util->setSharedFileKeyfiles($session, $usersSharing, $target.$ext); + // Attempt to set shareKey + $util->setSharedFileKeyfiles($session, $usersSharing, $target . $ext); } } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; + // enable proxy + \OC_FileProxy::$enabled = $proxyStatus; } return $size; } /** * @brief delete file from trash bin permanently - * + * * @param $filename path to the file * @param $timestamp of deletion time - * + * * @return size of deleted files */ - public static function delete($filename, $timestamp=null) { + public static function delete($filename, $timestamp = null) { $user = \OCP\User::getUser(); - $view = new \OC\Files\View('/'.$user); + $view = new \OC\Files\View('/' . $user); $size = 0; - + $trashbinSize = self::getTrashbinSize($user); - if ( $trashbinSize === false || $trashbinSize < 0 ) { - $trashbinSize = self::calculateSize(new \OC\Files\View('/'. $user.'/files_trashbin')); + if ($trashbinSize === false || $trashbinSize < 0) { + $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin')); } - if ( $timestamp ) { + if ($timestamp) { $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?'); - $query->execute(array($user,$filename,$timestamp)); - $file = $filename.'.d'.$timestamp; + $query->execute(array($user, $filename, $timestamp)); + $file = $filename . '.d' . $timestamp; } else { $file = $filename; } $size += self::deleteVersions($view, $file, $filename, $timestamp); $size += self::deleteEncryptionKeys($view, $file, $filename, $timestamp); - - if ($view->is_dir('/files_trashbin/files/'.$file)) { - $size += self::calculateSize(new \OC\Files\View('/'.$user.'/files_trashbin/files/'.$file)); + + if ($view->is_dir('/files_trashbin/files/' . $file)) { + $size += self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin/files/' . $file)); } else { - $size += $view->filesize('/files_trashbin/files/'.$file); + $size += $view->filesize('/files_trashbin/files/' . $file); } - $view->unlink('/files_trashbin/files/'.$file); + $view->unlink('/files_trashbin/files/' . $file); $trashbinSize -= $size; self::setTrashbinSize($user, $trashbinSize); - + return $size; } private static function deleteVersions($view, $file, $filename, $timestamp) { $size = 0; - if ( \OCP\App::isEnabled('files_versions') ) { + if (\OCP\App::isEnabled('files_versions')) { $user = \OCP\User::getUser(); - if ($view->is_dir('files_trashbin/versions/'.$file)) { - $size += self::calculateSize(new \OC\Files\view('/'.$user.'/files_trashbin/versions/'.$file)); - $view->unlink('files_trashbin/versions/'.$file); - } else if ( $versions = self::getVersionsFromTrash($filename, $timestamp) ) { + if ($view->is_dir('files_trashbin/versions/' . $file)) { + $size += self::calculateSize(new \OC\Files\view('/' . $user . '/files_trashbin/versions/' . $file)); + $view->unlink('files_trashbin/versions/' . $file); + } else if ($versions = self::getVersionsFromTrash($filename, $timestamp)) { foreach ($versions as $v) { - if ($timestamp ) { - $size += $view->filesize('/files_trashbin/versions/'.$filename.'.v'.$v.'.d'.$timestamp); - $view->unlink('/files_trashbin/versions/'.$filename.'.v'.$v.'.d'.$timestamp); + if ($timestamp) { + $size += $view->filesize('/files_trashbin/versions/' . $filename . '.v' . $v . '.d' . $timestamp); + $view->unlink('/files_trashbin/versions/' . $filename . '.v' . $v . '.d' . $timestamp); } else { - $size += $view->filesize('/files_trashbin/versions/'.$filename.'.v'.$v); - $view->unlink('/files_trashbin/versions/'.$filename.'.v'.$v); + $size += $view->filesize('/files_trashbin/versions/' . $filename . '.v' . $v); + $view->unlink('/files_trashbin/versions/' . $filename . '.v' . $v); } } } @@ -553,10 +569,10 @@ class Trashbin { if ($view->is_dir('/files_trashbin/files/' . $file)) { $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/' . $filename); - $sharekeys = \OC\Files\Filesystem::normalizePath('files_trashbin/share-keys/' . $filename); + $sharekeys = \OC\Files\Filesystem::normalizePath('files_trashbin/share-keys/' . $filename); } else { $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/' . $filename . '.key'); - $sharekeys = \OC\Files\Filesystem::normalizePath('files_trashbin/share-keys/' . $filename . '.' . $user . '.shareKey'); + $sharekeys = \OC\Files\Filesystem::normalizePath('files_trashbin/share-keys/' . $filename . '.' . $user . '.shareKey'); } if ($timestamp) { $keyfile .= '.d' . $timestamp; @@ -583,17 +599,17 @@ class Trashbin { * @param $timestamp of deletion time * @return true if file exists, otherwise false */ - public static function file_exists($filename, $timestamp=null) { + public static function file_exists($filename, $timestamp = null) { $user = \OCP\User::getUser(); - $view = new \OC\Files\View('/'.$user); + $view = new \OC\Files\View('/' . $user); if ($timestamp) { - $filename = $filename.'.d'.$timestamp; + $filename = $filename . '.d' . $timestamp; } else { $filename = $filename; } - $target = \OC\Files\Filesystem::normalizePath('files_trashbin/files/'.$filename); + $target = \OC\Files\Filesystem::normalizePath('files_trashbin/files/' . $filename); return $view->file_exists($target); } @@ -623,11 +639,11 @@ class Trashbin { $softQuota = true; $user = \OCP\User::getUser(); $quota = \OC_Preferences::getValue($user, 'files', 'quota'); - $view = new \OC\Files\View('/'.$user); - if ( $quota === null || $quota === 'default') { + $view = new \OC\Files\View('/' . $user); + if ($quota === null || $quota === 'default') { $quota = \OC_Appconfig::getValue('files', 'default_quota'); } - if ( $quota === null || $quota === 'none' ) { + if ($quota === null || $quota === 'none') { $quota = \OC\Files\Filesystem::free_space('/'); $softQuota = false; } else { @@ -638,11 +654,11 @@ class Trashbin { // subtract size of files and current trash bin size from quota if ($softQuota) { $rootInfo = $view->getFileInfo('/files/'); - $free = $quota-$rootInfo['size']; // remaining free space for user - if ( $free > 0 ) { + $free = $quota - $rootInfo['size']; // remaining free space for user + if ($free > 0) { $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $trashbinSize; // how much space can be used for versions } else { - $availableSpace = $free-$trashbinSize; + $availableSpace = $free - $trashbinSize; } } else { $availableSpace = $quota; @@ -658,43 +674,40 @@ class Trashbin { private static function expire($trashbinSize) { $user = \OCP\User::getUser(); - $view = new \OC\Files\View('/'.$user); + $view = new \OC\Files\View('/' . $user); $availableSpace = self::calculateFreeSpace($trashbinSize); $size = 0; $query = \OC_DB::prepare('SELECT `location`,`type`,`id`,`timestamp` FROM `*PREFIX*files_trash` WHERE `user`=?'); $result = $query->execute(array($user))->fetchAll(); - $retention_obligation = \OC_Config::getValue('trashbin_retention_obligation', - self::DEFAULT_RETENTION_OBLIGATION); + $retention_obligation = \OC_Config::getValue('trashbin_retention_obligation', self::DEFAULT_RETENTION_OBLIGATION); $limit = time() - ($retention_obligation * 86400); - foreach ( $result as $r ) { + foreach ($result as $r) { $timestamp = $r['timestamp']; $filename = $r['id']; - if ( $r['timestamp'] < $limit ) { + if ($r['timestamp'] < $limit) { $size += self::delete($filename, $timestamp); - \OC_Log::write('files_trashbin', 'remove "'.$filename.'" fom trash bin because it is older than '.$retention_obligation, \OC_log::INFO); + \OC_Log::write('files_trashbin', 'remove "' . $filename . '" fom trash bin because it is older than ' . $retention_obligation, \OC_log::INFO); } } $availableSpace = $availableSpace + $size; // if size limit for trash bin reached, delete oldest files in trash bin if ($availableSpace < 0) { $query = \OC_DB::prepare('SELECT `location`,`type`,`id`,`timestamp` FROM `*PREFIX*files_trash`' - .' WHERE `user`=? ORDER BY `timestamp` ASC'); + . ' WHERE `user`=? ORDER BY `timestamp` ASC'); $result = $query->execute(array($user))->fetchAll(); $length = count($result); $i = 0; - while ( $i < $length && $availableSpace < 0 ) { + while ($i < $length && $availableSpace < 0) { $tmp = self::delete($result[$i]['id'], $result[$i]['timestamp']); - \OC_Log::write('files_trashbin', 'remove "'.$result[$i]['id'].'" ('.$tmp.'B) to meet the limit of trash bin size (50% of available quota)', \OC_log::INFO); + \OC_Log::write('files_trashbin', 'remove "' . $result[$i]['id'] . '" (' . $tmp . 'B) to meet the limit of trash bin size (50% of available quota)', \OC_log::INFO); $availableSpace += $tmp; $size += $tmp; $i++; } - - } return $size; @@ -707,25 +720,25 @@ class Trashbin { * @param $destination destination path relative to the users root directoy * @param $view file view for the users root directory */ - private static function copy_recursive( $source, $destination, $view ) { + private static function copy_recursive($source, $destination, $view) { $size = 0; - if ( $view->is_dir( 'files'.$source ) ) { - $view->mkdir( $destination ); - $view->touch($destination, $view->filemtime('files'.$source)); - foreach ( \OC_Files::getDirectoryContent($source) as $i ) { - $pathDir = $source.'/'.$i['name']; - if ( $view->is_dir('files'.$pathDir) ) { - $size += self::copy_recursive($pathDir, $destination.'/'.$i['name'], $view); + if ($view->is_dir('files' . $source)) { + $view->mkdir($destination); + $view->touch($destination, $view->filemtime('files' . $source)); + foreach (\OC_Files::getDirectoryContent($source) as $i) { + $pathDir = $source . '/' . $i['name']; + if ($view->is_dir('files' . $pathDir)) { + $size += self::copy_recursive($pathDir, $destination . '/' . $i['name'], $view); } else { - $size += $view->filesize('files'.$pathDir); - $view->copy( 'files'.$pathDir, $destination . '/' . $i['name'] ); - $view->touch($destination . '/' . $i['name'], $view->filemtime('files'.$pathDir)); + $size += $view->filesize('files' . $pathDir); + $view->copy('files' . $pathDir, $destination . '/' . $i['name']); + $view->touch($destination . '/' . $i['name'], $view->filemtime('files' . $pathDir)); } } } else { - $size += $view->filesize('files'.$source); - $view->copy( 'files'.$source, $destination ); - $view->touch($destination, $view->filemtime('files'.$source)); + $size += $view->filesize('files' . $source); + $view->copy('files' . $source, $destination); + $view->touch($destination, $view->filemtime('files' . $source)); } return $size; } @@ -736,24 +749,25 @@ class Trashbin { * @param $timestamp timestamp when the file was deleted */ private static function getVersionsFromTrash($filename, $timestamp) { - $view = new \OC\Files\View('/'.\OCP\User::getUser().'/files_trashbin/versions'); - $versionsName = $view->getLocalFile($filename); + $view = new \OC\Files\View('/' . \OCP\User::getUser() . '/files_trashbin/versions'); + $versionsName = $view->getLocalFile($filename) . '.v'; + $escapedVersionsName = preg_replace('/(\*|\?|\[)/', '[$1]', $versionsName); $versions = array(); - if ($timestamp ) { + if ($timestamp) { // fetch for old versions - $matches = glob( $versionsName.'.v*.d'.$timestamp ); - $offset = -strlen($timestamp)-2; + $matches = glob($escapedVersionsName . '*.d' . $timestamp); + $offset = -strlen($timestamp) - 2; } else { - $matches = glob( $versionsName.'.v*' ); + $matches = glob($escapedVersionsName . '*'); } - foreach( $matches as $ma ) { - if ( $timestamp ) { - $parts = explode( '.v', substr($ma, 0, $offset) ); - $versions[] = ( end( $parts ) ); + foreach ($matches as $ma) { + if ($timestamp) { + $parts = explode('.v', substr($ma, 0, $offset)); + $versions[] = ( end($parts) ); } else { - $parts = explode( '.v', $ma ); - $versions[] = ( end( $parts ) ); + $parts = explode('.v', $ma); + $versions[] = ( end($parts) ); } } return $versions; @@ -768,12 +782,12 @@ class Trashbin { */ private static function getUniqueExtension($location, $filename, $view) { $ext = ''; - if ( $view->file_exists('files'.$location.'/'.$filename) ) { + if ($view->file_exists('files' . $location . '/' . $filename)) { $tmpext = '.restored'; $ext = $tmpext; $i = 1; - while ( $view->file_exists('files'.$location.'/'.$filename.$ext) ) { - $ext = $tmpext.$i; + while ($view->file_exists('files' . $location . '/' . $filename . $ext)) { + $ext = $tmpext . $i; $i++; } } @@ -786,17 +800,16 @@ class Trashbin { * @return size of the folder */ private static function calculateSize($view) { - $root = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath(''); + $root = \OCP\Config::getSystemValue('datadirectory') . $view->getAbsolutePath(''); if (!file_exists($root)) { return 0; } - $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($root), - \RecursiveIteratorIterator::CHILD_FIRST); + $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($root), \RecursiveIteratorIterator::CHILD_FIRST); $size = 0; foreach ($iterator as $path) { - $relpath = substr($path, strlen($root)-1); - if ( !$view->is_dir($relpath) ) { + $relpath = substr($path, strlen($root) - 1); + if (!$view->is_dir($relpath)) { $size += $view->filesize($relpath); } } @@ -818,7 +831,7 @@ class Trashbin { } return false; } - + /** * write to the database how much space is in use for the trash bin * @@ -826,9 +839,9 @@ class Trashbin { * @param $size size of the trash bin */ private static function setTrashbinSize($user, $size) { - if ( self::getTrashbinSize($user) === false) { + if (self::getTrashbinSize($user) === false) { $query = \OC_DB::prepare('INSERT INTO `*PREFIX*files_trashsize` (`size`, `user`) VALUES (?, ?)'); - }else { + } else { $query = \OC_DB::prepare('UPDATE `*PREFIX*files_trashsize` SET `size`=? WHERE `user`=?'); } $query->execute(array($size, $user)); @@ -843,4 +856,5 @@ class Trashbin { //Listen to delete user signal \OCP\Util::connectHook('OC_User', 'pre_deleteUser', "OCA\Files_Trashbin\Hooks", "deleteUser_hook"); } + } diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php index cb5edaa2c9..66ec36df86 100644 --- a/apps/files_trashbin/templates/index.php +++ b/apps/files_trashbin/templates/index.php @@ -18,7 +18,7 @@ <?php p($l->t( 'Restore' )); ?>" /> + src="" /> t('Restore'))?> diff --git a/apps/files_trashbin/templates/part.breadcrumb.php b/apps/files_trashbin/templates/part.breadcrumb.php index 2801e04e9a..85bb16ffa2 100644 --- a/apps/files_trashbin/templates/part.breadcrumb.php +++ b/apps/files_trashbin/templates/part.breadcrumb.php @@ -11,8 +11,7 @@ + $dir = \OCP\Util::encodePath($crumb["dir"]); ?>
svg" data-dir=''> diff --git a/apps/files_trashbin/templates/part.list.php b/apps/files_trashbin/templates/part.list.php index 92a38bd263..94a8eec951 100644 --- a/apps/files_trashbin/templates/part.list.php +++ b/apps/files_trashbin/templates/part.list.php @@ -4,10 +4,8 @@ // the older the file, the brighter the shade of grey; days*14 $relative_date_color = round((time()-$file['date'])/60/60/24*14); if($relative_date_color>200) $relative_date_color = 200; - $name = str_replace('+', '%20', urlencode($file['name'])); - $name = str_replace('%2F', '/', $name); - $directory = str_replace('+', '%20', urlencode($file['directory'])); - $directory = str_replace('%2F', '/', $directory); ?> + $name = \OCP\Util::encodePath($file['name']); + $directory = \OCP\Util::encodePath($file['directory']); ?> "بازگردانی امکان ناپذیر است: %s", "success" => "موفقیت", +"File %s was reverted to version %s" => "فایل %s به نسخه %s بازگردانده شده است.", "failure" => "شکست", +"File %s could not be reverted to version %s" => "فایل %s نمی تواند به نسخه %s بازگردانده شود.", "No old versions available" => "هیچ نسخه قدیمی در دسترس نیست", "No path specified" => "هیچ مسیری مشخص نشده است", +"Versions" => "نسخه ها", "Revert a file to a previous version by clicking on its revert button" => "بازگردانی یک پرورنده به نسخه قدیمی اش از طریق دکمه بازگردانی امکان پذیر است" ); diff --git a/apps/files_versions/l10n/he.php b/apps/files_versions/l10n/he.php index ad2e261d53..577389eb08 100644 --- a/apps/files_versions/l10n/he.php +++ b/apps/files_versions/l10n/he.php @@ -1,3 +1,11 @@ "גרסאות" +"Could not revert: %s" => "לא ניתן להחזיר: %s", +"success" => "הושלם", +"File %s was reverted to version %s" => "הקובץ %s הוחזר לגרסה %s", +"failure" => "נכשל", +"File %s could not be reverted to version %s" => "לא ניתן להחזיר את הקובץ %s לגרסה %s", +"No old versions available" => "אין גרסאות ישנות זמינות", +"No path specified" => "לא צוין נתיב", +"Versions" => "גרסאות", +"Revert a file to a previous version by clicking on its revert button" => "ניתן להחזיר קובץ לגרסה קודמת על ידי לחיצה על לחצן ההחזרה שלו" ); diff --git a/apps/files_versions/l10n/ko.php b/apps/files_versions/l10n/ko.php index 994144f39e..df34e4681b 100644 --- a/apps/files_versions/l10n/ko.php +++ b/apps/files_versions/l10n/ko.php @@ -1,11 +1,11 @@ "되돌릴 수 없습니다: %s", -"success" => "완료", -"File %s was reverted to version %s" => "파일 %s를 버전 %s로 변경하였습니다.", +"success" => "성공", +"File %s was reverted to version %s" => "파일 %s을(를) 버전 %s(으)로 되돌림", "failure" => "실패", -"File %s could not be reverted to version %s" => "파일 %s를 버전 %s로 되돌리지 못했습니다.", -"No old versions available" => "오래된 버전을 사용할 수 없습니다", -"No path specified" => "경로를 알수 없습니다.", -"Versions" => "버젼", -"Revert a file to a previous version by clicking on its revert button" => "변경 버튼을 클릭하여 이전 버전의 파일로 변경할 수 있습니다." +"File %s could not be reverted to version %s" => "파일 %s을(를) 버전 %s(으)로 되돌리지 못했음", +"No old versions available" => "오래된 버전을 사용할 수 없음", +"No path specified" => "경로가 지정되지 않았음", +"Versions" => "버전", +"Revert a file to a previous version by clicking on its revert button" => "변경 단추를 눌러 이전 버전의 파일로 되돌릴 수 있습니다" ); diff --git a/apps/files_versions/l10n/sv.php b/apps/files_versions/l10n/sv.php index bcd21bc599..8317097630 100644 --- a/apps/files_versions/l10n/sv.php +++ b/apps/files_versions/l10n/sv.php @@ -7,5 +7,5 @@ "No old versions available" => "Inga gamla versioner finns tillgängliga", "No path specified" => "Ingen sökväg angiven", "Versions" => "Versioner", -"Revert a file to a previous version by clicking on its revert button" => "Återställ en fil till en tidigare version genom att klicka på knappen" +"Revert a file to a previous version by clicking on its revert button" => "Återställ en fil till en tidigare version genom att klicka på återställningsknappen" ); diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 5fdbef2774..2f8262475b 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -113,8 +113,16 @@ class Storage { mkdir($versionsFolderName.'/'.$info['dirname'], 0750, true); } + // disable proxy to prevent multiple fopen calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; + // store a new version of a file $users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename)); + + // reset proxy state + \OC_FileProxy::$enabled = $proxyStatus; + $versionsSize = self::getVersionsSize($uid); if ( $versionsSize === false || $versionsSize < 0 ) { $versionsSize = self::calculateSize($uid); @@ -195,7 +203,16 @@ class Storage { //first create a new version $version = 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename); if ( !$users_view->file_exists($version)) { + + // disable proxy to prevent multiple fopen calls + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; + $users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename)); + + // reset proxy state + \OC_FileProxy::$enabled = $proxyStatus; + $versionCreated = true; } @@ -224,11 +241,12 @@ class Storage { public static function getVersions($uid, $filename, $count = 0 ) { if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { $versions_fileview = new \OC\Files\View('/' . $uid . '/files_versions'); - $versionsName = $versions_fileview->getLocalFile($filename); - + $versionsName = $versions_fileview->getLocalFile($filename).'.v'; + $escapedVersionName = preg_replace('/(\*|\?|\[)/', '[$1]', $versionsName); + $versions = array(); // fetch for old versions - $matches = glob(preg_quote($versionsName).'.v*' ); + $matches = glob($escapedVersionName.'*'); if ( !$matches ) { return $versions; diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index 81eaa0404b..593e846bc0 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -49,7 +49,7 @@ $entry = array( 'name' => 'LDAP' ); -OCP\Backgroundjob::addRegularTask('OCA\user_ldap\lib\Jobs', 'updateGroups'); +OCP\Backgroundjob::registerJob('OCA\user_ldap\lib\Jobs'); if(OCP\App::isEnabled('user_webdavauth')) { OCP\Util::writeLog('user_ldap', 'user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour', diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index f47d49cf22..52d5dbc48d 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -14,7 +14,7 @@ var LdapConfiguration = { //deal with Checkboxes if($(elementID).is('input[type=checkbox]')) { - if(configvalue === 1) { + if(parseInt(configvalue) === 1) { $(elementID).attr('checked', 'checked'); } else { $(elementID).removeAttr('checked'); diff --git a/apps/user_ldap/l10n/cs_CZ.php b/apps/user_ldap/l10n/cs_CZ.php index dd7373eb69..65c7c76b5d 100644 --- a/apps/user_ldap/l10n/cs_CZ.php +++ b/apps/user_ldap/l10n/cs_CZ.php @@ -1,4 +1,5 @@ "Selhalo zrušení mapování.", "Failed to delete the server configuration" => "Selhalo smazání nastavení serveru", "The configuration is valid and the connection could be established!" => "Nastavení je v pořádku a spojení bylo navázáno.", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Konfigurace je v pořádku, ale spojení selhalo. Zkontrolujte, prosím, nastavení serveru a přihlašovací údaje.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Převzít nastavení z nedávného nastavení serveru?", "Keep settings?" => "Ponechat nastavení?", "Cannot add server configuration" => "Nelze přidat nastavení serveru", +"mappings cleared" => "mapování zrušeno", "Success" => "Úspěch", "Error" => "Chyba", "Connection test succeeded" => "Test spojení byl úspěšný", @@ -72,6 +74,13 @@ "Email Field" => "Pole e-mailu", "User Home Folder Naming Rule" => "Pravidlo pojmenování domovské složky uživatele", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.", +"Internal Username" => "Interní uživatelské jméno", +"Internal Username Attribute:" => "Atribut interního uživatelského jména:", +"Override UUID detection" => "Nastavit ručně UUID atribut", +"UUID Attribute:" => "Atribut UUID:", +"Username-LDAP User Mapping" => "Mapování uživatelských jmen z LDAPu", +"Clear Username-LDAP User Mapping" => "Zrušit mapování uživatelských jmen LDAPu", +"Clear Groupname-LDAP Group Mapping" => "Zrušit mapování názvů skupin LDAPu", "Test Configuration" => "Vyzkoušet nastavení", "Help" => "Nápověda" ); diff --git a/apps/user_ldap/l10n/de.php b/apps/user_ldap/l10n/de.php index f001081842..bf25806d38 100644 --- a/apps/user_ldap/l10n/de.php +++ b/apps/user_ldap/l10n/de.php @@ -1,4 +1,5 @@ "Löschen der Zuordnung fehlgeschlagen.", "Failed to delete the server configuration" => "Löschen der Serverkonfiguration fehlgeschlagen", "The configuration is valid and the connection could be established!" => "Die Konfiguration ist gültig und die Verbindung konnte hergestellt werden!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Die Konfiguration ist gültig aber die Verbindung ist fehlgeschlagen. Bitte überprüfe die Servereinstellungen und Anmeldeinformationen.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Einstellungen von letzter Konfiguration übernehmen?", "Keep settings?" => "Einstellungen beibehalten?", "Cannot add server configuration" => "Das Hinzufügen der Serverkonfiguration schlug fehl", +"mappings cleared" => "Zuordnungen gelöscht", "Success" => "Erfolgreich", "Error" => "Fehler", "Connection test succeeded" => "Verbindungstest erfolgreich", @@ -72,6 +74,16 @@ "Email Field" => "E-Mail Feld", "User Home Folder Naming Rule" => "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfall trage ein LDAP/AD-Attribut ein.", +"Internal Username" => "Interner Benutzername", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Standardmäßig wird der interne Benutzername aus der UUID erstellt. Dies stellt sicher, daß der Name einmalig ist und keine Zeichen umgewandelt werden müssen. Für den internen Benutzernamen sind nur die folgenden Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden durch ihr ASCII-Äquivalent ersetzt oder ausgelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um einen Benutzer intern zu identifizieren. Er ist auch der Standardname für das Benutzerverzeichnis in ownCloud und Teil von Remote-URLs, unter anderem für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Um ein ähnliches Verhalten wie in ownCloud 5 zu erreichen, geben Sie das Benutzer-Anzeige-Namen-Attribut in das folgende Feld ein. Änderungen betreffen nur neu angelegte LDAP-Benutzer.", +"Internal Username Attribute:" => "Attribut für interne Benutzernamen:", +"Override UUID detection" => "UUID-Erkennung überschreiben", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Standardmäßig erkennt ownCloud das UUID-Attribut automatisch. Das UUID-Attribut wird benutzt, um LDAP-Benutzer und Gruppen eindeutig zu identifizieren. Außerdem wird der interne Benutzername basierend auf der UUID erstellt, wenn nicht anders angegeben. Sie können dieses Verhalten ändern und ein Attribut Ihrer Wahl angeben. Sie müssen sichergehen, dass das Attribut Ihrer Wahl auf Benutzer und Gruppen anwendbar und einzigartig ist. Für das Standardverhalten lassen Sie das Feld leer. Änderungen betreffen nur neu angelegte LDAP-Benutzer und Gruppen.", +"UUID Attribute:" => "UUID-Attribut:", +"Username-LDAP User Mapping" => "LDAP-Benutzernamenzuordnung", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "OwnCloud nutzt die Benutzernamen, um (Meta)Daten zuzuordnen und zu speichern. Um Benutzer eindeutig und präzise zu identifizieren, hat jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung vom OwnCloud-Benutzernamen zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen durch OwnCloud gefunden. Der interne OwnCloud-Name, wird in der gesamten OwnCloud verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste in der OwnCloud. Die Löschung der Zuordnungen kann nicht in der Konfiguration vorgenommen werden, beeinflusst aber die LDAP-Konfiguration! Lösche niemals die Zuordnungen in einer produktiven Umgebung. Lösche die Zuordnungen nur in einer Test- oder Experimentierumgebung.", +"Clear Username-LDAP User Mapping" => "Lösche LDAP-Benutzernamenzuordnung", +"Clear Groupname-LDAP Group Mapping" => "Lösche LDAP-Gruppennamenzuordnung", "Test Configuration" => "Testkonfiguration", "Help" => "Hilfe" ); diff --git a/apps/user_ldap/l10n/de_DE.php b/apps/user_ldap/l10n/de_DE.php index e22c5b5bdd..a876119f36 100644 --- a/apps/user_ldap/l10n/de_DE.php +++ b/apps/user_ldap/l10n/de_DE.php @@ -1,4 +1,5 @@ "Löschen der Zuordnung fehlgeschlagen.", "Failed to delete the server configuration" => "Löschen der Serverkonfiguration fehlgeschlagen", "The configuration is valid and the connection could be established!" => "Die Konfiguration ist gültig und die Verbindung konnte hergestellt werden!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Die Konfiguration ist gültig aber die Verbindung ist fehlgeschlagen. Bitte überprüfen Sie die Servereinstellungen und die Anmeldeinformationen.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Einstellungen von letzter Konfiguration übernehmen?", "Keep settings?" => "Einstellungen beibehalten?", "Cannot add server configuration" => "Das Hinzufügen der Serverkonfiguration schlug fehl", +"mappings cleared" => "Zuordnungen gelöscht", "Success" => "Erfolg", "Error" => "Fehler", "Connection test succeeded" => "Verbindungstest erfolgreich", @@ -74,6 +76,14 @@ "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", "Internal Username" => "Interner Benutzername", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Standardmäßig wird der interne Benutzername mittels des UUID-Attributes erzeugt. Dies stellt sicher, dass der Benutzername einzigartig ist und keinerlei Zeichen konvertiert werden müssen. Der interne Benutzername unterliegt Beschränkungen, die nur die nachfolgenden Zeichen erlauben: [ a-zA-Z0-9_.@- ]. Andere Zeichenwerden mittels ihrer korrespondierenden Zeichen ersetzt oder einfach ausgelassen. Bei Übereinstimmungen wird ein Zähler hinzugefügt bzw. der Zähler um einen Wert erhöht. Der interne Benutzername wird benutzt, um einen Benutzer intern zu identifizieren. Es ist ebenso der standardmäßig vorausgewählte Namen des Heimatverzeichnisses in ownCloud. Es dient weiterhin als Port für Remote-URLs - zum Beispiel für alle *DAV-Dienste Mit dieser Einstellung kann das Standardverhalten überschrieben werden. Um ein ähnliches Verhalten wie vor ownCloud 5 zu erzielen, fügen Sie das anzuzeigende Attribut des Benutzernamens in das nachfolgende Feld ein. Lassen Sie dies hingegen für das Standardverhalten leer. Die Änderungen werden sich einzig und allein nur auf neu gemappte (hinzugefügte) LDAP-Benutzer auswirken.", +"Internal Username Attribute:" => "Interne Eigenschaften des Benutzers:", +"Override UUID detection" => "UUID-Erkennung überschreiben", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Standardmäßig erkennt OwnCloud die UUID-Eigenschaften des Benutzers selbstständig. Die UUID-Eigenschaften werden genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Außerdem wird ein interner Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Sie können diese Eigenschaften überschreiben und selbst Eigenschaften nach Wahl vorgeben. Sie müssen allerdings sicherstellen, dass die Eigenschaften zur Identifikation für Benutzer und Gruppen eindeutig sind. Lassen Sie es frei, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu zugeordnete (neu erstellte) LDAP-Benutzer und -Gruppen aus.", +"UUID Attribute:" => "UUID-Attribut:", +"Username-LDAP User Mapping" => "LDAP-Benutzernamenzuordnung", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "OwnCloud nutzt die Benutzernamen, um (Meta)Daten zuzuordnen und zu speichern. Um Benutzer eindeutig und präzise zu identifizieren, hat jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung vom OwnCloud-Benutzernamen zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen durch OwnCloud gefunden. Der interne OwnCloud-Name, wird in der gesamten OwnCloud verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste in der OwnCloud. Die Löschung der Zuordnungen kann nicht in der Konfiguration vorgenommen werden, beeinflusst aber die LDAP-Konfiguration! Löschen Sie niemals die Zuordnungen in einer produktiven Umgebung. Löschen Sie die Zuordnungen nur in einer Test- oder Experimentierumgebung.", +"Clear Username-LDAP User Mapping" => "Lösche LDAP-Benutzernamenzuordnung", +"Clear Groupname-LDAP Group Mapping" => "Lösche LDAP-Gruppennamenzuordnung", "Test Configuration" => "Testkonfiguration", "Help" => "Hilfe" ); diff --git a/apps/user_ldap/l10n/es_AR.php b/apps/user_ldap/l10n/es_AR.php index 98fb32b1d2..6925ea89a0 100644 --- a/apps/user_ldap/l10n/es_AR.php +++ b/apps/user_ldap/l10n/es_AR.php @@ -1,12 +1,14 @@ "Hubo un error al borrar las asignaciones.", "Failed to delete the server configuration" => "Fallo al borrar la configuración del servidor", -"The configuration is valid and the connection could be established!" => "La configuración es valida y la conexión pudo ser establecida.", +"The configuration is valid and the connection could be established!" => "La configuración es válida y la conexión pudo ser establecida.", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "La configuración es válida, pero el enlace falló. Por favor, comprobá la configuración del servidor y las credenciales.", "The configuration is invalid. Please look in the ownCloud log for further details." => "La configuración no es válida. Por favor, buscá en el log de ownCloud más detalles.", "Deletion failed" => "Error al borrar", "Take over settings from recent server configuration?" => "Tomar los valores de la anterior configuración de servidor?", "Keep settings?" => "¿Mantener preferencias?", "Cannot add server configuration" => "No se pudo añadir la configuración del servidor", +"mappings cleared" => "Asignaciones borradas", "Success" => "Éxito", "Error" => "Error", "Connection test succeeded" => "El este de conexión ha sido completado satisfactoriamente", @@ -72,6 +74,16 @@ "Email Field" => "Campo de e-mail", "User Home Folder Naming Rule" => "Regla de nombre de los directorios de usuario", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Vacío para el nombre de usuario (por defecto). En otro caso, especificá un atributo LDAP/AD.", +"Internal Username" => "Nombre interno de usuario", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Por defecto, el nombre interno de usuario va a ser creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y los caracteres no necesitan ser convertidos. Para el nombre de usuario interno sólo se pueden usar estos caracteres: [a-zA-Z0-9_.@-]. Otros caracteres son sustituidos por su correspondiente en ASCII o simplemente omitidos. Si ocurrieran colisiones, un número será añadido o incrementado. El nombre interno de usuario se usa para identificar un usuario internamente. Es también el nombre por defecto para el directorio personal del usuario in ownCloud. También es un puerto de URLs remotas, por ejemplo, para todos los servicios *DAV. Con esta configuración el comportamiento por defecto puede ser cambiado. Para conseguir un comportamiento similar al anterior a ownCloud 5, ingresá el atributo del nombre en pantalla del usuario en el siguiente campo. Dejalo vacío para el comportamiento por defecto. Los cambios solo tendrán efecto para los nuevos usuarios LDAP.", +"Internal Username Attribute:" => "Atributo Nombre Interno de usuario:", +"Override UUID detection" => "Sobrescribir la detección UUID", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Por defecto, ownCloud detecta automáticamente el atributo UUID. El atributo UUID se usa para identificar indudablemente usuarios y grupos LDAP. Además, el nombre de usuario interno va a ser creado en base al UUID, si no ha sido especificado otro comportamiento arriba. Podés sobrescribir la configuración y pasar un atributo de tu elección. Tenés que asegurarte de que el atributo de tu elección sea accesible por los usuarios y grupos y ser único. Dejalo en blanco para usar el comportamiento por defecto. Los cambios tendrán efecto sólo en los nuevos usuarios y grupos de LDAP.", +"UUID Attribute:" => "Atributo UUID:", +"Username-LDAP User Mapping" => "Asignación del Nombre de usuario de un usuario LDAP", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "ownCloud usa nombres de usuario para almacenar y asignar (meta) datos. Con el fin de identificar con precisión y reconocer usuarios, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una asignación de nombre de usuario de ownCloud a usuario LDAP. El nombre de usuario creado se asigna al UUID del usuario LDAP. Además el DN se almacena en caché principalmente para reducir la interacción de LDAP, pero no se utiliza para la identificación. Si la DN cambia, los cambios serán encontrados por ownCloud. El nombre interno de ownCloud se utiliza para todo en ownCloud. Borrar las asignaciones dejará restos en distintos lugares. Borrar las asignaciones no depende de la configuración, ¡afecta a todas las configuraciones de LDAP! No borrar nunca las asignaciones en un entorno de producción. Sólo borrar asignaciones en una situación de prueba o experimental.", +"Clear Username-LDAP User Mapping" => "Borrar la asignación de los Nombres de usuario de los usuarios LDAP", +"Clear Groupname-LDAP Group Mapping" => "Borrar la asignación de los Nombres de grupo de los grupos de LDAP", "Test Configuration" => "Probar configuración", "Help" => "Ayuda" ); diff --git a/apps/user_ldap/l10n/hi.php b/apps/user_ldap/l10n/hi.php index 45166eb0e3..8e8e4e8ff6 100644 --- a/apps/user_ldap/l10n/hi.php +++ b/apps/user_ldap/l10n/hi.php @@ -1,4 +1,5 @@ "त्रुटि", "Password" => "पासवर्ड", "Help" => "सहयोग" ); diff --git a/apps/user_ldap/l10n/hu_HU.php b/apps/user_ldap/l10n/hu_HU.php index a06d0bd535..361ae5e040 100644 --- a/apps/user_ldap/l10n/hu_HU.php +++ b/apps/user_ldap/l10n/hu_HU.php @@ -75,6 +75,12 @@ "User Home Folder Naming Rule" => "A home könyvtár elérési útvonala", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Hagyja üresen, ha a felhasználónevet kívánja használni. Ellenkező esetben adjon meg egy LDAP/AD attribútumot!", "Internal Username" => "Belső felhasználónév", +"Internal Username Attribute:" => "A belső felhasználónév attribútuma:", +"Override UUID detection" => "Az UUID-felismerés felülbírálása", +"UUID Attribute:" => "UUID attribútum:", +"Username-LDAP User Mapping" => "Felhasználó - LDAP felhasználó hozzárendelés", +"Clear Username-LDAP User Mapping" => "A felhasználó - LDAP felhasználó hozzárendelés törlése", +"Clear Groupname-LDAP Group Mapping" => "A csoport - LDAP csoport hozzárendelés törlése", "Test Configuration" => "A beállítások tesztelése", "Help" => "Súgó" ); diff --git a/apps/user_ldap/l10n/is.php b/apps/user_ldap/l10n/is.php index dadac9eeda..6ea474f56d 100644 --- a/apps/user_ldap/l10n/is.php +++ b/apps/user_ldap/l10n/is.php @@ -1,6 +1,8 @@ "Geyma stillingar ?", "Error" => "Villa", "Host" => "Netþjónn", "Password" => "Lykilorð", +"Test Configuration" => "Prúfa uppsetningu", "Help" => "Hjálp" ); diff --git a/apps/user_ldap/l10n/nl.php b/apps/user_ldap/l10n/nl.php index c935d387cc..c75aae3ea4 100644 --- a/apps/user_ldap/l10n/nl.php +++ b/apps/user_ldap/l10n/nl.php @@ -75,10 +75,13 @@ "User Home Folder Naming Rule" => "Gebruikers Home map naamgevingsregel", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Laat leeg voor de gebruikersnaam (standaard). Of, specificeer een LDAP/AD attribuut.", "Internal Username" => "Interne gebruikersnaam", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Standaard wordt de interne gebruikersnaam aangemaakt op basis van de UUID attribuut. Het zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft als beperking dat alleen deze tekens zijn toegestaan​​: [a-zA-Z0-9_.@- ]. Andere tekens worden vervangen door hun ASCII vertaling of gewoonweg weggelaten. Bij identieke namen wordt een nummer toegevoegd of verhoogd. De interne gebruikersnaam wordt gebruikt om een ​​gebruiker binnen het systeem te herkennen. Het is ook de standaardnaam voor de standaardmap van de gebruiker in ownCloud. Het is ook een vertaling voor externe URL's, bijvoorbeeld voor alle * DAV diensten. Met deze instelling kan het standaardgedrag worden overschreven. Om een soortgelijk gedrag te bereiken als van voor ownCloud 5, voer het gebruikersweergavenaam attribuut in in het volgende veld. Laat het leeg voor standaard gedrag. Veranderingen worden alleen toegepast op nieuw in kaart gebracht (toegevoegde) LDAP-gebruikers.", "Internal Username Attribute:" => "Interne gebruikersnaam attribuut:", "Override UUID detection" => "Negeren UUID detectie", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Standaard herkent ownCloud het UUID attribuut automatisch. Het UUID attribuut wordt gebruikt om LDAP-gebruikers en -groepen uniek te identificeren. Ook zal de interne gebruikersnaam worden aangemaakt op basis van het UUID, tenzij dit hierboven anders is aangegeven. U kunt de instelling overschrijven en zelf een waarde voor het attribuut opgeven. U moet ervoor zorgen dat het ingestelde attribuut kan worden opgehaald voor zowel gebruikers als groepen en dat het uniek is. Laat het leeg voor standaard gedrag. Veranderingen worden alleen doorgevoerd op nieuw in kaart gebrachte (toegevoegde) LDAP-gebruikers en-groepen.", "UUID Attribute:" => "UUID Attribuut:", "Username-LDAP User Mapping" => "Gebruikersnaam-LDAP gebruikers vertaling", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "ownCloud maakt gebruik van gebruikersnamen om (meta) data op te slaan en toe te wijzen. Om gebruikers uniek te identificeren, zal elke LDAP-gebruiker ook een interne gebruikersnaam krijgen. Dit vereist een mapping van de ownCloud gebruikersnaam naar een ​​LDAP-gebruiker. De gecreëerde gebruikersnaam is gekoppeld aan de UUID van de LDAP-gebruiker. Ook de 'DN' wordt gecached om het aantal LDAP transacties te verminderen, maar deze wordt niet gebruikt voor identificatie. Als de DN verandert, zullen de veranderingen worden gevonden door ownCloud. De interne ownCloud naam wordt overal in ownCloud gebruikt. Wissen van de koppeling zal overal overblijfsel laten staan. Het wissen van Mappings is niet configuratiegevoelig, maar het raakt wel alle LDAP instellingen! Zorg ervoor dat deze Mappings nooit in een productieomgeving plaatsvinden. Maak ze alleen leeg in een test-of ontwikkelomgeving.", "Clear Username-LDAP User Mapping" => "Leegmaken Gebruikersnaam-LDAP gebruikers vertaling", "Clear Groupname-LDAP Group Mapping" => "Leegmaken Groepsnaam-LDAP groep vertaling", "Test Configuration" => "Test configuratie", diff --git a/apps/user_ldap/l10n/pl.php b/apps/user_ldap/l10n/pl.php index 7edfe0919e..5495ab9940 100644 --- a/apps/user_ldap/l10n/pl.php +++ b/apps/user_ldap/l10n/pl.php @@ -75,6 +75,7 @@ "User Home Folder Naming Rule" => "Reguły nazewnictwa folderu domowego użytkownika", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Pozostaw puste dla user name (domyślnie). W przeciwnym razie podaj atrybut LDAP/AD.", "Internal Username" => "Wewnętrzna nazwa użytkownika", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Domyślnie, wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID, ang. Universally unique identifier - Unikalny identyfikator użytkownika. To daje pewność, że nazwa użytkownika jest niepowtarzalna a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika dopuszcza jedynie znaki: [ a-zA-Z0-9_.@- ]. Pozostałe znaki zamieniane są na ich odpowiedniki ASCII lub po prostu pomijane. W przypadku, gdy nazwa się powtarza na końcu dodawana / zwiększana jest cyfra. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest to również domyślna nazwa głównego folderu w ownCloud. Jest to również klucz zdalnego URL, na przykład dla wszystkich usług *DAV. Dzięki temu ustawieniu można modyfikować domyślne zachowania. Aby osiągnąć podobny efekt jak w ownCloud 5 wpisz atrybut nazwy użytkownika w poniższym polu. Pozostaw puste dla domyślnego zachowania. Zmiany będą miały wpływ tylko na nowo stworzonych (dodane) użytkowników LDAP.", "Internal Username Attribute:" => "Wewnętrzny atrybut nazwy uzżytkownika:", "Override UUID detection" => "Zastąp wykrywanie UUID", "UUID Attribute:" => "Atrybuty UUID:", diff --git a/apps/user_ldap/l10n/pt_PT.php b/apps/user_ldap/l10n/pt_PT.php index ed1e0f376d..308fd34760 100644 --- a/apps/user_ldap/l10n/pt_PT.php +++ b/apps/user_ldap/l10n/pt_PT.php @@ -1,4 +1,5 @@ "Falhou a limpar os mapas", "Failed to delete the server configuration" => "Erro ao eliminar as configurações do servidor", "The configuration is valid and the connection could be established!" => "A configuração está correcta e foi possível estabelecer a ligação!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "A configuração está correcta, mas não foi possível estabelecer o \"laço\", por favor, verifique as configurações do servidor e as credenciais.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Assumir as configurações da configuração do servidor mais recente?", "Keep settings?" => "Manter as definições?", "Cannot add server configuration" => "Não foi possível adicionar as configurações do servidor.", +"mappings cleared" => "Mapas limpos", "Success" => "Sucesso", "Error" => "Erro", "Connection test succeeded" => "Teste de conecção passado com sucesso.", @@ -72,6 +74,13 @@ "Email Field" => "Campo de email", "User Home Folder Naming Rule" => "Regra da pasta inicial do utilizador", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Deixe vazio para nome de utilizador (padrão). De outro modo, especifique um atributo LDAP/AD.", +"Internal Username" => "Nome de utilizador interno", +"Internal Username Attribute:" => "Atributo do nome de utilizador interno", +"Override UUID detection" => "Passar a detecção do UUID", +"UUID Attribute:" => "Atributo UUID:", +"Username-LDAP User Mapping" => "Mapeamento do utilizador LDAP", +"Clear Username-LDAP User Mapping" => "Limpar mapeamento do utilizador-LDAP", +"Clear Groupname-LDAP Group Mapping" => "Limpar o mapeamento do nome de grupo LDAP", "Test Configuration" => "Testar a configuração", "Help" => "Ajuda" ); diff --git a/apps/user_ldap/l10n/ru.php b/apps/user_ldap/l10n/ru.php index eed6d373b9..d88b20dc46 100644 --- a/apps/user_ldap/l10n/ru.php +++ b/apps/user_ldap/l10n/ru.php @@ -1,4 +1,5 @@ "Не удалось очистить соотвествия.", "Failed to delete the server configuration" => "Не удалось удалить конфигурацию сервера", "The configuration is valid and the connection could be established!" => "Конфигурация правильная и подключение может быть установлено!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Конфигурация верна, но операция подключения завершилась неудачно. Пожалуйста, проверьте настройки сервера и учетные данные.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Принять настройки из последней конфигурации сервера?", "Keep settings?" => "Сохранить настройки?", "Cannot add server configuration" => "Не получилось добавить конфигурацию сервера", +"mappings cleared" => "Соответствия очищены", "Success" => "Успешно", "Error" => "Ошибка", "Connection test succeeded" => "Проверка соединения удалась", @@ -72,6 +74,16 @@ "Email Field" => "Поле адресса эллектронной почты", "User Home Folder Naming Rule" => "Правило именования Домашней Папки Пользователя", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Оставьте имя пользователя пустым (по умолчанию). Иначе укажите атрибут LDAP/AD.", +"Internal Username" => "Внутреннее имя пользователя", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "По-умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Это необходимо для того, чтобы имя пользователя было уникальным и не содержало в себе запрещенных символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по-умолчанию для папки пользователя в ownCloud. Оно также портом для удаленных ссылок, к примеру, для всех сервисов *DAV. С помощию данной настройки можно изменить поведение по-умолчанию. Чтобы достичь поведения, как было настроено до изменения, ownCloud 5 выводит атрибут имени пользователя в этом поле. Оставьте его пустым для режима по-умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", +"Internal Username Attribute:" => "Аттрибут для внутреннего имени:", +"Override UUID detection" => "Переопределить нахождение UUID", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "По-умолчанию, ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно индентифицировать пользователей и группы LDAP. Также, на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по-умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", +"UUID Attribute:" => "Аттрибут для UUID:", +"Username-LDAP User Mapping" => "Соответствия Имя-Пользователь LDAP", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "ownCloud использует имена пользователей для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует наличия соответствия имени пользователя ownCloud к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кэшируется доменное имя (DN) для снижения взаимодействия LDAP, однако оно не используется для идентификации. Если доменное имя было изменено, об этом станет известно ownCloud. Внутреннее имя ownCloud используется повсеместно в ownCloud. При очистке соответствий повсюду будут оставаться \"хвосты\". Очистка соответствий не привязана к конкретной конфигурации, она влияет на все конфигурации LDAP! Никогда не очищайте соответствия в рабочем окружении. Очищайте соответствия только во время тестов или в экспериментальных конфигурациях.", +"Clear Username-LDAP User Mapping" => "Очистить соответствия Имя-Пользователь LDAP", +"Clear Groupname-LDAP Group Mapping" => "Очистить соответствия Группа-Группа LDAP", "Test Configuration" => "Тестовая конфигурация", "Help" => "Помощь" ); diff --git a/apps/user_ldap/l10n/sk_SK.php b/apps/user_ldap/l10n/sk_SK.php index e36a158936..fe1e14ea6f 100644 --- a/apps/user_ldap/l10n/sk_SK.php +++ b/apps/user_ldap/l10n/sk_SK.php @@ -79,6 +79,9 @@ "Internal Username Attribute:" => "Atribút interného používateľského mena:", "Override UUID detection" => "Prepísať UUID detekciu", "UUID Attribute:" => "UUID atribút:", +"Username-LDAP User Mapping" => "Mapovanie názvov LDAP používateľských mien", +"Clear Username-LDAP User Mapping" => "Zrušiť mapovanie LDAP používateľských mien", +"Clear Groupname-LDAP Group Mapping" => "Zrušiť mapovanie názvov LDAP skupín", "Test Configuration" => "Test nastavenia", "Help" => "Pomoc" ); diff --git a/apps/user_ldap/l10n/sl.php b/apps/user_ldap/l10n/sl.php index 1ade5d9b73..aeca97038e 100644 --- a/apps/user_ldap/l10n/sl.php +++ b/apps/user_ldap/l10n/sl.php @@ -1,4 +1,5 @@ "Preslikav ni bilo mogoče izbrisati", "Failed to delete the server configuration" => "Brisanje nastavitev strežnika je spodletelo.", "The configuration is valid and the connection could be established!" => "Nastavitev je veljavna, zato je povezavo mogoče vzpostaviti!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Nastavitev je veljavna, vendar pa je vez Bind spodletela. Preveriti je treba nastavitve strežnika in ustreznost poveril.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Ali naj se prevzame nastavitve nedavne nastavitve strežnika?", "Keep settings?" => "Ali nas se nastavitve ohranijo?", "Cannot add server configuration" => "Ni mogoče dodati nastavitev strežnika", +"mappings cleared" => "Preslikave so izbrisane", "Success" => "Uspešno končano.", "Error" => "Napaka", "Connection test succeeded" => "Preizkus povezave je uspešno končan.", @@ -72,6 +74,16 @@ "Email Field" => "Polje elektronske pošte", "User Home Folder Naming Rule" => "Pravila poimenovanja uporabniške osebne mape", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Pustite prazno za uporabniško ime (privzeto), sicer navedite atribut LDAP/AD.", +"Internal Username" => "Interno uporabniško ime", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Po privzetih nastavitvah bo uporabniško ime nastavljeno na podlagi atributa UUID. Ta zagotovi, da je uporabniško ime unikatno in, da znakov ni potrebno pretvarjati. Interno uporabniško ime ima omejitev v uporabi znakov, in sicer so dovoljeni le znaki [ a-zA-Z0-9_.@- ]. Ostali znaki so nadomeščeni z njihovimi ustreznicami v ASCII ali so enostavno prezrti. Pri prekrivanju znakov bo dodana številka. Interno uporabniško ime je v uporabi za interno identifikacijo uporabnika. Je tudi privzeto ime za uporabnikovo domačo mapo v ownCloudu. Predstavlja tudi vrata za oddaljene internetne naslove, na primer za vse storitve *DAV. S to nastavitvijo se privzete nastavitve ne bodo upoštevale. Če boste želeli doseči isto obnašanje kot pri različicah ownClouda 5, vnesite atribut za Ime za prikaz v spodnje polje. Če boste polje pustili prazno, bo uporabljena privzeta vrednost. Spremembe bodo vplivale samo na novo dodane LDAP-uporabnike.", +"Internal Username Attribute:" => "Atribut Interno uporabniško ime", +"Override UUID detection" => "Prezri zaznavo UUID", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Po privzetih nastavitvah ownCloud sam zazna atribute UUID. Atribut UUID je uporabljen za identifikacijo LDAP-uporabnikov in skupin. Na podlagi atributa UUID se ustvari tudi interno uporabniško ime, če ne navedete drugačnih nastavitev sami. Nastavitev lahko povozite in izberete nastavitev po vaši izbiri. Potrebno je zagotoviti, da je izbran atribut lahko uporabljen tako za kreiranje uporabnikov kot skupin in je unikaten. Pustite praznega, če želite, da sistem uporabi privzete nastavitve. Spremembe bodo uporabljene šele pri novo preslikanih ali dodanih LDAP-uporabnikih in skupinah.", +"UUID Attribute:" => "Atribut UUID", +"Username-LDAP User Mapping" => "Preslikava uporabniško ime - LDAP-uporabnik", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "ownCloud uporablja uporabniška imena za shranjevanje in določanje metapodatkov. Za natančno identifikacijo in prepoznavo uporabnikov, ima vsak LDAP-uporabnik svoje interno uporabniško ime. To zahteva preslikavo iz uporabniškega imena v ownCloudu v LDAP-uporabnika. Ustvarjeno uporabniško ime je preslikano v UUID LDAP-uporabnika. Hkrati je v predpomnilnik shranjen DN uporabnika, zato da se zmanjšajo povezave z LDAP-om, ni pa uporabljen za identifikacijo uporabnikov. Če se DN spremeni, bo ownCloud sam našel te spremembe. Interno ime v ownCloudu je uporabljeno v celotnem sistemu. Brisanje preslikav bo pustilo posledice povsod. Brisanje preslikav je zato problematično za konfiguracijo, vpliva na celotno LDAP-konfiguracijo. Nikoli ne brišite preslikav na produkcijskem okolju. Preslikave brišite samo v fazi preizkušanja storitve.", +"Clear Username-LDAP User Mapping" => "Izbriši preslikavo Uporabniškega imena in LDAP-uporabnika", +"Clear Groupname-LDAP Group Mapping" => "Izbriši preslikavo Skupine in LDAP-skupine", "Test Configuration" => "Preizkusne nastavitve", "Help" => "Pomoč" ); diff --git a/apps/user_ldap/l10n/sv.php b/apps/user_ldap/l10n/sv.php index eb30bd22f0..6ab8a9e5a6 100644 --- a/apps/user_ldap/l10n/sv.php +++ b/apps/user_ldap/l10n/sv.php @@ -1,4 +1,5 @@ "Fel vid rensning av mappningar", "Failed to delete the server configuration" => "Misslyckades med att radera serverinställningen", "The configuration is valid and the connection could be established!" => "Inställningen är giltig och anslutningen kunde upprättas!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Konfigurationen är riktig, men Bind felade. Var vänlig och kontrollera serverinställningar och logininformation.", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "Ta över inställningar från tidigare serverkonfiguration?", "Keep settings?" => "Behåll inställningarna?", "Cannot add server configuration" => "Kunde inte lägga till serverinställning", +"mappings cleared" => "mappningar rensade", "Success" => "Lyckat", "Error" => "Fel", "Connection test succeeded" => "Anslutningstestet lyckades", @@ -72,6 +74,16 @@ "Email Field" => "E-postfält", "User Home Folder Naming Rule" => "Namnregel för hemkatalog", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP/AD-attribut.", +"Internal Username" => "Internt Användarnamn", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "Som standard skapas det interna användarnamnet från UUID-attributet. Det säkerställer att användarnamnet är unikt och tecken inte behöver konverteras. Det interna användarnamnet har restriktionerna att endast följande tecken är tillåtna: [ a-zA-Z0-9_.@- ]. Andra tecken blir ersatta av deras motsvarighet i ASCII eller utelämnas helt. En siffra kommer att läggas till eller ökas på vid en kollision. Det interna användarnamnet används för att identifiera användaren internt. Det är även förvalt som användarens användarnamn i ownCloud. Det är även en port för fjärråtkomst, t.ex. för alla *DAV-tjänster. Med denna inställning kan det förvalda beteendet åsidosättas. För att uppnå ett liknande beteende som innan ownCloud 5, ange attributet för användarens visningsnamn i detta fält. Lämna det tomt för förvalt beteende. Ändringarna kommer endast att påverka nyligen mappade (tillagda) LDAP-användare", +"Internal Username Attribute:" => "Internt Användarnamn Attribut:", +"Override UUID detection" => "Åsidosätt UUID detektion", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Som standard upptäcker ownCloud automatiskt UUID-attributet. Det UUID-attributet används för att utan tvivel identifiera LDAP-användare och grupper. Dessutom kommer interna användarnamn skapas baserat på detta UUID, om inte annat anges ovan. Du kan åsidosätta inställningen och passera ett attribut som du själv väljer. Du måste se till att attributet som du väljer kan hämtas för både användare och grupper och att det är unikt. Lämna det tomt för standard beteende. Förändringar kommer endast att påverka nyligen mappade (tillagda) LDAP-användare och grupper.", +"UUID Attribute:" => "UUID Attribut:", +"Username-LDAP User Mapping" => "Användarnamn-LDAP User Mapping", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "ownCloud använder sig av användarnamn för att lagra och tilldela (meta) data. För att exakt kunna identifiera och känna igen användare, kommer varje LDAP-användare ha ett internt användarnamn. Detta kräver en mappning från ownCloud-användarnamn till LDAP-användare. Det skapade användarnamnet mappas till UUID för LDAP-användaren. Dessutom cachas DN samt minska LDAP-interaktionen, men den används inte för identifiering. Om DN förändras, kommer förändringarna hittas av ownCloud. Det interna ownCloud-namnet används överallt i ownCloud. Om du rensar/raderar mappningarna kommer att lämna referenser överallt i systemet. Men den är inte konfigurationskänslig, den påverkar alla LDAP-konfigurationer! Rensa/radera aldrig mappningarna i en produktionsmiljö. Utan gör detta endast på i testmiljö!", +"Clear Username-LDAP User Mapping" => "Rensa Användarnamn-LDAP User Mapping", +"Clear Groupname-LDAP Group Mapping" => "Rensa Gruppnamn-LDAP Group Mapping", "Test Configuration" => "Testa konfigurationen", "Help" => "Hjälp" ); diff --git a/apps/user_ldap/l10n/zh_CN.php b/apps/user_ldap/l10n/zh_CN.php index 7b8389227a..675fe4dfc7 100644 --- a/apps/user_ldap/l10n/zh_CN.php +++ b/apps/user_ldap/l10n/zh_CN.php @@ -1,4 +1,5 @@ "清除映射失败。", "Failed to delete the server configuration" => "未能删除服务器配置", "The configuration is valid and the connection could be established!" => "配置有效,能够建立连接!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "配置有效但绑定失败。请检查服务器设置和认证信息。", @@ -7,6 +8,7 @@ "Take over settings from recent server configuration?" => "从近期的服务器配置中导入设置?", "Keep settings?" => "保留设置吗?", "Cannot add server configuration" => "无法添加服务器配置", +"mappings cleared" => "清除映射", "Success" => "成功", "Error" => "错误", "Connection test succeeded" => "连接测试成功", @@ -72,6 +74,16 @@ "Email Field" => "电邮字段", "User Home Folder Naming Rule" => "用户主目录命名规则", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "将用户名称留空(默认)。否则指定一个LDAP/AD属性", +"Internal Username" => "内部用户名", +"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder in ownCloud. It is also a port of remote URLs, for instance for all *DAV services. With this setting, the default behaviour can be overriden. To achieve a similar behaviour as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users." => "默认情况下内部用户名具有唯一识别属性来确保用户名的唯一性和属性不用转换。内部用户名有严格的字符限制,只允许使用 [ a-zA-Z0-9_.@- ]。其他字符会被ASCII码取代或者被活力。当冲突时会增加或者减少一个数字。内部用户名被用于内部识别用户,同时也作为ownCloud中用户根文件夹的默认名。也作为远程URLs的一部分,比如为了所有的*DAV服务。在这种设置下,默认行为可以被超越。实现一个类似的行为,owncloud 5输入用户的显示名称属性在以下领域之前。让它空着的默认行为。更改只对新映射的影响(增加)的LDAP用户。", +"Internal Username Attribute:" => "内部用户名属性:", +"Override UUID detection" => "超越UUID检测", +"By default, ownCloud autodetects the UUID attribute. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups." => "默认ownCloud自动检测UUID属性。UUID属性用来无误的识别LDAP用户和组。同时内部用户名也基于UUID创建,如果没有上述的指定。也可以超越设置直接指定一种属性。但一定要确保指定的属性取得的用户和组是唯一的。默认行为空。变更基于新映射(增加)LDAP用户和组才会生效。", +"UUID Attribute:" => "UUID属性:", +"Username-LDAP User Mapping" => "用户名-LDAP用户映射", +"ownCloud uses usernames to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from ownCloud username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found by ownCloud. The internal ownCloud name is used all over in ownCloud. Clearing the Mappings will have leftovers everywhere. Clearing the Mappings is not configuration sensitive, it affects all LDAP configurations! Do never clear the mappings in a production environment. Only clear mappings in a testing or experimental stage." => "ownCloud使用用户名存储和分配数据(元)。为了准确地识别和确认用户,每个用户都有一个内部用户名。需要从ownCloud用户名映射到LDAP用户。创建的用户名映射到LDAP用户的UUID。此外,DN是缓存以及减少LDAP交互,但它不用于识别。如果DN变化,ownCloud也会变化。内部ownCloud名在ownCloud的各处使用。清除映射将一片混乱。清除映射不是常用的配置,它影响到所有LDAP配置!千万不要在正式环境中清除映射。只有在测试或试验阶段可以清除映射。", +"Clear Username-LDAP User Mapping" => "清除用户-LDAP用户映射", +"Clear Groupname-LDAP Group Mapping" => "清除组用户-LDAP级映射", "Test Configuration" => "测试配置", "Help" => "帮助" ); diff --git a/apps/user_ldap/l10n/zh_TW.php b/apps/user_ldap/l10n/zh_TW.php index d01e75356c..cde743f003 100644 --- a/apps/user_ldap/l10n/zh_TW.php +++ b/apps/user_ldap/l10n/zh_TW.php @@ -1,11 +1,76 @@ "清除映射失敗", +"Failed to delete the server configuration" => "刪除伺服器設定時失敗", +"The configuration is valid and the connection could be established!" => "設定有效且連線可建立", +"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "設定有效但連線無法建立。請檢查伺服器的設定與認證資料。", +"The configuration is invalid. Please look in the ownCloud log for further details." => "設定無效。更多細節請參閱ownCloud的記錄檔。", "Deletion failed" => "移除失敗", +"Take over settings from recent server configuration?" => "要使用最近一次的伺服器設定嗎?", +"Keep settings?" => "維持設定嗎?", +"Cannot add server configuration" => "無法新增伺服器設定", +"mappings cleared" => "映射已清除", "Success" => "成功", "Error" => "錯誤", +"Connection test succeeded" => "連線測試成功", +"Connection test failed" => "連線測試失敗", +"Do you really want to delete the current Server Configuration?" => "您真的確定要刪除現在的伺服器設定嗎?", +"Confirm Deletion" => "確認已刪除", +"Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour. Please ask your system administrator to disable one of them." => "警告: 應用程式user_ldap和user_webdavauth互不相容。可能會造成無法預期的結果。請要求您的系統管理員將兩者其中之一停用。", +"Warning: The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "警告:沒有安裝 PHP LDAP 模組,後端系統將無法運作。請要求您的系統管理員安裝模組。", +"Server configuration" => "伺服器設定", +"Add Server Configuration" => "新增伺服器設定", "Host" => "主機", +"You can omit the protocol, except you require SSL. Then start with ldaps://" => "若您不需要SSL加密傳輸則可忽略通訊協定。若非如此請從ldaps://開始", +"One Base DN per line" => "一行一個Base DN", +"You can specify Base DN for users and groups in the Advanced tab" => "您可以在進階標籤頁裡面指定使用者及群組的Base DN", +"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "客戶端使用者的DN與特定字詞的連結需要完善,例如:uid=agent,dc=example,dc=com。若是匿名連接,則將DN與密碼欄位留白。", "Password" => "密碼", +"For anonymous access, leave DN and Password empty." => "匿名連接時請將DN與密碼欄位留白", +"User Login Filter" => "使用者登入過濾器", +"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action." => "試圖登入時會定義要套用的篩選器。登入過程中%%uid會取代使用者名稱。", +"use %%uid placeholder, e.g. \"uid=%%uid\"" => "請使用 %%uid placeholder,例如:\"uid=%%uid\"", +"User List Filter" => "使用者名單篩選器", +"Defines the filter to apply, when retrieving users." => "檢索使用者時定義要套用的篩選器", +"without any placeholder, e.g. \"objectClass=person\"." => "請勿使用任何placeholder,例如:\"objectClass=person\"。", +"Group Filter" => "群組篩選器", +"Defines the filter to apply, when retrieving groups." => "檢索群組時,定義要套用的篩選器", +"without any placeholder, e.g. \"objectClass=posixGroup\"." => "請勿使用任何placeholder,例如:\"objectClass=posixGroup\"。", +"Connection Settings" => "連線設定", +"Configuration Active" => "設定為主動模式", +"When unchecked, this configuration will be skipped." => "沒有被勾選時,此設定會被略過。", "Port" => "連接阜", +"Backup (Replica) Host" => "備用主機", +"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "請給定一個可選的備用主機。必須是LDAP/AD中央伺服器的複本。", +"Backup (Replica) Port" => "備用(複本)連接阜", +"Disable Main Server" => "停用主伺服器", +"When switched on, ownCloud will only connect to the replica server." => "當開關打開時,ownCloud將只會連接複本伺服器。", "Use TLS" => "使用TLS", +"Case insensitve LDAP server (Windows)" => "不區分大小寫的LDAP伺服器(Windows)", "Turn off SSL certificate validation." => "關閉 SSL 憑證驗證", +"If connection only works with this option, import the LDAP server's SSL certificate in your ownCloud server." => "若連線只有在此選項開啟時運作,請匯入LDAP伺服器的SSL認證到您的ownCloud伺服器。", +"Not recommended, use for testing only." => "不推薦使用,僅供測試用途。", +"Cache Time-To-Live" => "快取的存活時間", +"in seconds. A change empties the cache." => "以秒為單位。更變後會清空快取。", +"Directory Settings" => "目錄選項", +"User Display Name Field" => "使用者名稱欄位", +"The LDAP attribute to use to generate the user`s ownCloud name." => "用於產生ownCloud名稱", +"Base User Tree" => "Base使用者數", +"One User Base DN per line" => "一行一個使用者Base DN", +"User Search Attributes" => "使用者搜索屬性", +"Optional; one attribute per line" => "可選的; 一行一項屬性", +"Group Display Name Field" => "群組顯示名稱欄位", +"Base Group Tree" => "Base群組樹", +"One Group Base DN per line" => "一行一個群組Base DN", +"Group Search Attributes" => "群組搜索屬性", +"Group-Member association" => "群組成員的關係", +"Special Attributes" => "特殊屬性", +"Quota Field" => "配額欄位", +"Quota Default" => "預設配額", +"in bytes" => "以位元組為單位", +"Email Field" => "電郵欄位", +"User Home Folder Naming Rule" => "使用者家目錄的命名規則", +"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "使用者名稱請留白(預設)。若不留白請指定一個LDAP/AD屬性。", +"Internal Username" => "內部使用者名稱", +"Test Configuration" => "測試此設定", "Help" => "說明" ); diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index a7611eb3e8..6f6b8d0f01 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -441,8 +441,8 @@ abstract class Access { //while loop is just a precaution. If a name is not generated within //20 attempts, something else is very wrong. Avoids infinite loop. while($attempts < 20){ - $altName = $name . '_' . uniqid(); - if(\OCP\User::userExists($altName)) { + $altName = $name . '_' . rand(1000,9999); + if(!\OCP\User::userExists($altName)) { return $altName; } $attempts++; @@ -578,14 +578,12 @@ abstract class Access { '); //feed the DB - $res = $insert->execute(array($dn, $ocname, $this->getUUID($dn), $dn, $ocname)); + $insRows = $insert->execute(array($dn, $ocname, $this->getUUID($dn), $dn, $ocname)); - if(\OCP\DB::isError($res)) { + if(\OCP\DB::isError($insRows)) { return false; } - $insRows = $res->numRows(); - if($insRows === 0) { return false; } diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php index ba4de13534..36c8e648b1 100644 --- a/apps/user_ldap/lib/connection.php +++ b/apps/user_ldap/lib/connection.php @@ -209,6 +209,22 @@ class Connection { $value); } + /** + * Special handling for reading Base Configuration + * + * @param $base the internal name of the config key + * @param $value the value stored for the base + */ + private function readBase($base, $value) { + if(empty($value)) { + $value = ''; + } else { + $value = preg_split('/\r\n|\r|\n/', $value); + } + + $this->config[$base] = $value; + } + /** * Caches the general LDAP configuration. */ @@ -224,14 +240,9 @@ class Connection { $this->config['ldapAgentName'] = $this->$v('ldap_dn'); $this->config['ldapAgentPassword'] = base64_decode($this->$v('ldap_agent_password')); - $rawLdapBase = $this->$v('ldap_base'); - $this->config['ldapBase'] - = preg_split('/\r\n|\r|\n/', $rawLdapBase); - $this->config['ldapBaseUsers'] - = preg_split('/\r\n|\r|\n/', ($this->$v('ldap_base_users'))); - $this->config['ldapBaseGroups'] - = preg_split('/\r\n|\r|\n/', $this->$v('ldap_base_groups')); - unset($rawLdapBase); + $this->readBase('ldapBase', $this->$v('ldap_base')); + $this->readBase('ldapBaseUsers', $this->$v('ldap_base_users')); + $this->readBase('ldapBaseGroups', $this->$v('ldap_base_groups')); $this->config['ldapTLS'] = $this->$v('ldap_tls'); $this->config['ldapNoCase'] = $this->$v('ldap_nocase'); $this->config['turnOffCertCheck'] @@ -601,14 +612,13 @@ class Connection { $error = null; } - $error = null; //if LDAP server is not reachable, try the Backup (Replica!) Server - if((!$bindStatus && ($error === -1)) + if((!$bindStatus && ($error !== 0)) || $this->config['ldapOverrideMainServer'] || $this->getFromCache('overrideMainServer')) { $this->doConnect($this->config['ldapBackupHost'], $this->config['ldapBackupPort']); $bindStatus = $this->bind(); - if($bindStatus && $error === -1) { + if(!$bindStatus && $error === -1) { //when bind to backup server succeeded and failed to main server, //skip contacting him until next cache refresh $this->writeToCache('overrideMainServer', true); @@ -622,6 +632,10 @@ class Connection { if(empty($host)) { return false; } + if(strpos($host, '://') !== false) { + //ldap_connect ignores port paramater when URLs are passed + $host .= ':' . $port; + } $this->ldapConnectionRes = ldap_connect($host, $port); if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) { if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) { @@ -636,10 +650,17 @@ class Connection { * Binds to LDAP */ public function bind() { + static $getConnectionResourceAttempt = false; if(!$this->config['ldapConfigurationActive']) { return false; } + if($getConnectionResourceAttempt) { + $getConnectionResourceAttempt = false; + return false; + } + $getConnectionResourceAttempt = true; $cr = $this->getConnectionResource(); + $getConnectionResourceAttempt = false; if(!is_resource($cr)) { return false; } diff --git a/apps/user_ldap/lib/helper.php b/apps/user_ldap/lib/helper.php index 07d13a806a..f65f466789 100644 --- a/apps/user_ldap/lib/helper.php +++ b/apps/user_ldap/lib/helper.php @@ -90,13 +90,13 @@ class Helper { AND `appid` = \'user_ldap\' AND `configkey` NOT IN (\'enabled\', \'installed_version\', \'types\', \'bgjUpdateGroupsLastRun\') '); - $res = $query->execute(array($prefix.'%')); + $delRows = $query->execute(array($prefix.'%')); - if(\OCP\DB::isError($res)) { + if(\OCP\DB::isError($delRows)) { return false; } - if($res->numRows() === 0) { + if($delRows === 0) { return false; } @@ -118,7 +118,13 @@ class Helper { return false; } - $query = \OCP\DB::prepare('TRUNCATE '.$table); + if(strpos(\OCP\Config::getSystemValue('dbtype'), 'sqlite') !== false) { + $query = \OCP\DB::prepare('DELETE FROM '.$table); + } else { + $query = \OCP\DB::prepare('TRUNCATE '.$table); + } + + $res = $query->execute(); if(\OCP\DB::isError($res)) { diff --git a/apps/user_ldap/lib/jobs.php b/apps/user_ldap/lib/jobs.php index 094d11db3d..60ecc0da33 100644 --- a/apps/user_ldap/lib/jobs.php +++ b/apps/user_ldap/lib/jobs.php @@ -23,20 +23,22 @@ namespace OCA\user_ldap\lib; -class Jobs { +class Jobs extends \OC\BackgroundJob\TimedJob { static private $groupsFromDB; static private $groupBE; static private $connector; + public function __construct(){ + $this->interval = self::getRefreshInterval(); + } + + public function run($argument){ + Jobs::updateGroups(); + } + static public function updateGroups() { \OCP\Util::writeLog('user_ldap', 'Run background job "updateGroups"', \OCP\Util::DEBUG); - $lastUpdate = \OCP\Config::getAppValue('user_ldap', 'bgjUpdateGroupsLastRun', 0); - if((time() - $lastUpdate) < self::getRefreshInterval()) { - \OCP\Util::writeLog('user_ldap', 'bgJ "updateGroups" – last run too fresh, aborting.', \OCP\Util::DEBUG); - //komm runter Werner die Maurer geben ein aus - return; - } $knownGroups = array_keys(self::getKnownGroups()); $actualGroups = self::getGroupBE()->getGroups(); @@ -45,7 +47,6 @@ class Jobs { \OCP\Util::writeLog('user_ldap', 'bgJ "updateGroups" – groups do not seem to be configured properly, aborting.', \OCP\Util::INFO); - \OCP\Config::setAppValue('user_ldap', 'bgjUpdateGroupsLastRun', time()); return; } @@ -53,8 +54,6 @@ class Jobs { self::handleCreatedGroups(array_diff($actualGroups, $knownGroups)); self::handleRemovedGroups(array_diff($knownGroups, $actualGroups)); - \OCP\Config::setAppValue('user_ldap', 'bgjUpdateGroupsLastRun', time()); - \OCP\Util::writeLog('user_ldap', 'bgJ "updateGroups" – Finished.', \OCP\Util::DEBUG); } diff --git a/apps/user_webdavauth/l10n/ar.php b/apps/user_webdavauth/l10n/ar.php index c17302f7bb..78b347e51f 100644 --- a/apps/user_webdavauth/l10n/ar.php +++ b/apps/user_webdavauth/l10n/ar.php @@ -1,5 +1,4 @@ "تأكد شخصية ال WebDAV", -"URL: http://" => "الرابط: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." ); diff --git a/apps/user_webdavauth/l10n/bg_BG.php b/apps/user_webdavauth/l10n/bg_BG.php index a3bd703b25..61503db839 100644 --- a/apps/user_webdavauth/l10n/bg_BG.php +++ b/apps/user_webdavauth/l10n/bg_BG.php @@ -1,5 +1,4 @@ "WebDAV идентификация", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud ще изпрати потребителските данни до този URL. " ); diff --git a/apps/user_webdavauth/l10n/ca.php b/apps/user_webdavauth/l10n/ca.php index 7ac540f213..339e4dbe68 100644 --- a/apps/user_webdavauth/l10n/ca.php +++ b/apps/user_webdavauth/l10n/ca.php @@ -1,5 +1,5 @@ "Autenticació WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud enviarà les credencials d'usuari a aquesta URL. Aquest endollable en comprova la resposta i interpretarà els codis d'estat 401 i 403 com a credencials no vàlides, i qualsevol altra resposta com a credencials vàlides." ); diff --git a/apps/user_webdavauth/l10n/cs_CZ.php b/apps/user_webdavauth/l10n/cs_CZ.php index 9bd4c96a2b..e1f8d76e16 100644 --- a/apps/user_webdavauth/l10n/cs_CZ.php +++ b/apps/user_webdavauth/l10n/cs_CZ.php @@ -1,5 +1,5 @@ "Ověření WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud odešle uživatelské údaje na zadanou URL. Plugin zkontroluje odpověď a považuje návratovou hodnotu HTTP 401 a 403 za neplatné údaje a všechny ostatní hodnoty jako platné přihlašovací údaje." ); diff --git a/apps/user_webdavauth/l10n/da.php b/apps/user_webdavauth/l10n/da.php index b268d3e15d..0d1190ba22 100644 --- a/apps/user_webdavauth/l10n/da.php +++ b/apps/user_webdavauth/l10n/da.php @@ -1,5 +1,4 @@ "WebDAV-godkendelse", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud vil sende brugerens oplysninger til denne URL. Plugin'et registrerer responsen og fortolker HTTP-statuskoder 401 og 403 som ugyldige oplysninger, men alle andre besvarelser som gyldige oplysninger." ); diff --git a/apps/user_webdavauth/l10n/de.php b/apps/user_webdavauth/l10n/de.php index c86ff44e55..a6d61a497f 100644 --- a/apps/user_webdavauth/l10n/de.php +++ b/apps/user_webdavauth/l10n/de.php @@ -1,5 +1,5 @@ "WebDAV Authentifikation", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud sendet die Benutzerdaten an diese URL. Dieses Plugin prüft die Antwort und wird die Statuscodes 401 und 403 als ungültige Daten und alle anderen Antworten als gültige Daten interpretieren." ); diff --git a/apps/user_webdavauth/l10n/de_DE.php b/apps/user_webdavauth/l10n/de_DE.php index 1aecfd2996..21a886343f 100644 --- a/apps/user_webdavauth/l10n/de_DE.php +++ b/apps/user_webdavauth/l10n/de_DE.php @@ -1,5 +1,5 @@ "WebDAV-Authentifizierung", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud sendet die Benutzerdaten an diese URL. Dieses Plugin prüft die Antwort und wird die Statuscodes 401 und 403 als ungültige Daten und alle anderen Antworten als gültige Daten interpretieren." ); diff --git a/apps/user_webdavauth/l10n/el.php b/apps/user_webdavauth/l10n/el.php index 951709c4d6..79bb1d13bf 100644 --- a/apps/user_webdavauth/l10n/el.php +++ b/apps/user_webdavauth/l10n/el.php @@ -1,5 +1,5 @@ "Αυθεντικοποίηση μέσω WebDAV ", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Το ownCloud θα στείλει τα διαπιστευτήρια χρήστη σε αυτό το URL. Αυτό το plugin ελέγχει την απάντηση και την μετατρέπει σε HTTP κωδικό κατάστασης 401 και 403 για μη έγκυρα, όλες οι υπόλοιπες απαντήσεις είναι έγκυρες." ); diff --git a/apps/user_webdavauth/l10n/eo.php b/apps/user_webdavauth/l10n/eo.php index d945f181e6..0e1fda7c4c 100644 --- a/apps/user_webdavauth/l10n/eo.php +++ b/apps/user_webdavauth/l10n/eo.php @@ -1,4 +1,3 @@ "WebDAV-aŭtentigo", -"URL: http://" => "URL: http://" +"WebDAV Authentication" => "WebDAV-aŭtentigo" ); diff --git a/apps/user_webdavauth/l10n/es.php b/apps/user_webdavauth/l10n/es.php index 103c3738e2..18c87794d6 100644 --- a/apps/user_webdavauth/l10n/es.php +++ b/apps/user_webdavauth/l10n/es.php @@ -1,5 +1,5 @@ "Autenticación de WevDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "onwCloud enviará las credenciales de usuario a esta URL. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas." ); diff --git a/apps/user_webdavauth/l10n/es_AR.php b/apps/user_webdavauth/l10n/es_AR.php index 103c3738e2..cda5d7eab0 100644 --- a/apps/user_webdavauth/l10n/es_AR.php +++ b/apps/user_webdavauth/l10n/es_AR.php @@ -1,5 +1,5 @@ "Autenticación de WevDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "onwCloud enviará las credenciales de usuario a esta URL. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas." ); diff --git a/apps/user_webdavauth/l10n/et_EE.php b/apps/user_webdavauth/l10n/et_EE.php index a3b86224ac..f95b521413 100644 --- a/apps/user_webdavauth/l10n/et_EE.php +++ b/apps/user_webdavauth/l10n/et_EE.php @@ -1,5 +1,5 @@ "WebDAV autentimine", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud saadab kasutajatunnused sellel aadressil. See vidin kontrollib vastust ning tuvastab HTTP vastuskoodid 401 ja 403 kui vigased, ning kõik teised vastused kui korrektsed kasutajatunnused." ); diff --git a/apps/user_webdavauth/l10n/eu.php b/apps/user_webdavauth/l10n/eu.php index d792c1588b..6395d7fc1e 100644 --- a/apps/user_webdavauth/l10n/eu.php +++ b/apps/user_webdavauth/l10n/eu.php @@ -1,5 +1,4 @@ "WebDAV Autentikazioa", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloudek erabiltzailearen kredentzialak URL honetara bidaliko ditu. Plugin honek erantzuna aztertzen du eta HTTP 401 eta 403 egoera kodeak baliogabezko kredentzialtzat hartuko ditu, beste erantzunak kredentzial egokitzat hartuko dituelarik." ); diff --git a/apps/user_webdavauth/l10n/fi_FI.php b/apps/user_webdavauth/l10n/fi_FI.php index 6c67c78c81..61a848bcfe 100644 --- a/apps/user_webdavauth/l10n/fi_FI.php +++ b/apps/user_webdavauth/l10n/fi_FI.php @@ -1,4 +1,3 @@ "WebDAV-todennus", -"URL: http://" => "Osoite: http://" +"WebDAV Authentication" => "WebDAV-todennus" ); diff --git a/apps/user_webdavauth/l10n/fr.php b/apps/user_webdavauth/l10n/fr.php index 9d528a3a9d..e7fad26287 100644 --- a/apps/user_webdavauth/l10n/fr.php +++ b/apps/user_webdavauth/l10n/fr.php @@ -1,5 +1,5 @@ "Authentification WebDAV", -"URL: http://" => "URL : http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud enverra les informations de connexion à cette adresse. Ce module complémentaire analyse le code réponse HTTP et considère tout code différent des codes 401 et 403 comme associé à une authentification correcte." ); diff --git a/apps/user_webdavauth/l10n/gl.php b/apps/user_webdavauth/l10n/gl.php index f63a7cb0ce..35ed8a1969 100644 --- a/apps/user_webdavauth/l10n/gl.php +++ b/apps/user_webdavauth/l10n/gl.php @@ -1,5 +1,5 @@ "Autenticación WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud enviará as credenciais do usuario a este URL. Este engadido comproba a resposta e interpretará os códigos de estado HTTP 401 e 403 como credenciais incorrectas, e todas as outras respostas como credenciais correctas." ); diff --git a/apps/user_webdavauth/l10n/he.php b/apps/user_webdavauth/l10n/he.php new file mode 100644 index 0000000000..aee7b00f18 --- /dev/null +++ b/apps/user_webdavauth/l10n/he.php @@ -0,0 +1,4 @@ + "הזדהות מול WebDAV", +"ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "מערכת ownCloud תשלח את פרטי המשתמש לכתובת זו. התוסף יבדוק את התגובה ויתרגם את הקודים 401 ו־403 כתגובה לציון פרטי גישה שגויים ואת כל שאר התגובות כפרטי גישה נכונים." +); diff --git a/apps/user_webdavauth/l10n/hu_HU.php b/apps/user_webdavauth/l10n/hu_HU.php index 6435280114..d7de5e57f3 100644 --- a/apps/user_webdavauth/l10n/hu_HU.php +++ b/apps/user_webdavauth/l10n/hu_HU.php @@ -1,5 +1,4 @@ "WebDAV hitelesítés", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Az ownCloud elküldi a felhasználói fiók adatai a következő URL-re. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen hitelesítő, akkor minden más válasz érvényes lesz." ); diff --git a/apps/user_webdavauth/l10n/id.php b/apps/user_webdavauth/l10n/id.php index 4324ee8ff5..8ddf54e473 100644 --- a/apps/user_webdavauth/l10n/id.php +++ b/apps/user_webdavauth/l10n/id.php @@ -1,5 +1,4 @@ "Otentikasi WebDAV", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud akan mengirimkan informasi pengguna ke URL ini. Pengaya akan mengecek respon dan menginterpretasikan kode status HTTP 401 serta 403 sebagai informasi yang keliru, sedangkan respon lainnya dianggap benar." ); diff --git a/apps/user_webdavauth/l10n/is.php b/apps/user_webdavauth/l10n/is.php index 8fe0d974b3..10dcfa6e3d 100644 --- a/apps/user_webdavauth/l10n/is.php +++ b/apps/user_webdavauth/l10n/is.php @@ -1,3 +1,3 @@ "Vefslóð: http://" +"WebDAV Authentication" => "WebDAV Auðkenni" ); diff --git a/apps/user_webdavauth/l10n/it.php b/apps/user_webdavauth/l10n/it.php index a7cd6e8e4b..1c1e0899b1 100644 --- a/apps/user_webdavauth/l10n/it.php +++ b/apps/user_webdavauth/l10n/it.php @@ -1,5 +1,5 @@ "Autenticazione WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud invierà le credenziali dell'utente a questo URL. Questa estensione controlla la risposta e interpreta i codici di stato 401 e 403 come credenziali non valide, e tutte le altre risposte come credenziali valide." ); diff --git a/apps/user_webdavauth/l10n/ja_JP.php b/apps/user_webdavauth/l10n/ja_JP.php index 1cd14a03c7..703cc71489 100644 --- a/apps/user_webdavauth/l10n/ja_JP.php +++ b/apps/user_webdavauth/l10n/ja_JP.php @@ -1,5 +1,5 @@ "WebDAV 認証", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloudはこのURLにユーザ資格情報を送信します。このプラグインは応答をチェックし、HTTP状態コードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。" ); diff --git a/apps/user_webdavauth/l10n/ka_GE.php b/apps/user_webdavauth/l10n/ka_GE.php index f475ea0b73..34c502cc5e 100644 --- a/apps/user_webdavauth/l10n/ka_GE.php +++ b/apps/user_webdavauth/l10n/ka_GE.php @@ -1,5 +1,4 @@ "WebDAV აუთენთიფიკაცია", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud–ი გამოგიგზავნით ანგარიშის მონაცემებს ამ URL–ზე. ეს პლაგინი შეამოწმებს პასუხს და მოახდენს მის ინტერპრეტაციას HTTP სტატუსკოდებში 401 და 403 დაუშვებელი მონაცემებისთვის, ხოლო სხვა დანარჩენს დაშვებადი მონაცემებისთვის." ); diff --git a/apps/user_webdavauth/l10n/ko.php b/apps/user_webdavauth/l10n/ko.php index 578ff35e72..e0431164a5 100644 --- a/apps/user_webdavauth/l10n/ko.php +++ b/apps/user_webdavauth/l10n/ko.php @@ -1,5 +1,4 @@ "WebDAV 인증", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud에서 이 URL로 사용자 인증 정보를 보냅니다. 이 플러그인은 응답을 확인하여 HTTP 상태 코드 401이나 403이 돌아온 경우에 잘못된 인증 정보로 간주합니다. 다른 모든 상태 코드는 올바른 인증 정보로 간주합니다." ); diff --git a/apps/user_webdavauth/l10n/lt_LT.php b/apps/user_webdavauth/l10n/lt_LT.php index 8d0492ae48..ed81efdf8b 100644 --- a/apps/user_webdavauth/l10n/lt_LT.php +++ b/apps/user_webdavauth/l10n/lt_LT.php @@ -1,5 +1,4 @@ "WebDAV autorizavimas", -"URL: http://" => "Adresas: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud išsiųs naudotojo duomenis į šį WWW adresą. Šis įskiepis patikrins gautą atsakymą ir interpretuos HTTP būsenos kodą 401 ir 403 kaip negaliojančius duomenis, ir visus kitus gautus atsakymus kaip galiojančius duomenis. " ); diff --git a/apps/user_webdavauth/l10n/lv.php b/apps/user_webdavauth/l10n/lv.php index d0043df9f0..7f90f64d21 100644 --- a/apps/user_webdavauth/l10n/lv.php +++ b/apps/user_webdavauth/l10n/lv.php @@ -1,5 +1,4 @@ "WebDAV autentifikācija", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud sūtīs lietotāja akreditācijas datus uz šo URL. Šis spraudnis pārbauda atbildi un interpretē HTTP statusa kodus 401 un 403 kā nederīgus akreditācijas datus un visas citas atbildes kā derīgus akreditācijas datus." ); diff --git a/apps/user_webdavauth/l10n/nl.php b/apps/user_webdavauth/l10n/nl.php index 7d1bb33923..086f8ad2ea 100644 --- a/apps/user_webdavauth/l10n/nl.php +++ b/apps/user_webdavauth/l10n/nl.php @@ -1,5 +1,5 @@ "WebDAV authenticatie", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud stuurt de inloggegevens naar deze URL. Deze plugin controleert het antwoord en interpreteert de HTTP statuscodes 401 als 403 als ongeldige inloggegevens, maar alle andere antwoorden als geldige inloggegevens." ); diff --git a/apps/user_webdavauth/l10n/nn_NO.php b/apps/user_webdavauth/l10n/nn_NO.php new file mode 100644 index 0000000000..5c4184b33a --- /dev/null +++ b/apps/user_webdavauth/l10n/nn_NO.php @@ -0,0 +1,4 @@ + "WebDAV-autentisering", +"ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud sender brukarakkreditiv til denne nettadressa. Dette programtillegget kontrollerer svaret og tolkar HTTP-statuskodane 401 og 403 som ugyldige, og alle andre svar som gyldige." +); diff --git a/apps/user_webdavauth/l10n/pl.php b/apps/user_webdavauth/l10n/pl.php index 4887e93531..8c8116e523 100644 --- a/apps/user_webdavauth/l10n/pl.php +++ b/apps/user_webdavauth/l10n/pl.php @@ -1,5 +1,5 @@ "Uwierzytelnienie WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud wyśle dane uwierzytelniające do tego URL. Ten plugin sprawdza odpowiedź i zinterpretuje kody HTTP 401 oraz 403 jako nieprawidłowe dane uwierzytelniające, a każdy inny kod odpowiedzi jako poprawne dane." ); diff --git a/apps/user_webdavauth/l10n/pt_BR.php b/apps/user_webdavauth/l10n/pt_BR.php index 6ddd00ccc3..6727219db4 100644 --- a/apps/user_webdavauth/l10n/pt_BR.php +++ b/apps/user_webdavauth/l10n/pt_BR.php @@ -1,5 +1,5 @@ "Autenticação WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "O ownCloud enviará as credenciais do usuário para esta URL. Este plugin verifica a resposta e interpreta o os códigos de status do HTTP 401 e 403 como credenciais inválidas, e todas as outras respostas como credenciais válidas." ); diff --git a/apps/user_webdavauth/l10n/pt_PT.php b/apps/user_webdavauth/l10n/pt_PT.php index d7e87b5c8d..eec1a328e1 100644 --- a/apps/user_webdavauth/l10n/pt_PT.php +++ b/apps/user_webdavauth/l10n/pt_PT.php @@ -1,5 +1,4 @@ "Autenticação WebDAV", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "O ownCloud vai enviar as credenciais do utilizador através deste URL. Este plugin verifica a resposta e vai interpretar os códigos de estado HTTP 401 e 403 como credenciais inválidas, e todas as outras como válidas." ); diff --git a/apps/user_webdavauth/l10n/ro.php b/apps/user_webdavauth/l10n/ro.php index 9df490e81e..bccd7d50e2 100644 --- a/apps/user_webdavauth/l10n/ro.php +++ b/apps/user_webdavauth/l10n/ro.php @@ -1,5 +1,4 @@ "Autentificare WebDAV", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud va trimite datele de autentificare la acest URL. Acest modul verifică răspunsul și va interpreta codurile de status HTTP 401 sau 403 ca fiind date de autentificare invalide, și orice alt răspuns ca fiind date valide." ); diff --git a/apps/user_webdavauth/l10n/ru.php b/apps/user_webdavauth/l10n/ru.php index f12982fc40..20acc6e59a 100644 --- a/apps/user_webdavauth/l10n/ru.php +++ b/apps/user_webdavauth/l10n/ru.php @@ -1,5 +1,5 @@ "Идентификация WebDAV", -"URL: http://" => "URL: http://", -"ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud отправит пользовательские данные на этот URL. Затем плагин проверит ответ, в случае HTTP ответа 401 или 403 данные будут считаться неверными, при любых других ответах - верными." +"URL: " => "URL:", +"ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud отправит учётные данные пользователя на этот адрес. Затем плагин проверит ответ, в случае HTTP ответа 401 или 403 данные будут считаться неверными, при любых других ответах - верными." ); diff --git a/apps/user_webdavauth/l10n/sk_SK.php b/apps/user_webdavauth/l10n/sk_SK.php index c4e6dfddc7..fa63b18569 100644 --- a/apps/user_webdavauth/l10n/sk_SK.php +++ b/apps/user_webdavauth/l10n/sk_SK.php @@ -1,5 +1,5 @@ "WebDAV overenie", -"URL: http://" => "URL: http://", +"URL: " => "URL: ", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud odošle používateľské údaje na zadanú URL. Plugin skontroluje odpoveď a považuje návratovú hodnotu HTTP 401 a 403 za neplatné údaje a všetky ostatné hodnoty ako platné prihlasovacie údaje." ); diff --git a/apps/user_webdavauth/l10n/sl.php b/apps/user_webdavauth/l10n/sl.php index 7c592723af..105fda4865 100644 --- a/apps/user_webdavauth/l10n/sl.php +++ b/apps/user_webdavauth/l10n/sl.php @@ -1,5 +1,5 @@ "Overitev WebDAV", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Sistem ownCloud bo poslal uporabniška poverila na navedeni naslov URL. Ta vstavek preveri odziv in tolmači kode stanja HTTP 401 in HTTP 403 kot spodletel odgovor in vse ostale odzive kot veljavna poverila." ); diff --git a/apps/user_webdavauth/l10n/sr.php b/apps/user_webdavauth/l10n/sr.php index 518fcbe9be..44ff078493 100644 --- a/apps/user_webdavauth/l10n/sr.php +++ b/apps/user_webdavauth/l10n/sr.php @@ -1,5 +1,4 @@ "WebDAV провера идентитета", -"URL: http://" => "Адреса: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud ће послати акредитиве корисника на ову адресу. Овај прикључак проверава одговор и тумачи HTTP статусне кодове 401 и 403 као неисправне акредитиве, а све остале одговоре као исправне." ); diff --git a/apps/user_webdavauth/l10n/sv.php b/apps/user_webdavauth/l10n/sv.php index c79b35c27c..481b771094 100644 --- a/apps/user_webdavauth/l10n/sv.php +++ b/apps/user_webdavauth/l10n/sv.php @@ -1,5 +1,5 @@ "WebDAV Autentisering", -"URL: http://" => "URL: http://", +"URL: " => "URL:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter." ); diff --git a/apps/user_webdavauth/l10n/th_TH.php b/apps/user_webdavauth/l10n/th_TH.php index 2bd1f685e6..3c84ef7104 100644 --- a/apps/user_webdavauth/l10n/th_TH.php +++ b/apps/user_webdavauth/l10n/th_TH.php @@ -1,5 +1,4 @@ "WebDAV Authentication", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud จะส่งข้อมูลการเข้าใช้งานของผู้ใช้งานไปยังที่อยู่ URL ดังกล่าวนี้ ปลั๊กอินดังกล่าวจะทำการตรวจสอบข้อมูลที่โต้ตอบกลับมาและจะทำการแปลรหัส HTTP statuscodes 401 และ 403 ให้เป็นข้อมูลการเข้าใช้งานที่ไม่สามารถใช้งานได้ ส่วนข้อมูลอื่นๆที่เหลือทั้งหมดจะเป็นข้อมูลการเข้าใช้งานที่สามารถใช้งานได้" ); diff --git a/apps/user_webdavauth/l10n/tr.php b/apps/user_webdavauth/l10n/tr.php index c495a39dce..06bf97c4b0 100644 --- a/apps/user_webdavauth/l10n/tr.php +++ b/apps/user_webdavauth/l10n/tr.php @@ -1,5 +1,4 @@ "WebDAV Kimlik doğrulaması", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud deneyme kullanicin URLe gonderecek. Bu toplan cepaplama muayene edecek ve status kodeci HTTPden 401 ve 403 deneyi gecerli ve hepsi baska cevaplamari mantekli gibi yorumlacak. " ); diff --git a/apps/user_webdavauth/l10n/ug.php b/apps/user_webdavauth/l10n/ug.php index 03ced5f4aa..7231d0c570 100644 --- a/apps/user_webdavauth/l10n/ug.php +++ b/apps/user_webdavauth/l10n/ug.php @@ -1,4 +1,3 @@ "WebDAV سالاھىيەت دەلىللەش", -"URL: http://" => "URL: http://" +"WebDAV Authentication" => "WebDAV سالاھىيەت دەلىللەش" ); diff --git a/apps/user_webdavauth/l10n/uk.php b/apps/user_webdavauth/l10n/uk.php index 66887df54b..2f4d3c95da 100644 --- a/apps/user_webdavauth/l10n/uk.php +++ b/apps/user_webdavauth/l10n/uk.php @@ -1,5 +1,4 @@ "Аутентифікація WebDAV", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud надішле облікові дані на цей URL. Цей плагін перевірить відповідь і буде інтерпретувати HTTP коди 401 і 403 як повідомлення про недійсні повноваження, а решту відповідей як дійсні облікові дані." ); diff --git a/apps/user_webdavauth/l10n/vi.php b/apps/user_webdavauth/l10n/vi.php index ee2aa08912..53f1e1c420 100644 --- a/apps/user_webdavauth/l10n/vi.php +++ b/apps/user_webdavauth/l10n/vi.php @@ -1,5 +1,4 @@ "Xác thực WebDAV", -"URL: http://" => "URL: http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud sẽ gửi chứng thư người dùng tới URL này. Tính năng này kiểm tra trả lời và sẽ hiểu mã 401 và 403 của giao thức HTTP là chứng thư không hợp lệ, và mọi trả lời khác được coi là hợp lệ." ); diff --git a/apps/user_webdavauth/l10n/zh_CN.php b/apps/user_webdavauth/l10n/zh_CN.php index 72d2a0c11d..ee4b88c6b4 100644 --- a/apps/user_webdavauth/l10n/zh_CN.php +++ b/apps/user_webdavauth/l10n/zh_CN.php @@ -1,5 +1,5 @@ "WebDAV 认证", -"URL: http://" => "URL:http://", +"URL: " => "地址:", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud 将会发送用户的身份到此 URL。这个插件检查返回值并且将 HTTP 状态编码 401 和 403 解释为非法身份,其他所有返回值为合法身份。" ); diff --git a/apps/user_webdavauth/l10n/zh_TW.php b/apps/user_webdavauth/l10n/zh_TW.php index 6f94b77ac5..32166b0475 100644 --- a/apps/user_webdavauth/l10n/zh_TW.php +++ b/apps/user_webdavauth/l10n/zh_TW.php @@ -1,5 +1,4 @@ "WebDAV 認證", -"URL: http://" => "網址:http://", "ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud 會將把用戶的登入資訊發送到這個網址以嘗試登入,並檢查回應, HTTP 狀態碼401和403視為登入失敗,所有其他回應視為登入成功。" ); diff --git a/apps/user_webdavauth/templates/settings.php b/apps/user_webdavauth/templates/settings.php index ec6524ee4f..e199c32675 100755 --- a/apps/user_webdavauth/templates/settings.php +++ b/apps/user_webdavauth/templates/settings.php @@ -1,7 +1,7 @@
t('WebDAV Authentication'));?> -

+


t('ownCloud will send the user credentials to this URL. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials.')); ?> diff --git a/apps/user_webdavauth/user_webdavauth.php b/apps/user_webdavauth/user_webdavauth.php index 6417e45434..86e5b916f3 100755 --- a/apps/user_webdavauth/user_webdavauth.php +++ b/apps/user_webdavauth/user_webdavauth.php @@ -41,19 +41,25 @@ class OC_USER_WEBDAVAUTH extends OC_User_Backend { } public function checkPassword( $uid, $password ) { - $url= 'http://'.urlencode($uid).':'.urlencode($password).'@'.$this->webdavauth_url; + $arr = explode('://', $this->webdavauth_url, 2); + if( ! isset($arr) OR count($arr) !== 2) { + OC_Log::write('OC_USER_WEBDAVAUTH', 'Invalid Url: "'.$this->webdavauth_url.'" ', 3); + return false; + } + list($webdavauth_protocol, $webdavauth_url_path) = $arr; + $url= $webdavauth_protocol.'://'.urlencode($uid).':'.urlencode($password).'@'.$webdavauth_url_path; $headers = get_headers($url); if($headers==false) { - OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to connect to WebDAV Url: "'.$this->webdavauth_url.'" ', 3); + OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to connect to WebDAV Url: "'.$webdavauth_protocol.'://'.$webdavauth_url_path.'" ', 3); return false; } $returncode= substr($headers[0], 9, 3); - if(($returncode=='401') or ($returncode=='403')) { - return(false); - }else{ - return($uid); + if(substr($returncode, 0, 1) === '2') { + return $uid; + } else { + return false; } } diff --git a/autotest.sh b/autotest.sh index 4562b3ed08..141b4333f9 100755 --- a/autotest.sh +++ b/autotest.sh @@ -132,9 +132,9 @@ EOF php -f enable_all.php if [ "$1" == "sqlite" ] ; then # coverage only with sqlite - causes segfault on ci.tmit.eu - reason unknown - phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml --coverage-clover autotest-clover-$1.xml --coverage-html coverage-html-$1 + phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml --coverage-clover autotest-clover-$1.xml --coverage-html coverage-html-$1 $2 $3 else - phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml + phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml $2 $3 fi } @@ -143,13 +143,12 @@ EOF # if [ -z "$1" ] then - execute_tests "sqlite" + execute_tests 'sqlite' execute_tests 'mysql' execute_tests 'pgsql' - # we will add oci as soon as it's stable - #execute_tests 'oci' + execute_tests 'oci' else - execute_tests $1 + execute_tests $1 $2 $3 fi # diff --git a/config/config.sample.php b/config/config.sample.php index 7283400920..dfa29f329c 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -145,6 +145,9 @@ $CONFIG = array( /* Lifetime of the remember login cookie, default is 15 days */ "remember_login_cookie_lifetime" => 60*60*24*15, +/* Life time of a session after inactivity */ +"session_lifetime" => 60 * 60 * 24, + /* Custom CSP policy, changing this will overwrite the standard policy */ "custom_csp_policy" => "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src *; img-src *; font-src 'self' data:; media-src *", diff --git a/core/ajax/share.php b/core/ajax/share.php index 5854b65aa0..bdcb61284e 100644 --- a/core/ajax/share.php +++ b/core/ajax/share.php @@ -94,23 +94,28 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo $l = OC_L10N::get('core'); // setup the email - $subject = (string)$l->t('User %s shared a file with you', $displayName); - if ($type === 'folder') - $subject = (string)$l->t('User %s shared a folder with you', $displayName); + $subject = (string)$l->t('%s shared »%s« with you', array($displayName, $file)); - $text = (string)$l->t('User %s shared the file "%s" with you. It is available for download here: %s', - array($displayName, $file, $link)); - if ($type === 'folder') - $text = (string)$l->t('User %s shared the folder "%s" with you. It is available for download here: %s', - array($displayName, $file, $link)); + $content = new OC_Template("core", "mail", ""); + $content->assign ('link', $link); + $content->assign ('type', $type); + $content->assign ('user_displayname', $displayName); + $content->assign ('filename', $file); + $text = $content->fetchPage(); + $content = new OC_Template("core", "altmail", ""); + $content->assign ('link', $link); + $content->assign ('type', $type); + $content->assign ('user_displayname', $displayName); + $content->assign ('filename', $file); + $alttext = $content->fetchPage(); $default_from = OCP\Util::getDefaultEmailAddress('sharing-noreply'); $from_address = OCP\Config::getUserValue($user, 'settings', 'email', $default_from ); // send it out now try { - OCP\Util::sendMail($to_address, $to_address, $subject, $text, $from_address, $displayName); + OCP\Util::sendMail($to_address, $to_address, $subject, $text, $from_address, $displayName, 1, $alttext); OCP\JSON::success(); } catch (Exception $exception) { OCP\JSON::error(array('data' => array('message' => OC_Util::sanitizeHTML($exception->getMessage())))); diff --git a/core/ajax/update.php b/core/ajax/update.php index 6015a901eb..43ed75b07f 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -4,108 +4,34 @@ $RUNTIME_NOAPPS = true; require_once '../../lib/base.php'; if (OC::checkUpgrade(false)) { - \OC_DB::enableCaching(false); - $updateEventSource = new OC_EventSource(); - $watcher = new UpdateWatcher($updateEventSource); - OC_Hook::connect('update', 'success', $watcher, 'success'); - OC_Hook::connect('update', 'error', $watcher, 'error'); - OC_Hook::connect('update', 'error', $watcher, 'failure'); - $watcher->success('Turned on maintenance mode'); - try { - $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml'); - $watcher->success('Updated database'); - - // do a file cache upgrade for users with files - // this can take loooooooooooooooooooooooong - __doFileCacheUpgrade($watcher); - } catch (Exception $exception) { - $watcher->failure($exception->getMessage()); - } - OC_Config::setValue('version', implode('.', OC_Util::getVersion())); - OC_App::checkAppsRequirements(); - // load all apps to also upgrade enabled apps - OC_App::loadApps(); - OC_Config::setValue('maintenance', false); - $watcher->success('Turned off maintenance mode'); - $watcher->done(); -} - -/** - * The FileCache Upgrade routine - * - * @param UpdateWatcher $watcher - */ -function __doFileCacheUpgrade($watcher) { - try { - $query = \OC_DB::prepare(' - SELECT DISTINCT `user` - FROM `*PREFIX*fscache` - '); - $result = $query->execute(); - } catch (\Exception $e) { - return; - } - $users = $result->fetchAll(); - if(count($users) == 0) { - return; - } - $step = 100 / count($users); - $percentCompleted = 0; - $lastPercentCompletedOutput = 0; - $startInfoShown = false; - foreach($users as $userRow) { - $user = $userRow['user']; - \OC\Files\Filesystem::initMountPoints($user); - \OC\Files\Cache\Upgrade::doSilentUpgrade($user); - if(!$startInfoShown) { - //We show it only now, because otherwise Info about upgraded apps - //will appear between this and progress info - $watcher->success('Updating filecache, this may take really long...'); - $startInfoShown = true; - } - $percentCompleted += $step; - $out = floor($percentCompleted); - if($out != $lastPercentCompletedOutput) { - $watcher->success('... '. $out.'% done ...'); - $lastPercentCompletedOutput = $out; - } - } - $watcher->success('Updated filecache'); -} - -class UpdateWatcher { - /** - * @var \OC_EventSource $eventSource; - */ - private $eventSource; - - public function __construct($eventSource) { - $this->eventSource = $eventSource; - } - - public function success($message) { - OC_Util::obEnd(); - $this->eventSource->send('success', $message); - ob_start(); - } - - public function error($message) { - OC_Util::obEnd(); - $this->eventSource->send('error', $message); - ob_start(); - } - - public function failure($message) { - OC_Util::obEnd(); - $this->eventSource->send('failure', $message); - $this->eventSource->close(); - die(); - } - - public function done() { - OC_Util::obEnd(); - $this->eventSource->send('done', ''); - $this->eventSource->close(); - } + $eventSource = new OC_EventSource(); + $updater = new \OC\Updater(\OC_Log::$object); + $updater->listen('\OC\Updater', 'maintenanceStart', function () use ($eventSource) { + $eventSource->send('success', 'Turned on maintenance mode'); + }); + $updater->listen('\OC\Updater', 'maintenanceEnd', function () use ($eventSource) { + $eventSource->send('success', 'Turned off maintenance mode'); + }); + $updater->listen('\OC\Updater', 'dbUpgrade', function () use ($eventSource) { + $eventSource->send('success', 'Updated database'); + }); + $updater->listen('\OC\Updater', 'filecacheStart', function () use ($eventSource) { + $eventSource->send('success', 'Updating filecache, this may take really long...'); + }); + $updater->listen('\OC\Updater', 'filecacheDone', function () use ($eventSource) { + $eventSource->send('success', 'Updated filecache'); + }); + $updater->listen('\OC\Updater', 'filecacheProgress', function ($out) use ($eventSource) { + $eventSource->send('success', '... ' . $out . '% done ...'); + }); + $updater->listen('\OC\Updater', 'failure', function ($message) use ($eventSource) { + $eventSource->send('failure', $message); + $eventSource->close(); + OC_Config::setValue('maintenance', false); + }); + $updater->upgrade(); + + $eventSource->send('done', ''); + $eventSource->close(); } diff --git a/core/css/jquery.multiselect.css b/core/css/jquery.multiselect.css index 156799f086..898786a615 100644 --- a/core/css/jquery.multiselect.css +++ b/core/css/jquery.multiselect.css @@ -11,7 +11,7 @@ .ui-multiselect-header span.ui-icon { float:left } .ui-multiselect-header li.ui-multiselect-close { float:right; text-align:right; padding-right:0 } -.ui-multiselect-menu { display:none; padding:3px; position:absolute; z-index:10000 } +.ui-multiselect-menu { display:none; padding:3px; position:absolute; z-index:10000; text-align: left } .ui-multiselect-checkboxes { position:relative /* fixes bug in IE6/7 */; overflow-y:scroll } .ui-multiselect-checkboxes label { cursor:default; display:block; border:1px solid transparent; padding:3px 1px } .ui-multiselect-checkboxes label input { position:relative; top:1px } diff --git a/core/css/jquery.ocdialog.css b/core/css/jquery.ocdialog.css new file mode 100644 index 0000000000..aa72eaf847 --- /dev/null +++ b/core/css/jquery.ocdialog.css @@ -0,0 +1,48 @@ +.oc-dialog { + background: white; + color: #333333; + border-radius: 3px; box-shadow: 0 0 7px #888888; + padding: 15px; + z-index: 1000; + font-size: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + min-width: 200px; +} +.oc-dialog-title { + background: white; + font-weight: bold; + font-size: 110%; + margin-bottom: 10px; +} +.oc-dialog-content { + z-index: 1000; + background: white; +} +.oc-dialog-separator { +} +.oc-dialog-buttonrow { + background: white; + float: right; + position: relative; + bottom: 0; + display: block; + margin-top: 10px; +} + +.oc-dialog-close { + position:absolute; + top:7px; right:7px; + height:20px; width:20px; + background:url('../img/actions/close.svg') no-repeat center; +} + +.oc-dialog-dim { + background-color: #000; + opacity: .20;filter:Alpha(Opacity=20); + z-index: 999; + position: absolute; + top: 0; left: 0; + width: 100%; height: 100%; +} diff --git a/core/css/multiselect.css b/core/css/multiselect.css index def4e60d74..a2d1b20d3a 100644 --- a/core/css/multiselect.css +++ b/core/css/multiselect.css @@ -1,84 +1,105 @@ -/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net - This file is licensed under the Affero General Public License version 3 or later. - See the COPYING-README file. */ +/* Copyright (c) 2011, Jan-Christoph Borchardt, http: //jancborchardt.net +This file is licensed under the Affero General Public License version 3 or later. +See the COPYING-README file. */ - ul.multiselectoptions { - background-color:#fff; - border:1px solid #ddd; - border-top:none; - box-shadow:0 1px 1px #ddd; - padding-top:.5em; - position:absolute; - max-height: 20em; - overflow-y: auto; - z-index:49; - } +ul.multiselectoptions { + background-color: #fff; + border: 1px solid #ddd; + border-top: none; + box-shadow: 0 1px 1px #ddd; + padding-top: .5em; + position: absolute; + max-height: 20em; + overflow-y: auto; + z-index: 49; +} - ul.multiselectoptions.down { - border-bottom-left-radius:.5em; - border-bottom-right-radius:.5em; - } +ul.multiselectoptions.down { + border-bottom-left-radius: .5em; + border-bottom-right-radius: .5em; + width: 100%; /* do not cut off group names */ + -webkit-box-shadow: 0px 0px 20px rgba(29,45,68,.4); + -moz-box-shadow: 0px 0px 20px rgba(29,45,68,.4); + box-shadow: 0px 0px 20px rgba(29,45,68,.4); +} - ul.multiselectoptions.up { - border-top-left-radius:.5em; - border-top-right-radius:.5em; - } +ul.multiselectoptions.up { + border-top-left-radius: .5em; + border-top-right-radius: .5em; +} - ul.multiselectoptions>li { - overflow:hidden; - white-space:nowrap; - } +ul.multiselectoptions>li { + overflow: hidden; + white-space: nowrap; +} - ul.multiselectoptions>li>input[type="checkbox"] { - margin-top: 3px; - margin-right: 5px; - margin-left: 3px; - } +ul.multiselectoptions > li > input[type="checkbox"] { + margin: 10px 7px; + vertical-align: middle; +} +ul.multiselectoptions > li input[type='checkbox']+label { + font-weight: normal; + display: inline-block; + width: 100%; + padding: 5px 27px; + margin-left: -27px; /* to have area around checkbox clickable as well */ +} +ul.multiselectoptions > li input[type='checkbox']:checked+label { + font-weight: bold; +} - div.multiselect { - display:inline-block; - max-width:400px; - min-width:100px; - padding-right:.6em; - position:relative; - vertical-align:bottom; - } +div.multiselect { + display: inline-block; + max-width: 400px; + min-width: 150px; + padding-right: .6em; + position: relative; + vertical-align: bottom; +} - div.multiselect.active { - background-color:#fff; - position:relative; - z-index:50; - } +div.multiselect.active { + background-color: #fff; + position: relative; + z-index: 50; +} - div.multiselect.up { - border-top:0 none; - border-top-left-radius:0; - border-top-right-radius:0; - } +div.multiselect.up { + border-top: 0 none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} - div.multiselect.down { - border-bottom:none; - border-bottom-left-radius:0; - border-bottom-right-radius:0; - } +div.multiselect.down { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} - div.multiselect>span:first-child { - float:left; - margin-right:2em; - overflow:hidden; - text-overflow:ellipsis; - width:90%; - } +div.multiselect>span:first-child { + float: left; + margin-right: 2em; + overflow: hidden; + text-overflow: ellipsis; + width: 90%; +} - div.multiselect>span:last-child { - position:absolute; - right:.8em; - } +div.multiselect>span:last-child { + position: absolute; + right: .8em; +} - ul.multiselectoptions input.new { - border-top-left-radius:0; - border-top-right-radius:0; - padding-bottom:.2em; - padding-top:.2em; - margin:0; - } +ul.multiselectoptions input.new { + padding-bottom: .2em; + padding-top: .2em; + margin: 0; +} + +ul.multiselectoptions > li.creator { + padding: 10px; + font-weight: bold; +} +ul.multiselectoptions > li.creator > input { + width: 95% !important; /* do not constrain size of text input */ + padding: 5px; + margin: -5px; +} diff --git a/core/css/styles.css b/core/css/styles.css index 70a840d689..ca2d082eb3 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -37,7 +37,7 @@ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', endC /* INPUTS */ -input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], +input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"], textarea, select, button, .button, #quota, div.jp-progress, .pager li a { @@ -48,11 +48,11 @@ button, .button, -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } input[type="hidden"] { height:0; width:0; } -input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], textarea { +input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"], textarea { background:#f8f8f8; color:#555; cursor:text; font-family: inherit; /* use default ownCloud font instead of default textarea monospace */ } -input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"] { +input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"] { -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; } @@ -61,6 +61,7 @@ input[type="password"]:hover, input[type="password"]:focus, input[type="password input[type="number"]:hover, input[type="number"]:focus, input[type="number"]:active, .searchbox input[type="search"]:hover, .searchbox input[type="search"]:focus, .searchbox input[type="search"]:active, input[type="email"]:hover, input[type="email"]:focus, input[type="email"]:active, +input[type="url"]:hover, input[type="url"]:focus, input[type="url"]:active, textarea:hover, textarea:focus, textarea:active { background-color:#fff; color:#333; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; @@ -140,7 +141,7 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b padding:0 70px 0 0.5em; margin:0; -moz-box-sizing:border-box; box-sizing:border-box; -moz-box-shadow:0 -3px 7px #000; -webkit-box-shadow:0 -3px 7px #000; box-shadow:0 -3px 7px #000; - background:#f7f7f7; border-bottom:1px solid #eee; z-index:50; + background:#eee; border-bottom:1px solid #e7e7e7; z-index:50; } #controls .button { display:inline-block; } @@ -354,14 +355,27 @@ tr .action { width:16px; height:16px; } tr:hover .action:hover, .selectedActions a:hover, .header-action:hover { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } tbody tr:hover, tr:active { background-color:#f8f8f8; } -#body-settings .personalblock, #body-settings .helpblock { padding:.5em 1em; margin:1em; background:#f8f8f8; color:#555; text-shadow:#fff 0 1px 0; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } +#body-settings .personalblock, #body-settings .helpblock { + padding: .5em 1em; + margin: 1em; + background-color: rgb(240,240,240); + color: #555; + text-shadow: #fff 0 1px 0; + -moz-border-radius: .5em; -webkit-border-radius: .5em; border-radius: .5em; +} #body-settings .personalblock#quota { position:relative; padding:0; } #body-settings #controls+.helpblock { position:relative; margin-top:3em; } .personalblock > legend { margin-top:2em; } .personalblock > legend, th, dt, label { font-weight:bold; } code { font-family:"Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", monospace; } -#quota div, div.jp-play-bar, div.jp-seek-bar { padding:0; background:#e6e6e6; font-weight:normal; white-space:nowrap; -moz-border-radius-bottomleft:.4em; -webkit-border-bottom-left-radius:.4em; border-bottom-left-radius:.4em; -moz-border-radius-topleft:.4em; -webkit-border-top-left-radius:.4em; border-top-left-radius:.4em; } +#quota div, div.jp-play-bar, div.jp-seek-bar { + padding: 0; + background-color: rgb(220,220,220); + font-weight: normal; + white-space: nowrap; + -moz-border-radius-bottomleft: .4em; -webkit-border-bottom-left-radius: .4em; border-bottom-left-radius:.4em; + -moz-border-radius-topleft: .4em; -webkit-border-top-left-radius: .4em; border-top-left-radius: .4em; } #quotatext {padding:.6em 1em;} div.jp-play-bar, div.jp-seek-bar { padding:0; } @@ -391,13 +405,24 @@ a.bookmarklet { background-color:#ddd; border:1px solid #ccc; padding:5px;paddin #oc-dialog-filepicker-content .dirtree span:not(:last-child) { cursor: pointer; } #oc-dialog-filepicker-content .dirtree span:last-child { font-weight: bold; } #oc-dialog-filepicker-content .dirtree span:not(:last-child)::after { content: '>'; padding: 3px;} -#oc-dialog-filepicker-content .filelist {height:270px; overflow-y:auto; background-color:white; width:100%;} +#oc-dialog-filepicker-content .filelist { + overflow-y:auto; + max-height: 300px; + background-color:white; + width:100%; +} #oc-dialog-filepicker-content .filelist img { margin: 2px 1em 0 4px; } #oc-dialog-filepicker-content .filelist .date { float:right;margin-right:1em; } #oc-dialog-filepicker-content .filepicker_element_selected { background-color:lightblue;} .ui-dialog {position:fixed !important;} span.ui-icon {float: left; margin: 3px 7px 30px 0;} + .loading { background: url('../img/loading.gif') no-repeat center; cursor: wait; } +.move2trash { /* decrease spinner size */ + width: 16px; + height: 16px; +} + /* ---- CATEGORIES ---- */ #categoryform .scrollarea { position:absolute; left:10px; top:10px; right:10px; bottom:50px; overflow:auto; border:1px solid #ddd; background:#f8f8f8; } @@ -412,7 +437,7 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;} .popup { background-color:white; border-radius:10px 10px 10px 10px; box-shadow:0 0 20px #888; color:#333; padding:10px; position:fixed !important; z-index:200; } .popup.topright { top:7em; right:1em; } .popup.bottomleft { bottom:1em; left:33em; } -.popup .close { position:absolute; top:0.2em; right:0.2em; height:20px; width:20px; background:url('../img/actions/delete.svg') no-repeat center; } +.popup .close { position:absolute; top:0.2em; right:0.2em; height:20px; width:20px; background:url('../img/actions/close.svg') no-repeat center; } .popup h2 { font-weight:bold; font-size:1.2em; } .arrow { border-bottom:10px solid white; border-left:10px solid transparent; border-right:10px solid transparent; display:block; height:0; position:absolute; width:0; z-index:201; } .arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); } @@ -421,12 +446,22 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;} .help-includes {overflow: hidden; width: 100%; height: 100%; -moz-box-sizing: border-box; box-sizing: border-box; padding-top: 2.8em; } .help-iframe {width: 100%; height: 100%; margin: 0;padding: 0; border: 0; overflow: auto;} + /* ---- BREADCRUMB ---- */ div.crumb { float:left; display:block; background:url('../img/breadcrumb.svg') no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; -moz-box-sizing:border-box; box-sizing:border-box; } div.crumb:first-child { padding:10px 20px 10px 5px; } div.crumb.last { font-weight:bold; background:none; padding-right:10px; } div.crumb a{ padding: 0.9em 0 0.7em 0; } +/* some feedback for hover/tap on breadcrumbs */ +div.crumb:hover, +div.crumb:focus, +div.crumb:active { + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter:alpha(opacity=70); + opacity:.7; +} + /* ---- APP STYLING ---- */ @@ -626,12 +661,19 @@ div.crumb a{ padding: 0.9em 0 0.7em 0; } /* icons */ .folder-icon { background-image: url('../img/places/folder.svg'); } .delete-icon { background-image: url('../img/actions/delete.svg'); } -.delete-icon:hover { background-image: url('../img/actions/delete-hover.svg'); } .edit-icon { background-image: url('../img/actions/rename.svg'); } /* buttons */ button.loading { background-image: url('../img/loading.gif'); background-position: right 10px center; background-repeat: no-repeat; + background-size: 16px; padding-right: 30px; } + + + +/* ---- BROWSER-SPECIFIC FIXES ---- */ +::-moz-focus-inner { + border: 0; /* remove dotted outlines in Firefox */ +} diff --git a/core/img/actions/add.png b/core/img/actions/add.png index 25d472b2dc..1aac02b845 100644 Binary files a/core/img/actions/add.png and b/core/img/actions/add.png differ diff --git a/core/img/actions/add.svg b/core/img/actions/add.svg index 136d6c4b31..250746e166 100644 --- a/core/img/actions/add.svg +++ b/core/img/actions/add.svg @@ -1,10 +1,6 @@ - - - - - - - - + + + + diff --git a/core/img/actions/delete-hover.png b/core/img/actions/delete-hover.png deleted file mode 100644 index 048d91cee5..0000000000 Binary files a/core/img/actions/delete-hover.png and /dev/null differ diff --git a/core/img/actions/delete-hover.svg b/core/img/actions/delete-hover.svg deleted file mode 100644 index 3e8d26c978..0000000000 --- a/core/img/actions/delete-hover.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/core/img/actions/delete.png b/core/img/actions/delete.png index fa8e18183e..99f549faf9 100644 Binary files a/core/img/actions/delete.png and b/core/img/actions/delete.png differ diff --git a/core/img/actions/delete.svg b/core/img/actions/delete.svg index ef564bfd48..568185c5c7 100644 --- a/core/img/actions/delete.svg +++ b/core/img/actions/delete.svg @@ -1,6 +1,12 @@ - - - - + + + + image/svg+xml + + + + + + diff --git a/core/img/actions/lock.png b/core/img/actions/lock.png index dbcffa3990..f3121811ea 100644 Binary files a/core/img/actions/lock.png and b/core/img/actions/lock.png differ diff --git a/core/img/actions/mail.png b/core/img/actions/mail.png index 8e884fbc0e..be6142444a 100644 Binary files a/core/img/actions/mail.png and b/core/img/actions/mail.png differ diff --git a/core/img/actions/mail.svg b/core/img/actions/mail.svg index 2c63daac03..c01f2c113e 100644 --- a/core/img/actions/mail.svg +++ b/core/img/actions/mail.svg @@ -1,8 +1,4 @@ - - - - - - + + diff --git a/core/img/actions/undelete.png b/core/img/actions/undelete.png deleted file mode 100644 index d712527ef6..0000000000 Binary files a/core/img/actions/undelete.png and /dev/null differ diff --git a/core/img/loader.gif b/core/img/loader.gif deleted file mode 100644 index e192ca895c..0000000000 Binary files a/core/img/loader.gif and /dev/null differ diff --git a/core/img/loading-dark.gif b/core/img/loading-dark.gif index 5fe86acabc..13f0f64eab 100644 Binary files a/core/img/loading-dark.gif and b/core/img/loading-dark.gif differ diff --git a/core/img/loading.gif b/core/img/loading.gif index 5b33f7e54f..f8f3dff6fb 100644 Binary files a/core/img/loading.gif and b/core/img/loading.gif differ diff --git a/core/img/logo-mail.gif b/core/img/logo-mail.gif new file mode 100644 index 0000000000..6a1caaa918 Binary files /dev/null and b/core/img/logo-mail.gif differ diff --git a/core/img/remoteStorage-big.png b/core/img/remoteStorage-big.png deleted file mode 100644 index 7e76e21209..0000000000 Binary files a/core/img/remoteStorage-big.png and /dev/null differ diff --git a/core/img/weather-clear.png b/core/img/weather-clear.png deleted file mode 100644 index 0acf7a9b2a..0000000000 Binary files a/core/img/weather-clear.png and /dev/null differ diff --git a/core/js/config.php b/core/js/config.php index 53a8fb9638..dd46f7889d 100644 --- a/core/js/config.php +++ b/core/js/config.php @@ -26,8 +26,6 @@ $array = array( "oc_debug" => (defined('DEBUG') && DEBUG) ? 'true' : 'false', "oc_webroot" => "\"".OC::$WEBROOT."\"", "oc_appswebroots" => str_replace('\\/', '/', json_encode($apps_paths)), // Ugly unescape slashes waiting for better solution - "oc_current_user" => "document.getElementsByTagName('head')[0].getAttribute('data-user')", - "oc_requesttoken" => "document.getElementsByTagName('head')[0].getAttribute('data-requesttoken')", "datepickerFormatDate" => json_encode($l->l('jsdate', 'jsdate')), "dayNames" => json_encode( array( diff --git a/core/js/eventsource.js b/core/js/eventsource.js index ce8c8387c8..536b180bc8 100644 --- a/core/js/eventsource.js +++ b/core/js/eventsource.js @@ -110,7 +110,11 @@ OC.EventSource.prototype={ this.listeners[type].push(callback); }else{ this.source.addEventListener(type,function(e){ - callback(JSON.parse(e.data)); + if (typeof e.data != 'undefined') { + callback(JSON.parse(e.data)); + } else { + callback(''); + } },false); } }else{ diff --git a/core/js/jquery.multiselect.js b/core/js/jquery.multiselect.js index 46aab7ebf0..16ae426417 100644 --- a/core/js/jquery.multiselect.js +++ b/core/js/jquery.multiselect.js @@ -1,6 +1,7 @@ +/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ /* - * jQuery MultiSelect UI Widget 1.11 - * Copyright (c) 2011 Eric Hynds + * jQuery MultiSelect UI Widget 1.13 + * Copyright (c) 2012 Eric Hynds * * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ * @@ -34,8 +35,8 @@ $.widget("ech.multiselect", { noneSelectedText: 'Select options', selectedText: '# selected', selectedList: 0, - show: '', - hide: '', + show: null, + hide: null, autoOpen: false, multiple: true, position: {} @@ -62,7 +63,7 @@ $.widget("ech.multiselect", { menu = (this.menu = $('

')) .addClass('ui-multiselect-menu ui-widget ui-widget-content ui-corner-all') .addClass( o.classes ) - .insertAfter( button ), + .appendTo( document.body ), header = (this.header = $('
')) .addClass('ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix') @@ -119,70 +120,72 @@ $.widget("ech.multiselect", { menu = this.menu, checkboxContainer = this.checkboxContainer, optgroups = [], - html = [], + html = "", id = el.attr('id') || multiselectID++; // unique ID for the label & option tags // build items - this.element.find('option').each(function( i ){ + el.find('option').each(function( i ){ var $this = $(this), parent = this.parentNode, title = this.innerHTML, description = this.title, value = this.value, - inputID = this.id || 'ui-multiselect-'+id+'-option-'+i, + inputID = 'ui-multiselect-' + (this.id || id + '-option-' + i), isDisabled = this.disabled, isSelected = this.selected, - labelClasses = ['ui-corner-all'], + labelClasses = [ 'ui-corner-all' ], + liClasses = (isDisabled ? 'ui-multiselect-disabled ' : ' ') + this.className, optLabel; // is this an optgroup? - if( parent.tagName.toLowerCase() === 'optgroup' ){ - optLabel = parent.getAttribute('label'); + if( parent.tagName === 'OPTGROUP' ){ + optLabel = parent.getAttribute( 'label' ); // has this optgroup been added already? if( $.inArray(optLabel, optgroups) === -1 ){ - html.push('
  • ' + optLabel + '
  • '); + html += '
  • ' + optLabel + '
  • '; optgroups.push( optLabel ); } } if( isDisabled ){ - labelClasses.push('ui-state-disabled'); + labelClasses.push( 'ui-state-disabled' ); } // browsers automatically select the first option // by default with single selects if( isSelected && !o.multiple ){ - labelClasses.push('ui-state-active'); + labelClasses.push( 'ui-state-active' ); } - html.push('
  • '); + html += '
  • '; // create the label - html.push('
  • '); + html += ' />' + title + ''; }); // insert into the DOM - checkboxContainer.html( html.join('') ); + checkboxContainer.html( html ); // cache some moar useful elements this.labels = menu.find('label'); + this.inputs = this.labels.children('input'); // set widths this._setButtonWidth(); @@ -197,10 +200,10 @@ $.widget("ech.multiselect", { } }, - // updates the button text. call refresh() to rebuild + // updates the button text. call refresh() to rebuild update: function(){ var o = this.options, - $inputs = this.labels.find('input'), + $inputs = this.inputs, $checked = $inputs.filter(':checked'), numChecked = $checked.length, value; @@ -211,7 +214,7 @@ $.widget("ech.multiselect", { if($.isFunction( o.selectedText )){ value = o.selectedText.call(this, numChecked, $inputs.length, $checked.get()); } else if( /\d/.test(o.selectedList) && o.selectedList > 0 && numChecked <= o.selectedList){ - value = $checked.map(function(){ return this.title; }).get().join(', '); + value = $checked.map(function(){ return $(this).next().html(); }).get().join(', '); } else { value = o.selectedText.replace('#', numChecked).replace('#', $inputs.length); } @@ -291,8 +294,8 @@ $.widget("ech.multiselect", { var $this = $(this), $inputs = $this.parent().nextUntil('li.ui-multiselect-optgroup-label').find('input:visible:not(:disabled)'), - nodes = $inputs.get(), - label = $this.parent().text(); + nodes = $inputs.get(), + label = $this.parent().text(); // trigger event and bail if the return is false if( self._trigger('beforeoptgrouptoggle', e, { inputs:nodes, label:label }) === false ){ @@ -343,11 +346,15 @@ $.widget("ech.multiselect", { tags = self.element.find('option'); // bail if this input is disabled or the event is cancelled - if( this.disabled || self._trigger('click', e, { value:val, text:this.title, checked:checked }) === false ){ + if( this.disabled || self._trigger('click', e, { value: val, text: this.title, checked: checked }) === false ){ e.preventDefault(); return; } + // make sure the input has focus. otherwise, the esc key + // won't close the menu after clicking an item. + $this.focus(); + // toggle aria state $this.attr('aria-selected', checked); @@ -389,7 +396,7 @@ $.widget("ech.multiselect", { // handler fires before the form is actually reset. delaying it a bit // gives the form inputs time to clear. $(this.element[0].form).bind('reset.multiselect', function(){ - setTimeout(function(){ self.update(); }, 10); + setTimeout($.proxy(self.refresh, self), 10); }); }, @@ -428,7 +435,7 @@ $.widget("ech.multiselect", { // if at the first/last element if( !$next.length ){ - var $container = this.menu.find('ul:last'); + var $container = this.menu.find('ul').last(); // move to the first/last this.menu.find('label')[ moveToLast ? 'last' : 'first' ]().trigger('mouseover'); @@ -445,27 +452,29 @@ $.widget("ech.multiselect", { // other related attributes of a checkbox. // // The context of this function should be a checkbox; do not proxy it. - _toggleCheckbox: function( prop, flag ){ + _toggleState: function( prop, flag ){ return function(){ - !this.disabled && (this[ prop ] = flag); + if( !this.disabled ) { + this[ prop ] = flag; + } if( flag ){ this.setAttribute('aria-selected', true); } else { this.removeAttribute('aria-selected'); } - } + }; }, _toggleChecked: function( flag, group ){ - var $inputs = (group && group.length) ? - group : - this.labels.find('input'), - + var $inputs = (group && group.length) ? group : this.inputs, self = this; // toggle state on inputs - $inputs.each(this._toggleCheckbox('checked', flag)); + $inputs.each(this._toggleState('checked', flag)); + + // give the first input focus + $inputs.eq(0).focus(); // update button text this.update(); @@ -480,7 +489,7 @@ $.widget("ech.multiselect", { .find('option') .each(function(){ if( !this.disabled && $.inArray(this.value, values) > -1 ){ - self._toggleCheckbox('selected', flag).call( this ); + self._toggleState('selected', flag).call( this ); } }); @@ -494,9 +503,22 @@ $.widget("ech.multiselect", { this.button .attr({ 'disabled':flag, 'aria-disabled':flag })[ flag ? 'addClass' : 'removeClass' ]('ui-state-disabled'); - this.menu - .find('input') - .attr({ 'disabled':flag, 'aria-disabled':flag }) + var inputs = this.menu.find('input'); + var key = "ech-multiselect-disabled"; + + if(flag) { + // remember which elements this widget disabled (not pre-disabled) + // elements, so that they can be restored if the widget is re-enabled. + inputs = inputs.filter(':enabled') + .data(key, true) + } else { + inputs = inputs.filter(function() { + return $.data(this, key) === true; + }).removeData(key); + } + + inputs + .attr({ 'disabled':flag, 'arial-disabled':flag }) .parent()[ flag ? 'addClass' : 'removeClass' ]('ui-state-disabled'); this.element @@ -509,16 +531,17 @@ $.widget("ech.multiselect", { button = this.button, menu = this.menu, speed = this.speed, - o = this.options; + o = this.options, + args = []; // bail if the multiselectopen event returns false, this widget is disabled, or is already open if( this._trigger('beforeopen') === false || button.hasClass('ui-state-disabled') || this._isOpen ){ return; } - var $container = menu.find('ul:last'), + var $container = menu.find('ul').last(), effect = o.show, - pos = button.position(); + pos = button.offset(); // figure out opening effects/speeds if( $.isArray(o.show) ){ @@ -526,6 +549,12 @@ $.widget("ech.multiselect", { speed = o.show[1] || self.speed; } + // if there's an effect, assume jQuery UI is in use + // build the arguments to pass to show() + if( effect ) { + args = [ effect, speed ]; + } + // set the scroll of the checkbox container $container.scrollTop(0).height(o.height); @@ -536,17 +565,19 @@ $.widget("ech.multiselect", { menu .show() .position( o.position ) - .hide() - .show( effect, speed ); + .hide(); // if position utility is not available... } else { menu.css({ - top: pos.top+button.outerHeight(), + top: pos.top + button.outerHeight(), left: pos.left - }).show( effect, speed ); + }); } + // show the menu, maybe with a speed/effect combo + $.fn.show.apply(menu, args); + // select the first option // triggering both mouseover and mouseover because 1.4.2+ has a bug where triggering mouseover // will actually trigger mouseenter. the mouseenter trigger is there for when it's eventually fixed @@ -563,7 +594,10 @@ $.widget("ech.multiselect", { return; } - var o = this.options, effect = o.hide, speed = this.speed; + var o = this.options, + effect = o.hide, + speed = this.speed, + args = []; // figure out opening effects/speeds if( $.isArray(o.hide) ){ @@ -571,7 +605,11 @@ $.widget("ech.multiselect", { speed = o.hide[1] || this.speed; } - this.menu.hide(effect, speed); + if( effect ) { + args = [ effect, speed ]; + } + + $.fn.hide.apply(this.menu, args); this.button.removeClass('ui-state-active').trigger('blur').trigger('mouseleave'); this._isOpen = false; this._trigger('close'); @@ -618,6 +656,10 @@ $.widget("ech.multiselect", { return this.menu; }, + getButton: function(){ + return this.button; + }, + // react to option changes after initialization _setOption: function( key, value ){ var menu = this.menu; @@ -633,7 +675,7 @@ $.widget("ech.multiselect", { menu.find('a.ui-multiselect-none span').eq(-1).text(value); break; case 'height': - menu.find('ul:last').height( parseInt(value,10) ); + menu.find('ul').last().height( parseInt(value,10) ); break; case 'minWidth': this.options[ key ] = parseInt(value,10); @@ -649,6 +691,11 @@ $.widget("ech.multiselect", { case 'classes': menu.add(this.button).removeClass(this.options.classes).addClass(value); break; + case 'multiple': + menu.toggleClass('ui-multiselect-single', !value); + this.options.multiple = value; + this.element[0].multiple = value; + this.refresh(); } $.Widget.prototype._setOption.apply( this, arguments ); diff --git a/core/js/jquery.ocdialog.js b/core/js/jquery.ocdialog.js new file mode 100644 index 0000000000..7413927e3b --- /dev/null +++ b/core/js/jquery.ocdialog.js @@ -0,0 +1,217 @@ +(function($) { + $.widget('oc.ocdialog', { + options: { + width: 'auto', + height: 'auto', + closeButton: true, + closeOnEscape: true, + modal: false + }, + _create: function() { + var self = this; + + this.originalCss = { + display: this.element[0].style.display, + width: this.element[0].style.width, + height: this.element[0].style.height, + }; + + this.originalTitle = this.element.attr('title'); + this.options.title = this.options.title || this.originalTitle; + + this.$dialog = $('
    ') + .attr({ + // Setting tabIndex makes the div focusable + tabIndex: -1, + role: 'dialog' + }) + .insertBefore(this.element); + this.$dialog.append(this.element.detach()); + this.element.removeAttr('title').addClass('oc-dialog-content').appendTo(this.$dialog); + + this.$dialog.css({ + display: 'inline-block', + position: 'fixed' + }); + + $(document).on('keydown keyup', function(event) { + if(event.target !== self.$dialog.get(0) && self.$dialog.find($(event.target)).length === 0) { + return; + } + // Escape + if(event.keyCode === 27 && self.options.closeOnEscape) { + self.close(); + return false; + } + // Enter + if(event.keyCode === 13) { + event.stopImmediatePropagation(); + if(event.type === 'keyup') { + event.preventDefault(); + return false; + } + // If no button is selected we trigger the primary + if(self.$buttonrow && self.$buttonrow.find($(event.target)).length === 0) { + var $button = self.$buttonrow.find('button.primary'); + if($button) { + $button.trigger('click'); + } + } else if(self.$buttonrow) { + $(event.target).trigger('click'); + } + return false; + } + }); + $(window).resize(function() { + self.parent = self.$dialog.parent().length > 0 ? self.$dialog.parent() : $('body'); + var pos = self.parent.position(); + self.$dialog.css({ + left: pos.left + (self.parent.width() - self.$dialog.outerWidth())/2, + top: pos.top + (self.parent.height() - self.$dialog.outerHeight())/2 + }); + }); + + this._setOptions(this.options); + $(window).trigger('resize'); + this._createOverlay(); + }, + _init: function() { + this.$dialog.focus(); + this._trigger('open'); + }, + _setOption: function(key, value) { + var self = this; + switch(key) { + case 'title': + var $title = $('

    ' + this.options.title + + '

    '); //
    '); + if(this.$title) { + this.$title.replaceWith($title); + } else { + this.$title = $title.prependTo(this.$dialog); + } + this._setSizes(); + break; + case 'buttons': + var $buttonrow = $('
    '); + if(this.$buttonrow) { + this.$buttonrow.replaceWith($buttonrow); + } else { + this.$buttonrow = $buttonrow.appendTo(this.$dialog); + } + $.each(value, function(idx, val) { + var $button = $('
    diff --git a/core/templates/altmail.php b/core/templates/altmail.php new file mode 100644 index 0000000000..a7df29a244 --- /dev/null +++ b/core/templates/altmail.php @@ -0,0 +1,9 @@ +t("Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\nCheers!", array($_['user_displayname'], $_['filename'], $_['link']))); +?> + +-- +getName() . ' - ' . $defaults->getSlogan()); ?> +getBaseUrl()); diff --git a/core/templates/installation.php b/core/templates/installation.php index de7ff8c168..7f2796a4b3 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -165,7 +165,7 @@

    + value="" />

    diff --git a/core/templates/layout.base.php b/core/templates/layout.base.php index 336df27ef1..09e1006d50 100644 --- a/core/templates/layout.base.php +++ b/core/templates/layout.base.php @@ -5,8 +5,13 @@ + + + - ownCloud + + <?php p($defaults->getName()); ?> + diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index a3a8dc5f7b..329744e382 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -5,8 +5,13 @@ + + + - ownCloud + + <?php p($defaults->getName()); ?> + @@ -33,10 +38,13 @@
    -

    ownCloud – - t( 'web services under your control' )); ?>

    +
    +

    + getLongFooter()); ?> +

    diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index a3ebf3abd0..dacbe79bd3 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -5,9 +5,15 @@ + + + - <?php p(!empty($_['application'])?$_['application'].' | ':'') ?>ownCloud - <?php p(trim($_['user_displayname']) != '' ?' ('.$_['user_displayname'].') ':'') ?> + + <?php p(!empty($_['application'])?$_['application'].' | ':''); + p($defaults->getName()); + p(trim($_['user_displayname']) != '' ?' ('.$_['user_displayname'].') ':'') ?> + @@ -40,7 +46,7 @@