summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorBjoern Schiessle <schiessle@owncloud.com>2013-09-26 13:02:39 +0200
committerBjoern Schiessle <schiessle@owncloud.com>2013-09-26 13:02:39 +0200
commitb9d6539d768bcad2cf7e07a95c379184f0ab2047 (patch)
treef83c2039dd9d890a8c7894add94a1ae349cd4ede /apps
parent663009f895f63235d65b32f32dba532e46b9057d (diff)
parent6b1d70f148de8ce9d1fa7944a114823bf6decd35 (diff)
downloadnextcloud-server-b9d6539d768bcad2cf7e07a95c379184f0ab2047.tar.gz
nextcloud-server-b9d6539d768bcad2cf7e07a95c379184f0ab2047.zip
Merge branch 'master' into ocs_share_api
Diffstat (limited to 'apps')
-rw-r--r--apps/files/ajax/delete.php2
-rw-r--r--apps/files/ajax/getstoragestats.php2
-rw-r--r--apps/files/ajax/list.php43
-rw-r--r--apps/files/ajax/rawlist.php54
-rw-r--r--apps/files/ajax/upload.php68
-rw-r--r--apps/files/appinfo/app.php1
-rw-r--r--apps/files/appinfo/register_command.php9
-rw-r--r--apps/files/command/scan.php73
-rw-r--r--apps/files/console/scan.php31
-rw-r--r--apps/files/css/files.css37
-rw-r--r--apps/files/css/upload.css119
-rw-r--r--apps/files/index.php78
-rw-r--r--apps/files/js/file-upload.js553
-rw-r--r--apps/files/js/fileactions.js12
-rw-r--r--apps/files/js/filelist.js467
-rw-r--r--apps/files/js/files.js255
-rw-r--r--apps/files/js/jquery.fileupload.js1023
-rw-r--r--apps/files/js/jquery.iframe-transport.js70
-rw-r--r--apps/files/l10n/ach.php7
-rw-r--r--apps/files/l10n/af_ZA.php7
-rw-r--r--apps/files/l10n/ar.php3
-rw-r--r--apps/files/l10n/be.php7
-rw-r--r--apps/files/l10n/bg_BG.php1
-rw-r--r--apps/files/l10n/bn_BD.php1
-rw-r--r--apps/files/l10n/bs.php12
-rw-r--r--apps/files/l10n/ca.php9
-rw-r--r--apps/files/l10n/cs_CZ.php3
-rw-r--r--apps/files/l10n/cy_GB.php3
-rw-r--r--apps/files/l10n/da.php3
-rw-r--r--apps/files/l10n/de.php8
-rw-r--r--apps/files/l10n/de_AT.php7
-rw-r--r--apps/files/l10n/de_CH.php74
-rw-r--r--apps/files/l10n/de_DE.php8
-rw-r--r--apps/files/l10n/el.php3
-rw-r--r--apps/files/l10n/en_GB.php80
-rw-r--r--apps/files/l10n/eo.php3
-rw-r--r--apps/files/l10n/es.php11
-rw-r--r--apps/files/l10n/es_AR.php10
-rw-r--r--apps/files/l10n/es_MX.php7
-rw-r--r--apps/files/l10n/et_EE.php4
-rw-r--r--apps/files/l10n/eu.php3
-rw-r--r--apps/files/l10n/fa.php3
-rw-r--r--apps/files/l10n/fi_FI.php5
-rw-r--r--apps/files/l10n/fr.php12
-rw-r--r--apps/files/l10n/gl.php9
-rw-r--r--apps/files/l10n/he.php3
-rw-r--r--apps/files/l10n/hi.php1
-rw-r--r--apps/files/l10n/hr.php2
-rw-r--r--apps/files/l10n/hu_HU.php3
-rw-r--r--apps/files/l10n/id.php2
-rw-r--r--apps/files/l10n/is.php1
-rw-r--r--apps/files/l10n/it.php8
-rw-r--r--apps/files/l10n/ja_JP.php3
-rw-r--r--apps/files/l10n/ka_GE.php3
-rw-r--r--apps/files/l10n/km.php7
-rw-r--r--apps/files/l10n/kn.php7
-rw-r--r--apps/files/l10n/ko.php3
-rw-r--r--apps/files/l10n/ku_IQ.php1
-rw-r--r--apps/files/l10n/lb.php1
-rw-r--r--apps/files/l10n/lt_LT.php14
-rw-r--r--apps/files/l10n/lv.php3
-rw-r--r--apps/files/l10n/mk.php1
-rw-r--r--apps/files/l10n/ml_IN.php7
-rw-r--r--apps/files/l10n/ms_MY.php1
-rw-r--r--apps/files/l10n/nb_NO.php3
-rw-r--r--apps/files/l10n/ne.php7
-rw-r--r--apps/files/l10n/nl.php4
-rw-r--r--apps/files/l10n/nn_NO.php19
-rw-r--r--apps/files/l10n/nqo.php7
-rw-r--r--apps/files/l10n/oc.php2
-rw-r--r--apps/files/l10n/pa.php16
-rw-r--r--apps/files/l10n/pl.php11
-rw-r--r--apps/files/l10n/pt_BR.php14
-rw-r--r--apps/files/l10n/pt_PT.php3
-rw-r--r--apps/files/l10n/ro.php50
-rw-r--r--apps/files/l10n/ru.php10
-rw-r--r--apps/files/l10n/si_LK.php1
-rw-r--r--apps/files/l10n/sk.php7
-rw-r--r--apps/files/l10n/sk_SK.php3
-rw-r--r--apps/files/l10n/sl.php3
-rw-r--r--apps/files/l10n/sq.php14
-rw-r--r--apps/files/l10n/sr.php3
-rw-r--r--apps/files/l10n/sr@latin.php3
-rw-r--r--apps/files/l10n/sv.php3
-rw-r--r--apps/files/l10n/sw_KE.php7
-rw-r--r--apps/files/l10n/ta_LK.php2
-rw-r--r--apps/files/l10n/th_TH.php3
-rw-r--r--apps/files/l10n/tr.php3
-rw-r--r--apps/files/l10n/ug.php1
-rw-r--r--apps/files/l10n/uk.php4
-rw-r--r--apps/files/l10n/vi.php3
-rw-r--r--apps/files/l10n/zh_CN.php3
-rw-r--r--apps/files/l10n/zh_TW.php3
-rw-r--r--apps/files/lib/helper.php118
-rw-r--r--apps/files/templates/fileexists.html26
-rw-r--r--apps/files/templates/index.php35
-rw-r--r--apps/files/templates/part.list.php27
-rw-r--r--apps/files_encryption/appinfo/app.php4
-rw-r--r--apps/files_encryption/hooks/hooks.php37
-rw-r--r--apps/files_encryption/l10n/bs.php5
-rw-r--r--apps/files_encryption/l10n/de_CH.php39
-rw-r--r--apps/files_encryption/l10n/en_GB.php39
-rw-r--r--apps/files_encryption/l10n/es.php2
-rw-r--r--apps/files_encryption/l10n/es_AR.php2
-rw-r--r--apps/files_encryption/l10n/fi_FI.php12
-rw-r--r--apps/files_encryption/l10n/lt_LT.php24
-rw-r--r--apps/files_encryption/l10n/nn_NO.php3
-rw-r--r--apps/files_encryption/l10n/pa.php5
-rw-r--r--apps/files_encryption/l10n/te.php5
-rw-r--r--apps/files_encryption/l10n/uk.php3
-rwxr-xr-xapps/files_encryption/lib/keymanager.php28
-rw-r--r--apps/files_encryption/lib/proxy.php1
-rw-r--r--apps/files_encryption/lib/stream.php36
-rw-r--r--apps/files_encryption/lib/util.php168
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/Prods.inc.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/ProdsConfig.inc.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/ProdsPath.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/ProdsQuery.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/ProdsRule.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/ProdsStreamer.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSAccount.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSConn.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSConnManager.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSException.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueConds.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueResults.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueSelFlds.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSKeyValPair.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSMessage.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RODSObjIOOpr.inc.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RodsAPINum.inc.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RodsConst.inc.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RodsErrorTable.inc.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryKeyWd.inc.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryNum.inc.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RODSPacket.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_BinBytesBuf.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollOprStat.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjCopyInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecCmdOut.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecMyRuleInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryOut.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxIvalPair.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxValPair.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_KeyValPair.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MiscSvrInfo.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ModAVUMetadataInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParam.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParamArray.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsgHeader.class.php3
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RHostAddr.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RodsObjStat.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_STR.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_SqlResult.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_StartupPack.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_TransStat.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_Version.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authRequestOut.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authResponseInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjCloseInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjReadInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjWriteInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekInp.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekOut.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_getTempPasswordOut.class.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestInp.class.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestOut.class.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslEndInp.class.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslStartInp.class.php1
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/setRodsAPINum.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/setRodsErrorCodes.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryKeyWd.php2
-rw-r--r--apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryNum.php2
-rw-r--r--apps/files_external/l10n/de_CH.php28
-rw-r--r--apps/files_external/l10n/en_GB.php28
-rw-r--r--apps/files_external/l10n/pa.php6
-rw-r--r--apps/files_external/lib/amazons3.php39
-rwxr-xr-xapps/files_external/lib/config.php2
-rw-r--r--apps/files_external/lib/google.php12
-rw-r--r--apps/files_external/lib/irods.php33
-rw-r--r--apps/files_external/lib/smb.php12
-rw-r--r--apps/files_sharing/js/public.js30
-rw-r--r--apps/files_sharing/js/share.js2
-rw-r--r--apps/files_sharing/l10n/de_CH.php19
-rw-r--r--apps/files_sharing/l10n/en_GB.php19
-rw-r--r--apps/files_sharing/l10n/es.php2
-rw-r--r--apps/files_sharing/l10n/es_AR.php6
-rw-r--r--apps/files_sharing/l10n/hi.php3
-rw-r--r--apps/files_sharing/l10n/lt_LT.php7
-rw-r--r--apps/files_sharing/l10n/nn_NO.php7
-rw-r--r--apps/files_sharing/l10n/pa.php8
-rw-r--r--apps/files_sharing/l10n/sq.php7
-rw-r--r--apps/files_sharing/lib/sharedstorage.php3
-rw-r--r--apps/files_sharing/public.php18
-rw-r--r--apps/files_trashbin/ajax/list.php51
-rw-r--r--apps/files_trashbin/appinfo/app.php4
-rw-r--r--apps/files_trashbin/index.php108
-rw-r--r--apps/files_trashbin/js/filelist.js24
-rw-r--r--apps/files_trashbin/js/trash.js14
-rw-r--r--apps/files_trashbin/l10n/ach.php6
-rw-r--r--apps/files_trashbin/l10n/af_ZA.php6
-rw-r--r--apps/files_trashbin/l10n/be.php6
-rw-r--r--apps/files_trashbin/l10n/bs.php7
-rw-r--r--apps/files_trashbin/l10n/de_AT.php6
-rw-r--r--apps/files_trashbin/l10n/de_CH.php19
-rw-r--r--apps/files_trashbin/l10n/en@pirate.php6
-rw-r--r--apps/files_trashbin/l10n/en_GB.php19
-rw-r--r--apps/files_trashbin/l10n/es.php4
-rw-r--r--apps/files_trashbin/l10n/es_AR.php5
-rw-r--r--apps/files_trashbin/l10n/es_MX.php6
-rw-r--r--apps/files_trashbin/l10n/hi.php7
-rw-r--r--apps/files_trashbin/l10n/ka.php6
-rw-r--r--apps/files_trashbin/l10n/km.php6
-rw-r--r--apps/files_trashbin/l10n/kn.php6
-rw-r--r--apps/files_trashbin/l10n/lt_LT.php5
-rw-r--r--apps/files_trashbin/l10n/ml_IN.php6
-rw-r--r--apps/files_trashbin/l10n/my_MM.php6
-rw-r--r--apps/files_trashbin/l10n/ne.php6
-rw-r--r--apps/files_trashbin/l10n/nn_NO.php5
-rw-r--r--apps/files_trashbin/l10n/nqo.php6
-rw-r--r--apps/files_trashbin/l10n/pa.php8
-rw-r--r--apps/files_trashbin/l10n/pl.php4
-rw-r--r--apps/files_trashbin/l10n/pt_BR.php4
-rw-r--r--apps/files_trashbin/l10n/ro.php4
-rw-r--r--apps/files_trashbin/l10n/sk.php6
-rw-r--r--apps/files_trashbin/l10n/sq.php5
-rw-r--r--apps/files_trashbin/l10n/sr@latin.php1
-rw-r--r--apps/files_trashbin/l10n/sw_KE.php6
-rw-r--r--apps/files_trashbin/lib/helper.php97
-rw-r--r--apps/files_trashbin/lib/trashbin.php (renamed from apps/files_trashbin/lib/trash.php)0
-rw-r--r--apps/files_trashbin/templates/index.php6
-rw-r--r--apps/files_trashbin/templates/part.breadcrumb.php4
-rw-r--r--apps/files_trashbin/templates/part.list.php3
-rw-r--r--apps/files_versions/l10n/cy_GB.php5
-rw-r--r--apps/files_versions/l10n/de_CH.php10
-rw-r--r--apps/files_versions/l10n/en_GB.php10
-rw-r--r--apps/files_versions/l10n/es.php2
-rw-r--r--apps/files_versions/l10n/es_AR.php3
-rw-r--r--apps/files_versions/l10n/lt_LT.php3
-rw-r--r--apps/files_versions/l10n/nn_NO.php3
-rw-r--r--apps/files_versions/l10n/sq.php5
-rw-r--r--apps/user_ldap/l10n/de_CH.php87
-rw-r--r--apps/user_ldap/l10n/en_GB.php87
-rw-r--r--apps/user_ldap/l10n/es.php11
-rw-r--r--apps/user_ldap/l10n/es_AR.php11
-rw-r--r--apps/user_ldap/l10n/fr.php11
-rw-r--r--apps/user_ldap/l10n/lt_LT.php45
-rw-r--r--apps/user_ldap/l10n/nn_NO.php1
-rw-r--r--apps/user_ldap/l10n/pa.php6
-rw-r--r--apps/user_ldap/l10n/ru.php10
-rw-r--r--apps/user_ldap/l10n/sr@latin.php1
-rw-r--r--apps/user_webdavauth/l10n/de_CH.php7
-rw-r--r--apps/user_webdavauth/l10n/en_GB.php7
-rw-r--r--apps/user_webdavauth/l10n/es.php4
-rw-r--r--apps/user_webdavauth/l10n/es_AR.php4
-rw-r--r--apps/user_webdavauth/l10n/fa.php5
-rw-r--r--apps/user_webdavauth/l10n/lt_LT.php4
-rw-r--r--apps/user_webdavauth/l10n/nn_NO.php4
-rw-r--r--apps/user_webdavauth/l10n/uk.php3
262 files changed, 3907 insertions, 1448 deletions
diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php
index 5f4856ec790..c69f5a8860c 100644
--- a/apps/files/ajax/delete.php
+++ b/apps/files/ajax/delete.php
@@ -24,7 +24,7 @@ foreach ($files as $file) {
}
// get array with updated storage stats (e.g. max file size) after upload
-$storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir);
+$storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
if ($success) {
OCP\JSON::success(array("data" => array_merge(array("dir" => $dir, "files" => $files), $storageStats)));
diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php
index 7a2b642a9bd..32a77bff6c3 100644
--- a/apps/files/ajax/getstoragestats.php
+++ b/apps/files/ajax/getstoragestats.php
@@ -6,4 +6,4 @@ $RUNTIME_APPTYPES = array('filesystem');
OCP\JSON::checkLoggedIn();
// send back json
-OCP\JSON::success(array('data' => \OCA\files\lib\Helper::buildFileStorageStatistics('/')));
+OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics('/')));
diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php
index c50e96b2429..350fc7fa5f6 100644
--- a/apps/files/ajax/list.php
+++ b/apps/files/ajax/list.php
@@ -10,35 +10,38 @@ OCP\JSON::checkLoggedIn();
// Load the files
$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';
+
+if (!\OC\Files\Filesystem::is_dir($dir . '/')) {
+ header("HTTP/1.0 404 Not Found");
+ exit();
+}
+
$doBreadcrumb = isset($_GET['breadcrumb']);
$data = array();
+$baseUrl = OCP\Util::linkTo('files', 'index.php') . '?dir=';
+
+$permissions = \OCA\Files\Helper::getDirPermissions($dir);
// Make breadcrumb
if($doBreadcrumb) {
- $breadcrumb = array();
- $pathtohere = "/";
- foreach( explode( "/", $dir ) as $i ) {
- if( $i != "" ) {
- $pathtohere .= "$i/";
- $breadcrumb[] = array( "dir" => $pathtohere, "name" => $i );
- }
- }
-
- $breadcrumbNav = new OCP\Template( "files", "part.breadcrumb", "" );
- $breadcrumbNav->assign( "breadcrumb", $breadcrumb, false );
+ $breadcrumb = \OCA\Files\Helper::makeBreadcrumb($dir);
+
+ $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '');
+ $breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
+ $breadcrumbNav->assign('baseURL', $baseUrl);
$data['breadcrumb'] = $breadcrumbNav->fetchPage();
}
// make filelist
-$files = array();
-foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $i ) {
- $i["date"] = OCP\Util::formatDate($i["mtime"] );
- $files[] = $i;
-}
-
-$list = new OCP\Template( "files", "part.list", "" );
-$list->assign( "files", $files, false );
-$data = array('files' => $list->fetchPage());
+$files = \OCA\Files\Helper::getFiles($dir);
+
+$list = new OCP\Template("files", "part.list", "");
+$list->assign('files', $files, false);
+$list->assign('baseURL', $baseUrl, false);
+$list->assign('downloadURL', OCP\Util::linkToRoute('download', array('file' => '/')));
+$list->assign('isPublic', false);
+$data['files'] = $list->fetchPage();
+$data['permissions'] = $permissions;
OCP\JSON::success(array('data' => $data));
diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php
index f568afad4da..5ca0d5e8117 100644
--- a/apps/files/ajax/rawlist.php
+++ b/apps/files/ajax/rawlist.php
@@ -11,22 +11,54 @@ OCP\JSON::checkLoggedIn();
// Load the files
$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';
-$mimetype = isset($_GET['mimetype']) ? $_GET['mimetype'] : '';
+$mimetypes = isset($_GET['mimetypes']) ? json_decode($_GET['mimetypes'], true) : '';
+
+// Clean up duplicates from array and deal with non-array requests
+if (is_array($mimetypes)) {
+ $mimetypes = array_unique($mimetypes);
+} elseif (is_null($mimetypes)) {
+ $mimetypes = array($_GET['mimetypes']);
+}
// make filelist
$files = array();
// If a type other than directory is requested first load them.
-if($mimetype && strpos($mimetype, 'httpd/unix-directory') === false) {
- foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $i ) {
- $i["date"] = OCP\Util::formatDate($i["mtime"] );
- $i['mimetype_icon'] = $i['type'] == 'dir' ? \mimetype_icon('dir'): \mimetype_icon($i['mimetype']);
- $files[] = $i;
+if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
+ foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) {
+ $file['directory'] = $dir;
+ $file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
+ $file["date"] = OCP\Util::formatDate($file["mtime"]);
+ $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
+ $files[] = $file;
}
}
-foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $i ) {
- $i["date"] = OCP\Util::formatDate($i["mtime"] );
- $i['mimetype_icon'] = $i['type'] == 'dir' ? \mimetype_icon('dir'): \mimetype_icon($i['mimetype']);
- $files[] = $i;
+
+if (is_array($mimetypes) && count($mimetypes)) {
+ foreach ($mimetypes as $mimetype) {
+ foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) {
+ $file['directory'] = $dir;
+ $file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
+ $file["date"] = OCP\Util::formatDate($file["mtime"]);
+ $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
+ $files[] = $file;
+ }
+ }
+} else {
+ foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) {
+ $file['directory'] = $dir;
+ $file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
+ $file["date"] = OCP\Util::formatDate($file["mtime"]);
+ $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
+ $files[] = $file;
+ }
}
-OCP\JSON::success(array('data' => $files));
+// Sort by name
+usort($files, function ($a, $b) {
+ if ($a['name'] === $b['name']) {
+ return 0;
+ }
+ return ($a['name'] < $b['name']) ? -1 : 1;
+});
+
+OC_JSON::success(array('data' => $files));
diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index 1d03cd89f83..0920bf62109 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -53,7 +53,7 @@ OCP\JSON::callCheck();
// get array with current storage stats (e.g. max file size)
-$storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir);
+$storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
if (!isset($_FILES['files'])) {
OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('No file was uploaded. Unknown error')), $storageStats)));
@@ -78,7 +78,7 @@ foreach ($_FILES['files']['error'] as $error) {
}
$files = $_FILES['files'];
-$error = '';
+$error = false;
$maxUploadFileSize = $storageStats['uploadMaxFilesize'];
$maxHumanFileSize = OCP\Util::humanFileSize($maxUploadFileSize);
@@ -98,33 +98,71 @@ $result = array();
if (strpos($dir, '..') === false) {
$fileCount = count($files['name']);
for ($i = 0; $i < $fileCount; $i++) {
- $target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]);
// $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder
- $target = \OC\Files\Filesystem::normalizePath($target);
- if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
+ if (isset($_POST['resolution']) && $_POST['resolution']==='autorename') {
+ // append a number in brackets like 'filename (2).ext'
+ $target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]);
+ } else {
+ $target = \OC\Files\Filesystem::normalizePath(stripslashes($dir).'/'.$files['name'][$i]);
+ }
+
+ if ( ! \OC\Files\Filesystem::file_exists($target)
+ || (isset($_POST['resolution']) && $_POST['resolution']==='replace')
+ ) {
+ // upload and overwrite file
+ if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
+
+ // updated max file size after upload
+ $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
+
+ $meta = \OC\Files\Filesystem::getFileInfo($target);
+ if ($meta === false) {
+ $error = $l->t('Upload failed. Could not get file info.');
+ } else {
+ $result[] = array('status' => 'success',
+ 'mime' => $meta['mimetype'],
+ 'mtime' => $meta['mtime'],
+ 'size' => $meta['size'],
+ 'id' => $meta['fileid'],
+ 'name' => basename($target),
+ 'originalname' => $files['tmp_name'][$i],
+ 'uploadMaxFilesize' => $maxUploadFileSize,
+ 'maxHumanFilesize' => $maxHumanFileSize,
+ 'permissions' => $meta['permissions'],
+ );
+ }
+
+ } else {
+ $error = $l->t('Upload failed. Could not find uploaded file');
+ }
+
+ } else {
+ // file already exists
$meta = \OC\Files\Filesystem::getFileInfo($target);
- // updated max file size after upload
- $storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir);
if ($meta === false) {
- OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('Upload failed')), $storageStats)));
- exit();
+ $error = $l->t('Upload failed. Could not get file info.');
} else {
- $result[] = array('status' => 'success',
+ $result[] = array('status' => 'existserror',
'mime' => $meta['mimetype'],
+ 'mtime' => $meta['mtime'],
'size' => $meta['size'],
'id' => $meta['fileid'],
'name' => basename($target),
- 'originalname' => $files['name'][$i],
+ 'originalname' => $files['tmp_name'][$i],
'uploadMaxFilesize' => $maxUploadFileSize,
- 'maxHumanFilesize' => $maxHumanFileSize
+ 'maxHumanFilesize' => $maxHumanFileSize,
+ 'permissions' => $meta['permissions'],
);
}
}
}
- OCP\JSON::encodedPrint($result);
- exit();
} else {
$error = $l->t('Invalid directory.');
}
-OCP\JSON::error(array('data' => array_merge(array('message' => $error), $storageStats)));
+if ($error === false) {
+ OCP\JSON::encodedPrint($result);
+ exit();
+} else {
+ OCP\JSON::error(array('data' => array_merge(array('message' => $error), $storageStats)));
+}
diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index bd3245ded3f..909baca92ea 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -1,5 +1,4 @@
<?php
-OC::$CLASSPATH['OCA\Files\Capabilities'] = 'apps/files/lib/capabilities.php';
$l = OC_L10N::get('files');
diff --git a/apps/files/appinfo/register_command.php b/apps/files/appinfo/register_command.php
new file mode 100644
index 00000000000..435ce0ab23f
--- /dev/null
+++ b/apps/files/appinfo/register_command.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+$application->add(new OCA\Files\Command\Scan(OC_User::getManager()));
diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php
new file mode 100644
index 00000000000..25ab70af362
--- /dev/null
+++ b/apps/files/command/scan.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Scan extends Command {
+
+ /**
+ * @var \OC\User\Manager $userManager
+ */
+ private $userManager;
+
+ public function __construct(\OC\User\Manager $userManager) {
+ $this->userManager = $userManager;
+ parent::__construct();
+ }
+
+ protected function configure() {
+ $this
+ ->setName('files:scan')
+ ->setDescription('rescan filesystem')
+ ->addArgument(
+ 'user_id',
+ InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ 'will rescan all files of the given user(s)'
+ )
+ ->addOption(
+ 'all',
+ null,
+ InputOption::VALUE_NONE,
+ 'will rescan all files of all known users'
+ )
+ ;
+ }
+
+ protected function scanFiles($user, OutputInterface $output) {
+ $scanner = new \OC\Files\Utils\Scanner($user);
+ $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function($path) use ($output) {
+ $output->writeln("Scanning <info>$path</info>");
+ });
+ $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function($path) use ($output) {
+ $output->writeln("Scanning <info>$path</info>");
+ });
+ $scanner->scan('');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ if ($input->getOption('all')) {
+ $users = $this->userManager->search('');
+ } else {
+ $users = $input->getArgument('user_id');
+ }
+
+ foreach ($users as $user) {
+ if (is_object($user)) {
+ $user = $user->getUID();
+ }
+ $this->scanFiles($user, $output);
+ }
+ }
+}
diff --git a/apps/files/console/scan.php b/apps/files/console/scan.php
deleted file mode 100644
index 70183fc888a..00000000000
--- a/apps/files/console/scan.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-if (count($argv) !== 2) {
- echo "Usage:" . PHP_EOL;
- echo " files:scan <user_id>" . PHP_EOL;
- echo " will rescan all files of the given user" . PHP_EOL;
- echo " files:scan --all" . PHP_EOL;
- echo " will rescan all files of all known users" . PHP_EOL;
- return;
-}
-
-function scanFiles($user) {
- $scanner = new \OC\Files\Utils\Scanner($user);
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function($path) {
- echo "Scanning $path" . PHP_EOL;
- });
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function($path) {
- echo "Scanning $path" . PHP_EOL;
- });
- $scanner->scan('');
-}
-
-if ($argv[1] === '--all') {
- $users = OC_User::getUsers();
-} else {
- $users = array($argv[1]);
-}
-
-foreach ($users as $user) {
- scanFiles($user);
-}
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 02a73ba83e5..b3ecd1dab93 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -69,13 +69,16 @@
/* FILE TABLE */
#filestable { position: relative; top:37px; width:100%; }
-tbody tr { background-color:#fff; height:2.5em; }
-tbody tr:hover, tbody tr:active {
+#filestable tbody tr { background-color:#fff; height:2.5em; }
+#filestable tbody tr:hover, tbody tr:active {
background-color: rgb(240,240,240);
}
-tbody tr.selected {
+#filestable tbody tr.selected {
background-color: rgb(230,230,230);
}
+#filestable tbody tr.searchresult {
+ background-color: rgb(240,240,240);
+}
tbody a { color:#000; }
span.extension, span.uploading, td.date { color:#999; }
span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; }
@@ -190,10 +193,15 @@ table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
#fileList tr:hover td.filename>input[type="checkbox"]:first-child,
#fileList tr td.filename>input[type="checkbox"]:checked:first-child,
#fileList tr.selected td.filename>input[type="checkbox"]:first-child {
+ opacity: 1;
+}
+.lte9 #fileList tr:hover td.filename>input[type="checkbox"]:first-child,
+.lte9 #fileList tr td.filename>input[type="checkbox"][checked=checked]:first-child,
+.lte9 #fileList tr.selected td.filename>input[type="checkbox"]:first-child {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
filter: alpha(opacity=100);
- opacity: 1;
}
+
/* Use label to have bigger clickable size for checkbox */
#fileList tr td.filename>input[type="checkbox"] + label,
#select_all + label {
@@ -331,3 +339,24 @@ table.dragshadow td.size {
text-align: center;
margin-left: -200px;
}
+.mask {
+ z-index: 50;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: white;
+ background-repeat: no-repeat no-repeat;
+ background-position: 50%;
+ opacity: 0.7;
+ filter: alpha(opacity=70);
+ transition: opacity 100ms;
+ -moz-transition: opacity 100ms;
+ -o-transition: opacity 100ms;
+ -ms-transition: opacity 100ms;
+ -webkit-transition: opacity 100ms;
+}
+.mask.transparent{
+ opacity: 0;
+}
diff --git a/apps/files/css/upload.css b/apps/files/css/upload.css
new file mode 100644
index 00000000000..2d11e41ba88
--- /dev/null
+++ b/apps/files/css/upload.css
@@ -0,0 +1,119 @@
+
+#upload {
+ height:27px; padding:0; margin-left:0.2em; overflow:hidden;
+ vertical-align: top;
+}
+#upload a {
+ position:relative; display:block; width:100%; height:27px;
+ cursor:pointer; z-index:10;
+ background-image:url('%webroot%/core/img/actions/upload.svg');
+ background-repeat:no-repeat;
+ background-position:7px 6px;
+ opacity:0.65;
+}
+.file_upload_target { display:none; }
+.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
+#file_upload_start {
+ float: left;
+ left:0; top:0; width:28px; height:27px; padding:0;
+ font-size:1em;
+ -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0;
+ z-index:20; position:relative; cursor:pointer; overflow:hidden;
+}
+
+#uploadprogresswrapper {
+ display: inline-block;
+ vertical-align: top;
+ margin:0.3em;
+ height: 29px;
+}
+#uploadprogressbar {
+ position:relative;
+ float: left;
+ margin-left: 12px;
+ width: 130px;
+ height: 26px;
+ display:inline-block;
+}
+#uploadprogressbar + stop {
+ font-size: 13px;
+}
+
+.oc-dialog .fileexists table {
+ width: 100%;
+}
+.oc-dialog .fileexists th {
+ padding-left: 0;
+ padding-right: 0;
+}
+.oc-dialog .fileexists th input[type='checkbox'] {
+ margin-right: 3px;
+}
+.oc-dialog .fileexists th:first-child {
+ width: 230px;
+}
+.oc-dialog .fileexists th label {
+ font-weight: normal;
+ color:black;
+}
+.oc-dialog .fileexists th .count {
+ margin-left: 3px;
+}
+.oc-dialog .fileexists .conflicts .template {
+ display: none;
+}
+.oc-dialog .fileexists .conflict {
+ width: 100%;
+ height: 85px;
+}
+.oc-dialog .fileexists .conflict .filename {
+ color:#777;
+ word-break: break-all;
+ clear: left;
+}
+.oc-dialog .fileexists .icon {
+ width: 64px;
+ height: 64px;
+ margin: 0px 5px 5px 5px;
+ background-repeat: no-repeat;
+ background-size: 64px 64px;
+ float: left;
+}
+.oc-dialog .fileexists .replacement {
+ float: left;
+ width: 230px;
+}
+.oc-dialog .fileexists .original {
+ float: left;
+ width: 230px;
+}
+.oc-dialog .fileexists .conflicts {
+ overflow-y:scroll;
+ max-height: 225px;
+}
+.oc-dialog .fileexists .conflict input[type='checkbox'] {
+ float: left;
+}
+.oc-dialog .fileexists .toggle {
+ background-image: url('%webroot%/core/img/actions/triangle-e.png');
+ width: 16px;
+ height: 16px;
+}
+.oc-dialog .fileexists #allfileslabel {
+ float:right;
+}
+.oc-dialog .fileexists #allfiles {
+ vertical-align: bottom;
+ position: relative;
+ top: -3px;
+}
+.oc-dialog .fileexists #allfiles + span{
+ vertical-align: bottom;
+}
+.oc-dialog .oc-dialog-buttonrow {
+ width:100%;
+ text-align:right;
+}
+.oc-dialog .oc-dialog-buttonrow .cancel {
+ float:left;
+}
diff --git a/apps/files/index.php b/apps/files/index.php
index f1e120c872c..6f22fdfdc19 100644
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -26,6 +26,7 @@ OCP\User::checkLoggedIn();
// Load the files we need
OCP\Util::addStyle('files', 'files');
+OCP\Util::addStyle('files', 'upload');
OCP\Util::addscript('files', 'file-upload');
OCP\Util::addscript('files', 'jquery.iframe-transport');
OCP\Util::addscript('files', 'jquery.fileupload');
@@ -41,79 +42,58 @@ if (!\OC\Files\Filesystem::is_dir($dir . '/')) {
exit();
}
-function fileCmp($a, $b) {
- if ($a['type'] == 'dir' and $b['type'] != 'dir') {
- return -1;
- } elseif ($a['type'] != 'dir' and $b['type'] == 'dir') {
- return 1;
- } else {
- return strnatcasecmp($a['name'], $b['name']);
+$isIE8 = false;
+preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
+if (count($matches) > 0 && $matches[1] <= 8){
+ $isIE8 = true;
+}
+
+// if IE8 and "?dir=path" was specified, reformat the URL to use a hash like "#?dir=path"
+if ($isIE8 && isset($_GET['dir'])){
+ if ($dir === ''){
+ $dir = '/';
}
+ header('Location: ' . OCP\Util::linkTo('files', 'index.php') . '#?dir=' . \OCP\Util::encodePath($dir));
+ exit();
}
+$ajaxLoad = false;
$files = array();
$user = OC_User::getUser();
if (\OC\Files\Cache\Upgrade::needUpgrade($user)) { //dont load anything if we need to upgrade the cache
- $content = array();
$needUpgrade = true;
$freeSpace = 0;
} else {
- $content = \OC\Files\Filesystem::getDirectoryContent($dir);
+ if ($isIE8){
+ // after the redirect above, the URL will have a format
+ // like "files#?dir=path" which means that no path was given
+ // (dir is not set). In that specific case, we don't return any
+ // files because the client will take care of switching the dir
+ // to the one from the hash, then ajax-load the initial file list
+ $files = array();
+ $ajaxLoad = true;
+ }
+ else{
+ $files = \OCA\Files\Helper::getFiles($dir);
+ }
$freeSpace = \OC\Files\Filesystem::free_space($dir);
$needUpgrade = false;
}
-foreach ($content as $i) {
- $i['date'] = OCP\Util::formatDate($i['mtime']);
- if ($i['type'] == 'file') {
- $fileinfo = pathinfo($i['name']);
- $i['basename'] = $fileinfo['filename'];
- if (!empty($fileinfo['extension'])) {
- $i['extension'] = '.' . $fileinfo['extension'];
- } else {
- $i['extension'] = '';
- }
- }
- $i['directory'] = $dir;
- $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
- $files[] = $i;
-}
-
-usort($files, "fileCmp");
// Make breadcrumb
-$breadcrumb = array();
-$pathtohere = '';
-foreach (explode('/', $dir) as $i) {
- if ($i != '') {
- $pathtohere .= '/' . $i;
- $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i);
- }
-}
+$breadcrumb = \OCA\Files\Helper::makeBreadcrumb($dir);
// make breadcrumb und filelist markup
$list = new OCP\Template('files', 'part.list', '');
$list->assign('files', $files);
$list->assign('baseURL', OCP\Util::linkTo('files', 'index.php') . '?dir=');
$list->assign('downloadURL', OCP\Util::linkToRoute('download', array('file' => '/')));
-$list->assign('disableSharing', false);
$list->assign('isPublic', false);
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '');
$breadcrumbNav->assign('breadcrumb', $breadcrumb);
$breadcrumbNav->assign('baseURL', OCP\Util::linkTo('files', 'index.php') . '?dir=');
-$permissions = OCP\PERMISSION_READ;
-if (\OC\Files\Filesystem::isCreatable($dir . '/')) {
- $permissions |= OCP\PERMISSION_CREATE;
-}
-if (\OC\Files\Filesystem::isUpdatable($dir . '/')) {
- $permissions |= OCP\PERMISSION_UPDATE;
-}
-if (\OC\Files\Filesystem::isDeletable($dir . '/')) {
- $permissions |= OCP\PERMISSION_DELETE;
-}
-if (\OC\Files\Filesystem::isSharable($dir . '/')) {
- $permissions |= OCP\PERMISSION_SHARE;
-}
+$permissions = \OCA\Files\Helper::getDirPermissions($dir);
if ($needUpgrade) {
OCP\Util::addscript('files', 'upgrade');
@@ -153,5 +133,7 @@ if ($needUpgrade) {
$tmpl->assign('isPublic', false);
$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
+ $tmpl->assign('disableSharing', false);
+ $tmpl->assign('ajaxLoad', $ajaxLoad);
$tmpl->printPage();
}
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 3d620c5640b..b52221ac1fc 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -1,155 +1,436 @@
-$(document).ready(function() {
-
- var 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
- }
+/**
+ * The file upload code uses several hooks to interact with blueimps jQuery file upload library:
+ * 1. the core upload handling hooks are added when initializing the plugin,
+ * 2. if the browser supports progress events they are added in a separate set after the initialization
+ * 3. every app can add it's own triggers for fileupload
+ * - files adds d'n'd handlers and also reacts to done events to add new rows to the filelist
+ * - TODO pictures upload button
+ * - TODO music upload button
+ */
- var totalSize=0;
- $.each(data.originalFiles, function(i,file){
- totalSize+=file.size;
- });
+/**
+ * Function that will allow us to know if Ajax uploads are supported
+ * @link https://github.com/New-Bamboo/example-ajax-upload/blob/master/public/index.html
+ * also see article @link http://blog.new-bamboo.co.uk/2012/01/10/ridiculously-simple-ajax-uploads-with-formdata
+ */
+function supportAjaxUploadWithProgress() {
+ return supportFileAPI() && supportAjaxUploadProgressEvents() && supportFormData();
- 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
- }
+ // Is the File API supported?
+ function supportFileAPI() {
+ var fi = document.createElement('INPUT');
+ fi.type = 'file';
+ return 'files' in fi;
+ };
- // start the actual file upload
- var jqXHR = data.submit();
+ // Are progress events supported?
+ function supportAjaxUploadProgressEvents() {
+ var xhr = new XMLHttpRequest();
+ return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload));
+ };
- // 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;
- }
+ // Is FormData supported?
+ function supportFormData() {
+ return !! window.FormData;
+ }
+}
- //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;
+/**
+ * keeps track of uploads in progress and implements callbacks for the conflicts dialog
+ * @type {OC.Upload}
+ */
+OC.Upload = {
+ _uploads: [],
+ /**
+ * cancels a single upload,
+ * @deprecated because it was only used when a file currently beeing uploaded was deleted. Now they are added after
+ * they have been uploaded.
+ * @param {string} dir
+ * @param {string} filename
+ * @returns {unresolved}
+ */
+ cancelUpload:function(dir, filename) {
+ var self = this;
+ var deleted = false;
+ //FIXME _selections
+ jQuery.each(this._uploads, function(i, jqXHR) {
+ if (selection.dir === dir && selection.uploads[filename]) {
+ deleted = self.deleteSelectionUpload(selection, filename);
+ return false; // end searching through selections
}
- $('#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;
+ });
+ return deleted;
+ },
+ /**
+ * deletes the jqHXR object from a data selection
+ * @param {object} data
+ */
+ deleteUpload:function(data) {
+ delete data.jqXHR;
+ },
+ /**
+ * cancels all uploads
+ */
+ cancelUploads:function() {
+ this.log('canceling uploads');
+ jQuery.each(this._uploads,function(i, jqXHR){
+ jqXHR.abort();
+ });
+ this._uploads = [];
+ },
+ rememberUpload:function(jqXHR){
+ if (jqXHR) {
+ this._uploads.push(jqXHR);
+ }
+ },
+ /**
+ * Checks the currently known uploads.
+ * returns true if any hxr has the state 'pending'
+ * @returns {boolean}
+ */
+ isProcessing:function(){
+ var count = 0;
+
+ jQuery.each(this._uploads,function(i, data){
+ if (data.state() === 'pending') {
+ count++;
}
- 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;
+ });
+ return count > 0;
+ },
+ /**
+ * callback for the conflicts dialog
+ * @param {object} data
+ */
+ onCancel:function(data) {
+ this.cancelUploads();
+ },
+ /**
+ * callback for the conflicts dialog
+ * calls onSkip, onReplace or onAutorename for each conflict
+ * @param {object} conflicts - list of conflict elements
+ */
+ onContinue:function(conflicts) {
+ var self = this;
+ //iterate over all conflicts
+ jQuery.each(conflicts, function (i, conflict) {
+ conflict = $(conflict);
+ var keepOriginal = conflict.find('.original input[type="checkbox"]:checked').length === 1;
+ var keepReplacement = conflict.find('.replacement input[type="checkbox"]:checked').length === 1;
+ if (keepOriginal && keepReplacement) {
+ // when both selected -> autorename
+ self.onAutorename(conflict.data('data'));
+ } else if (keepReplacement) {
+ // when only replacement selected -> overwrite
+ self.onReplace(conflict.data('data'));
} else {
- //fetch response from iframe
- response = data.result[0].body.innerText;
+ // when only original seleted -> skip
+ // when none selected -> skip
+ self.onSkip(conflict.data('data'));
}
- var result=$.parseJSON(response);
+ });
+ },
+ /**
+ * handle skipping an upload
+ * @param {object} data
+ */
+ onSkip:function(data){
+ this.log('skip', null, data);
+ this.deleteUpload(data);
+ },
+ /**
+ * handle replacing a file on the server with an uploaded file
+ * @param {object} data
+ */
+ onReplace:function(data){
+ this.log('replace', null, data);
+ data.data.append('resolution', 'replace');
+ data.submit();
+ },
+ /**
+ * handle uploading a file and letting the server decide a new name
+ * @param {object} data
+ */
+ onAutorename:function(data){
+ this.log('autorename', null, data);
+ if (data.data) {
+ data.data.append('resolution', 'autorename');
+ } else {
+ data.formData.push({name:'resolution',value:'autorename'}); //hack for ie8
+ }
+ data.submit();
+ },
+ _trace:false, //TODO implement log handler for JS per class?
+ log:function(caption, e, data) {
+ if (this._trace) {
+ console.log(caption);
+ console.log(data);
+ }
+ },
+ /**
+ * TODO checks the list of existing files prior to uploading and shows a simple dialog to choose
+ * skip all, replace all or choose which files to keep
+ * @param {array} selection of files to upload
+ * @param {object} callbacks - object with several callback methods
+ * @param {function} callbacks.onNoConflicts
+ * @param {function} callbacks.onSkipConflicts
+ * @param {function} callbacks.onReplaceConflicts
+ * @param {function} callbacks.onChooseConflicts
+ * @param {function} callbacks.onCancel
+ */
+ checkExistingFiles: function (selection, callbacks){
+ // TODO check filelist before uploading and show dialog on conflicts, use callbacks
+ callbacks.onNoConflicts(selection);
+ }
+};
+
+$(document).ready(function() {
+
+ if ( $('#file_upload_start').exists() ) {
+
+ var file_upload_param = {
+ dropZone: $('#content'), // restrict dropZone to content div
+ autoUpload: false,
+ sequentialUploads: true,
+ //singleFileUploads is on by default, so the data.files array will always have length 1
+ /**
+ * on first add of every selection
+ * - check all files of originalFiles array with files in dir
+ * - on conflict show dialog
+ * - skip all -> remember as single skip action for all conflicting files
+ * - replace all -> remember as single replace action for all conflicting files
+ * - choose -> show choose dialog
+ * - mark files to keep
+ * - when only existing -> remember as single skip action
+ * - when only new -> remember as single replace action
+ * - when both -> remember as single autorename action
+ * - start uploading selection
+ * @param {object} e
+ * @param {object} data
+ * @returns {boolean}
+ */
+ add: function(e, data) {
+ OC.Upload.log('add', e, data);
+ var that = $(this);
+
+ // we need to collect all data upload objects before starting the upload so we can check their existence
+ // and set individual conflict actions. unfortunately there is only one variable that we can use to identify
+ // the selection a data upload is part of, so we have to collect them in data.originalFiles
+ // turning singleFileUploads off is not an option because we want to gracefully handle server errors like
+ // already exists
+
+ // create a container where we can store the data objects
+ if ( ! data.originalFiles.selection ) {
+ // initialize selection and remember number of files to upload
+ data.originalFiles.selection = {
+ uploads: [],
+ filesToUpload: data.originalFiles.length,
+ totalBytes: 0
+ };
+ }
+ var selection = data.originalFiles.selection;
+
+ // add uploads
+ if ( selection.uploads.length < selection.filesToUpload ){
+ // remember upload
+ selection.uploads.push(data);
+ }
+
+ //examine file
+ var file = data.files[0];
+
+ if (file.type === '' && file.size === 4096) {
+ data.textStatus = 'dirorzero';
+ data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes',
+ {filename: file.name}
+ );
+ }
+
+ // add size
+ selection.totalBytes += file.size;
+
+ //check max upload size
+ if (selection.totalBytes > $('#max_upload').val()) {
+ data.textStatus = 'notenoughspace';
+ data.errorThrown = t('files', 'Not enough space available');
+ }
+
+ // end upload for whole selection on error
+ if (data.errorThrown) {
+ // trigger fileupload fail
+ var fu = that.data('blueimp-fileupload') || that.data('fileupload');
+ fu._trigger('fail', e, data);
+ return false; //don't upload anything
+ }
- if(typeof result[0] !== 'undefined' && result[0].status === 'success') {
- var filename = result[0].originalname;
+ // check existing files when all is collected
+ if ( selection.uploads.length >= selection.filesToUpload ) {
+
+ //remove our selection hack:
+ delete data.originalFiles.selection;
+
+ var callbacks = {
+
+ onNoConflicts: function (selection) {
+ $.each(selection.uploads, function(i, upload) {
+ upload.submit();
+ });
+ },
+ onSkipConflicts: function (selection) {
+ //TODO mark conflicting files as toskip
+ },
+ onReplaceConflicts: function (selection) {
+ //TODO mark conflicting files as toreplace
+ },
+ onChooseConflicts: function (selection) {
+ //TODO mark conflicting files as chosen
+ },
+ onCancel: function (selection) {
+ $.each(selection.uploads, function(i, upload) {
+ upload.abort();
+ });
+ }
+ };
- // 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];
+ OC.Upload.checkExistingFiles(selection, callbacks);
+
+ }
+
+ return true; // continue adding files
+ },
+ /**
+ * called after the first add, does NOT have the data param
+ * @param {object} e
+ */
+ start: function(e) {
+ OC.Upload.log('start', e, null);
+ },
+ submit: function(e, data) {
+ OC.Upload.rememberUpload(data);
+ if ( ! data.formData ) {
+ // noone set update parameters, we set the minimum
+ data.formData = {
+ requesttoken: oc_requesttoken,
+ dir: $('#dir').val()
+ };
+ }
+ },
+ fail: function(e, data) {
+ OC.Upload.log('fail', e, data);
+ if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) {
+ if (data.textStatus === 'abort') {
+ $('#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);
+ }
+ OC.Upload.deleteUpload(data);
+ },
+ /**
+ * called for every successful upload
+ * @param {object} e
+ * @param {object} data
+ */
+ done:function(e, data) {
+ OC.Upload.log('done', e, data);
+ // handle different responses (json or body from iframe for ie)
+ var response;
+ if (typeof data.result === 'string') {
+ response = data.result;
} else {
- delete uploadingFiles[filename];
+ //fetch response from iframe
+ response = data.result[0].body.innerText;
}
- 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);
- }
- },
- /**
- * called after last upload
- * @param e
- * @param data
- */
- stop: function(e, data) {
- if(data.dataType !== 'iframe') {
- $('#uploadprogresswrapper input.stop').hide();
- }
+ var result=$.parseJSON(response);
- //IE < 10 does not fire the necessary events for the progress bar.
- if($('html.lte9').length > 0) {
- return;
+ delete data.jqXHR;
+
+ if(typeof result[0] === 'undefined') {
+ data.textStatus = 'servererror';
+ data.errorThrown = t('files', 'Could not get result from server.');
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ fu._trigger('fail', e, data);
+ } else if (result[0].status === 'existserror') {
+ //show "file already exists" dialog
+ var original = result[0];
+ var replacement = data.files[0];
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu);
+ } else if (result[0].status !== 'success') {
+ //delete data.jqXHR;
+ data.textStatus = 'servererror';
+ data.errorThrown = result.data.message; // error message has been translated on server
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ fu._trigger('fail', e, data);
+ }
+ },
+ /**
+ * called after last upload
+ * @param {object} e
+ * @param {object} data
+ */
+ stop: function(e, data) {
+ OC.Upload.log('stop', e, data);
}
+ };
- $('#uploadprogressbar').progressbar('value',100);
- $('#uploadprogressbar').fadeOut();
- }
- };
- var file_upload_handler = function() {
- $('#file_upload_start').fileupload(file_upload_param);
- };
+ // initialize jquery fileupload (blueimp)
+ var fileupload = $('#file_upload_start').fileupload(file_upload_param);
+ window.file_upload_param = fileupload;
+ if(supportAjaxUploadWithProgress()) {
+ // add progress handlers
+ fileupload.on('fileuploadadd', function(e, data) {
+ OC.Upload.log('progress handle fileuploadadd', e, data);
+ //show cancel button
+ //if(data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie?
+ // $('#uploadprogresswrapper input.stop').show();
+ //}
+ });
+ // add progress handlers
+ fileupload.on('fileuploadstart', function(e, data) {
+ OC.Upload.log('progress handle fileuploadstart', e, data);
+ $('#uploadprogresswrapper input.stop').show();
+ $('#uploadprogressbar').progressbar({value:0});
+ $('#uploadprogressbar').fadeIn();
+ });
+ fileupload.on('fileuploadprogress', function(e, data) {
+ OC.Upload.log('progress handle fileuploadprogress', e, data);
+ //TODO progressbar in row
+ });
+ fileupload.on('fileuploadprogressall', function(e, data) {
+ OC.Upload.log('progress handle fileuploadprogressall', e, data);
+ var progress = (data.loaded / data.total) * 100;
+ $('#uploadprogressbar').progressbar('value', progress);
+ });
+ fileupload.on('fileuploadstop', function(e, data) {
+ OC.Upload.log('progress handle fileuploadstop', e, data);
+
+ $('#uploadprogresswrapper input.stop').fadeOut();
+ $('#uploadprogressbar').fadeOut();
+
+ });
+ fileupload.on('fileuploadfail', function(e, data) {
+ OC.Upload.log('progress handle fileuploadfail', e, data);
+ //if user pressed cancel hide upload progress bar and cancel button
+ if (data.errorThrown === 'abort') {
+ $('#uploadprogresswrapper input.stop').fadeOut();
+ $('#uploadprogressbar').fadeOut();
+ }
+ });
- if ( document.getElementById('data-upload-form') ) {
- $(file_upload_handler);
+ } else {
+ console.log('skipping file progress because your browser is broken');
+ }
}
+
$.assocArraySize = function(obj) {
// http://stackoverflow.com/a/6700/11236
var size = 0, key;
@@ -160,9 +441,9 @@ $(document).ready(function() {
};
// 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.');
+ $(window).on('beforeunload', function(e) {
+ if (OC.Upload.isProcessing()) {
+ return t('files', 'File upload is in progress. Leaving the page now will cancel the upload.');
}
});
@@ -344,8 +625,12 @@ $(document).ready(function() {
}
var li=form.parent();
form.remove();
+ /* workaround for IE 9&10 click event trap, 2 lines: */
+ $('input').first().focus();
+ $('#content').focus();
li.append('<p>'+li.data('text')+'</p>');
$('#new>a').click();
});
});
+ window.file_upload_param = file_upload_param;
});
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 097fe521aa6..67d3d5ead8d 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -68,6 +68,9 @@ var FileActions = {
if ($('tr[data-file="'+file+'"]').data('renaming')) {
return;
}
+
+ // recreate fileactions
+ parent.children('a.name').find('.fileactions').remove();
parent.children('a.name').append('<span class="fileactions" />');
var defaultAction = FileActions.getDefault(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions());
@@ -117,6 +120,8 @@ var FileActions = {
addAction('Share', actions.Share);
}
+ // remove the existing delete action
+ parent.parent().children().last().find('.action.delete').remove();
if (actions['Delete']) {
var img = FileActions.icons['Delete'];
if (img.call) {
@@ -172,7 +177,7 @@ $(document).ready(function () {
FileActions.register('all', 'Delete', OC.PERMISSION_DELETE, function () {
return OC.imagePath('core', 'actions/delete');
}, function (filename) {
- if (Files.cancelUpload(filename)) {
+ if (OC.Upload.cancelUpload($('#dir').val(), filename)) {
if (filename.substr) {
filename = [filename];
}
@@ -196,13 +201,12 @@ FileActions.register('all', 'Rename', OC.PERMISSION_UPDATE, function () {
FileList.rename(filename);
});
-
FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename) {
- var dir = $('#dir').val();
+ var dir = $('#dir').val() || '/';
if (dir !== '/') {
dir = dir + '/';
}
- window.location = OC.linkTo('files', 'index.php') + '?dir=' + encodeURIComponent(dir + filename);
+ FileList.changeDirectory(dir + filename);
});
FileActions.setDefault('dir', 'Open');
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 29be5e0d362..4fc1b95a0ab 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -1,7 +1,28 @@
var FileList={
useUndo:true,
+ postProcessList: function(){
+ $('#fileList tr').each(function(){
+ //little hack to set unescape filenames in attribute
+ $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
+ });
+ },
update:function(fileListHtml) {
- $('#fileList').empty().html(fileListHtml);
+ var $fileList = $('#fileList'),
+ permissions = $('#permissions').val(),
+ isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
+ $fileList.empty().html(fileListHtml);
+ $('#emptycontent').toggleClass('hidden', !isCreatable || $fileList.find('tr').length > 0);
+ $fileList.find('tr').each(function () {
+ FileActions.display($(this).children('td.filename'));
+ });
+ $fileList.trigger(jQuery.Event("fileActionsReady"));
+ FileList.postProcessList();
+ // "Files" might not be loaded in extending apps
+ if (window.Files){
+ Files.setupDragAndDrop();
+ }
+ FileList.updateFileSummary();
+ $fileList.trigger(jQuery.Event("updated"));
},
createRow:function(type, name, iconurl, linktarget, size, lastModified, permissions){
var td, simpleSize, basename, extension;
@@ -109,7 +130,6 @@ var FileList={
if (hidden) {
tr.hide();
}
- FileActions.display(tr.find('td.filename'));
return tr;
},
addDir:function(name,size,lastModified,hidden){
@@ -134,20 +154,109 @@ var FileList={
FileActions.display(tr.find('td.filename'));
return tr;
},
- refresh:function(data) {
- var result = jQuery.parseJSON(data.responseText);
+ /**
+ * @brief Changes the current directory and reload the file list.
+ * @param targetDir target directory (non URL encoded)
+ * @param changeUrl false if the URL must not be changed (defaults to true)
+ */
+ changeDirectory: function(targetDir, changeUrl, force){
+ var $dir = $('#dir'),
+ url,
+ currentDir = $dir.val() || '/';
+ targetDir = targetDir || '/';
+ if (!force && currentDir === targetDir){
+ return;
+ }
+ FileList.setCurrentDir(targetDir, changeUrl);
+ FileList.reload();
+ },
+ linkTo: function(dir){
+ return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
+ },
+ setCurrentDir: function(targetDir, changeUrl){
+ $('#dir').val(targetDir);
+ if (changeUrl !== false){
+ if (window.history.pushState && changeUrl !== false){
+ url = FileList.linkTo(targetDir);
+ window.history.pushState({dir: targetDir}, '', url);
+ }
+ // use URL hash for IE8
+ else{
+ window.location.hash = '?dir='+ encodeURIComponent(targetDir).replace(/%2F/g, '/');
+ }
+ }
+ },
+ /**
+ * @brief Reloads the file list using ajax call
+ */
+ reload: function(){
+ FileList.showMask();
+ if (FileList._reloadCall){
+ FileList._reloadCall.abort();
+ }
+ FileList._reloadCall = $.ajax({
+ url: OC.filePath('files','ajax','list.php'),
+ data: {
+ dir : $('#dir').val(),
+ breadcrumb: true
+ },
+ error: function(result){
+ FileList.reloadCallback(result);
+ },
+ success: function(result) {
+ FileList.reloadCallback(result);
+ }
+ });
+ },
+ reloadCallback: function(result){
+ var $controls = $('#controls');
+
+ delete FileList._reloadCall;
+ FileList.hideMask();
+
+ if (!result || result.status === 'error') {
+ OC.Notification.show(result.data.message);
+ return;
+ }
+
+ if (result.status === 404){
+ // go back home
+ FileList.changeDirectory('/');
+ return;
+ }
+
+ if (result.data.permissions){
+ FileList.setDirectoryPermissions(result.data.permissions);
+ }
+
if(typeof(result.data.breadcrumb) != 'undefined'){
- updateBreadcrumb(result.data.breadcrumb);
+ $controls.find('.crumb').remove();
+ $controls.prepend(result.data.breadcrumb);
+
+ var width = $(window).width();
+ Files.initBreadCrumbs();
+ Files.resizeBreadcrumbs(width, true);
+
+ // in case svg is not supported by the browser we need to execute the fallback mechanism
+ if(!SVGSupport()) {
+ replaceSVG();
+ }
}
+
FileList.update(result.data.files);
- resetFileActionPanel();
+ },
+ setDirectoryPermissions: function(permissions){
+ var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
+ $('#permissions').val(permissions);
+ $('.creatable').toggleClass('hidden', !isCreatable);
+ $('.notCreatable').toggleClass('hidden', isCreatable);
},
remove:function(name){
$('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy');
$('tr').filterAttr('data-file',name).remove();
FileList.updateFileSummary();
if($('tr[data-file]').length==0){
- $('#emptycontent').show();
+ $('#emptycontent').removeClass('hidden');
}
},
insertElement:function(name,type,element){
@@ -177,7 +286,7 @@ var FileList={
}else{
$('#fileList').append(element);
}
- $('#emptycontent').hide();
+ $('#emptycontent').addClass('hidden');
FileList.updateFileSummary();
},
loadingDone:function(name, id){
@@ -508,6 +617,62 @@ var FileList={
$connector.show();
}
}
+ },
+ showMask: function(){
+ // in case one was shown before
+ var $mask = $('#content .mask');
+ if ($mask.length){
+ return;
+ }
+
+ $mask = $('<div class="mask transparent"></div>');
+
+ $mask.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')');
+ $mask.css('background-repeat', 'no-repeat');
+ $('#content').append($mask);
+
+ // block UI, but only make visible in case loading takes longer
+ FileList._maskTimeout = window.setTimeout(function(){
+ // reset opacity
+ $mask.removeClass('transparent');
+ }, 250);
+ },
+ hideMask: function(){
+ var $mask = $('#content .mask').remove();
+ if (FileList._maskTimeout){
+ window.clearTimeout(FileList._maskTimeout);
+ }
+ },
+ scrollTo:function(file) {
+ //scroll to and highlight preselected file
+ var scrolltorow = $('tr[data-file="'+file+'"]');
+ if (scrolltorow.length > 0) {
+ scrolltorow.addClass('searchresult');
+ $(window).scrollTop(scrolltorow.position().top);
+ //remove highlight when hovered over
+ scrolltorow.one('hover', function(){
+ scrolltorow.removeClass('searchresult');
+ });
+ }
+ },
+ filter:function(query){
+ $('#fileList tr:not(.summary)').each(function(i,e){
+ if ($(e).data('file').toLowerCase().indexOf(query.toLowerCase()) !== -1) {
+ $(e).addClass("searchresult");
+ } else {
+ $(e).removeClass("searchresult");
+ }
+ });
+ //do not use scrollto to prevent removing searchresult css class
+ var first = $('#fileList tr.searchresult').first();
+ if (first.length !== 0) {
+ $(window).scrollTop(first.position().top);
+ }
+ },
+ unfilter:function(){
+ $('#fileList tr.searchresult').each(function(i,e){
+ $(e).removeClass("searchresult");
+ });
}
};
@@ -515,147 +680,167 @@ $(document).ready(function(){
// handle upload events
var file_upload_start = $('#file_upload_start');
+
file_upload_start.on('fileuploaddrop', function(e, data) {
- // only handle drop to dir if fileList exists
- if ($('#fileList').length > 0) {
- var dropTarget = $(e.originalEvent.target).closest('tr');
- if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder
- var dirName = dropTarget.data('file');
- // update folder in form
- data.formData = function(form) {
- var formArray = form.serializeArray();
- // array index 0 contains the max files size
- // array index 1 contains the request token
- // array index 2 contains the directory
- var parentDir = formArray[2]['value'];
- if (parentDir === '/') {
- formArray[2]['value'] += dirName;
- } else {
- formArray[2]['value'] += '/'+dirName;
- }
- return formArray;
+ OC.Upload.log('filelist handle fileuploaddrop', e, data);
+
+ var dropTarget = $(e.originalEvent.target).closest('tr');
+ if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder
+
+ // remember as context
+ data.context = dropTarget;
+
+ var dir = dropTarget.data('file');
+
+ // update folder in form
+ data.formData = function(form) {
+ var formArray = form.serializeArray();
+ // array index 0 contains the max files size
+ // array index 1 contains the request token
+ // array index 2 contains the directory
+ var parentDir = formArray[2]['value'];
+ if (parentDir === '/') {
+ formArray[2]['value'] += dir;
+ } else {
+ formArray[2]['value'] += '/' + dir;
}
- }
- }
+
+ return formArray;
+ };
+ }
+
});
file_upload_start.on('fileuploadadd', function(e, data) {
- // only add to fileList if it exists
- if ($('#fileList').length > 0) {
+ OC.Upload.log('filelist handle fileuploadadd', e, data);
+
+ //finish delete if we are uploading a deleted file
+ if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1){
+ FileList.finishDelete(null, true); //delete file before continuing
+ }
- if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!=-1){//finish delete if we are uploading a deleted file
- FileList.finishDelete(null, true); //delete file before continuing
+ // add ui visualization to existing folder
+ if(data.context && data.context.data('type') === 'dir') {
+ // add to existing folder
+
+ // update upload counter ui
+ var uploadtext = data.context.find('.uploadtext');
+ var currentUploads = parseInt(uploadtext.attr('currentUploads'));
+ currentUploads += 1;
+ uploadtext.attr('currentUploads', currentUploads);
+
+ var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads);
+ if(currentUploads === 1) {
+ var img = OC.imagePath('core', 'loading.gif');
+ data.context.find('td.filename').attr('style','background-image:url('+img+')');
+ uploadtext.text(translatedText);
+ uploadtext.show();
+ } else {
+ uploadtext.text(translatedText);
}
+ }
- // add ui visualization to existing folder or as new stand-alone file?
- var dropTarget = $(e.originalEvent.target).closest('tr');
- if(dropTarget && dropTarget.data('type') === 'dir') {
- // add to existing folder
- var dirName = dropTarget.data('file');
+ });
+ /*
+ * when file upload done successfully add row to filelist
+ * update counter when uploading to sub folder
+ */
+ file_upload_start.on('fileuploaddone', function(e, data) {
+ OC.Upload.log('filelist handle fileuploaddone', e, data);
+
+ var response;
+ if (typeof data.result === 'string') {
+ response = data.result;
+ } else {
+ // fetch response from iframe
+ response = data.result[0].body.innerText;
+ }
+ var result=$.parseJSON(response);
+
+ if(typeof result[0] !== 'undefined' && result[0].status === 'success') {
+ var file = result[0];
- // set dir context
- data.context = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName);
+ if (data.context && data.context.data('type') === 'dir') {
// update upload counter ui
var uploadtext = data.context.find('.uploadtext');
var currentUploads = parseInt(uploadtext.attr('currentUploads'));
- currentUploads += 1;
+ currentUploads -= 1;
uploadtext.attr('currentUploads', currentUploads);
var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads);
- if(currentUploads === 1) {
- var img = OC.imagePath('core', 'loading.gif');
+ if(currentUploads === 0) {
+ var img = OC.imagePath('core', 'filetypes/folder.png');
data.context.find('td.filename').attr('style','background-image:url('+img+')');
uploadtext.text(translatedText);
- uploadtext.show();
+ uploadtext.hide();
} else {
uploadtext.text(translatedText);
}
+
+ // update folder size
+ var size = parseInt(data.context.data('size'));
+ size += parseInt(file.size);
+ data.context.attr('data-size', size);
+ data.context.find('td.filesize').text(humanFileSize(size));
+
} else {
+
// add as stand-alone row to filelist
- var uniqueName = getUniqueName(data.files[0].name);
- var size=t('files','Pending');
- if(data.files[0].size>=0){
+ var size=t('files', 'Pending');
+ if (data.files[0].size>=0){
size=data.files[0].size;
}
var date=new Date();
var param = {};
if ($('#publicUploadRequestToken').length) {
- param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + uniqueName;
+ param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + file.name;
}
+ //should the file exist in the list remove it
+ FileList.remove(file.name);
+
// create new file context
- data.context = FileList.addFile(uniqueName,size,date,true,false,param);
+ data.context = FileList.addFile(file.name, file.size, date, false, false, param);
+
+ // update file data
+ data.context.attr('data-mime',file.mime).attr('data-id',file.id);
+ var permissions = data.context.data('permissions');
+ if(permissions != file.permissions) {
+ data.context.attr('data-permissions', file.permissions);
+ data.context.data('permissions', file.permissions);
+ }
+ FileActions.display(data.context.find('td.filename'));
+
+ var path = getPathForPreview(file.name);
+ lazyLoadPreview(path, file.mime, function(previewpath){
+ data.context.find('td.filename').attr('style','background-image:url('+previewpath+')');
+ });
}
}
});
- file_upload_start.on('fileuploaddone', function(e, data) {
- // only update the fileList if it exists
- if ($('#fileList').length > 0) {
- var response;
- if (typeof data.result === 'string') {
- response = data.result;
- } else {
- // fetch response from iframe
- response = data.result[0].body.innerText;
- }
- var result=$.parseJSON(response);
-
- if(typeof result[0] !== 'undefined' && result[0].status === 'success') {
- var file = result[0];
-
- if (data.context.data('type') === 'file') {
- // update file data
- data.context.attr('data-mime',file.mime).attr('data-id',file.id);
- var size = data.context.data('size');
- if(size!=file.size){
- data.context.attr('data-size', file.size);
- data.context.find('td.filesize').text(humanFileSize(file.size));
- }
- if (FileList.loadingDone) {
- FileList.loadingDone(file.name, file.id);
- }
- } else {
- // update upload counter ui
- var uploadtext = data.context.find('.uploadtext');
- var currentUploads = parseInt(uploadtext.attr('currentUploads'));
- currentUploads -= 1;
- uploadtext.attr('currentUploads', currentUploads);
- if(currentUploads === 0) {
- var img = OC.imagePath('core', 'filetypes/folder.png');
- data.context.find('td.filename').attr('style','background-image:url('+img+')');
- uploadtext.text('');
- uploadtext.hide();
- } else {
- uploadtext.text(currentUploads + ' ' + t('files', 'files uploading'));
- }
+ file_upload_start.on('fileuploadstop', function(e, data) {
+ OC.Upload.log('filelist handle fileuploadstop', e, data);
- // update folder size
- var size = parseInt(data.context.data('size'));
- size += parseInt(file.size) ;
- data.context.attr('data-size', size);
- data.context.find('td.filesize').text(humanFileSize(size));
-
- }
- }
+ //if user pressed cancel hide upload chrome
+ if (data.errorThrown === 'abort') {
+ //cleanup uploading to a dir
+ var uploadtext = $('tr .uploadtext');
+ var img = OC.imagePath('core', 'filetypes/folder.png');
+ uploadtext.parents('td.filename').attr('style','background-image:url('+img+')');
+ uploadtext.fadeOut();
+ uploadtext.attr('currentUploads', 0);
}
});
file_upload_start.on('fileuploadfail', function(e, data) {
- // only update the fileList if it exists
- // cleanup files, error notification has been shown by fileupload code
- var tr = data.context;
- if (typeof tr === 'undefined') {
- tr = $('tr').filterAttr('data-file', data.files[0].name);
- }
- if (tr.attr('data-type') === 'dir') {
+ OC.Upload.log('filelist handle fileuploadfail', e, data);
+
+ //if user pressed cancel hide upload chrome
+ if (data.errorThrown === 'abort') {
//cleanup uploading to a dir
- var uploadtext = tr.find('.uploadtext');
+ var uploadtext = $('tr .uploadtext');
var img = OC.imagePath('core', 'filetypes/folder.png');
- tr.find('td.filename').attr('style','background-image:url('+img+')');
- uploadtext.text('');
- uploadtext.hide(); //TODO really hide already
- } else {
- //remove file
- tr.fadeOut();
- tr.remove();
+ uploadtext.parents('td.filename').attr('style','background-image:url('+img+')');
+ uploadtext.fadeOut();
+ uploadtext.attr('currentUploads', 0);
}
});
@@ -683,16 +868,16 @@ $(document).ready(function(){
FileList.replaceIsNewFile = null;
}
FileList.lastAction = null;
- OC.Notification.hide();
+ OC.Notification.hide();
});
$('#notification:first-child').on('click', '.replace', function() {
- OC.Notification.hide(function() {
- FileList.replace($('#notification > span').attr('data-oldName'), $('#notification > span').attr('data-newName'), $('#notification > span').attr('data-isNewFile'));
- });
+ OC.Notification.hide(function() {
+ FileList.replace($('#notification > span').attr('data-oldName'), $('#notification > span').attr('data-newName'), $('#notification > span').attr('data-isNewFile'));
+ });
});
$('#notification:first-child').on('click', '.suggest', function() {
$('tr').filterAttr('data-file', $('#notification > span').attr('data-oldName')).show();
- OC.Notification.hide();
+ OC.Notification.hide();
});
$('#notification:first-child').on('click', '.cancel', function() {
if ($('#notification > span').attr('data-isNewFile')) {
@@ -710,5 +895,55 @@ $(document).ready(function(){
$(window).trigger('beforeunload');
});
+ function parseHashQuery(){
+ var hash = window.location.hash,
+ pos = hash.indexOf('?'),
+ query;
+ if (pos >= 0){
+ return hash.substr(pos + 1);
+ }
+ return '';
+ }
+
+ function parseCurrentDirFromUrl(){
+ var query = parseHashQuery(),
+ params,
+ dir = '/';
+ // try and parse from URL hash first
+ if (query){
+ params = OC.parseQueryString(query);
+ }
+ // else read from query attributes
+ if (!params){
+ params = OC.parseQueryString(location.search);
+ }
+ return (params && params.dir) || '/';
+ }
+
+ // fallback to hashchange when no history support
+ if (!window.history.pushState){
+ $(window).on('hashchange', function(){
+ FileList.changeDirectory(parseCurrentDirFromUrl(), false);
+ });
+ }
+ window.onpopstate = function(e){
+ var targetDir;
+ if (e.state && e.state.dir){
+ targetDir = e.state.dir;
+ }
+ else{
+ // read from URL
+ targetDir = parseCurrentDirFromUrl();
+ }
+ if (targetDir){
+ FileList.changeDirectory(targetDir, false);
+ }
+ }
+
+ if (parseInt($('#ajaxLoad').val(), 10) === 1){
+ // need to initially switch the dir to the one from the hash (IE8)
+ FileList.changeDirectory(parseCurrentDirFromUrl(), false, true);
+ }
+
FileList.createFileSummary();
});
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index d729077ea72..ec688eaf63e 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -1,31 +1,4 @@
-var uploadingFiles = {};
Files={
- cancelUpload:function(filename) {
- if(uploadingFiles[filename]) {
- uploadingFiles[filename].abort();
- delete uploadingFiles[filename];
- return true;
- }
- return false;
- },
- cancelUploads:function() {
- $.each(uploadingFiles,function(index,file) {
- if(typeof file['abort'] === 'function') {
- file.abort();
- var filename = $('tr').filterAttr('data-file',index);
- filename.hide();
- filename.find('input[type="checkbox"]').removeAttr('checked');
- filename.removeClass('selected');
- } else {
- $.each(file,function(i,f) {
- f.abort();
- delete file[i];
- });
- }
- delete uploadingFiles[index];
- });
- procesSelection();
- },
updateMaxUploadFilesize:function(response) {
if(response == undefined) {
return;
@@ -94,29 +67,106 @@ Files={
OC.Notification.show(t('files_encryption', 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.'));
return;
}
+ },
+
+ setupDragAndDrop: function(){
+ var $fileList = $('#fileList');
+
+ //drag/drop of files
+ $fileList.find('tr td.filename').each(function(i,e){
+ if ($(e).parent().data('permissions') & OC.PERMISSION_DELETE) {
+ $(e).draggable(dragOptions);
+ }
+ });
+
+ $fileList.find('tr[data-type="dir"] td.filename').each(function(i,e){
+ if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE){
+ $(e).droppable(folderDropOptions);
+ }
+ });
+ },
+
+ lastWidth: 0,
+
+ initBreadCrumbs: function () {
+ Files.lastWidth = 0;
+ Files.breadcrumbs = [];
+
+ // initialize with some extra space
+ Files.breadcrumbsWidth = 64;
+ if ( document.getElementById("navigation") ) {
+ Files.breadcrumbsWidth += $('#navigation').get(0).offsetWidth;
+ }
+ Files.hiddenBreadcrumbs = 0;
+
+ $.each($('.crumb'), function(index, breadcrumb) {
+ Files.breadcrumbs[index] = breadcrumb;
+ Files.breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth;
+ });
+
+ $.each($('#controls .actions>div'), function(index, action) {
+ Files.breadcrumbsWidth += $(action).get(0).offsetWidth;
+ });
+
+ // event handlers for breadcrumb items
+ $('#controls .crumb a').on('click', onClickBreadcrumb);
+ },
+
+ resizeBreadcrumbs: function (width, firstRun) {
+ if (width != Files.lastWidth) {
+ if ((width < Files.lastWidth || firstRun) && width < Files.breadcrumbsWidth) {
+ if (Files.hiddenBreadcrumbs == 0) {
+ Files.breadcrumbsWidth -= $(Files.breadcrumbs[1]).get(0).offsetWidth;
+ $(Files.breadcrumbs[1]).find('a').hide();
+ $(Files.breadcrumbs[1]).append('<span>...</span>');
+ Files.breadcrumbsWidth += $(Files.breadcrumbs[1]).get(0).offsetWidth;
+ Files.hiddenBreadcrumbs = 2;
+ }
+ var i = Files.hiddenBreadcrumbs;
+ while (width < Files.breadcrumbsWidth && i > 1 && i < Files.breadcrumbs.length - 1) {
+ Files.breadcrumbsWidth -= $(Files.breadcrumbs[i]).get(0).offsetWidth;
+ $(Files.breadcrumbs[i]).hide();
+ Files.hiddenBreadcrumbs = i;
+ i++
+ }
+ } else if (width > Files.lastWidth && Files.hiddenBreadcrumbs > 0) {
+ var i = Files.hiddenBreadcrumbs;
+ while (width > Files.breadcrumbsWidth && i > 0) {
+ if (Files.hiddenBreadcrumbs == 1) {
+ Files.breadcrumbsWidth -= $(Files.breadcrumbs[1]).get(0).offsetWidth;
+ $(Files.breadcrumbs[1]).find('span').remove();
+ $(Files.breadcrumbs[1]).find('a').show();
+ Files.breadcrumbsWidth += $(Files.breadcrumbs[1]).get(0).offsetWidth;
+ } else {
+ $(Files.breadcrumbs[i]).show();
+ Files.breadcrumbsWidth += $(Files.breadcrumbs[i]).get(0).offsetWidth;
+ if (Files.breadcrumbsWidth > width) {
+ Files.breadcrumbsWidth -= $(Files.breadcrumbs[i]).get(0).offsetWidth;
+ $(Files.breadcrumbs[i]).hide();
+ break;
+ }
+ }
+ i--;
+ Files.hiddenBreadcrumbs = i;
+ }
+ }
+ Files.lastWidth = width;
+ }
}
};
$(document).ready(function() {
+ // FIXME: workaround for trashbin app
+ if (window.trashBinApp){
+ return;
+ }
Files.displayEncryptionWarning();
Files.bindKeyboardShortcuts(document, jQuery);
- $('#fileList tr').each(function(){
- //little hack to set unescape filenames in attribute
- $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
- });
+
+ FileList.postProcessList();
+ Files.setupDragAndDrop();
$('#file_action_panel').attr('activeAction', false);
- //drag/drop of files
- $('#fileList tr td.filename').each(function(i,e){
- if ($(e).parent().data('permissions') & OC.PERMISSION_DELETE) {
- $(e).draggable(dragOptions);
- }
- });
- $('#fileList tr[data-type="dir"] td.filename').each(function(i,e){
- if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE){
- $(e).droppable(folderDropOptions);
- }
- });
$('div.crumb:not(.last)').droppable(crumbDropOptions);
$('ul#apps>li:first-child').data('dir','');
if($('div.crumb').length){
@@ -131,7 +181,8 @@ $(document).ready(function() {
// Trigger cancelling of file upload
$('#uploadprogresswrapper .stop').on('click', function() {
- Files.cancelUploads();
+ OC.Upload.cancelUploads();
+ procesSelection();
});
// Show trash bin
@@ -268,72 +319,15 @@ $(document).ready(function() {
//do a background scan if needed
scanFiles();
- var lastWidth = 0;
- var breadcrumbs = [];
- var breadcrumbsWidth = 0;
- if ( document.getElementById("navigation") ) {
- breadcrumbsWidth = $('#navigation').get(0).offsetWidth;
- }
- var hiddenBreadcrumbs = 0;
-
- $.each($('.crumb'), function(index, breadcrumb) {
- breadcrumbs[index] = breadcrumb;
- breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth;
- });
-
-
- $.each($('#controls .actions>div'), function(index, action) {
- breadcrumbsWidth += $(action).get(0).offsetWidth;
- });
-
- function resizeBreadcrumbs(firstRun) {
- var width = $(this).width();
- if (width != lastWidth) {
- if ((width < lastWidth || firstRun) && width < breadcrumbsWidth) {
- if (hiddenBreadcrumbs == 0) {
- breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth;
- $(breadcrumbs[1]).find('a').hide();
- $(breadcrumbs[1]).append('<span>...</span>');
- breadcrumbsWidth += $(breadcrumbs[1]).get(0).offsetWidth;
- hiddenBreadcrumbs = 2;
- }
- var i = hiddenBreadcrumbs;
- while (width < breadcrumbsWidth && i > 1 && i < breadcrumbs.length - 1) {
- breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth;
- $(breadcrumbs[i]).hide();
- hiddenBreadcrumbs = i;
- i++
- }
- } else if (width > lastWidth && hiddenBreadcrumbs > 0) {
- var i = hiddenBreadcrumbs;
- while (width > breadcrumbsWidth && i > 0) {
- if (hiddenBreadcrumbs == 1) {
- breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth;
- $(breadcrumbs[1]).find('span').remove();
- $(breadcrumbs[1]).find('a').show();
- breadcrumbsWidth += $(breadcrumbs[1]).get(0).offsetWidth;
- } else {
- $(breadcrumbs[i]).show();
- breadcrumbsWidth += $(breadcrumbs[i]).get(0).offsetWidth;
- if (breadcrumbsWidth > width) {
- breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth;
- $(breadcrumbs[i]).hide();
- break;
- }
- }
- i--;
- hiddenBreadcrumbs = i;
- }
- }
- lastWidth = width;
- }
- }
+ Files.initBreadCrumbs();
$(window).resize(function() {
- resizeBreadcrumbs(false);
+ var width = $(this).width();
+ Files.resizeBreadcrumbs(width, false);
});
- resizeBreadcrumbs(true);
+ var width = $(this).width();
+ Files.resizeBreadcrumbs(width, true);
// display storage warnings
setTimeout ( "Files.displayStorageWarnings()", 100 );
@@ -364,6 +358,11 @@ $(document).ready(function() {
}
});
}
+
+ //scroll to and highlight preselected file
+ if (getURLParameter('scrollto')) {
+ FileList.scrollTo(getURLParameter('scrollto'));
+ }
});
function scanFiles(force, dir, users){
@@ -415,10 +414,6 @@ function boolOperationFinished(data, callback) {
}
}
-function updateBreadcrumb(breadcrumbHtml) {
- $('p.nav').empty().html(breadcrumbHtml);
-}
-
var createDragShadow = function(event){
//select dragged file
var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked');
@@ -509,7 +504,7 @@ var folderDropOptions={
$('#notification').fadeIn();
}
} else {
- OC.dialogs.alert(t('Error moving file'), t('core', 'Error'));
+ OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error'));
}
});
});
@@ -547,7 +542,7 @@ var crumbDropOptions={
$('#notification').fadeIn();
}
} else {
- OC.dialogs.alert(t('Error moving file'), t('core', 'Error'));
+ OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error'));
}
});
});
@@ -637,15 +632,29 @@ function getPathForPreview(name) {
return path;
}
-function lazyLoadPreview(path, mime, ready) {
- getMimeIcon(mime,ready);
- var x = $('#filestable').data('preview-x');
- var y = $('#filestable').data('preview-y');
- var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:x, y:y});
- $.get(previewURL, function() {
- previewURL = previewURL.replace('(','%28');
- previewURL = previewURL.replace(')','%29');
- ready(previewURL + '&reload=true');
+function lazyLoadPreview(path, mime, ready, width, height) {
+ // get mime icon url
+ getMimeIcon(mime, function(iconURL) {
+ ready(iconURL); // set mimeicon URL
+
+ // now try getting a preview thumbnail URL
+ if ( ! width ) {
+ width = $('#filestable').data('preview-x');
+ }
+ if ( ! height ) {
+ height = $('#filestable').data('preview-y');
+ }
+ if( $('#publicUploadButtonMock').length ) {
+ var previewURL = OC.Router.generate('core_ajax_public_preview', {file: encodeURIComponent(path), x:width, y:height, t:$('#dirToken').val()});
+ } else {
+ var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:width, y:height});
+ }
+ $.get(previewURL, function() {
+ previewURL = previewURL.replace('(', '%28');
+ previewURL = previewURL.replace(')', '%29');
+ //set preview thumbnail URL
+ ready(previewURL + '&reload=true');
+ });
});
}
@@ -681,3 +690,9 @@ function checkTrashStatus() {
}
});
}
+
+function onClickBreadcrumb(e){
+ var $el = $(e.target).closest('.crumb');
+ e.preventDefault();
+ FileList.changeDirectory(decodeURIComponent($el.data('dir')));
+}
diff --git a/apps/files/js/jquery.fileupload.js b/apps/files/js/jquery.fileupload.js
index a89e9dc2c44..f9f6cc3a382 100644
--- a/apps/files/js/jquery.fileupload.js
+++ b/apps/files/js/jquery.fileupload.js
@@ -1,5 +1,5 @@
/*
- * jQuery File Upload Plugin 5.9
+ * jQuery File Upload Plugin 5.32.2
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
@@ -10,7 +10,7 @@
*/
/*jslint nomen: true, unparam: true, regexp: true */
-/*global define, window, document, Blob, FormData, location */
+/*global define, window, document, location, File, Blob, FormData */
(function (factory) {
'use strict';
@@ -27,12 +27,28 @@
}(function ($) {
'use strict';
+ // Detect file input support, based on
+ // http://viljamis.com/blog/2012/file-upload-support-on-mobile/
+ $.support.fileInput = !(new RegExp(
+ // Handle devices which give false positives for the feature detection:
+ '(Android (1\\.[0156]|2\\.[01]))' +
+ '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
+ '|(w(eb)?OSBrowser)|(webOS)' +
+ '|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
+ ).test(window.navigator.userAgent) ||
+ // Feature detection for all other devices:
+ $('<input type="file">').prop('disabled'));
+
// The FileReader API is not actually used, but works as feature detection,
// as e.g. Safari supports XHR file uploads via the FormData API,
// but not non-multipart XHR file uploads:
$.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);
$.support.xhrFormDataFileUpload = !!window.FormData;
+ // Detect support for Blob slicing (required for chunked uploads):
+ $.support.blobSlice = window.Blob && (Blob.prototype.slice ||
+ Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
+
// The fileupload widget listens for change events on file input fields defined
// via fileInput setting and paste or drop events of the given dropZone.
// In addition to the default jQuery Widget methods, the fileupload widget
@@ -44,17 +60,16 @@
$.widget('blueimp.fileupload', {
options: {
- // The namespace used for event handler binding on the dropZone and
- // fileInput collections.
- // If not set, the name of the widget ("fileupload") is used.
- namespace: undefined,
- // The drop target collection, by the default the complete document.
- // Set to null or an empty collection to disable drag & drop support:
+ // The drop target element(s), by the default the complete document.
+ // Set to null to disable drag & drop support:
dropZone: $(document),
- // The file input field collection, that is listened for change events.
+ // The paste target element(s), by the default the complete document.
+ // Set to null to disable paste support:
+ pasteZone: $(document),
+ // The file input field(s), that are listened to for change events.
// If undefined, it is set to the file input fields inside
// of the widget element on plugin initialization.
- // Set to null or an empty collection to disable the change listener.
+ // Set to null to disable the change listener.
fileInput: undefined,
// By default, the file input field is replaced with a clone after
// each input field change event. This is required for iframe transport
@@ -63,7 +78,8 @@
replaceFileInput: true,
// The parameter name for the file form data (the request argument name).
// If undefined or empty, the name property of the file input field is
- // used, or "files[]" if the file input name property is also empty:
+ // used, or "files[]" if the file input name property is also empty,
+ // can be a string or an array of strings:
paramName: undefined,
// By default, each file of a selection is uploaded using an individual
// request for XHR type uploads. Set to false to upload file
@@ -108,6 +124,29 @@
// global progress calculation. Set the following option to false to
// prevent recalculating the global progress data:
recalculateProgress: true,
+ // Interval in milliseconds to calculate and trigger progress events:
+ progressInterval: 100,
+ // Interval in milliseconds to calculate progress bitrate:
+ bitrateInterval: 500,
+ // By default, uploads are started automatically when adding files:
+ autoUpload: true,
+
+ // Error and info messages:
+ messages: {
+ uploadedBytes: 'Uploaded bytes exceed file size'
+ },
+
+ // Translation function, gets the message key to be translated
+ // and an object with context specific data as arguments:
+ i18n: function (message, context) {
+ message = this.messages[message] || message.toString();
+ if (context) {
+ $.each(context, function (key, value) {
+ message = message.replace('{' + key + '}', value);
+ });
+ }
+ return message;
+ },
// Additional form data to be sent along with the file uploads can be set
// using this option, which accepts an array of objects with name and
@@ -121,48 +160,81 @@
// The add callback is invoked as soon as files are added to the fileupload
// widget (via file input selection, drag & drop, paste or add API call).
// If the singleFileUploads option is enabled, this callback will be
- // called once for each file in the selection for XHR file uplaods, else
+ // called once for each file in the selection for XHR file uploads, else
// once for each file selection.
+ //
// The upload starts when the submit method is invoked on the data parameter.
// The data object contains a files property holding the added files
- // and allows to override plugin options as well as define ajax settings.
+ // and allows you to override plugin options as well as define ajax settings.
+ //
// Listeners for this callback can also be bound the following way:
// .bind('fileuploadadd', func);
+ //
// data.submit() returns a Promise object and allows to attach additional
// handlers using jQuery's Deferred callbacks:
// data.submit().done(func).fail(func).always(func);
add: function (e, data) {
- data.submit();
+ if (data.autoUpload || (data.autoUpload !== false &&
+ $(this).fileupload('option', 'autoUpload'))) {
+ data.process().done(function () {
+ data.submit();
+ });
+ }
},
// Other callbacks:
+
// Callback for the submit event of each file upload:
// submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
+
// Callback for the start of each file upload request:
// send: function (e, data) {}, // .bind('fileuploadsend', func);
+
// Callback for successful uploads:
// done: function (e, data) {}, // .bind('fileuploaddone', func);
+
// Callback for failed (abort or error) uploads:
// fail: function (e, data) {}, // .bind('fileuploadfail', func);
+
// Callback for completed (success, abort or error) requests:
// always: function (e, data) {}, // .bind('fileuploadalways', func);
+
// Callback for upload progress events:
// progress: function (e, data) {}, // .bind('fileuploadprogress', func);
+
// Callback for global upload progress events:
// progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
+
// Callback for uploads start, equivalent to the global ajaxStart event:
// start: function (e) {}, // .bind('fileuploadstart', func);
+
// Callback for uploads stop, equivalent to the global ajaxStop event:
// stop: function (e) {}, // .bind('fileuploadstop', func);
- // Callback for change events of the fileInput collection:
+
+ // Callback for change events of the fileInput(s):
// change: function (e, data) {}, // .bind('fileuploadchange', func);
- // Callback for paste events to the dropZone collection:
+
+ // Callback for paste events to the pasteZone(s):
// paste: function (e, data) {}, // .bind('fileuploadpaste', func);
- // Callback for drop events of the dropZone collection:
+
+ // Callback for drop events of the dropZone(s):
// drop: function (e, data) {}, // .bind('fileuploaddrop', func);
- // Callback for dragover events of the dropZone collection:
+
+ // Callback for dragover events of the dropZone(s):
// dragover: function (e) {}, // .bind('fileuploaddragover', func);
+ // Callback for the start of each chunk upload request:
+ // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
+
+ // Callback for successful chunk uploads:
+ // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
+
+ // Callback for failed (abort or error) chunk uploads:
+ // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
+
+ // Callback for completed (success, abort or error) chunk upload requests:
+ // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
+
// The plugin options are used as settings object for the ajax calls.
// The following are jQuery ajax settings required for the file uploads:
processData: false,
@@ -170,15 +242,36 @@
cache: false
},
- // A list of options that require a refresh after assigning a new value:
- _refreshOptionsList: [
- 'namespace',
- 'dropZone',
+ // A list of options that require reinitializing event listeners and/or
+ // special initialization code:
+ _specialOptions: [
'fileInput',
+ 'dropZone',
+ 'pasteZone',
'multipart',
'forceIframeTransport'
],
+ _blobSlice: $.support.blobSlice && function () {
+ var slice = this.slice || this.webkitSlice || this.mozSlice;
+ return slice.apply(this, arguments);
+ },
+
+ _BitrateTimer: function () {
+ this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
+ this.loaded = 0;
+ this.bitrate = 0;
+ this.getBitrate = function (now, loaded, interval) {
+ var timeDiff = now - this.timestamp;
+ if (!this.bitrate || !interval || timeDiff > interval) {
+ this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
+ this.loaded = loaded;
+ this.timestamp = now;
+ }
+ return this.bitrate;
+ };
+ },
+
_isXHRUpload: function (options) {
return !options.forceIframeTransport &&
((!options.multipart && $.support.xhrFileUpload) ||
@@ -189,9 +282,11 @@
var formData;
if (typeof options.formData === 'function') {
return options.formData(options.form);
- } else if ($.isArray(options.formData)) {
+ }
+ if ($.isArray(options.formData)) {
return options.formData;
- } else if (options.formData) {
+ }
+ if ($.type(options.formData) === 'object') {
formData = [];
$.each(options.formData, function (name, value) {
formData.push({name: name, value: value});
@@ -209,28 +304,66 @@
return total;
},
+ _initProgressObject: function (obj) {
+ var progress = {
+ loaded: 0,
+ total: 0,
+ bitrate: 0
+ };
+ if (obj._progress) {
+ $.extend(obj._progress, progress);
+ } else {
+ obj._progress = progress;
+ }
+ },
+
+ _initResponseObject: function (obj) {
+ var prop;
+ if (obj._response) {
+ for (prop in obj._response) {
+ if (obj._response.hasOwnProperty(prop)) {
+ delete obj._response[prop];
+ }
+ }
+ } else {
+ obj._response = {};
+ }
+ },
+
_onProgress: function (e, data) {
if (e.lengthComputable) {
- var total = data.total || this._getTotal(data.files),
- loaded = parseInt(
- e.loaded / e.total * (data.chunkSize || total),
- 10
- ) + (data.uploadedBytes || 0);
- this._loaded += loaded - (data.loaded || data.uploadedBytes || 0);
- data.lengthComputable = true;
- data.loaded = loaded;
- data.total = total;
+ var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
+ loaded;
+ if (data._time && data.progressInterval &&
+ (now - data._time < data.progressInterval) &&
+ e.loaded !== e.total) {
+ return;
+ }
+ data._time = now;
+ loaded = Math.floor(
+ e.loaded / e.total * (data.chunkSize || data._progress.total)
+ ) + (data.uploadedBytes || 0);
+ // Add the difference from the previously loaded state
+ // to the global loaded counter:
+ this._progress.loaded += (loaded - data._progress.loaded);
+ this._progress.bitrate = this._bitrateTimer.getBitrate(
+ now,
+ this._progress.loaded,
+ data.bitrateInterval
+ );
+ data._progress.loaded = data.loaded = loaded;
+ data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
+ now,
+ loaded,
+ data.bitrateInterval
+ );
// Trigger a custom progress event with a total data property set
// to the file size(s) of the current upload and a loaded data
// property calculated accordingly:
this._trigger('progress', e, data);
// Trigger a global progress event for all current file uploads,
// including ajax calls queued for sequential file uploads:
- this._trigger('progressall', e, {
- lengthComputable: true,
- loaded: this._loaded,
- total: this._total
- });
+ this._trigger('progressall', e, this._progress);
}
},
@@ -254,34 +387,30 @@
}
},
+ _isInstanceOf: function (type, obj) {
+ // Cross-frame instanceof check
+ return Object.prototype.toString.call(obj) === '[object ' + type + ']';
+ },
+
_initXHRData: function (options) {
- var formData,
+ var that = this,
+ formData,
file = options.files[0],
// Ignore non-multipart setting if not supported:
- multipart = options.multipart || !$.support.xhrFileUpload;
- if (!multipart || options.blob) {
- // For non-multipart uploads and chunked uploads,
- // file meta data is not part of the request body,
- // so we transmit this data as part of the HTTP headers.
- // For cross domain requests, these headers must be allowed
- // via Access-Control-Allow-Headers or removed using
- // the beforeSend callback:
- options.headers = $.extend(options.headers, {
- 'X-File-Name': file.name,
- 'X-File-Type': file.type,
- 'X-File-Size': file.size
- });
- if (!options.blob) {
- // Non-chunked non-multipart upload:
- options.contentType = file.type;
- options.data = file;
- } else if (!multipart) {
- // Chunked non-multipart upload:
- options.contentType = 'application/octet-stream';
- options.data = options.blob;
- }
+ multipart = options.multipart || !$.support.xhrFileUpload,
+ paramName = options.paramName[0];
+ options.headers = options.headers || {};
+ if (options.contentRange) {
+ options.headers['Content-Range'] = options.contentRange;
+ }
+ if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
+ options.headers['Content-Disposition'] = 'attachment; filename="' +
+ encodeURI(file.name) + '"';
}
- if (multipart && $.support.xhrFormDataFileUpload) {
+ if (!multipart) {
+ options.contentType = file.type;
+ options.data = options.blob || file;
+ } else if ($.support.xhrFormDataFileUpload) {
if (options.postMessage) {
// window.postMessage does not allow sending FormData
// objects, so we just add the File/Blob objects to
@@ -290,19 +419,19 @@
formData = this._getFormData(options);
if (options.blob) {
formData.push({
- name: options.paramName,
+ name: paramName,
value: options.blob
});
} else {
$.each(options.files, function (index, file) {
formData.push({
- name: options.paramName,
+ name: options.paramName[index] || paramName,
value: file
});
});
}
} else {
- if (options.formData instanceof FormData) {
+ if (that._isInstanceOf('FormData', options.formData)) {
formData = options.formData;
} else {
formData = new FormData();
@@ -311,14 +440,18 @@
});
}
if (options.blob) {
- formData.append(options.paramName, options.blob, file.name);
+ formData.append(paramName, options.blob, file.name);
} else {
$.each(options.files, function (index, file) {
- // File objects are also Blob instances.
// This check allows the tests to run with
// dummy objects:
- if (file instanceof Blob) {
- formData.append(options.paramName, file, file.name);
+ if (that._isInstanceOf('File', file) ||
+ that._isInstanceOf('Blob', file)) {
+ formData.append(
+ options.paramName[index] || paramName,
+ file,
+ file.name
+ );
}
});
}
@@ -330,13 +463,13 @@
},
_initIframeSettings: function (options) {
+ var targetHost = $('<a></a>').prop('href', options.url).prop('host');
// Setting the dataType to iframe enables the iframe transport:
options.dataType = 'iframe ' + (options.dataType || '');
// The iframe transport accepts a serialized array as form data:
options.formData = this._getFormData(options);
// Add redirect url to form data on cross-domain uploads:
- if (options.redirect && $('<a></a>').prop('href', options.url)
- .prop('host') !== location.host) {
+ if (options.redirect && targetHost && targetHost !== location.host) {
options.formData.push({
name: options.redirectParamName || 'redirect',
value: options.redirect
@@ -358,29 +491,58 @@
options.dataType = 'postmessage ' + (options.dataType || '');
}
} else {
- this._initIframeSettings(options, 'iframe');
+ this._initIframeSettings(options);
}
},
+ _getParamName: function (options) {
+ var fileInput = $(options.fileInput),
+ paramName = options.paramName;
+ if (!paramName) {
+ paramName = [];
+ fileInput.each(function () {
+ var input = $(this),
+ name = input.prop('name') || 'files[]',
+ i = (input.prop('files') || [1]).length;
+ while (i) {
+ paramName.push(name);
+ i -= 1;
+ }
+ });
+ if (!paramName.length) {
+ paramName = [fileInput.prop('name') || 'files[]'];
+ }
+ } else if (!$.isArray(paramName)) {
+ paramName = [paramName];
+ }
+ return paramName;
+ },
+
_initFormSettings: function (options) {
// Retrieve missing options from the input field and the
// associated form, if available:
if (!options.form || !options.form.length) {
options.form = $(options.fileInput.prop('form'));
+ // If the given file input doesn't have an associated form,
+ // use the default widget file input's form:
+ if (!options.form.length) {
+ options.form = $(this.options.fileInput.prop('form'));
+ }
}
- if (!options.paramName) {
- options.paramName = options.fileInput.prop('name') ||
- 'files[]';
- }
+ options.paramName = this._getParamName(options);
if (!options.url) {
options.url = options.form.prop('action') || location.href;
}
// The HTTP request method must be "POST" or "PUT":
options.type = (options.type || options.form.prop('method') || '')
.toUpperCase();
- if (options.type !== 'POST' && options.type !== 'PUT') {
+ if (options.type !== 'POST' && options.type !== 'PUT' &&
+ options.type !== 'PATCH') {
options.type = 'POST';
}
+ if (!options.formAcceptCharset) {
+ options.formAcceptCharset = options.form.attr('accept-charset');
+ }
},
_getAJAXSettings: function (data) {
@@ -390,6 +552,21 @@
return options;
},
+ // jQuery 1.6 doesn't provide .state(),
+ // while jQuery 1.8+ removed .isRejected() and .isResolved():
+ _getDeferredState: function (deferred) {
+ if (deferred.state) {
+ return deferred.state();
+ }
+ if (deferred.isResolved()) {
+ return 'resolved';
+ }
+ if (deferred.isRejected()) {
+ return 'rejected';
+ }
+ return 'pending';
+ },
+
// Maps jqXHR callbacks to the equivalent
// methods of the given Promise object:
_enhancePromise: function (promise) {
@@ -414,24 +591,77 @@
return this._enhancePromise(promise);
},
+ // Adds convenience methods to the data callback argument:
+ _addConvenienceMethods: function (e, data) {
+ var that = this,
+ getPromise = function (data) {
+ return $.Deferred().resolveWith(that, [data]).promise();
+ };
+ data.process = function (resolveFunc, rejectFunc) {
+ if (resolveFunc || rejectFunc) {
+ data._processQueue = this._processQueue =
+ (this._processQueue || getPromise(this))
+ .pipe(resolveFunc, rejectFunc);
+ }
+ return this._processQueue || getPromise(this);
+ };
+ data.submit = function () {
+ if (this.state() !== 'pending') {
+ data.jqXHR = this.jqXHR =
+ (that._trigger('submit', e, this) !== false) &&
+ that._onSend(e, this);
+ }
+ return this.jqXHR || that._getXHRPromise();
+ };
+ data.abort = function () {
+ if (this.jqXHR) {
+ return this.jqXHR.abort();
+ }
+ return that._getXHRPromise();
+ };
+ data.state = function () {
+ if (this.jqXHR) {
+ return that._getDeferredState(this.jqXHR);
+ }
+ if (this._processQueue) {
+ return that._getDeferredState(this._processQueue);
+ }
+ };
+ data.progress = function () {
+ return this._progress;
+ };
+ data.response = function () {
+ return this._response;
+ };
+ },
+
+ // Parses the Range header from the server response
+ // and returns the uploaded bytes:
+ _getUploadedBytes: function (jqXHR) {
+ var range = jqXHR.getResponseHeader('Range'),
+ parts = range && range.split('-'),
+ upperBytesPos = parts && parts.length > 1 &&
+ parseInt(parts[1], 10);
+ return upperBytesPos && upperBytesPos + 1;
+ },
+
// Uploads a file in multiple, sequential requests
// by splitting the file up in multiple blob chunks.
// If the second parameter is true, only tests if the file
// should be uploaded in chunks, but does not invoke any
// upload requests:
_chunkedUpload: function (options, testOnly) {
+ options.uploadedBytes = options.uploadedBytes || 0;
var that = this,
file = options.files[0],
fs = file.size,
- ub = options.uploadedBytes = options.uploadedBytes || 0,
+ ub = options.uploadedBytes,
mcs = options.maxChunkSize || fs,
- // Use the Blob methods with the slice implementation
- // according to the W3C Blob API specification:
- slice = file.webkitSlice || file.mozSlice || file.slice,
- upload,
- n,
+ slice = this._blobSlice,
+ dfd = $.Deferred(),
+ promise = dfd.promise(),
jqXHR,
- pipe;
+ upload;
if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
options.data) {
return false;
@@ -440,62 +670,84 @@
return true;
}
if (ub >= fs) {
- file.error = 'uploadedBytes';
+ file.error = options.i18n('uploadedBytes');
return this._getXHRPromise(
false,
options.context,
[null, 'error', file.error]
);
}
- // n is the number of blobs to upload,
- // calculated via filesize, uploaded bytes and max chunk size:
- n = Math.ceil((fs - ub) / mcs);
- // The chunk upload method accepting the chunk number as parameter:
- upload = function (i) {
- if (!i) {
- return that._getXHRPromise(true, options.context);
- }
- // Upload the blobs in sequential order:
- return upload(i -= 1).pipe(function () {
- // Clone the options object for each chunk upload:
- var o = $.extend({}, options);
- o.blob = slice.call(
- file,
- ub + i * mcs,
- ub + (i + 1) * mcs
- );
- // Store the current chunk size, as the blob itself
- // will be dereferenced after data processing:
- o.chunkSize = o.blob.size;
- // Process the upload data (the blob and potential form data):
- that._initXHRData(o);
- // Add progress listeners for this chunk upload:
- that._initProgressListener(o);
- jqXHR = ($.ajax(o) || that._getXHRPromise(false, o.context))
- .done(function () {
- // Create a progress event if upload is done and
- // no progress event has been invoked for this chunk:
- if (!o.loaded) {
- that._onProgress($.Event('progress', {
- lengthComputable: true,
- loaded: o.chunkSize,
- total: o.chunkSize
- }), o);
- }
- options.uploadedBytes = o.uploadedBytes +=
- o.chunkSize;
- });
- return jqXHR;
- });
+ // The chunk upload method:
+ upload = function () {
+ // Clone the options object for each chunk upload:
+ var o = $.extend({}, options),
+ currentLoaded = o._progress.loaded;
+ o.blob = slice.call(
+ file,
+ ub,
+ ub + mcs,
+ file.type
+ );
+ // Store the current chunk size, as the blob itself
+ // will be dereferenced after data processing:
+ o.chunkSize = o.blob.size;
+ // Expose the chunk bytes position range:
+ o.contentRange = 'bytes ' + ub + '-' +
+ (ub + o.chunkSize - 1) + '/' + fs;
+ // Process the upload data (the blob and potential form data):
+ that._initXHRData(o);
+ // Add progress listeners for this chunk upload:
+ that._initProgressListener(o);
+ jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
+ that._getXHRPromise(false, o.context))
+ .done(function (result, textStatus, jqXHR) {
+ ub = that._getUploadedBytes(jqXHR) ||
+ (ub + o.chunkSize);
+ // Create a progress event if no final progress event
+ // with loaded equaling total has been triggered
+ // for this chunk:
+ if (currentLoaded + o.chunkSize - o._progress.loaded) {
+ that._onProgress($.Event('progress', {
+ lengthComputable: true,
+ loaded: ub - o.uploadedBytes,
+ total: ub - o.uploadedBytes
+ }), o);
+ }
+ options.uploadedBytes = o.uploadedBytes = ub;
+ o.result = result;
+ o.textStatus = textStatus;
+ o.jqXHR = jqXHR;
+ that._trigger('chunkdone', null, o);
+ that._trigger('chunkalways', null, o);
+ if (ub < fs) {
+ // File upload not yet complete,
+ // continue with the next chunk:
+ upload();
+ } else {
+ dfd.resolveWith(
+ o.context,
+ [result, textStatus, jqXHR]
+ );
+ }
+ })
+ .fail(function (jqXHR, textStatus, errorThrown) {
+ o.jqXHR = jqXHR;
+ o.textStatus = textStatus;
+ o.errorThrown = errorThrown;
+ that._trigger('chunkfail', null, o);
+ that._trigger('chunkalways', null, o);
+ dfd.rejectWith(
+ o.context,
+ [jqXHR, textStatus, errorThrown]
+ );
+ });
};
- // Return the piped Promise object, enhanced with an abort method,
- // which is delegated to the jqXHR object of the current upload,
- // and jqXHR callbacks mapped to the equivalent Promise methods:
- pipe = upload(n);
- pipe.abort = function () {
+ this._enhancePromise(promise);
+ promise.abort = function () {
return jqXHR.abort();
};
- return this._enhancePromise(pipe);
+ upload();
+ return promise;
},
_beforeSend: function (e, data) {
@@ -504,99 +756,113 @@
// and no other uploads are currently running,
// equivalent to the global ajaxStart event:
this._trigger('start');
+ // Set timer for global bitrate progress calculation:
+ this._bitrateTimer = new this._BitrateTimer();
+ // Reset the global progress values:
+ this._progress.loaded = this._progress.total = 0;
+ this._progress.bitrate = 0;
}
+ // Make sure the container objects for the .response() and
+ // .progress() methods on the data object are available
+ // and reset to their initial state:
+ this._initResponseObject(data);
+ this._initProgressObject(data);
+ data._progress.loaded = data.loaded = data.uploadedBytes || 0;
+ data._progress.total = data.total = this._getTotal(data.files) || 1;
+ data._progress.bitrate = data.bitrate = 0;
this._active += 1;
// Initialize the global progress values:
- this._loaded += data.uploadedBytes || 0;
- this._total += this._getTotal(data.files);
+ this._progress.loaded += data.loaded;
+ this._progress.total += data.total;
},
_onDone: function (result, textStatus, jqXHR, options) {
- if (!this._isXHRUpload(options)) {
- // Create a progress event for each iframe load:
+ var total = options._progress.total,
+ response = options._response;
+ if (options._progress.loaded < total) {
+ // Create a progress event if no final progress event
+ // with loaded equaling total has been triggered:
this._onProgress($.Event('progress', {
lengthComputable: true,
- loaded: 1,
- total: 1
+ loaded: total,
+ total: total
}), options);
}
- options.result = result;
- options.textStatus = textStatus;
- options.jqXHR = jqXHR;
+ response.result = options.result = result;
+ response.textStatus = options.textStatus = textStatus;
+ response.jqXHR = options.jqXHR = jqXHR;
this._trigger('done', null, options);
},
_onFail: function (jqXHR, textStatus, errorThrown, options) {
- options.jqXHR = jqXHR;
- options.textStatus = textStatus;
- options.errorThrown = errorThrown;
- this._trigger('fail', null, options);
+ var response = options._response;
if (options.recalculateProgress) {
// Remove the failed (error or abort) file upload from
// the global progress calculation:
- this._loaded -= options.loaded || options.uploadedBytes || 0;
- this._total -= options.total || this._getTotal(options.files);
+ this._progress.loaded -= options._progress.loaded;
+ this._progress.total -= options._progress.total;
}
+ response.jqXHR = options.jqXHR = jqXHR;
+ response.textStatus = options.textStatus = textStatus;
+ response.errorThrown = options.errorThrown = errorThrown;
+ this._trigger('fail', null, options);
},
_onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
- this._active -= 1;
- options.textStatus = textStatus;
- if (jqXHRorError && jqXHRorError.always) {
- options.jqXHR = jqXHRorError;
- options.result = jqXHRorResult;
- } else {
- options.jqXHR = jqXHRorResult;
- options.errorThrown = jqXHRorError;
- }
+ // jqXHRorResult, textStatus and jqXHRorError are added to the
+ // options object via done and fail callbacks
this._trigger('always', null, options);
- if (this._active === 0) {
- // The stop callback is triggered when all uploads have
- // been completed, equivalent to the global ajaxStop event:
- this._trigger('stop');
- // Reset the global progress values:
- this._loaded = this._total = 0;
- }
},
_onSend: function (e, data) {
+ if (!data.submit) {
+ this._addConvenienceMethods(e, data);
+ }
var that = this,
jqXHR,
+ aborted,
slot,
pipe,
options = that._getAJAXSettings(data),
- send = function (resolve, args) {
+ send = function () {
that._sending += 1;
+ // Set timer for bitrate progress calculation:
+ options._bitrateTimer = new that._BitrateTimer();
jqXHR = jqXHR || (
- (resolve !== false &&
- that._trigger('send', e, options) !== false &&
- (that._chunkedUpload(options) || $.ajax(options))) ||
- that._getXHRPromise(false, options.context, args)
+ ((aborted || that._trigger('send', e, options) === false) &&
+ that._getXHRPromise(false, options.context, aborted)) ||
+ that._chunkedUpload(options) || $.ajax(options)
).done(function (result, textStatus, jqXHR) {
that._onDone(result, textStatus, jqXHR, options);
}).fail(function (jqXHR, textStatus, errorThrown) {
that._onFail(jqXHR, textStatus, errorThrown, options);
}).always(function (jqXHRorResult, textStatus, jqXHRorError) {
- that._sending -= 1;
that._onAlways(
jqXHRorResult,
textStatus,
jqXHRorError,
options
);
+ that._sending -= 1;
+ that._active -= 1;
if (options.limitConcurrentUploads &&
options.limitConcurrentUploads > that._sending) {
// Start the next queued upload,
// that has not been aborted:
var nextSlot = that._slots.shift();
while (nextSlot) {
- if (!nextSlot.isRejected()) {
+ if (that._getDeferredState(nextSlot) === 'pending') {
nextSlot.resolve();
break;
}
nextSlot = that._slots.shift();
}
}
+ if (that._active === 0) {
+ // The stop callback is triggered when all uploads have
+ // been completed, equivalent to the global ajaxStop event:
+ that._trigger('stop');
+ }
});
return jqXHR;
};
@@ -609,18 +875,19 @@
this._slots.push(slot);
pipe = slot.pipe(send);
} else {
- pipe = (this._sequence = this._sequence.pipe(send, send));
+ this._sequence = this._sequence.pipe(send, send);
+ pipe = this._sequence;
}
// Return the piped Promise object, enhanced with an abort method,
// which is delegated to the jqXHR object of the current upload,
// and jqXHR callbacks mapped to the equivalent Promise methods:
pipe.abort = function () {
- var args = [undefined, 'abort', 'abort'];
+ aborted = [undefined, 'abort', 'abort'];
if (!jqXHR) {
if (slot) {
- slot.rejectWith(args);
+ slot.rejectWith(options.context, aborted);
}
- return send(false, args);
+ return send();
}
return jqXHR.abort();
};
@@ -634,40 +901,43 @@
result = true,
options = $.extend({}, this.options, data),
limit = options.limitMultiFileUploads,
+ paramName = this._getParamName(options),
+ paramNameSet,
+ paramNameSlice,
fileSet,
i;
if (!(options.singleFileUploads || limit) ||
!this._isXHRUpload(options)) {
fileSet = [data.files];
+ paramNameSet = [paramName];
} else if (!options.singleFileUploads && limit) {
fileSet = [];
+ paramNameSet = [];
for (i = 0; i < data.files.length; i += limit) {
fileSet.push(data.files.slice(i, i + limit));
+ paramNameSlice = paramName.slice(i, i + limit);
+ if (!paramNameSlice.length) {
+ paramNameSlice = paramName;
+ }
+ paramNameSet.push(paramNameSlice);
}
+ } else {
+ paramNameSet = paramName;
}
data.originalFiles = data.files;
$.each(fileSet || data.files, function (index, element) {
- var files = fileSet ? element : [element],
- newData = $.extend({}, data, {files: files});
- newData.submit = function () {
- newData.jqXHR = this.jqXHR =
- (that._trigger('submit', e, this) !== false) &&
- that._onSend(e, this);
- return this.jqXHR;
- };
- return (result = that._trigger('add', e, newData));
+ var newData = $.extend({}, data);
+ newData.files = fileSet ? element : [element];
+ newData.paramName = paramNameSet[index];
+ that._initResponseObject(newData);
+ that._initProgressObject(newData);
+ that._addConvenienceMethods(e, newData);
+ result = that._trigger('add', e, newData);
+ return result;
});
return result;
},
- // File Normalization for Gecko 1.9.1 (Firefox 3.5) support:
- _normalizeFile: function (index, file) {
- if (file.name === undefined && file.size === undefined) {
- file.name = file.fileName;
- file.size = file.fileSize;
- }
- },
-
_replaceFileInput: function (input) {
var inputClone = input.clone(true);
$('<form></form>').append(inputClone)[0].reset();
@@ -677,7 +947,7 @@
// Avoid memory leaks with the detached file input:
$.cleanData(input.unbind('remove'));
// Replace the original file input element in the fileInput
- // collection with the clone, which has been copied including
+ // elements set with the clone, which has been copied including
// event handlers:
this.options.fileInput = this.options.fileInput.map(function (i, el) {
if (el === input[0]) {
@@ -692,102 +962,229 @@
}
},
- _onChange: function (e) {
- var that = e.data.fileupload,
- data = {
- files: $.each($.makeArray(e.target.files), that._normalizeFile),
- fileInput: $(e.target),
- form: $(e.target.form)
- };
- if (!data.files.length) {
+ _handleFileTreeEntry: function (entry, path) {
+ var that = this,
+ dfd = $.Deferred(),
+ errorHandler = function (e) {
+ if (e && !e.entry) {
+ e.entry = entry;
+ }
+ // Since $.when returns immediately if one
+ // Deferred is rejected, we use resolve instead.
+ // This allows valid files and invalid items
+ // to be returned together in one set:
+ dfd.resolve([e]);
+ },
+ dirReader;
+ path = path || '';
+ if (entry.isFile) {
+ if (entry._file) {
+ // Workaround for Chrome bug #149735
+ entry._file.relativePath = path;
+ dfd.resolve(entry._file);
+ } else {
+ entry.file(function (file) {
+ file.relativePath = path;
+ dfd.resolve(file);
+ }, errorHandler);
+ }
+ } else if (entry.isDirectory) {
+ dirReader = entry.createReader();
+ dirReader.readEntries(function (entries) {
+ that._handleFileTreeEntries(
+ entries,
+ path + entry.name + '/'
+ ).done(function (files) {
+ dfd.resolve(files);
+ }).fail(errorHandler);
+ }, errorHandler);
+ } else {
+ // Return an empy list for file system items
+ // other than files or directories:
+ dfd.resolve([]);
+ }
+ return dfd.promise();
+ },
+
+ _handleFileTreeEntries: function (entries, path) {
+ var that = this;
+ return $.when.apply(
+ $,
+ $.map(entries, function (entry) {
+ return that._handleFileTreeEntry(entry, path);
+ })
+ ).pipe(function () {
+ return Array.prototype.concat.apply(
+ [],
+ arguments
+ );
+ });
+ },
+
+ _getDroppedFiles: function (dataTransfer) {
+ dataTransfer = dataTransfer || {};
+ var items = dataTransfer.items;
+ if (items && items.length && (items[0].webkitGetAsEntry ||
+ items[0].getAsEntry)) {
+ return this._handleFileTreeEntries(
+ $.map(items, function (item) {
+ var entry;
+ if (item.webkitGetAsEntry) {
+ entry = item.webkitGetAsEntry();
+ if (entry) {
+ // Workaround for Chrome bug #149735:
+ entry._file = item.getAsFile();
+ }
+ return entry;
+ }
+ return item.getAsEntry();
+ })
+ );
+ }
+ return $.Deferred().resolve(
+ $.makeArray(dataTransfer.files)
+ ).promise();
+ },
+
+ _getSingleFileInputFiles: function (fileInput) {
+ fileInput = $(fileInput);
+ var entries = fileInput.prop('webkitEntries') ||
+ fileInput.prop('entries'),
+ files,
+ value;
+ if (entries && entries.length) {
+ return this._handleFileTreeEntries(entries);
+ }
+ files = $.makeArray(fileInput.prop('files'));
+ if (!files.length) {
+ value = fileInput.prop('value');
+ if (!value) {
+ return $.Deferred().resolve([]).promise();
+ }
// If the files property is not available, the browser does not
// support the File API and we add a pseudo File object with
// the input value as name with path information removed:
- data.files = [{name: e.target.value.replace(/^.*\\/, '')}];
- }
- if (that.options.replaceFileInput) {
- that._replaceFileInput(data.fileInput);
+ files = [{name: value.replace(/^.*\\/, '')}];
+ } else if (files[0].name === undefined && files[0].fileName) {
+ // File normalization for Safari 4 and Firefox 3:
+ $.each(files, function (index, file) {
+ file.name = file.fileName;
+ file.size = file.fileSize;
+ });
}
- if (that._trigger('change', e, data) === false ||
- that._onAdd(e, data) === false) {
- return false;
+ return $.Deferred().resolve(files).promise();
+ },
+
+ _getFileInputFiles: function (fileInput) {
+ if (!(fileInput instanceof $) || fileInput.length === 1) {
+ return this._getSingleFileInputFiles(fileInput);
}
+ return $.when.apply(
+ $,
+ $.map(fileInput, this._getSingleFileInputFiles)
+ ).pipe(function () {
+ return Array.prototype.concat.apply(
+ [],
+ arguments
+ );
+ });
+ },
+
+ _onChange: function (e) {
+ var that = this,
+ data = {
+ fileInput: $(e.target),
+ form: $(e.target.form)
+ };
+ this._getFileInputFiles(data.fileInput).always(function (files) {
+ data.files = files;
+ if (that.options.replaceFileInput) {
+ that._replaceFileInput(data.fileInput);
+ }
+ if (that._trigger('change', e, data) !== false) {
+ that._onAdd(e, data);
+ }
+ });
},
_onPaste: function (e) {
- var that = e.data.fileupload,
- cbd = e.originalEvent.clipboardData,
- items = (cbd && cbd.items) || [],
+ var items = e.originalEvent && e.originalEvent.clipboardData &&
+ e.originalEvent.clipboardData.items,
data = {files: []};
- $.each(items, function (index, item) {
- var file = item.getAsFile && item.getAsFile();
- if (file) {
- data.files.push(file);
+ if (items && items.length) {
+ $.each(items, function (index, item) {
+ var file = item.getAsFile && item.getAsFile();
+ if (file) {
+ data.files.push(file);
+ }
+ });
+ if (this._trigger('paste', e, data) === false ||
+ this._onAdd(e, data) === false) {
+ return false;
}
- });
- if (that._trigger('paste', e, data) === false ||
- that._onAdd(e, data) === false) {
- return false;
}
},
_onDrop: function (e) {
- var that = e.data.fileupload,
- dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer,
- data = {
- files: $.each(
- $.makeArray(dataTransfer && dataTransfer.files),
- that._normalizeFile
- )
- };
- if (that._trigger('drop', e, data) === false ||
- that._onAdd(e, data) === false) {
- return false;
+ e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
+ var that = this,
+ dataTransfer = e.dataTransfer,
+ data = {};
+ if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
+ e.preventDefault();
+ this._getDroppedFiles(dataTransfer).always(function (files) {
+ data.files = files;
+ if (that._trigger('drop', e, data) !== false) {
+ that._onAdd(e, data);
+ }
+ });
}
- e.preventDefault();
},
_onDragOver: function (e) {
- var that = e.data.fileupload,
- dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer;
- if (that._trigger('dragover', e) === false) {
- return false;
- }
+ e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
+ var dataTransfer = e.dataTransfer;
if (dataTransfer) {
- dataTransfer.dropEffect = dataTransfer.effectAllowed = 'copy';
+ if (this._trigger('dragover', e) === false) {
+ return false;
+ }
+ if ($.inArray('Files', dataTransfer.types) !== -1) {
+ dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ }
}
- e.preventDefault();
},
_initEventHandlers: function () {
- var ns = this.options.namespace;
if (this._isXHRUpload(this.options)) {
- this.options.dropZone
- .bind('dragover.' + ns, {fileupload: this}, this._onDragOver)
- .bind('drop.' + ns, {fileupload: this}, this._onDrop)
- .bind('paste.' + ns, {fileupload: this}, this._onPaste);
+ this._on(this.options.dropZone, {
+ dragover: this._onDragOver,
+ drop: this._onDrop
+ });
+ this._on(this.options.pasteZone, {
+ paste: this._onPaste
+ });
+ }
+ if ($.support.fileInput) {
+ this._on(this.options.fileInput, {
+ change: this._onChange
+ });
}
- this.options.fileInput
- .bind('change.' + ns, {fileupload: this}, this._onChange);
},
_destroyEventHandlers: function () {
- var ns = this.options.namespace;
- this.options.dropZone
- .unbind('dragover.' + ns, this._onDragOver)
- .unbind('drop.' + ns, this._onDrop)
- .unbind('paste.' + ns, this._onPaste);
- this.options.fileInput
- .unbind('change.' + ns, this._onChange);
+ this._off(this.options.dropZone, 'dragover drop');
+ this._off(this.options.pasteZone, 'paste');
+ this._off(this.options.fileInput, 'change');
},
_setOption: function (key, value) {
- var refresh = $.inArray(key, this._refreshOptionsList) !== -1;
- if (refresh) {
+ var reinit = $.inArray(key, this._specialOptions) !== -1;
+ if (reinit) {
this._destroyEventHandlers();
}
- $.Widget.prototype._setOption.call(this, key, value);
- if (refresh) {
+ this._super(key, value);
+ if (reinit) {
this._initSpecialOptions();
this._initEventHandlers();
}
@@ -796,42 +1193,68 @@
_initSpecialOptions: function () {
var options = this.options;
if (options.fileInput === undefined) {
- options.fileInput = this.element.is('input:file') ?
- this.element : this.element.find('input:file');
+ options.fileInput = this.element.is('input[type="file"]') ?
+ this.element : this.element.find('input[type="file"]');
} else if (!(options.fileInput instanceof $)) {
options.fileInput = $(options.fileInput);
}
if (!(options.dropZone instanceof $)) {
options.dropZone = $(options.dropZone);
}
+ if (!(options.pasteZone instanceof $)) {
+ options.pasteZone = $(options.pasteZone);
+ }
+ },
+
+ _getRegExp: function (str) {
+ var parts = str.split('/'),
+ modifiers = parts.pop();
+ parts.shift();
+ return new RegExp(parts.join('/'), modifiers);
+ },
+
+ _isRegExpOption: function (key, value) {
+ return key !== 'url' && $.type(value) === 'string' &&
+ /^\/.*\/[igm]{0,3}$/.test(value);
+ },
+
+ _initDataAttributes: function () {
+ var that = this,
+ options = this.options;
+ // Initialize options set via HTML5 data-attributes:
+ $.each(
+ $(this.element[0].cloneNode(false)).data(),
+ function (key, value) {
+ if (that._isRegExpOption(key, value)) {
+ value = that._getRegExp(value);
+ }
+ options[key] = value;
+ }
+ );
},
_create: function () {
- var options = this.options,
- dataOpts = $.extend({}, this.element.data());
- dataOpts[this.widgetName] = undefined;
- $.extend(options, dataOpts);
- options.namespace = options.namespace || this.widgetName;
+ this._initDataAttributes();
this._initSpecialOptions();
this._slots = [];
this._sequence = this._getXHRPromise(true);
- this._sending = this._active = this._loaded = this._total = 0;
+ this._sending = this._active = 0;
+ this._initProgressObject(this);
this._initEventHandlers();
},
- destroy: function () {
- this._destroyEventHandlers();
- $.Widget.prototype.destroy.call(this);
- },
-
- enable: function () {
- $.Widget.prototype.enable.call(this);
- this._initEventHandlers();
+ // This method is exposed to the widget API and allows to query
+ // the number of active uploads:
+ active: function () {
+ return this._active;
},
- disable: function () {
- this._destroyEventHandlers();
- $.Widget.prototype.disable.call(this);
+ // This method is exposed to the widget API and allows to query
+ // the widget upload progress.
+ // It returns an object with loaded, total and bitrate properties
+ // for the running uploads:
+ progress: function () {
+ return this._progress;
},
// This method is exposed to the widget API and allows adding files
@@ -839,21 +1262,65 @@
// must have a files property and can contain additional options:
// .fileupload('add', {files: filesList});
add: function (data) {
+ var that = this;
if (!data || this.options.disabled) {
return;
}
- data.files = $.each($.makeArray(data.files), this._normalizeFile);
- this._onAdd(null, data);
+ if (data.fileInput && !data.files) {
+ this._getFileInputFiles(data.fileInput).always(function (files) {
+ data.files = files;
+ that._onAdd(null, data);
+ });
+ } else {
+ data.files = $.makeArray(data.files);
+ this._onAdd(null, data);
+ }
},
// This method is exposed to the widget API and allows sending files
// using the fileupload API. The data parameter accepts an object which
- // must have a files property and can contain additional options:
+ // must have a files or fileInput property and can contain additional options:
// .fileupload('send', {files: filesList});
// The method returns a Promise object for the file upload call.
send: function (data) {
if (data && !this.options.disabled) {
- data.files = $.each($.makeArray(data.files), this._normalizeFile);
+ if (data.fileInput && !data.files) {
+ var that = this,
+ dfd = $.Deferred(),
+ promise = dfd.promise(),
+ jqXHR,
+ aborted;
+ promise.abort = function () {
+ aborted = true;
+ if (jqXHR) {
+ return jqXHR.abort();
+ }
+ dfd.reject(null, 'abort', 'abort');
+ return promise;
+ };
+ this._getFileInputFiles(data.fileInput).always(
+ function (files) {
+ if (aborted) {
+ return;
+ }
+ if (!files.length) {
+ dfd.reject();
+ return;
+ }
+ data.files = files;
+ jqXHR = that._onSend(null, data).then(
+ function (result, textStatus, jqXHR) {
+ dfd.resolve(result, textStatus, jqXHR);
+ },
+ function (jqXHR, textStatus, errorThrown) {
+ dfd.reject(jqXHR, textStatus, errorThrown);
+ }
+ );
+ }
+ );
+ return this._enhancePromise(promise);
+ }
+ data.files = $.makeArray(data.files);
if (data.files.length) {
return this._onSend(null, data);
}
@@ -863,4 +1330,4 @@
});
-}));
+})); \ No newline at end of file
diff --git a/apps/files/js/jquery.iframe-transport.js b/apps/files/js/jquery.iframe-transport.js
index d85c0c11297..5c9df77976b 100644
--- a/apps/files/js/jquery.iframe-transport.js
+++ b/apps/files/js/jquery.iframe-transport.js
@@ -1,5 +1,5 @@
/*
- * jQuery Iframe Transport Plugin 1.3
+ * jQuery Iframe Transport Plugin 1.7
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
@@ -30,27 +30,45 @@
// The iframe transport accepts three additional options:
// options.fileInput: a jQuery collection of file input fields
// options.paramName: the parameter name for the file form data,
- // overrides the name property of the file input field(s)
+ // overrides the name property of the file input field(s),
+ // can be a string or an array of strings.
// options.formData: an array of objects with name and value properties,
// equivalent to the return data of .serializeArray(), e.g.:
// [{name: 'a', value: 1}, {name: 'b', value: 2}]
$.ajaxTransport('iframe', function (options) {
- if (options.async && (options.type === 'POST' || options.type === 'GET')) {
+ if (options.async) {
var form,
- iframe;
+ iframe,
+ addParamChar;
return {
send: function (_, completeCallback) {
form = $('<form style="display:none;"></form>');
+ form.attr('accept-charset', options.formAcceptCharset);
+ addParamChar = /\?/.test(options.url) ? '&' : '?';
+ // XDomainRequest only supports GET and POST:
+ if (options.type === 'DELETE') {
+ options.url = options.url + addParamChar + '_method=DELETE';
+ options.type = 'POST';
+ } else if (options.type === 'PUT') {
+ options.url = options.url + addParamChar + '_method=PUT';
+ options.type = 'POST';
+ } else if (options.type === 'PATCH') {
+ options.url = options.url + addParamChar + '_method=PATCH';
+ options.type = 'POST';
+ }
// javascript:false as initial iframe src
// prevents warning popups on HTTPS in IE6.
// IE versions below IE8 cannot set the name property of
// elements that have already been added to the DOM,
// so we set the name along with the iframe HTML markup:
+ counter += 1;
iframe = $(
'<iframe src="javascript:false;" name="iframe-transport-' +
- (counter += 1) + '"></iframe>'
+ counter + '"></iframe>'
).bind('load', function () {
- var fileInputClones;
+ var fileInputClones,
+ paramNames = $.isArray(options.paramName) ?
+ options.paramName : [options.paramName];
iframe
.unbind('load')
.bind('load', function () {
@@ -79,7 +97,12 @@
// (happens on form submits to iframe targets):
$('<iframe src="javascript:false;"></iframe>')
.appendTo(form);
- form.remove();
+ window.setTimeout(function () {
+ // Removing the form in a setTimeout call
+ // allows Chrome's developer tools to display
+ // the response result
+ form.remove();
+ }, 0);
});
form
.prop('target', iframe.prop('name'))
@@ -101,8 +124,11 @@
return fileInputClones[index];
});
if (options.paramName) {
- options.fileInput.each(function () {
- $(this).prop('name', options.paramName);
+ options.fileInput.each(function (index) {
+ $(this).prop(
+ 'name',
+ paramNames[index] || options.paramName
+ );
});
}
// Appending the file input fields to the hidden form
@@ -144,22 +170,36 @@
});
// The iframe transport returns the iframe content document as response.
- // The following adds converters from iframe to text, json, html, and script:
+ // The following adds converters from iframe to text, json, html, xml
+ // and script.
+ // Please note that the Content-Type for JSON responses has to be text/plain
+ // or text/html, if the browser doesn't include application/json in the
+ // Accept header, else IE will show a download dialog.
+ // The Content-Type for XML responses on the other hand has to be always
+ // application/xml or text/xml, so IE properly parses the XML response.
+ // See also
+ // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
$.ajaxSetup({
converters: {
'iframe text': function (iframe) {
- return $(iframe[0].body).text();
+ return iframe && $(iframe[0].body).text();
},
'iframe json': function (iframe) {
- return $.parseJSON($(iframe[0].body).text());
+ return iframe && $.parseJSON($(iframe[0].body).text());
},
'iframe html': function (iframe) {
- return $(iframe[0].body).html();
+ return iframe && $(iframe[0].body).html();
+ },
+ 'iframe xml': function (iframe) {
+ var xmlDoc = iframe && iframe[0];
+ return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
+ $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
+ $(xmlDoc.body).html());
},
'iframe script': function (iframe) {
- return $.globalEval($(iframe[0].body).text());
+ return iframe && $.globalEval($(iframe[0].body).text());
}
}
});
-}));
+})); \ No newline at end of file
diff --git a/apps/files/l10n/ach.php b/apps/files/l10n/ach.php
new file mode 100644
index 00000000000..3c711e6b78a
--- /dev/null
+++ b/apps/files/l10n/ach.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files/l10n/af_ZA.php b/apps/files/l10n/af_ZA.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/af_ZA.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php
index 99eb409a369..67a3414819b 100644
--- a/apps/files/l10n/ar.php
+++ b/apps/files/l10n/ar.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "المجلد المؤقت غير موجود",
"Failed to write to disk" => "خطأ في الكتابة على القرص الصلب",
"Not enough storage available" => "لا يوجد مساحة تخزينية كافية",
-"Upload failed" => "عملية الرفع فشلت",
"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." => "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("","","","","",""),
"{dirs} and {files}" => "{dirs} و {files}",
"_Uploading %n file_::_Uploading %n files_" => array("","","","","",""),
-"files uploading" => "يتم تحميل الملفات",
"'.' is an invalid file name." => "\".\" اسم ملف غير صحيح.",
"File name cannot be empty." => "اسم الملف لا يجوز أن يكون فارغا",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "اسم غير صحيح , الرموز '\\', '/', '<', '>', ':', '\"', '|', '?' و \"*\" غير مسموح استخدامها",
diff --git a/apps/files/l10n/be.php b/apps/files/l10n/be.php
new file mode 100644
index 00000000000..17262d2184d
--- /dev/null
+++ b/apps/files/l10n/be.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("","","",""),
+"_%n file_::_%n files_" => array("","","",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","","","")
+);
+$PLURAL_FORMS = "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php
index 913875e863a..e7dafd1c43a 100644
--- a/apps/files/l10n/bg_BG.php
+++ b/apps/files/l10n/bg_BG.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"No file was uploaded" => "Фахлът не бе качен",
"Missing a temporary folder" => "Липсва временна папка",
"Failed to write to disk" => "Възникна проблем при запис в диска",
-"Upload failed" => "Качването е неуспешно",
"Invalid directory." => "Невалидна директория.",
"Files" => "Файлове",
"Upload cancelled." => "Качването е спряно.",
diff --git a/apps/files/l10n/bn_BD.php b/apps/files/l10n/bn_BD.php
index 2265c232a14..66ac3a2165f 100644
--- a/apps/files/l10n/bn_BD.php
+++ b/apps/files/l10n/bn_BD.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Failed to write to disk" => "ডিস্কে লিখতে ব্যর্থ",
"Invalid directory." => "ভুল ডিরেক্টরি",
"Files" => "ফাইল",
-"Unable to upload your file as it is a directory or has 0 bytes" => "আপনার ফাইলটি আপলোড করা সম্ভব হলো না, কেননা এটি হয় একটি ফোল্ডার কিংবা এর আকার ০ বাইট",
"Not enough space available" => "যথেষ্ঠ পরিমাণ স্থান নেই",
"Upload cancelled." => "আপলোড বাতিল করা হয়েছে।",
"File upload is in progress. Leaving the page now will cancel the upload." => "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
diff --git a/apps/files/l10n/bs.php b/apps/files/l10n/bs.php
new file mode 100644
index 00000000000..8ab07a97761
--- /dev/null
+++ b/apps/files/l10n/bs.php
@@ -0,0 +1,12 @@
+<?php
+$TRANSLATIONS = array(
+"Share" => "Podijeli",
+"_%n folder_::_%n folders_" => array("","",""),
+"_%n file_::_%n files_" => array("","",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","",""),
+"Name" => "Ime",
+"Size" => "Veličina",
+"Save" => "Spasi",
+"Folder" => "Fasikla"
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index 648ffce79d6..5c2cade8d63 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta un fitxer temporal",
"Failed to write to disk" => "Ha fallat en escriure al disc",
"Not enough storage available" => "No hi ha prou espai disponible",
-"Upload failed" => "La pujada ha fallat",
+"Upload failed. Could not get file info." => "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.",
+"Upload failed. Could not find uploaded file" => "La pujada ha fallat. El fitxer pujat no s'ha trobat.",
"Invalid directory." => "Directori no vàlid.",
"Files" => "Fitxers",
-"Unable to upload your file as it is a directory or has 0 bytes" => "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "No es pot pujar {filename} perquè és una carpeta o té 0 bytes",
"Not enough space available" => "No hi ha prou espai disponible",
"Upload cancelled." => "La pujada s'ha cancel·lat.",
+"Could not get result from server." => "No hi ha resposta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.",
"URL cannot be empty." => "La URL no pot ser buida",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de carpeta no vàlid. L'ús de 'Shared' està reservat per Owncloud",
@@ -35,8 +37,8 @@ $TRANSLATIONS = array(
"undo" => "desfés",
"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetes"),
"_%n file_::_%n files_" => array("%n fitxer","%n fitxers"),
+"{dirs} and {files}" => "{dirs} i {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Pujant %n fitxer","Pujant %n fitxers"),
-"files uploading" => "fitxers pujant",
"'.' is an invalid file name." => "'.' és un nom no vàlid per un fitxer.",
"File name cannot be empty." => "El nom del fitxer no pot ser buit.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.",
@@ -44,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "El vostre espai d'emmagatzemament és gairebé ple ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "L'encriptació s'ha desactivat però els vostres fitxers segueixen encriptats. Aneu a la vostra configuració personal per desencriptar els vostres fitxers.",
"Your download is being prepared. This might take some time if the files are big." => "S'està preparant la baixada. Pot trigar una estona si els fitxers són grans.",
+"Error moving file" => "Error en moure el fitxer",
"Name" => "Nom",
"Size" => "Mida",
"Modified" => "Modificat",
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index 691cc92f1ad..f67283ec6e8 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Chybí adresář pro dočasné soubory",
"Failed to write to disk" => "Zápis na disk selhal",
"Not enough storage available" => "Nedostatek dostupného úložného prostoru",
-"Upload failed" => "Odesílání selhalo",
"Invalid directory." => "Neplatný adresář",
"Files" => "Soubory",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář nebo jeho velikost je 0 bajtů",
"Not enough space available" => "Nedostatek volné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 způsobí zrušení nahrávání.",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n soubor","%n soubory","%n souborů"),
"{dirs} and {files}" => "{dirs} a {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Nahrávám %n soubor","Nahrávám %n soubory","Nahrávám %n souborů"),
-"files uploading" => "soubory se odesílají",
"'.' is an invalid file name." => "'.' je neplatným názvem souboru.",
"File name cannot be empty." => "Název souboru nemůže být prázdný řetězec.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neplatný název, znaky '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nejsou povoleny.",
diff --git a/apps/files/l10n/cy_GB.php b/apps/files/l10n/cy_GB.php
index 157f4f89a23..86e5f65e7b0 100644
--- a/apps/files/l10n/cy_GB.php
+++ b/apps/files/l10n/cy_GB.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Plygell dros dro yn eisiau",
"Failed to write to disk" => "Methwyd ysgrifennu i'r ddisg",
"Not enough storage available" => "Dim digon o le storio ar gael",
-"Upload failed" => "Methwyd llwytho i fyny",
"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.",
@@ -33,7 +31,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","","",""),
"_%n file_::_%n files_" => array("","","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","","",""),
-"files uploading" => "ffeiliau'n llwytho i fyny",
"'.' is an invalid file name." => "Mae '.' yn enw ffeil annilys.",
"File name cannot be empty." => "Does dim hawl cael enw ffeil gwag.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Enw annilys, ni chaniateir, '\\', '/', '<', '>', ':', '\"', '|', '?' na '*'.",
diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php
index aab12986ec1..c2a20931ba0 100644
--- a/apps/files/l10n/da.php
+++ b/apps/files/l10n/da.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manglende midlertidig mappe.",
"Failed to write to disk" => "Fejl ved skrivning til disk.",
"Not enough storage available" => "Der er ikke nok plads til rådlighed",
-"Upload failed" => "Upload fejlede",
"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.",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fil","%n filer"),
"{dirs} and {files}" => "{dirs} og {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Uploader %n fil","Uploader %n filer"),
-"files uploading" => "uploader filer",
"'.' is an invalid file name." => "'.' er et ugyldigt filnavn.",
"File name cannot be empty." => "Filnavnet kan ikke stå tomt.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.",
diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php
index 947d4f07461..143a5efc3da 100644
--- a/apps/files/l10n/de.php
+++ b/apps/files/l10n/de.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte",
"Not enough storage available" => "Nicht genug Speicher vorhanden.",
-"Upload failed" => "Hochladen fehlgeschlagen",
+"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.",
+"Upload failed. Could not find uploaded file" => "Hochladen fehlgeschlagen. Hochgeladene Datei konnte nicht gefunden werden.",
"Invalid directory." => "Ungültiges Verzeichnis.",
"Files" => "Dateien",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Deine Datei kann nicht hochgeladen werden, weil es sich um einen Ordner handelt oder 0 Bytes groß ist.",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
"Not enough space available" => "Nicht genug Speicherplatz verfügbar",
"Upload cancelled." => "Upload abgebrochen.",
+"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.",
"URL cannot be empty." => "Die URL darf nicht leer sein.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Der Ordnername ist ungültig. Nur ownCloud kann den Ordner \"Shared\" anlegen",
@@ -37,7 +39,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n Datei","%n Dateien"),
"{dirs} and {files}" => "{dirs} und {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hochgeladen","%n Dateien werden hochgeladen"),
-"files uploading" => "Dateien werden hoch geladen",
"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.",
"File name cannot be empty." => "Der Dateiname darf nicht leer sein.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.",
@@ -45,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Dein Speicher ist fast voll ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind deine Dateien nach wie vor verschlüsselt. Bitte gehe zu deinen persönlichen Einstellungen, um deine Dateien zu entschlüsseln.",
"Your download is being prepared. This might take some time if the files are big." => "Dein Download wird vorbereitet. Dies kann bei größeren Dateien etwas dauern.",
+"Error moving file" => "Fehler beim Verschieben der Datei",
"Name" => "Name",
"Size" => "Größe",
"Modified" => "Geändert",
diff --git a/apps/files/l10n/de_AT.php b/apps/files/l10n/de_AT.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/de_AT.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de_CH.php b/apps/files/l10n/de_CH.php
new file mode 100644
index 00000000000..a7074a8b1cc
--- /dev/null
+++ b/apps/files/l10n/de_CH.php
@@ -0,0 +1,74 @@
+<?php
+$TRANSLATIONS = array(
+"Could not move %s - File with this name already exists" => "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.",
+"Could not move %s" => "Konnte %s nicht verschieben",
+"Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.",
+"Invalid Token" => "Ungültiges Merkmal",
+"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler",
+"There is no error, the file uploaded with success" => "Es ist kein Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Datei ist grösser, als die MAX_FILE_SIZE Vorgabe erlaubt, die im HTML-Formular spezifiziert ist",
+"The uploaded file was only partially uploaded" => "Die Datei konnte nur teilweise übertragen werden",
+"No file was uploaded" => "Keine Datei konnte übertragen werden.",
+"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
+"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte",
+"Not enough storage available" => "Nicht genug Speicher vorhanden.",
+"Invalid directory." => "Ungültiges Verzeichnis.",
+"Files" => "Dateien",
+"Not enough space available" => "Nicht genügend Speicherplatz verfügbar",
+"Upload cancelled." => "Upload abgebrochen.",
+"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
+"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",
+"Rename" => "Umbenennen",
+"Pending" => "Ausstehend",
+"{new_name} already exists" => "{new_name} existiert bereits",
+"replace" => "ersetzen",
+"suggest name" => "Namen vorschlagen",
+"cancel" => "abbrechen",
+"replaced {new_name} with {old_name}" => "{old_name} wurde ersetzt durch {new_name}",
+"undo" => "rückgängig machen",
+"_%n folder_::_%n folders_" => array("","%n Ordner"),
+"_%n file_::_%n files_" => array("","%n Dateien"),
+"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hochgeladen","%n Dateien werden hochgeladen"),
+"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.",
+"File name cannot be empty." => "Der Dateiname darf nicht leer sein.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, «\\», «/», «<», «>», «:», «\"», «|», «?» und «*» sind nicht zulässig.",
+"Your storage is full, files can not be updated or synced anymore!" => "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
+"Your storage is almost full ({usedSpacePercent}%)" => "Ihr Speicher ist fast voll ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.",
+"Your download is being prepared. This might take some time if the files are big." => "Ihr Download wird vorbereitet. Dies kann bei grösseren Dateien etwas dauern.",
+"Name" => "Name",
+"Size" => "Grösse",
+"Modified" => "Geändert",
+"%s could not be renamed" => "%s konnte nicht umbenannt werden",
+"Upload" => "Hochladen",
+"File handling" => "Dateibehandlung",
+"Maximum upload size" => "Maximale Upload-Grösse",
+"max. possible: " => "maximal möglich:",
+"Needed for multi-file and folder downloads." => "Für Mehrfachdatei- und Ordnerdownloads benötigt:",
+"Enable ZIP-download" => "ZIP-Download aktivieren",
+"0 is unlimited" => "0 bedeutet unbegrenzt",
+"Maximum input size for ZIP files" => "Maximale Grösse für ZIP-Dateien",
+"Save" => "Speichern",
+"New" => "Neu",
+"Text file" => "Textdatei",
+"Folder" => "Ordner",
+"From link" => "Von einem Link",
+"Deleted files" => "Gelöschte Dateien",
+"Cancel upload" => "Upload abbrechen",
+"You don’t have write permissions here." => "Sie haben hier keine Schreib-Berechtigungen.",
+"Nothing in here. Upload something!" => "Alles leer. Laden Sie etwas hoch!",
+"Download" => "Herunterladen",
+"Unshare" => "Freigabe aufheben",
+"Delete" => "Löschen",
+"Upload too large" => "Der Upload ist zu gross",
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgrösse für Uploads auf diesem Server.",
+"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
+"Current scanning" => "Scanne",
+"Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..."
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php
index db07ed7fadd..c58cb4bbe3e 100644
--- a/apps/files/l10n/de_DE.php
+++ b/apps/files/l10n/de_DE.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte",
"Not enough storage available" => "Nicht genug Speicher vorhanden.",
-"Upload failed" => "Hochladen fehlgeschlagen",
+"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.",
+"Upload failed. Could not find uploaded file" => "Hochladen fehlgeschlagen. Hochgeladene Datei konnte nicht gefunden werden.",
"Invalid directory." => "Ungültiges Verzeichnis.",
"Files" => "Dateien",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Ihre Datei kann nicht hochgeladen werden, weil es sich um einen Ordner handelt oder 0 Bytes groß ist.",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
"Not enough space available" => "Nicht genügend Speicherplatz verfügbar",
"Upload cancelled." => "Upload abgebrochen.",
+"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
"URL cannot be empty." => "Die URL darf nicht leer sein.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ungültiger Ordnername. Die Verwendung von \"Shared\" ist ownCloud vorbehalten.",
@@ -37,7 +39,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n Datei","%n Dateien"),
"{dirs} and {files}" => "{dirs} und {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hoch geladen","%n Dateien werden hoch geladen"),
-"files uploading" => "Dateien werden hoch geladen",
"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.",
"File name cannot be empty." => "Der Dateiname darf nicht leer sein.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.",
@@ -45,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Ihr Speicher ist fast voll ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.",
"Your download is being prepared. This might take some time if the files are big." => "Ihr Download wird vorbereitet. Dies kann bei größeren Dateien etwas dauern.",
+"Error moving file" => "Fehler beim Verschieben der Datei",
"Name" => "Name",
"Size" => "Größe",
"Modified" => "Geändert",
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index 8c89e5e1feb..37a61c6b956 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος",
"Failed to write to disk" => "Αποτυχία εγγραφής στο δίσκο",
"Not enough storage available" => "Μη επαρκής διαθέσιμος αποθηκευτικός χώρος",
-"Upload failed" => "Η μεταφόρτωση απέτυχε",
"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." => "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n φάκελος","%n φάκελοι"),
"_%n file_::_%n files_" => array("%n αρχείο","%n αρχεία"),
"_Uploading %n file_::_Uploading %n files_" => array("Ανέβασμα %n αρχείου","Ανέβασμα %n αρχείων"),
-"files uploading" => "αρχεία ανεβαίνουν",
"'.' is an invalid file name." => "'.' είναι μη έγκυρο όνομα αρχείου.",
"File name cannot be empty." => "Το όνομα αρχείου δεν μπορεί να είναι κενό.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Μη έγκυρο όνομα, '\\', '/', '<', '>', ':', '\"', '|', '?' και '*' δεν επιτρέπονται.",
diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php
new file mode 100644
index 00000000000..c747555e40b
--- /dev/null
+++ b/apps/files/l10n/en_GB.php
@@ -0,0 +1,80 @@
+<?php
+$TRANSLATIONS = array(
+"Could not move %s - File with this name already exists" => "Could not move %s - File with this name already exists",
+"Could not move %s" => "Could not move %s",
+"Unable to set upload directory." => "Unable to set upload directory.",
+"Invalid Token" => "Invalid Token",
+"No file was uploaded. Unknown error" => "No file was uploaded. Unknown error",
+"There is no error, the file uploaded with success" => "There is no error, the file uploaded successfully",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "The uploaded file exceeds the upload_max_filesize directive in php.ini: ",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
+"The uploaded file was only partially uploaded" => "The uploaded file was only partially uploaded",
+"No file was uploaded" => "No file was uploaded",
+"Missing a temporary folder" => "Missing a temporary folder",
+"Failed to write to disk" => "Failed to write to disk",
+"Not enough storage available" => "Not enough storage available",
+"Upload failed. Could not get file info." => "Upload failed. Could not get file info.",
+"Upload failed. Could not find uploaded file" => "Upload failed. Could not find uploaded file",
+"Invalid directory." => "Invalid directory.",
+"Files" => "Files",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Unable to upload {filename} as it is a directory or has 0 bytes",
+"Not enough space available" => "Not enough space available",
+"Upload cancelled." => "Upload cancelled.",
+"Could not get result from server." => "Could not get result from server.",
+"File upload is in progress. Leaving the page now will cancel the upload." => "File upload is in progress. Leaving the page now will cancel the upload.",
+"URL cannot be empty." => "URL cannot be empty.",
+"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Invalid folder name. Usage of 'Shared' is reserved by ownCloud",
+"Error" => "Error",
+"Share" => "Share",
+"Delete permanently" => "Delete permanently",
+"Rename" => "Rename",
+"Pending" => "Pending",
+"{new_name} already exists" => "{new_name} already exists",
+"replace" => "replace",
+"suggest name" => "suggest name",
+"cancel" => "cancel",
+"replaced {new_name} with {old_name}" => "replaced {new_name} with {old_name}",
+"undo" => "undo",
+"_%n folder_::_%n folders_" => array("%n folder","%n folders"),
+"_%n file_::_%n files_" => array("%n file","%n files"),
+"{dirs} and {files}" => "{dirs} and {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Uploading %n file","Uploading %n files"),
+"'.' is an invalid file name." => "'.' is an invalid file name.",
+"File name cannot be empty." => "File name cannot be empty.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Invalid name: '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.",
+"Your storage is full, files can not be updated or synced anymore!" => "Your storage is full, files can not be updated or synced anymore!",
+"Your storage is almost full ({usedSpacePercent}%)" => "Your storage is almost full ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.",
+"Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.",
+"Error moving file" => "Error moving file",
+"Name" => "Name",
+"Size" => "Size",
+"Modified" => "Modified",
+"%s could not be renamed" => "%s could not be renamed",
+"Upload" => "Upload",
+"File handling" => "File handling",
+"Maximum upload size" => "Maximum upload size",
+"max. possible: " => "max. possible: ",
+"Needed for multi-file and folder downloads." => "Needed for multi-file and folder downloads.",
+"Enable ZIP-download" => "Enable ZIP-download",
+"0 is unlimited" => "0 is unlimited",
+"Maximum input size for ZIP files" => "Maximum input size for ZIP files",
+"Save" => "Save",
+"New" => "New",
+"Text file" => "Text file",
+"Folder" => "Folder",
+"From link" => "From link",
+"Deleted files" => "Deleted files",
+"Cancel upload" => "Cancel upload",
+"You don’t have write permissions here." => "You don’t have write permission here.",
+"Nothing in here. Upload something!" => "Nothing in here. Upload something!",
+"Download" => "Download",
+"Unshare" => "Unshare",
+"Delete" => "Delete",
+"Upload too large" => "Upload too large",
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "The files you are trying to upload exceed the maximum size for file uploads on this server.",
+"Files are being scanned, please wait." => "Files are being scanned, please wait.",
+"Current scanning" => "Current scanning",
+"Upgrading filesystem cache..." => "Upgrading filesystem cache..."
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php
index ad538f2f2a9..eb6e6ba2d39 100644
--- a/apps/files/l10n/eo.php
+++ b/apps/files/l10n/eo.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Mankas provizora dosierujo.",
"Failed to write to disk" => "Malsukcesis skribo al disko",
"Not enough storage available" => "Ne haveblas sufiĉa memoro",
-"Upload failed" => "Alŝuto malsukcesis",
"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.",
@@ -34,7 +32,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"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.",
diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php
index 7a5785577af..90d760587d9 100644
--- a/apps/files/l10n/es.php
+++ b/apps/files/l10n/es.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta la carpeta temporal",
"Failed to write to disk" => "Falló al escribir al disco",
"Not enough storage available" => "No hay suficiente espacio disponible",
-"Upload failed" => "Error en la subida",
"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.",
@@ -33,15 +31,16 @@ $TRANSLATIONS = array(
"cancel" => "cancelar",
"replaced {new_name} with {old_name}" => "reemplazado {new_name} con {old_name}",
"undo" => "deshacer",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
-"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "subiendo archivos",
+"_%n folder_::_%n folders_" => array("","%n carpetas"),
+"_%n file_::_%n files_" => array("","%n archivos"),
+"{dirs} and {files}" => "{dirs} y {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"),
"'.' is an invalid file name." => "'.' no es un nombre de archivo válido.",
"File name cannot be empty." => "El nombre de archivo no puede estar vacío.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre Invalido, \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ",
"Your storage is full, files can not be updated or synced anymore!" => "Su almacenamiento está lleno, ¡no se pueden actualizar o sincronizar más!",
"Your storage is almost full ({usedSpacePercent}%)" => "Su almacenamiento está casi lleno ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "El cifrado ha sido deshabilitado pero tus archivos permanecen cifrados. Por favor, ve a tus ajustes personales para descifrar tus archivos.",
"Your download is being prepared. This might take some time if the files are big." => "Su descarga está siendo preparada. Esto puede tardar algún tiempo si los archivos son grandes.",
"Name" => "Nombre",
"Size" => "Tamaño",
diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php
index 1c26c10028d..be16f3f99ae 100644
--- a/apps/files/l10n/es_AR.php
+++ b/apps/files/l10n/es_AR.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta un directorio temporal",
"Failed to write to disk" => "Error al escribir en el disco",
"Not enough storage available" => "No hay suficiente almacenamiento",
-"Upload failed" => "Error al subir el archivo",
"Invalid directory." => "Directorio inválido.",
"Files" => "Archivos",
-"Unable to upload your file as it is a directory or has 0 bytes" => "No fue posible subir el archivo porque es un directorio o porque su tamaño es 0 bytes",
"Not enough space available" => "No hay suficiente espacio disponible",
"Upload cancelled." => "La subida fue cancelada",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.",
@@ -33,10 +31,10 @@ $TRANSLATIONS = array(
"cancel" => "cancelar",
"replaced {new_name} with {old_name}" => "se reemplazó {new_name} con {old_name}",
"undo" => "deshacer",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
-"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "Subiendo archivos",
+"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetas"),
+"_%n file_::_%n files_" => array("%n archivo","%n archivos"),
+"{dirs} and {files}" => "{carpetas} y {archivos}",
+"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"),
"'.' is an invalid file name." => "'.' es un nombre de archivo inválido.",
"File name cannot be empty." => "El nombre del archivo no puede quedar vacío.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre invalido, '\\', '/', '<', '>', ':', '\"', '|', '?' y '*' no están permitidos.",
diff --git a/apps/files/l10n/es_MX.php b/apps/files/l10n/es_MX.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/es_MX.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php
index 5a2bb437d39..9f674b27e63 100644
--- a/apps/files/l10n/et_EE.php
+++ b/apps/files/l10n/et_EE.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Ajutiste failide kaust puudub",
"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
"Not enough storage available" => "Saadaval pole piisavalt ruumi",
-"Upload failed" => "Üleslaadimine ebaõnnestus",
"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.",
@@ -35,8 +33,8 @@ $TRANSLATIONS = array(
"undo" => "tagasi",
"_%n folder_::_%n folders_" => array("%n kataloog","%n kataloogi"),
"_%n file_::_%n files_" => array("%n fail","%n faili"),
+"{dirs} and {files}" => "{dirs} ja {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Laadin üles %n faili","Laadin üles %n faili"),
-"files uploading" => "faili üleslaadimisel",
"'.' is an invalid file name." => "'.' on vigane failinimi.",
"File name cannot be empty." => "Faili nimi ei saa olla tühi.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud.",
diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php
index 524be56af02..33ea47d5f04 100644
--- a/apps/files/l10n/eu.php
+++ b/apps/files/l10n/eu.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Aldi bateko karpeta falta da",
"Failed to write to disk" => "Errore bat izan da diskoan idazterakoan",
"Not enough storage available" => "Ez dago behar aina leku erabilgarri,",
-"Upload failed" => "igotzeak huts egin du",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("karpeta %n","%n karpeta"),
"_%n file_::_%n files_" => array("fitxategi %n","%n fitxategi"),
"_Uploading %n file_::_Uploading %n files_" => array("Fitxategi %n igotzen","%n fitxategi igotzen"),
-"files uploading" => "fitxategiak igotzen",
"'.' is an invalid file name." => "'.' ez da fitxategi izen baliogarria.",
"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.",
diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php
index 24584f715b5..46d7cfe73ef 100644
--- a/apps/files/l10n/fa.php
+++ b/apps/files/l10n/fa.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "یک پوشه موقت گم شده",
"Failed to write to disk" => "نوشتن بر روی دیسک سخت ناموفق بود",
"Not enough storage available" => "فضای کافی در دسترس نیست",
-"Upload failed" => "بارگزاری ناموفق بود",
"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." => "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "بارگذاری فایل ها",
"'.' is an invalid file name." => "'.' یک نام پرونده نامعتبر است.",
"File name cannot be empty." => "نام پرونده نمی تواند خالی باشد.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "نام نامعتبر ، '\\', '/', '<', '>', ':', '\"', '|', '?' و '*' مجاز نمی باشند.",
diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php
index 1d29dbf79d2..5345bad902b 100644
--- a/apps/files/l10n/fi_FI.php
+++ b/apps/files/l10n/fi_FI.php
@@ -11,12 +11,12 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Tilapäiskansio puuttuu",
"Failed to write to disk" => "Levylle kirjoitus epäonnistui",
"Not enough storage available" => "Tallennustilaa ei ole riittävästi käytettävissä",
-"Upload failed" => "Lähetys epäonnistui",
"Invalid directory." => "Virheellinen kansio.",
"Files" => "Tiedostot",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio.",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua",
"Not enough space available" => "Tilaa ei ole riittävästi",
"Upload cancelled." => "Lähetys peruttu.",
+"Could not get result from server." => "Tuloksien saaminen palvelimelta ei onnistunut.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.",
"URL cannot be empty." => "Verkko-osoite ei voi olla tyhjä",
"Error" => "Virhe",
@@ -39,6 +39,7 @@ $TRANSLATIONS = array(
"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.",
+"Error moving file" => "Virhe tiedostoa siirrettäessä",
"Name" => "Nimi",
"Size" => "Koko",
"Modified" => "Muokattu",
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index ce19bb60eb7..03505a2a269 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -6,19 +6,21 @@ $TRANSLATIONS = array(
"Invalid Token" => "Jeton non valide",
"No file was uploaded. Unknown error" => "Aucun fichier n'a été envoyé. Erreur inconnue",
"There is no error, the file uploaded with success" => "Aucune erreur, le fichier a été envoyé avec succès.",
-"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Le fichier envoyé dépasse la valeur upload_max_filesize située dans le fichier php.ini:",
-"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse la directive MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini:",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse l'instruction MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.",
"The uploaded file was only partially uploaded" => "Le fichier n'a été que partiellement envoyé.",
"No file was uploaded" => "Pas de fichier envoyé.",
"Missing a temporary folder" => "Absence de dossier temporaire.",
"Failed to write to disk" => "Erreur d'écriture sur le disque",
"Not enough storage available" => "Plus assez d'espace de stockage disponible",
-"Upload failed" => "Échec de l'envoi",
+"Upload failed. Could not get file info." => "L'envoi a échoué. Impossible d'obtenir les informations du fichier.",
+"Upload failed. Could not find uploaded file" => "L'envoi a échoué. Impossible de trouver le fichier envoyé.",
"Invalid directory." => "Dossier invalide.",
"Files" => "Fichiers",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible d'envoyer votre fichier dans la mesure où il s'agit d'un répertoire ou d'un fichier de taille nulle",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle",
"Not enough space available" => "Espace disponible insuffisant",
"Upload cancelled." => "Envoi annulé.",
+"Could not get result from server." => "Ne peut recevoir les résultats du serveur.",
"File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"URL cannot be empty." => "L'URL ne peut-être vide",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée à Owncloud",
@@ -37,7 +39,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fichier","%n fichiers"),
"{dirs} and {files}" => "{dir} et {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Téléversement de %n fichier","Téléversement de %n fichiers"),
-"files uploading" => "fichiers en cours d'envoi",
"'.' is an invalid file name." => "'.' n'est pas un nom de fichier valide.",
"File name cannot be empty." => "Le nom de fichier ne peut être vide.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.",
@@ -45,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Votre espace de stockage est presque plein ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Le chiffrement était désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos Paramètres personnels pour déchiffrer vos fichiers.",
"Your download is being prepared. This might take some time if the files are big." => "Votre téléchargement est cours de préparation. Ceci peut nécessiter un certain temps si les fichiers sont volumineux.",
+"Error moving file" => "Erreur lors du déplacement du fichier",
"Name" => "Nom",
"Size" => "Taille",
"Modified" => "Modifié",
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 6ec1816308a..2766478650a 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta o cartafol temporal",
"Failed to write to disk" => "Produciuse un erro ao escribir no disco",
"Not enough storage available" => "Non hai espazo de almacenamento abondo",
-"Upload failed" => "Produciuse un fallou no envío",
+"Upload failed. Could not get file info." => "O envío fracasou. Non foi posíbel obter información do ficheiro.",
+"Upload failed. Could not find uploaded file" => "O envío fracasou. Non foi posíbel atopar o ficheiro enviado",
"Invalid directory." => "O directorio é incorrecto.",
"Files" => "Ficheiros",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Non foi posíbel enviar o ficheiro pois ou é un directorio ou ten 0 bytes",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes",
"Not enough space available" => "O espazo dispoñíbel é insuficiente",
"Upload cancelled." => "Envío cancelado.",
+"Could not get result from server." => "Non foi posíbel obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
"URL cannot be empty." => "O URL non pode quedar baleiro.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome de cartafol incorrecto. O uso de «Compartido» e «Shared» está reservado para o ownClod",
@@ -35,8 +37,8 @@ $TRANSLATIONS = array(
"undo" => "desfacer",
"_%n folder_::_%n folders_" => array("%n cartafol","%n cartafoles"),
"_%n file_::_%n files_" => array("%n ficheiro","%n ficheiros"),
+"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Cargando %n ficheiro","Cargando %n ficheiros"),
-"files uploading" => "ficheiros enviándose",
"'.' is an invalid file name." => "«.» é un nome de ficheiro incorrecto",
"File name cannot be empty." => "O nome de ficheiro non pode estar baleiro",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».",
@@ -44,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "O cifrado foi desactivado, mais os ficheiros están cifrados. Vaia á configuración persoal para descifrar os ficheiros.",
"Your download is being prepared. This might take some time if the files are big." => "Está a prepararse a súa descarga. Isto pode levar bastante tempo se os ficheiros son grandes.",
+"Error moving file" => "Produciuse un erro ao mover o ficheiro",
"Name" => "Nome",
"Size" => "Tamaño",
"Modified" => "Modificado",
diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php
index 40d7cc9c552..bc7ecdb0716 100644
--- a/apps/files/l10n/he.php
+++ b/apps/files/l10n/he.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "תקיה זמנית חסרה",
"Failed to write to disk" => "הכתיבה לכונן נכשלה",
"Not enough storage available" => "אין די שטח פנוי באחסון",
-"Upload failed" => "ההעלאה נכשלה",
"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." => "קישור אינו יכול להיות ריק.",
@@ -32,7 +30,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "קבצים בהעלאה",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'.",
"Name" => "שם",
"Size" => "גודל",
diff --git a/apps/files/l10n/hi.php b/apps/files/l10n/hi.php
index 7d2baab607d..549c928320d 100644
--- a/apps/files/l10n/hi.php
+++ b/apps/files/l10n/hi.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
+"Upload" => "अपलोड ",
"Save" => "सहेजें"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php
index 57f1ad9700b..60f1da84409 100644
--- a/apps/files/l10n/hr.php
+++ b/apps/files/l10n/hr.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nedostaje privremeni direktorij",
"Failed to write to disk" => "Neuspjelo pisanje na disk",
"Files" => "Datoteke",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Nemoguće poslati datoteku jer je prazna ili je direktorij",
"Upload cancelled." => "Slanje poništeno.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Učitavanje datoteke. Napuštanjem stranice će prekinuti učitavanje.",
"Error" => "Greška",
@@ -21,7 +20,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"files uploading" => "datoteke se učitavaju",
"Name" => "Ime",
"Size" => "Veličina",
"Modified" => "Zadnja promjena",
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index 66edbefbca5..5d313ff2488 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Hiányzik egy ideiglenes mappa",
"Failed to write to disk" => "Nem sikerült a lemezre történő írás",
"Not enough storage available" => "Nincs elég szabad hely.",
-"Upload failed" => "A feltöltés nem sikerült",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "fájl töltődik föl",
"'.' is an invalid file name." => "'.' fájlnév érvénytelen.",
"File name cannot be empty." => "A fájlnév nem lehet semmi.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Érvénytelen elnevezés. Ezek a karakterek nem használhatók: '\\', '/', '<', '>', ':', '\"', '|', '?' és '*'",
diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php
index ce7cfe5ef4c..c8b3194eb6b 100644
--- a/apps/files/l10n/id.php
+++ b/apps/files/l10n/id.php
@@ -13,7 +13,6 @@ $TRANSLATIONS = array(
"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.",
@@ -32,7 +31,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "berkas diunggah",
"'.' is an invalid file name." => "'.' bukan nama berkas yang valid.",
"File name cannot be empty." => "Nama berkas tidak boleh kosong.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nama tidak valid, karakter '\\', '/', '<', '>', ':', '\"', '|', '?' dan '*' tidak diizinkan.",
diff --git a/apps/files/l10n/is.php b/apps/files/l10n/is.php
index 2cf195d0a11..ef493418206 100644
--- a/apps/files/l10n/is.php
+++ b/apps/files/l10n/is.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Failed to write to disk" => "Tókst ekki að skrifa á disk",
"Invalid directory." => "Ógild mappa.",
"Files" => "Skrár",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Innsending á skrá mistókst, hugsanlega sendir þú möppu eða skráin er 0 bæti.",
"Not enough space available" => "Ekki nægt pláss tiltækt",
"Upload cancelled." => "Hætt við innsendingu.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.",
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index b0ec954d907..c24d30ae368 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manca una cartella temporanea",
"Failed to write to disk" => "Scrittura su disco non riuscita",
"Not enough storage available" => "Spazio di archiviazione insufficiente",
-"Upload failed" => "Caricamento non riuscito",
+"Upload failed. Could not get file info." => "Upload fallito. Impossibile ottenere informazioni sul file",
+"Upload failed. Could not find uploaded file" => "Upload fallit. Impossibile trovare file caricato",
"Invalid directory." => "Cartella non valida.",
"Files" => "File",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile caricare il file poiché è una cartella o ha una dimensione di 0 byte",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte",
"Not enough space available" => "Spazio disponibile insufficiente",
"Upload cancelled." => "Invio annullato",
+"Could not get result from server." => "Impossibile ottenere il risultato dal server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.",
"URL cannot be empty." => "L'URL non può essere vuoto.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome della cartella non valido. L'uso di 'Shared' è riservato a ownCloud",
@@ -37,7 +39,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n file","%n file"),
"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Caricamento di %n file in corso","Caricamento di %n file in corso"),
-"files uploading" => "caricamento file",
"'.' is an invalid file name." => "'.' non è un nome file valido.",
"File name cannot be empty." => "Il nome del file non può essere vuoto.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non valido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non sono consentiti.",
@@ -45,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "La cifratura è stata disabilitata ma i tuoi file sono ancora cifrati. Vai nelle impostazioni personali per decifrare i file.",
"Your download is being prepared. This might take some time if the files are big." => "Il tuo scaricamento è in fase di preparazione. Ciò potrebbe richiedere del tempo se i file sono grandi.",
+"Error moving file" => "Errore durante lo spostamento del file",
"Name" => "Nome",
"Size" => "Dimensione",
"Modified" => "Modificato",
diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php
index 5438cbb4976..5944b47434d 100644
--- a/apps/files/l10n/ja_JP.php
+++ b/apps/files/l10n/ja_JP.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "一時保存フォルダが見つかりません",
"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
"Not enough storage available" => "ストレージに十分な空き容量がありません",
-"Upload failed" => "アップロードに失敗",
"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." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n個のファイル"),
"{dirs} and {files}" => "{dirs} と {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n 個のファイルをアップロード中"),
-"files uploading" => "ファイルをアップロード中",
"'.' is an invalid file name." => "'.' は無効なファイル名です。",
"File name cannot be empty." => "ファイル名を空にすることはできません。",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。",
diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php
index 455e3211a55..b9313957714 100644
--- a/apps/files/l10n/ka_GE.php
+++ b/apps/files/l10n/ka_GE.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "დროებითი საქაღალდე არ არსებობს",
"Failed to write to disk" => "შეცდომა დისკზე ჩაწერისას",
"Not enough storage available" => "საცავში საკმარისი ადგილი არ არის",
-"Upload failed" => "ატვირთვა ვერ განხორციელდა",
"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." => "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას",
@@ -33,7 +31,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "ფაილები იტვირთება",
"'.' is an invalid file name." => "'.' არის დაუშვებელი ფაილის სახელი.",
"File name cannot be empty." => "ფაილის სახელი არ შეიძლება იყოს ცარიელი.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "არადაშვებადი სახელი, '\\', '/', '<', '>', ':', '\"', '|', '?' და '*' არ არის დაიშვებული.",
diff --git a/apps/files/l10n/km.php b/apps/files/l10n/km.php
new file mode 100644
index 00000000000..70ab6572ba4
--- /dev/null
+++ b/apps/files/l10n/km.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array(""),
+"_Uploading %n file_::_Uploading %n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/kn.php b/apps/files/l10n/kn.php
new file mode 100644
index 00000000000..70ab6572ba4
--- /dev/null
+++ b/apps/files/l10n/kn.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array(""),
+"_Uploading %n file_::_Uploading %n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index e2b787e7f91..502acefcf3a 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "임시 폴더가 없음",
"Failed to write to disk" => "디스크에 쓰지 못했습니다",
"Not enough storage available" => "저장소가 용량이 충분하지 않습니다.",
-"Upload failed" => "업로드 실패",
"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." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
@@ -33,7 +31,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "파일 업로드중",
"'.' is an invalid file name." => "'.' 는 올바르지 않은 파일 이름 입니다.",
"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.",
diff --git a/apps/files/l10n/ku_IQ.php b/apps/files/l10n/ku_IQ.php
index 9ec565da441..d98848a71f0 100644
--- a/apps/files/l10n/ku_IQ.php
+++ b/apps/files/l10n/ku_IQ.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"URL cannot be empty." => "ناونیشانی به‌سته‌ر نابێت به‌تاڵ بێت.",
"Error" => "هه‌ڵه",
+"Share" => "هاوبەشی کردن",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php
index deefe9caa15..cd68b2b9ad2 100644
--- a/apps/files/l10n/lb.php
+++ b/apps/files/l10n/lb.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Et feelt en temporären Dossier",
"Failed to write to disk" => "Konnt net op den Disk schreiwen",
"Files" => "Dateien",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Kann deng Datei net eroplueden well et en Dossier ass oder 0 byte grouss ass.",
"Upload cancelled." => "Upload ofgebrach.",
"File upload is in progress. Leaving the page now will cancel the upload." => "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.",
"Error" => "Fehler",
diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php
index 0530adc2ae2..2b32a129d55 100644
--- a/apps/files/l10n/lt_LT.php
+++ b/apps/files/l10n/lt_LT.php
@@ -2,6 +2,8 @@
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja",
"Could not move %s" => "Nepavyko perkelti %s",
+"Unable to set upload directory." => "Nepavyksta nustatyti įkėlimų katalogo.",
+"Invalid Token" => "Netinkamas ženklas",
"No file was uploaded. Unknown error" => "Failai nebuvo įkelti dėl nežinomos priežasties",
"There is no error, the file uploaded with success" => "Failas įkeltas sėkmingai, be klaidų",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Įkeliamas failas yra didesnis nei leidžia upload_max_filesize php.ini faile:",
@@ -11,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Failed to write to disk" => "Nepavyko įrašyti į diską",
"Not enough storage available" => "Nepakanka vietos serveryje",
-"Upload failed" => "Nusiuntimas nepavyko",
"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.",
@@ -31,19 +31,21 @@ $TRANSLATIONS = array(
"cancel" => "atšaukti",
"replaced {new_name} with {old_name}" => "pakeiskite {new_name} į {old_name}",
"undo" => "anuliuoti",
-"_%n folder_::_%n folders_" => array("","",""),
-"_%n file_::_%n files_" => array("","",""),
-"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"files uploading" => "įkeliami failai",
+"_%n folder_::_%n folders_" => array("%n aplankas","%n aplankai","%n aplankų"),
+"_%n file_::_%n files_" => array("%n failas","%n failai","%n failų"),
+"{dirs} and {files}" => "{dirs} ir {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"),
"'.' is an invalid file name." => "'.' yra neleidžiamas failo pavadinime.",
"File name cannot be empty." => "Failo pavadinimas negali būti tuščias.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neleistinas pavadinimas, '\\', '/', '<', '>', ':', '\"', '|', '?' ir '*' yra neleidžiami.",
"Your storage is full, files can not be updated or synced anymore!" => "Jūsų visa vieta serveryje užimta",
"Your storage is almost full ({usedSpacePercent}%)" => "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.",
"Your download is being prepared. This might take some time if the files are big." => "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunčiamas didelis failas.",
"Name" => "Pavadinimas",
"Size" => "Dydis",
"Modified" => "Pakeista",
+"%s could not be renamed" => "%s negali būti pervadintas",
"Upload" => "Įkelti",
"File handling" => "Failų tvarkymas",
"Maximum upload size" => "Maksimalus įkeliamo failo dydis",
diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php
index d24aaca9e4c..cefaea62818 100644
--- a/apps/files/l10n/lv.php
+++ b/apps/files/l10n/lv.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Trūkst pagaidu mapes",
"Failed to write to disk" => "Neizdevās saglabāt diskā",
"Not enough storage available" => "Nav pietiekami daudz vietas",
-"Upload failed" => "Neizdevās augšupielādēt",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n mapes","%n mape","%n mapes"),
"_%n file_::_%n files_" => array("%n faili","%n fails","%n faili"),
"_Uploading %n file_::_Uploading %n files_" => array("%n","Augšupielāde %n failu","Augšupielāde %n failus"),
-"files uploading" => "fails augšupielādējas",
"'.' is an invalid file name." => "'.' ir nederīgs datnes nosaukums.",
"File name cannot be empty." => "Datnes nosaukums nevar būt tukšs.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nederīgs nosaukums, nav atļauti '\\', '/', '<', '>', ':', '\"', '|', '?' un '*'.",
diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php
index 7a9a8641f80..2306db6921a 100644
--- a/apps/files/l10n/mk.php
+++ b/apps/files/l10n/mk.php
@@ -9,7 +9,6 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Недостасува привремена папка",
"Failed to write to disk" => "Неуспеав да запишам на диск",
"Files" => "Датотеки",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти",
"Upload cancelled." => "Преземањето е прекинато.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.",
"URL cannot be empty." => "Адресата неможе да биде празна.",
diff --git a/apps/files/l10n/ml_IN.php b/apps/files/l10n/ml_IN.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/ml_IN.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php
index 59d0bbfb339..61bbf81cd8a 100644
--- a/apps/files/l10n/ms_MY.php
+++ b/apps/files/l10n/ms_MY.php
@@ -8,7 +8,6 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Direktori sementara hilang",
"Failed to write to disk" => "Gagal untuk disimpan",
"Files" => "Fail-fail",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes",
"Upload cancelled." => "Muatnaik dibatalkan.",
"Error" => "Ralat",
"Share" => "Kongsi",
diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php
index 55ce978d2a2..8fda251a2bc 100644
--- a/apps/files/l10n/nb_NO.php
+++ b/apps/files/l10n/nb_NO.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Mangler midlertidig mappe",
"Failed to write to disk" => "Klarte ikke å skrive til disk",
"Not enough storage available" => "Ikke nok lagringsplass",
-"Upload failed" => "Opplasting feilet",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"),
"_%n file_::_%n files_" => array("%n fil","%n filer"),
"_Uploading %n file_::_Uploading %n files_" => array("Laster opp %n fil","Laster opp %n filer"),
-"files uploading" => "filer lastes opp",
"'.' is an invalid file name." => "'.' er et ugyldig filnavn.",
"File name cannot be empty." => "Filnavn kan ikke være tomt.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig navn, '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' er ikke tillatt.",
diff --git a/apps/files/l10n/ne.php b/apps/files/l10n/ne.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/ne.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php
index 9fb13517369..65ad5265237 100644
--- a/apps/files/l10n/nl.php
+++ b/apps/files/l10n/nl.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Er ontbreekt een tijdelijke map",
"Failed to write to disk" => "Schrijven naar schijf mislukt",
"Not enough storage available" => "Niet genoeg opslagruimte beschikbaar",
-"Upload failed" => "Upload mislukt",
"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.",
@@ -35,8 +33,8 @@ $TRANSLATIONS = array(
"undo" => "ongedaan maken",
"_%n folder_::_%n folders_" => array("","%n mappen"),
"_%n file_::_%n files_" => array("","%n bestanden"),
+"{dirs} and {files}" => "{dirs} en {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n bestand aan het uploaden","%n bestanden aan het uploaden"),
-"files uploading" => "bestanden aan het uploaden",
"'.' is an invalid file name." => "'.' is een ongeldige bestandsnaam.",
"File name cannot be empty." => "Bestandsnaam kan niet leeg zijn.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Onjuiste naam; '\\', '/', '<', '>', ':', '\"', '|', '?' en '*' zijn niet toegestaan.",
diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php
index b1f38057a88..e29b1d3ad36 100644
--- a/apps/files/l10n/nn_NO.php
+++ b/apps/files/l10n/nn_NO.php
@@ -2,6 +2,8 @@
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet",
"Could not move %s" => "Klarte ikkje flytta %s",
+"Unable to set upload directory." => "Klarte ikkje å endra opplastingsmappa.",
+"Invalid Token" => "Ugyldig token",
"No file was uploaded. Unknown error" => "Ingen filer lasta opp. Ukjend feil",
"There is no error, the file uploaded with success" => "Ingen feil, fila vart lasta opp",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fila du lasta opp er større enn det «upload_max_filesize» i php.ini tillater: ",
@@ -11,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manglar ei mellombels mappe",
"Failed to write to disk" => "Klarte ikkje skriva til disk",
"Not enough storage available" => "Ikkje nok lagringsplass tilgjengeleg",
-"Upload failed" => "Feil ved opplasting",
+"Upload failed. Could not get file info." => "Feil ved opplasting. Klarte ikkje å henta filinfo.",
+"Upload failed. Could not find uploaded file" => "Feil ved opplasting. Klarte ikkje å finna opplasta fil.",
"Invalid directory." => "Ugyldig mappe.",
"Files" => "Filer",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Klarte ikkje lasta opp fila sidan ho er ei mappe eller er på 0 byte",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.",
"Not enough space available" => "Ikkje nok lagringsplass tilgjengeleg",
"Upload cancelled." => "Opplasting avbroten.",
+"Could not get result from server." => "Klarte ikkje å henta resultat frå tenaren.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
"URL cannot be empty." => "Nettadressa kan ikkje vera tom.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldig mappenamn. Mappa «Shared» er reservert av ownCloud",
@@ -31,19 +35,22 @@ $TRANSLATIONS = array(
"cancel" => "avbryt",
"replaced {new_name} with {old_name}" => "bytte ut {new_name} med {old_name}",
"undo" => "angre",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
-"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "filer lastar opp",
+"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"),
+"_%n file_::_%n files_" => array("%n fil","%n filer"),
+"{dirs} and {files}" => "{dirs} og {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Lastar opp %n fil","Lastar opp %n filer"),
"'.' is an invalid file name." => "«.» er eit ugyldig filnamn.",
"File name cannot be empty." => "Filnamnet kan ikkje vera tomt.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig namn, «\\», «/», «<», «>», «:», «\"», «|», «?» og «*» er ikkje tillate.",
"Your storage is full, files can not be updated or synced anymore!" => "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!",
"Your storage is almost full ({usedSpacePercent}%)" => "Lagringa di er nesten full ({usedSpacePercent} %)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kryptering er skrudd av, men filene dine er enno krypterte. Du kan dekryptera filene i personlege innstillingar.",
"Your download is being prepared. This might take some time if the files are big." => "Gjer klar nedlastinga di. Dette kan ta ei stund viss filene er store.",
+"Error moving file" => "Feil ved flytting av fil",
"Name" => "Namn",
"Size" => "Storleik",
"Modified" => "Endra",
+"%s could not be renamed" => "Klarte ikkje å omdøypa på %s",
"Upload" => "Last opp",
"File handling" => "Filhandtering",
"Maximum upload size" => "Maksimal opplastingsstorleik",
diff --git a/apps/files/l10n/nqo.php b/apps/files/l10n/nqo.php
new file mode 100644
index 00000000000..70ab6572ba4
--- /dev/null
+++ b/apps/files/l10n/nqo.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array(""),
+"_Uploading %n file_::_Uploading %n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php
index 63e572059bf..a6d8f91458e 100644
--- a/apps/files/l10n/oc.php
+++ b/apps/files/l10n/oc.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Un dorsièr temporari manca",
"Failed to write to disk" => "L'escriptura sul disc a fracassat",
"Files" => "Fichièrs",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible d'amontcargar lo teu fichièr qu'es un repertòri o que ten pas que 0 octet.",
"Upload cancelled." => "Amontcargar anullat.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. ",
"Error" => "Error",
@@ -21,7 +20,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "fichièrs al amontcargar",
"Name" => "Nom",
"Size" => "Talha",
"Modified" => "Modificat",
diff --git a/apps/files/l10n/pa.php b/apps/files/l10n/pa.php
new file mode 100644
index 00000000000..d8c50f2d1bc
--- /dev/null
+++ b/apps/files/l10n/pa.php
@@ -0,0 +1,16 @@
+<?php
+$TRANSLATIONS = array(
+"Files" => "ਫਾਇਲਾਂ",
+"Error" => "ਗਲਤੀ",
+"Share" => "ਸਾਂਝਾ ਕਰੋ",
+"Rename" => "ਨਾਂ ਬਦਲੋ",
+"undo" => "ਵਾਪਸ",
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("",""),
+"Upload" => "ਅੱਪਲੋਡ",
+"Cancel upload" => "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ",
+"Download" => "ਡਾਊਨਲੋਡ",
+"Delete" => "ਹਟਾਓ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php
index 4b22b080b28..3ad80975810 100644
--- a/apps/files/l10n/pl.php
+++ b/apps/files/l10n/pl.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Brak folderu tymczasowego",
"Failed to write to disk" => "Błąd zapisu na dysk",
"Not enough storage available" => "Za mało dostępnego miejsca",
-"Upload failed" => "Wysyłanie nie powiodło się",
"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.",
@@ -33,15 +31,16 @@ $TRANSLATIONS = array(
"cancel" => "anuluj",
"replaced {new_name} with {old_name}" => "zastąpiono {new_name} przez {old_name}",
"undo" => "cofnij",
-"_%n folder_::_%n folders_" => array("","",""),
-"_%n file_::_%n files_" => array("","",""),
-"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"files uploading" => "pliki wczytane",
+"_%n folder_::_%n folders_" => array("%n katalog","%n katalogi","%n katalogów"),
+"_%n file_::_%n files_" => array("%n plik","%n pliki","%n plików"),
+"{dirs} and {files}" => "{katalogi} and {pliki}",
+"_Uploading %n file_::_Uploading %n files_" => array("Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików"),
"'.' is an invalid file name." => "„.” jest nieprawidłową nazwą pliku.",
"File name cannot be empty." => "Nazwa pliku nie może być pusta.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nieprawidłowa nazwa. Znaki '\\', '/', '<', '>', ':', '\"', '|', '?' oraz '*' są niedozwolone.",
"Your storage is full, files can not be updated or synced anymore!" => "Magazyn jest pełny. Pliki nie mogą zostać zaktualizowane lub zsynchronizowane!",
"Your storage is almost full ({usedSpacePercent}%)" => "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.",
"Your download is being prepared. This might take some time if the files are big." => "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pliki są duże.",
"Name" => "Nazwa",
"Size" => "Rozmiar",
diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php
index de9644bd588..cd960208565 100644
--- a/apps/files/l10n/pt_BR.php
+++ b/apps/files/l10n/pt_BR.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Pasta temporária não encontrada",
"Failed to write to disk" => "Falha ao escrever no disco",
"Not enough storage available" => "Espaço de armazenamento insuficiente",
-"Upload failed" => "Falha no envio",
+"Upload failed. Could not get file info." => "Falha no envio. Não foi possível obter informações do arquivo.",
+"Upload failed. Could not find uploaded file" => "Falha no envio. Não foi possível encontrar o arquivo enviado",
"Invalid directory." => "Diretório inválido.",
"Files" => "Arquivos",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Impossível enviar seus arquivo por ele ser um diretório ou ter 0 bytes.",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes",
"Not enough space available" => "Espaço de armazenamento insuficiente",
"Upload cancelled." => "Envio cancelado.",
+"Could not get result from server." => "Não foi possível obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Upload em andamento. Sair da página agora resultará no cancelamento do envio.",
"URL cannot be empty." => "URL não pode ficar em branco",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome de pasta inválido. O uso do nome 'Compartilhado' é reservado ao ownCloud",
@@ -33,11 +35,10 @@ $TRANSLATIONS = array(
"cancel" => "cancelar",
"replaced {new_name} with {old_name}" => "Substituído {old_name} por {new_name} ",
"undo" => "desfazer",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("%n pasta","%n pastas"),
+"_%n file_::_%n files_" => array("%n arquivo","%n arquivos"),
"{dirs} and {files}" => "{dirs} e {files}",
-"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "enviando arquivos",
+"_Uploading %n file_::_Uploading %n files_" => array("Enviando %n arquivo","Enviando %n arquivos"),
"'.' is an invalid file name." => "'.' é um nome de arquivo inválido.",
"File name cannot be empty." => "O nome do arquivo não pode estar vazio.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
@@ -45,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Seu armazenamento está quase cheio ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Encriptação foi desabilitada mas seus arquivos continuam encriptados. Por favor vá a suas configurações pessoais para descriptar seus arquivos.",
"Your download is being prepared. This might take some time if the files are big." => "Seu download está sendo preparado. Isto pode levar algum tempo se os arquivos forem grandes.",
+"Error moving file" => "Erro movendo o arquivo",
"Name" => "Nome",
"Size" => "Tamanho",
"Modified" => "Modificado",
diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php
index 33ec8cddce6..f6d61fc9873 100644
--- a/apps/files/l10n/pt_PT.php
+++ b/apps/files/l10n/pt_PT.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Está a faltar a pasta temporária",
"Failed to write to disk" => "Falhou a escrita no disco",
"Not enough storage available" => "Não há espaço suficiente em disco",
-"Upload failed" => "Carregamento falhou",
"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.",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n ficheiro","%n ficheiros"),
"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("A carregar %n ficheiro","A carregar %n ficheiros"),
-"files uploading" => "A enviar os ficheiros",
"'.' is an invalid file name." => "'.' não é um nome de ficheiro válido!",
"File name cannot be empty." => "O nome do ficheiro não pode estar vazio.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome Inválido, os caracteres '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php
index 59f6cc68499..b1b9af45d38 100644
--- a/apps/files/l10n/ro.php
+++ b/apps/files/l10n/ro.php
@@ -6,43 +6,47 @@ $TRANSLATIONS = array(
"Invalid Token" => "Jeton Invalid",
"No file was uploaded. Unknown error" => "Nici un fișier nu a fost încărcat. Eroare necunoscută",
"There is no error, the file uploaded with success" => "Nu a apărut nici o eroare, fișierul a fost încărcat cu succes",
-"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fisierul incarcat depaseste upload_max_filesize permisi in php.ini: ",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fisierul incarcat depaseste marimea maxima permisa in php.ini: ",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fișierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML",
"The uploaded file was only partially uploaded" => "Fișierul a fost încărcat doar parțial",
"No file was uploaded" => "Nu a fost încărcat nici un fișier",
-"Missing a temporary folder" => "Lipsește un director temporar",
-"Failed to write to disk" => "Eroare la scriere pe disc",
+"Missing a temporary folder" => "Lipsește un dosar temporar",
+"Failed to write to disk" => "Eroare la scrierea discului",
"Not enough storage available" => "Nu este suficient spațiu disponibil",
-"Upload failed" => "Încărcarea a eșuat",
-"Invalid directory." => "Director invalid.",
+"Upload failed. Could not get file info." => "Încărcare eșuată. Nu se pot obține informații despre fișier.",
+"Upload failed. Could not find uploaded file" => "Încărcare eșuată. Nu se poate găsi fișierul încărcat",
+"Invalid directory." => "registru invalid.",
"Files" => "Fișiere",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Nu s-a putut încărca fișierul tău deoarece pare să fie un director sau are 0 bytes.",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
"Not enough space available" => "Nu este suficient spațiu disponibil",
"Upload cancelled." => "Încărcare anulată.",
+"Could not get result from server." => "Nu se poate obține rezultatul de la server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.",
-"URL cannot be empty." => "Adresa URL nu poate fi goală.",
+"URL cannot be empty." => "Adresa URL nu poate fi golita",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nume de dosar invalid. Utilizarea 'Shared' e rezervată de ownCloud",
"Error" => "Eroare",
-"Share" => "Partajează",
+"Share" => "a imparti",
"Delete permanently" => "Stergere permanenta",
"Rename" => "Redenumire",
-"Pending" => "În așteptare",
+"Pending" => "in timpul",
"{new_name} already exists" => "{new_name} deja exista",
"replace" => "înlocuire",
"suggest name" => "sugerează nume",
"cancel" => "anulare",
"replaced {new_name} with {old_name}" => "{new_name} inlocuit cu {old_name}",
"undo" => "Anulează ultima acțiune",
-"_%n folder_::_%n folders_" => array("","",""),
-"_%n file_::_%n files_" => array("","",""),
-"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"files uploading" => "fișiere se încarcă",
+"_%n folder_::_%n folders_" => array("%n director","%n directoare","%n directoare"),
+"_%n file_::_%n files_" => array("%n fișier","%n fișiere","%n fișiere"),
+"{dirs} and {files}" => "{dirs} și {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."),
"'.' is an invalid file name." => "'.' este un nume invalid de fișier.",
"File name cannot be empty." => "Numele fișierului nu poate rămâne gol.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume invalid, '\\', '/', '<', '>', ':', '\"', '|', '?' si '*' nu sunt permise.",
-"Your storage is full, files can not be updated or synced anymore!" => "Spatiul de stocare este plin, nu mai puteti incarca s-au sincroniza alte fisiere.",
-"Your storage is almost full ({usedSpacePercent}%)" => "Spatiul de stocare este aproape plin ({usedSpacePercent}%)",
-"Your download is being prepared. This might take some time if the files are big." => "Se pregătește descărcarea. Aceasta poate să dureze ceva timp dacă fișierele sunt mari.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume invalide, '\\', '/', '<', '>', ':', '\"', '|', '?' si '*' nu sunt permise.",
+"Your storage is full, files can not be updated or synced anymore!" => "Spatiul de stocare este plin, fisierele nu mai pot fi actualizate sau sincronizate",
+"Your storage is almost full ({usedSpacePercent}%)" => "Spatiul de stocare este aproape plin {spatiu folosit}%",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "criptarea a fost disactivata dar fisierele sant inca criptate.va rog intrati in setarile personale pentru a decripta fisierele",
+"Your download is being prepared. This might take some time if the files are big." => "in curs de descarcare. Aceasta poate să dureze ceva timp dacă fișierele sunt mari.",
+"Error moving file" => "Eroare la mutarea fișierului",
"Name" => "Nume",
"Size" => "Dimensiune",
"Modified" => "Modificat",
@@ -51,25 +55,25 @@ $TRANSLATIONS = array(
"File handling" => "Manipulare fișiere",
"Maximum upload size" => "Dimensiune maximă admisă la încărcare",
"max. possible: " => "max. posibil:",
-"Needed for multi-file and folder downloads." => "Necesar pentru descărcarea mai multor fișiere și a dosarelor",
-"Enable ZIP-download" => "Activează descărcare fișiere compresate",
+"Needed for multi-file and folder downloads." => "necesar la descarcarea mai multor liste si fisiere",
+"Enable ZIP-download" => "permite descarcarea codurilor ZIP",
"0 is unlimited" => "0 e nelimitat",
"Maximum input size for ZIP files" => "Dimensiunea maximă de intrare pentru fișiere compresate",
"Save" => "Salvează",
"New" => "Nou",
-"Text file" => "Fișier text",
+"Text file" => "lista",
"Folder" => "Dosar",
"From link" => "de la adresa",
"Deleted files" => "Sterge fisierele",
"Cancel upload" => "Anulează încărcarea",
-"You don’t have write permissions here." => "Nu ai permisiunea de a sterge fisiere aici.",
+"You don’t have write permissions here." => "Nu ai permisiunea de a scrie aici.",
"Nothing in here. Upload something!" => "Nimic aici. Încarcă ceva!",
"Download" => "Descarcă",
-"Unshare" => "Anulare partajare",
+"Unshare" => "Anulare",
"Delete" => "Șterge",
"Upload too large" => "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fișierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server.",
-"Files are being scanned, please wait." => "Fișierele sunt scanate, te rog așteptă.",
+"Files are being scanned, please wait." => "Fișierele sunt scanate, asteptati va rog",
"Current scanning" => "În curs de scanare",
"Upgrading filesystem cache..." => "Modernizare fisiere de sistem cache.."
);
diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php
index 96f52a9045c..143a3379ad4 100644
--- a/apps/files/l10n/ru.php
+++ b/apps/files/l10n/ru.php
@@ -13,12 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Отсутствует временная папка",
"Failed to write to disk" => "Ошибка записи на диск",
"Not enough storage available" => "Недостаточно доступного места в хранилище",
-"Upload failed" => "Ошибка загрузки",
+"Upload failed. Could not get file info." => "Загрузка не удалась. Невозможно получить информацию о файле",
+"Upload failed. Could not find uploaded file" => "Загрузка не удалась. Невозможно найти загруженный файл",
"Invalid directory." => "Неправильный каталог.",
"Files" => "Файлы",
-"Unable to upload your file as it is a directory or has 0 bytes" => "Файл не был загружен: его размер 0 байт либо это не файл, а директория.",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Невозможно загрузить файл {filename} так как он является директорией либо имеет размер 0 байт",
"Not enough space available" => "Недостаточно свободного места",
"Upload cancelled." => "Загрузка отменена.",
+"Could not get result from server." => "Не получен ответ от сервера",
"File upload is in progress. Leaving the page now will cancel the upload." => "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку.",
"URL cannot be empty." => "Ссылка не может быть пустой.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Неправильное имя каталога. Имя 'Shared' зарезервировано.",
@@ -35,14 +37,16 @@ $TRANSLATIONS = array(
"undo" => "отмена",
"_%n folder_::_%n folders_" => array("%n папка","%n папки","%n папок"),
"_%n file_::_%n files_" => array("%n файл","%n файла","%n файлов"),
+"{dirs} and {files}" => "{dirs} и {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Закачка %n файла","Закачка %n файлов","Закачка %n файлов"),
-"files uploading" => "файлы загружаются",
"'.' is an invalid file name." => "'.' - неправильное имя файла.",
"File name cannot be empty." => "Имя файла не может быть пустым.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправильное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.",
"Your storage is full, files can not be updated or synced anymore!" => "Ваше дисковое пространство полностью заполнено, произведите очистку перед загрузкой новых файлов.",
"Your storage is almost full ({usedSpacePercent}%)" => "Ваше хранилище почти заполнено ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Шифрование было отключено, но ваши файлы все еще зашифрованы. Пожалуйста, зайдите на страницу персональных настроек для того, чтобы расшифровать ваши файлы.",
"Your download is being prepared. This might take some time if the files are big." => "Загрузка началась. Это может потребовать много времени, если файл большого размера.",
+"Error moving file" => "Ошибка при перемещении файла",
"Name" => "Имя",
"Size" => "Размер",
"Modified" => "Изменён",
diff --git a/apps/files/l10n/si_LK.php b/apps/files/l10n/si_LK.php
index 1fd18d0c56f..7d24370a092 100644
--- a/apps/files/l10n/si_LK.php
+++ b/apps/files/l10n/si_LK.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"No file was uploaded" => "ගොනුවක් උඩුගත නොවුණි",
"Missing a temporary folder" => "තාවකාලික ෆොල්ඩරයක් අතුරුදහන්",
"Failed to write to disk" => "තැටිගත කිරීම අසාර්ථකයි",
-"Upload failed" => "උඩුගත කිරීම අසාර්ථකයි",
"Files" => "ගොනු",
"Upload cancelled." => "උඩුගත කිරීම අත් හරින්න ලදී",
"File upload is in progress. Leaving the page now will cancel the upload." => "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත",
diff --git a/apps/files/l10n/sk.php b/apps/files/l10n/sk.php
new file mode 100644
index 00000000000..a3178a95c47
--- /dev/null
+++ b/apps/files/l10n/sk.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("","",""),
+"_%n file_::_%n files_" => array("","",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","","")
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php
index b30f263d244..962ce7d7e9b 100644
--- a/apps/files/l10n/sk_SK.php
+++ b/apps/files/l10n/sk_SK.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Chýba dočasný priečinok",
"Failed to write to disk" => "Zápis na disk sa nepodaril",
"Not enough storage available" => "Nedostatok dostupného úložného priestoru",
-"Upload failed" => "Odoslanie bolo neúspešné",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n priečinok","%n priečinky","%n priečinkov"),
"_%n file_::_%n files_" => array("%n súbor","%n súbory","%n súborov"),
"_Uploading %n file_::_Uploading %n files_" => array("Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov"),
-"files uploading" => "nahrávanie súborov",
"'.' is an invalid file name." => "'.' je neplatné meno súboru.",
"File name cannot be empty." => "Meno súboru nemôže byť prázdne",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty.",
diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php
index 08f789ff866..7190753eac9 100644
--- a/apps/files/l10n/sl.php
+++ b/apps/files/l10n/sl.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manjka začasna mapa",
"Failed to write to disk" => "Pisanje na disk je spodletelo",
"Not enough storage available" => "Na voljo ni dovolj prostora",
-"Upload failed" => "Pošiljanje je spodletelo",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","","",""),
"_%n file_::_%n files_" => array("","","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","","",""),
-"files uploading" => "poteka pošiljanje datotek",
"'.' is an invalid file name." => "'.' je neveljavno ime datoteke.",
"File name cannot be empty." => "Ime datoteke ne sme biti prazno polje.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neveljavno ime, znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni.",
diff --git a/apps/files/l10n/sq.php b/apps/files/l10n/sq.php
index ff09e7b4f95..ecc066a284c 100644
--- a/apps/files/l10n/sq.php
+++ b/apps/files/l10n/sq.php
@@ -2,6 +2,8 @@
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s nuk u spostua - Aty ekziston një skedar me të njëjtin emër",
"Could not move %s" => "%s nuk u spostua",
+"Unable to set upload directory." => "Nuk është i mundur caktimi i dosjes së ngarkimit.",
+"Invalid Token" => "Përmbajtje e pavlefshme",
"No file was uploaded. Unknown error" => "Nuk u ngarkua asnjë skedar. Veprim i gabuar i panjohur",
"There is no error, the file uploaded with success" => "Nuk pati veprime të gabuara, skedari u ngarkua me sukses",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Skedari i ngarkuar tejkalon udhëzimin upload_max_filesize tek php.ini:",
@@ -13,11 +15,11 @@ $TRANSLATIONS = array(
"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.",
+"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",
"Share" => "Nda",
"Delete permanently" => "Elimino përfundimisht",
@@ -29,19 +31,21 @@ $TRANSLATIONS = array(
"cancel" => "anulo",
"replaced {new_name} with {old_name}" => "U zëvëndësua {new_name} me {old_name}",
"undo" => "anulo",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
-"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"files uploading" => "po ngarkoj skedarët",
+"_%n folder_::_%n folders_" => array("%n dosje","%n dosje"),
+"_%n file_::_%n files_" => array("%n skedar","%n skedarë"),
+"{dirs} and {files}" => "{dirs} dhe {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Po ngarkoj %n skedar","Po ngarkoj %n skedarë"),
"'.' is an invalid file name." => "'.' është emër i pavlefshëm.",
"File name cannot be empty." => "Emri i skedarit nuk mund të jetë bosh.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Emër i pavlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.",
"Your storage is full, files can not be updated or synced anymore!" => "Hapësira juaj e memorizimit është plot, nuk mund të ngarkoni apo sinkronizoni më skedarët.",
"Your storage is almost full ({usedSpacePercent}%)" => "Hapësira juaj e memorizimit është gati plot ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kodifikimi u çaktivizua por skedarët tuaj vazhdojnë të jenë të kodifikuar. Ju lutem shkoni tek parametrat personale për të dekodifikuar skedarët tuaj.",
"Your download is being prepared. This might take some time if the files are big." => "Shkarkimi juaj po përgatitet. Mund të duhet pak kohë nqse skedarët janë të mëdhenj.",
"Name" => "Emri",
"Size" => "Dimensioni",
"Modified" => "Modifikuar",
+"%s could not be renamed" => "Nuk është i mundur riemërtimi i %s",
"Upload" => "Ngarko",
"File handling" => "Trajtimi i skedarit",
"Maximum upload size" => "Dimensioni maksimal i ngarkimit",
diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php
index 73f8ace5c81..fd3b2a2912f 100644
--- a/apps/files/l10n/sr.php
+++ b/apps/files/l10n/sr.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Недостаје привремена фасцикла",
"Failed to write to disk" => "Не могу да пишем на диск",
"Not enough storage available" => "Нема довољно простора",
-"Upload failed" => "Отпремање није успело",
"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." => "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање.",
@@ -33,7 +31,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"files uploading" => "датотеке се отпремају",
"'.' is an invalid file name." => "Датотека „.“ је неисправног имена.",
"File name cannot be empty." => "Име датотеке не може бити празно.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неисправан назив. Следећи знакови нису дозвољени: \\, /, <, >, :, \", |, ? и *.",
diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php
index 1965479fe66..8831d1a1bef 100644
--- a/apps/files/l10n/sr@latin.php
+++ b/apps/files/l10n/sr@latin.php
@@ -6,6 +6,8 @@ $TRANSLATIONS = array(
"No file was uploaded" => "Nijedan fajl nije poslat",
"Missing a temporary folder" => "Nedostaje privremena fascikla",
"Files" => "Fajlovi",
+"Error" => "Greška",
+"Share" => "Podeli",
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
@@ -17,6 +19,7 @@ $TRANSLATIONS = array(
"Save" => "Snimi",
"Nothing in here. Upload something!" => "Ovde nema ničeg. Pošaljite nešto!",
"Download" => "Preuzmi",
+"Unshare" => "Ukljoni deljenje",
"Delete" => "Obriši",
"Upload too large" => "Pošiljka je prevelika",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru."
diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php
index fbbe1f15910..208dcd4ea12 100644
--- a/apps/files/l10n/sv.php
+++ b/apps/files/l10n/sv.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "En temporär mapp saknas",
"Failed to write to disk" => "Misslyckades spara till disk",
"Not enough storage available" => "Inte tillräckligt med lagringsutrymme tillgängligt",
-"Upload failed" => "Misslyckad uppladdning",
"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.",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fil","%n filer"),
"{dirs} and {files}" => "{dirs} och {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Laddar upp %n fil","Laddar upp %n filer"),
-"files uploading" => "filer laddas upp",
"'.' 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.",
diff --git a/apps/files/l10n/sw_KE.php b/apps/files/l10n/sw_KE.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/sw_KE.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php
index 154e0d6796e..f05990b94f0 100644
--- a/apps/files/l10n/ta_LK.php
+++ b/apps/files/l10n/ta_LK.php
@@ -7,9 +7,7 @@ $TRANSLATIONS = array(
"No file was uploaded" => "எந்த கோப்பும் பதிவேற்றப்படவில்லை",
"Missing a temporary folder" => "ஒரு தற்காலிகமான கோப்புறையை காணவில்லை",
"Failed to write to disk" => "வட்டில் எழுத முடியவில்லை",
-"Upload failed" => "பதிவேற்றல் தோல்வியுற்றது",
"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 வெறுமையாக இருக்கமுடியாது.",
diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php
index aa8cf4e9b50..37144ebc883 100644
--- a/apps/files/l10n/th_TH.php
+++ b/apps/files/l10n/th_TH.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "โฟลเดอร์ชั่วคราวเกิดการสูญหาย",
"Failed to write to disk" => "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว",
"Not enough storage available" => "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน",
-"Upload failed" => "อัพโหลดล้มเหลว",
"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." => "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
@@ -32,7 +30,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "การอัพโหลดไฟล์",
"'.' is an invalid file name." => "'.' เป็นชื่อไฟล์ที่ไม่ถูกต้อง",
"File name cannot be empty." => "ชื่อไฟล์ไม่สามารถเว้นว่างได้",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง, '\\', '/', '<', '>', ':', '\"', '|', '?' และ '*' ไม่ได้รับอนุญาตให้ใช้งานได้",
diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php
index dd089757d5f..8cb05e16ace 100644
--- a/apps/files/l10n/tr.php
+++ b/apps/files/l10n/tr.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Geçici dizin eksik",
"Failed to write to disk" => "Diske yazılamadı",
"Not enough storage available" => "Yeterli disk alanı yok",
-"Upload failed" => "Yükleme başarısız",
"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.",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n dizin","%n dizin"),
"_%n file_::_%n files_" => array("%n dosya","%n dosya"),
"_Uploading %n file_::_Uploading %n files_" => array("%n dosya yükleniyor","%n dosya yükleniyor"),
-"files uploading" => "Dosyalar yükleniyor",
"'.' is an invalid file name." => "'.' geçersiz dosya adı.",
"File name cannot be empty." => "Dosya adı boş olamaz.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Geçersiz isim, '\\', '/', '<', '>', ':', '\"', '|', '?' ve '*' karakterlerine izin verilmemektedir.",
diff --git a/apps/files/l10n/ug.php b/apps/files/l10n/ug.php
index 920d077e4eb..a38ce706ef9 100644
--- a/apps/files/l10n/ug.php
+++ b/apps/files/l10n/ug.php
@@ -23,7 +23,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "ھۆججەت يۈكلىنىۋاتىدۇ",
"Name" => "ئاتى",
"Size" => "چوڭلۇقى",
"Modified" => "ئۆزگەرتكەن",
diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php
index 781590cff35..fac7cea529a 100644
--- a/apps/files/l10n/uk.php
+++ b/apps/files/l10n/uk.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Не вдалося перемістити %s - Файл з таким ім'ям вже існує",
"Could not move %s" => "Не вдалося перемістити %s",
+"Unable to set upload directory." => "Не вдалося встановити каталог завантаження.",
"No file was uploaded. Unknown error" => "Не завантажено жодного файлу. Невідома помилка",
"There is no error, the file uploaded with success" => "Файл успішно вивантажено без помилок.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Розмір звантаження перевищує upload_max_filesize параметра в php.ini: ",
@@ -11,10 +12,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Відсутній тимчасовий каталог",
"Failed to write to disk" => "Невдалося записати на диск",
"Not enough storage available" => "Місця більше немає",
-"Upload failed" => "Помилка завантаження",
"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." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.",
@@ -33,7 +32,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"files uploading" => "файли завантажуються",
"'.' is an invalid file name." => "'.' це невірне ім'я файлу.",
"File name cannot be empty." => " Ім'я файлу не може бути порожнім.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені.",
diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php
index b98a14f6d7b..2d63128aa26 100644
--- a/apps/files/l10n/vi.php
+++ b/apps/files/l10n/vi.php
@@ -11,10 +11,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Không tìm thấy thư mục tạm",
"Failed to write to disk" => "Không thể ghi ",
"Not enough storage available" => "Không đủ không gian lưu trữ",
-"Upload failed" => "Tải lên thất bại",
"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.",
@@ -33,7 +31,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "tệp tin đang được tải lên",
"'.' is an invalid file name." => "'.' là một tên file không hợp lệ",
"File name cannot be empty." => "Tên file không được rỗng",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Tên không hợp lệ, '\\', '/', '<', '>', ':', '\"', '|', '?' và '*' thì không được phép dùng.",
diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php
index 59b09ad950b..b739b72ce7e 100644
--- a/apps/files/l10n/zh_CN.php
+++ b/apps/files/l10n/zh_CN.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "缺少临时目录",
"Failed to write to disk" => "写入磁盘失败",
"Not enough storage available" => "没有足够的存储空间",
-"Upload failed" => "上传失败",
"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." => "文件正在上传中。现在离开此页会导致上传动作被取消。",
@@ -36,7 +34,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n 文件夹"),
"_%n file_::_%n files_" => array("%n个文件"),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"files uploading" => "文件上传中",
"'.' is an invalid file name." => "'.' 是一个无效的文件名。",
"File name cannot be empty." => "文件名不能为空。",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。",
diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php
index 21c929f81a6..214812d7ada 100644
--- a/apps/files/l10n/zh_TW.php
+++ b/apps/files/l10n/zh_TW.php
@@ -13,10 +13,8 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "找不到暫存資料夾",
"Failed to write to disk" => "寫入硬碟失敗",
"Not enough storage available" => "儲存空間不足",
-"Upload failed" => "上傳失敗",
"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." => "檔案上傳中,離開此頁面將會取消上傳。",
@@ -37,7 +35,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n 個檔案"),
"{dirs} and {files}" => "{dirs} 和 {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n 個檔案正在上傳"),
-"files uploading" => "檔案上傳中",
"'.' is an invalid file name." => "'.' 是不合法的檔名",
"File name cannot be empty." => "檔名不能為空",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "檔名不合法,不允許 \\ / < > : \" | ? * 字元",
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index 7135ef9f656..1d431df04f1 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -1,6 +1,6 @@
<?php
-namespace OCA\files\lib;
+namespace OCA\Files;
class Helper
{
@@ -17,4 +17,120 @@ class Helper
'maxHumanFilesize' => $maxHumanFilesize,
'usedSpacePercent' => (int)$storageInfo['relative']);
}
+
+ public static function determineIcon($file) {
+ if($file['type'] === 'dir') {
+ $dir = $file['directory'];
+ $absPath = \OC\Files\Filesystem::getView()->getAbsolutePath($dir.'/'.$file['name']);
+ $mount = \OC\Files\Filesystem::getMountManager()->find($absPath);
+ if (!is_null($mount)) {
+ $sid = $mount->getStorageId();
+ if (!is_null($sid)) {
+ $sid = explode(':', $sid);
+ if ($sid[0] === 'shared') {
+ return \OC_Helper::mimetypeIcon('dir-shared');
+ }
+ if ($sid[0] !== 'local') {
+ return \OC_Helper::mimetypeIcon('dir-external');
+ }
+ }
+ }
+ return \OC_Helper::mimetypeIcon('dir');
+ }
+
+ if($file['isPreviewAvailable']) {
+ $pathForPreview = $file['directory'] . '/' . $file['name'];
+ return \OC_Helper::previewIcon($pathForPreview);
+ }
+ return \OC_Helper::mimetypeIcon($file['mimetype']);
+ }
+
+ /**
+ * Comparator function to sort files alphabetically and have
+ * the directories appear first
+ * @param array $a file
+ * @param array $b file
+ * @return -1 if $a must come before $b, 1 otherwise
+ */
+ public static function fileCmp($a, $b) {
+ if ($a['type'] === 'dir' and $b['type'] !== 'dir') {
+ return -1;
+ } elseif ($a['type'] !== 'dir' and $b['type'] === 'dir') {
+ return 1;
+ } else {
+ return strnatcasecmp($a['name'], $b['name']);
+ }
+ }
+
+ /**
+ * Retrieves the contents of the given directory and
+ * returns it as a sorted array.
+ * @param string $dir path to the directory
+ * @return array of files
+ */
+ public static function getFiles($dir) {
+ $content = \OC\Files\Filesystem::getDirectoryContent($dir);
+ $files = array();
+
+ foreach ($content as $i) {
+ $i['date'] = \OCP\Util::formatDate($i['mtime']);
+ if ($i['type'] === 'file') {
+ $fileinfo = pathinfo($i['name']);
+ $i['basename'] = $fileinfo['filename'];
+ if (!empty($fileinfo['extension'])) {
+ $i['extension'] = '.' . $fileinfo['extension'];
+ } else {
+ $i['extension'] = '';
+ }
+ }
+ $i['directory'] = $dir;
+ $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
+ $i['icon'] = \OCA\Files\Helper::determineIcon($i);
+ $files[] = $i;
+ }
+
+ usort($files, array('\OCA\Files\Helper', 'fileCmp'));
+
+ return $files;
+ }
+
+ /**
+ * Splits the given path into a breadcrumb structure.
+ * @param string $dir path to process
+ * @return array where each entry is a hash of the absolute
+ * directory path and its name
+ */
+ public static function makeBreadcrumb($dir){
+ $breadcrumb = array();
+ $pathtohere = '';
+ foreach (explode('/', $dir) as $i) {
+ if ($i !== '') {
+ $pathtohere .= '/' . $i;
+ $breadcrumb[] = array('dir' => $pathtohere, 'name' => $i);
+ }
+ }
+ return $breadcrumb;
+ }
+
+ /**
+ * Returns the numeric permissions for the given directory.
+ * @param string $dir directory without trailing slash
+ * @return numeric permissions
+ */
+ public static function getDirPermissions($dir){
+ $permissions = \OCP\PERMISSION_READ;
+ if (\OC\Files\Filesystem::isCreatable($dir . '/')) {
+ $permissions |= \OCP\PERMISSION_CREATE;
+ }
+ if (\OC\Files\Filesystem::isUpdatable($dir . '/')) {
+ $permissions |= \OCP\PERMISSION_UPDATE;
+ }
+ if (\OC\Files\Filesystem::isDeletable($dir . '/')) {
+ $permissions |= \OCP\PERMISSION_DELETE;
+ }
+ if (\OC\Files\Filesystem::isSharable($dir . '/')) {
+ $permissions |= \OCP\PERMISSION_SHARE;
+ }
+ return $permissions;
+ }
}
diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html
new file mode 100644
index 00000000000..662177ac7ed
--- /dev/null
+++ b/apps/files/templates/fileexists.html
@@ -0,0 +1,26 @@
+<div id="{dialog_name}" title="{title}" class="fileexists">
+ <span class="why">{why}<!-- Which files do you want to keep --></span><br/>
+ <span class="what">{what}<!-- If you select both versions, the copied file will have a number added to its name. --></span><br/>
+ <br/>
+ <table>
+ <th><label><input class="allnewfiles" type="checkbox" />New Files<span class="count"></span></label></th>
+ <th><label><input class="allexistingfiles" type="checkbox" />Already existing files<span class="count"></span></label></th>
+ </table>
+ <div class="conflicts">
+ <div class="template">
+ <div class="filename"></div>
+ <div class="replacement">
+ <input type="checkbox" />
+ <span class="svg icon"></span>
+ <div class="mtime"></div>
+ <div class="size"></div>
+ </div>
+ <div class="original">
+ <input type="checkbox" />
+ <span class="svg icon"></span>
+ <div class="mtime"></div>
+ <div class="size"></div>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 29cb457cd5a..96a80738989 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -1,8 +1,7 @@
<!--[if IE 8]><style>input[type="checkbox"]{padding:0;}table td{position:static !important;}</style><![endif]-->
<div id="controls">
<?php print_unescaped($_['breadcrumb']); ?>
- <?php if ($_['isCreatable']):?>
- <div class="actions <?php if (isset($_['files']) and count($_['files'])==0):?>emptyfolder<?php endif; ?>">
+ <div class="actions creatable <?php if (!$_['isCreatable']):?>hidden<?php endif; ?> <?php if (isset($_['files']) and count($_['files'])==0):?>emptycontent<?php endif; ?>">
<div id="new" class="button">
<a><?php p($l->t('New'));?></a>
<ul>
@@ -16,29 +15,23 @@
</div>
<div id="upload" class="button"
title="<?php p($l->t('Upload') . ' max. '.$_['uploadMaxHumanFilesize']) ?>">
- <form data-upload-id='1'
- id="data-upload-form"
- class="file_upload_form"
- action="<?php print_unescaped(OCP\Util::linkTo('files', 'ajax/upload.php')); ?>"
- method="post"
- enctype="multipart/form-data"
- target="file_upload_target_1">
<?php if($_['uploadMaxFilesize'] >= 0):?>
<input type="hidden" name="MAX_FILE_SIZE" id="max_upload"
value="<?php p($_['uploadMaxFilesize']) ?>">
<?php endif;?>
<!-- Send the requesttoken, this is needed for older IE versions
because they don't send the CSRF token via HTTP header in this case -->
- <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" id="requesttoken">
<input type="hidden" class="max_human_file_size"
value="(max <?php p($_['uploadMaxHumanFilesize']); ?>)">
<input type="hidden" name="dir" value="<?php p($_['dir']) ?>" id="dir">
- <input type="file" id="file_upload_start" name='files[]'/>
+ <input type="file" id="file_upload_start" name='files[]'
+ data-url="<?php print_unescaped(OCP\Util::linkTo('files', 'ajax/upload.php')); ?>" />
<a href="#" class="svg"></a>
- </form>
</div>
<?php if ($_['trash'] ): ?>
- <input id="trash" type="button" value="<?php p($l->t('Deleted files'));?>" class="button" <?php $_['trashEmpty'] ? p('disabled') : '' ?>></input>
+ <div id="trash" class="button" <?php $_['trashEmpty'] ? p('disabled') : '' ?>>
+ <a><?php p($l->t('Deleted files'));?></a>
+ </div>
<?php endif; ?>
<div id="uploadprogresswrapper">
<div id="uploadprogressbar"></div>
@@ -48,16 +41,15 @@
</div>
</div>
<div id="file_action_panel"></div>
- <?php elseif( !$_['isPublic'] ):?>
- <div class="actions"><input type="button" disabled value="<?php p($l->t('You don’t have write permissions here.'))?>"></div>
- <input type="hidden" name="dir" value="<?php p($_['dir']) ?>" id="dir">
- <?php endif;?>
+ <div class="notCreatable notPublic <?php if ($_['isCreatable'] or $_['isPublic'] ):?>hidden<?php endif; ?>">
+ <div class="actions"><input type="button" disabled value="<?php p($l->t('You don’t have write permissions here.'))?>"></div>
+ </div>
<input type="hidden" name="permissions" value="<?php p($_['permissions']); ?>" id="permissions">
</div>
-<?php if (isset($_['files']) and $_['isCreatable'] and count($_['files'])==0):?>
- <div id="emptycontent"><?php p($l->t('Nothing in here. Upload something!'))?></div>
-<?php endif; ?>
+<div id="emptycontent" <?php if (!isset($_['files']) or !$_['isCreatable'] or count($_['files']) > 0 or $_['ajaxLoad']):?>class="hidden"<?php endif; ?>><?php p($l->t('Nothing in here. Upload something!'))?></div>
+
+<input type="hidden" id="disableSharing" data-status="<?php p($_['disableSharing']); ?>"></input>
<table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="36" data-preview-y="36">
<thead>
@@ -82,7 +74,7 @@
<th id="headerDate">
<span id="modified"><?php p($l->t( 'Modified' )); ?></span>
<?php if ($_['permissions'] & OCP\PERMISSION_DELETE): ?>
-<!-- NOTE: Temporary fix to allow unsharing of files in root of Shared folder -->
+<!-- NOTE: Temporary fix to allow unsharing of files in root of Shared folder -->
<?php if ($_['dir'] == '/Shared'): ?>
<span class="selectedActions"><a href="" class="delete-selected">
<?php p($l->t('Unshare'))?>
@@ -120,6 +112,7 @@
</div>
<!-- config hints for javascript -->
+<input type="hidden" name="ajaxLoad" id="ajaxLoad" value="<?php p($_['ajaxLoad']); ?>" />
<input type="hidden" name="allowZipDownload" id="allowZipDownload" value="<?php p($_['allowZipDownload']); ?>" />
<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" />
<input type="hidden" name="encryptedFiles" id="encryptedFiles" value="<?php $_['encryptedFiles'] ? p('1') : p('0'); ?>" />
diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php
index 4076c1bb331..1e4d4d11c98 100644
--- a/apps/files/templates/part.list.php
+++ b/apps/files/templates/part.list.php
@@ -1,7 +1,7 @@
-<input type="hidden" id="disableSharing" data-status="<?php p($_['disableSharing']); ?>">
+<?php $totalfiles = 0;
+$totaldirs = 0;
+$totalsize = 0; ?>
<?php foreach($_['files'] as $file):
- //strlen('files/') => 6
- $relativePath = substr($file['path'], 6);
// the bigger the file, the darker the shade of grey; megabytes*2
$simple_size_color = intval(160-$file['size']/(1024*1024)*2);
if($simple_size_color<0) $simple_size_color = 0;
@@ -22,26 +22,7 @@
<?php else: ?>
<td class="filename svg"
<?php endif; ?>
- <?php if($file['type'] == 'dir'): ?>
- style="background-image:url(<?php print_unescaped(OCP\mimetype_icon('dir')); ?>)"
- <?php else: ?>
- <?php if($_['isPublic']): ?>
- <?php
- $relativePath = substr($relativePath, strlen($_['sharingroot']));
- ?>
- <?php if($file['isPreviewAvailable']): ?>
- style="background-image:url(<?php print_unescaped(OCP\publicPreview_icon($relativePath, $_['sharingtoken'])); ?>)"
- <?php else: ?>
- style="background-image:url(<?php print_unescaped(OCP\mimetype_icon($file['mimetype'])); ?>)"
- <?php endif; ?>
- <?php else: ?>
- <?php if($file['isPreviewAvailable']): ?>
- style="background-image:url(<?php print_unescaped(OCP\preview_icon($relativePath)); ?>)"
- <?php else: ?>
- style="background-image:url(<?php print_unescaped(OCP\mimetype_icon($file['mimetype'])); ?>)"
- <?php endif; ?>
- <?php endif; ?>
- <?php endif; ?>
+ style="background-image:url(<?php print_unescaped($file['icon']); ?>)"
>
<?php if(!isset($_['readonly']) || !$_['readonly']): ?>
<input id="select-<?php p($file['fileid']); ?>" type="checkbox" />
diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php
index 90a9984e27f..5b62b84e223 100644
--- a/apps/files_encryption/appinfo/app.php
+++ b/apps/files_encryption/appinfo/app.php
@@ -25,7 +25,9 @@ if (!OC_Config::getValue('maintenance', false)) {
// App manager related hooks
OCA\Encryption\Helper::registerAppHooks();
- stream_wrapper_register('crypt', 'OCA\Encryption\Stream');
+ if(!in_array('crypt', stream_get_wrappers())) {
+ stream_wrapper_register('crypt', 'OCA\Encryption\Stream');
+ }
// check if we are logged in
if (OCP\User::isLoggedIn()) {
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php
index 85169e6a1d0..d9221c6e828 100644
--- a/apps/files_encryption/hooks/hooks.php
+++ b/apps/files_encryption/hooks/hooks.php
@@ -44,17 +44,22 @@ class Hooks {
\OC_Util::setupFS($params['uid']);
}
- $util = new Util($view, $params['uid']);
-
- //check if all requirements are met
- if(!$util->ready() && (!Helper::checkRequirements() || !Helper::checkConfiguration())) {
- $error_msg = $l->t("Missing requirements.");
- $hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.');
- \OC_App::disable('files_encryption');
- \OCP\Util::writeLog('Encryption library', $error_msg . ' ' . $hint, \OCP\Util::ERROR);
- \OCP\Template::printErrorPage($error_msg, $hint);
+ $privateKey = \OCA\Encryption\Keymanager::getPrivateKey($view, $params['uid']);
+
+ // if no private key exists, check server configuration
+ if(!$privateKey) {
+ //check if all requirements are met
+ if(!Helper::checkRequirements() || !Helper::checkConfiguration()) {
+ $error_msg = $l->t("Missing requirements.");
+ $hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.');
+ \OC_App::disable('files_encryption');
+ \OCP\Util::writeLog('Encryption library', $error_msg . ' ' . $hint, \OCP\Util::ERROR);
+ \OCP\Template::printErrorPage($error_msg, $hint);
+ }
}
+ $util = new Util($view, $params['uid']);
+
// setup user, if user not ready force relogin
if (Helper::setupUser($util, $params['password']) === false) {
return false;
@@ -73,7 +78,7 @@ class Hooks {
$userView = new \OC_FilesystemView('/' . $params['uid']);
- // Set legacy encryption key if it exists, to support
+ // Set legacy encryption key if it exists, to support
// depreciated encryption system
if (
$userView->file_exists('encryption.key')
@@ -249,7 +254,7 @@ class Hooks {
$params['run'] = false;
$params['error'] = $l->t('Following users are not set up for encryption:') . ' ' . join(', ' , $notConfigured);
}
-
+
}
/**
@@ -260,7 +265,7 @@ class Hooks {
// NOTE: $params has keys:
// [itemType] => file
// itemSource -> int, filecache file ID
- // [parent] =>
+ // [parent] =>
// [itemTarget] => /13
// shareWith -> string, uid of user being shared to
// fileTarget -> path of file being shared
@@ -301,13 +306,13 @@ class Hooks {
// NOTE: parent is folder but shared was a file!
// we try to rebuild the missing path
// some examples we face here
- // user1 share folder1 with user2 folder1 has
- // the following structure
+ // user1 share folder1 with user2 folder1 has
+ // the following structure
// /folder1/subfolder1/subsubfolder1/somefile.txt
// user2 re-share subfolder2 with user3
// user3 re-share somefile.txt user4
- // so our path should be
- // /Shared/subfolder1/subsubfolder1/somefile.txt
+ // so our path should be
+ // /Shared/subfolder1/subsubfolder1/somefile.txt
// while user3 is sharing
if ($params['itemType'] === 'file') {
diff --git a/apps/files_encryption/l10n/bs.php b/apps/files_encryption/l10n/bs.php
new file mode 100644
index 00000000000..708e045adeb
--- /dev/null
+++ b/apps/files_encryption/l10n/bs.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Saving..." => "Spašavam..."
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_encryption/l10n/de_CH.php b/apps/files_encryption/l10n/de_CH.php
new file mode 100644
index 00000000000..aa867645c8d
--- /dev/null
+++ b/apps/files_encryption/l10n/de_CH.php
@@ -0,0 +1,39 @@
+<?php
+$TRANSLATIONS = array(
+"Recovery key successfully enabled" => "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 ausserhalb 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 OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.",
+"Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
+"Saving..." => "Speichern...",
+"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 ausserhalb 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 recovery key password:" => "Wiederherstellungsschlüsselpasswort ändern",
+"Old Recovery key password" => "Altes Wiederherstellungsschlüsselpasswort",
+"New Recovery key password" => "Neues Wiederherstellungsschlüsselpasswort ",
+"Change Password" => "Passwort ändern",
+"Your private key password no longer match your log-in password:" => "Das Privatschlüsselpasswort darf nicht länger mit den Login-Passwort übereinstimmen.",
+"Set your old private key password to your current log-in password." => "Setzen Sie Ihr altes Privatschlüsselpasswort auf Ihr aktuelles LogIn-Passwort.",
+" If you don't remember your old password you can ask your administrator to recover your files." => "Falls Sie sich nicht an Ihr altes Passwort erinnern können, fragen Sie bitte Ihren Administrator, um Ihre Dateien wiederherzustellen.",
+"Old log-in password" => "Altes Login-Passwort",
+"Current log-in password" => "Momentanes Login-Passwort",
+"Update Private Key Password" => "Das Passwort des privaten Schlüssels aktualisieren",
+"Enable password recovery:" => "Die Passwort-Wiederherstellung aktivieren:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben.",
+"File recovery settings updated" => "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.",
+"Could not update file recovery" => "Die Dateiwiederherstellung konnte nicht aktualisiert werden."
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/en_GB.php b/apps/files_encryption/l10n/en_GB.php
new file mode 100644
index 00000000000..c220a4bdf04
--- /dev/null
+++ b/apps/files_encryption/l10n/en_GB.php
@@ -0,0 +1,39 @@
+<?php
+$TRANSLATIONS = array(
+"Recovery key successfully enabled" => "Recovery key enabled successfully",
+"Could not enable recovery key. Please check your recovery key password!" => "Could not enable recovery key. Please check your recovery key password!",
+"Recovery key successfully disabled" => "Recovery key disabled successfully",
+"Could not disable recovery key. Please check your recovery key password!" => "Could not disable recovery key. Please check your recovery key password!",
+"Password successfully changed." => "Password changed successfully.",
+"Could not change the password. Maybe the old password was not correct." => "Could not change the password. Maybe the old password was incorrect.",
+"Private key password successfully updated." => "Private key password updated successfully.",
+"Could not update the private key password. Maybe the old password was not correct." => "Could not update the private key password. Maybe the old password was not correct.",
+"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." => "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.",
+"Missing requirements." => "Missing requirements.",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.",
+"Following users are not set up for encryption:" => "Following users are not set up for encryption:",
+"Saving..." => "Saving...",
+"Your private key is not valid! Maybe the your password was changed from outside." => "Your private key is not valid! Maybe the your password was changed externally.",
+"You can unlock your private key in your " => "You can unlock your private key in your ",
+"personal settings" => "personal settings",
+"Encryption" => "Encryption",
+"Enable recovery key (allow to recover users files in case of password loss):" => "Enable recovery key (allow to recover users files in case of password loss):",
+"Recovery key password" => "Recovery key password",
+"Enabled" => "Enabled",
+"Disabled" => "Disabled",
+"Change recovery key password:" => "Change recovery key password:",
+"Old Recovery key password" => "Old Recovery key password",
+"New Recovery key password" => "New Recovery key password",
+"Change Password" => "Change Password",
+"Your private key password no longer match your log-in password:" => "Your private key password no longer match your login password:",
+"Set your old private key password to your current log-in password." => "Set your old private key password to your current login password.",
+" If you don't remember your old password you can ask your administrator to recover your files." => " If you don't remember your old password you can ask your administrator to recover your files.",
+"Old log-in password" => "Old login password",
+"Current log-in password" => "Current login password",
+"Update Private Key Password" => "Update Private Key Password",
+"Enable password recovery:" => "Enable password recovery:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss",
+"File recovery settings updated" => "File recovery settings updated",
+"Could not update file recovery" => "Could not update file recovery"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php
index 8341bafc9fd..2d644708c59 100644
--- a/apps/files_encryption/l10n/es.php
+++ b/apps/files_encryption/l10n/es.php
@@ -10,6 +10,8 @@ $TRANSLATIONS = array(
"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 OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.",
+"Following users are not set up for encryption:" => "Los siguientes usuarios no han sido configurados para el cifrado:",
"Saving..." => "Guardando...",
"Your private key is not valid! Maybe the your password was changed from outside." => "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera.",
"You can unlock your private key in your " => "Puede desbloquear su clave privada en su",
diff --git a/apps/files_encryption/l10n/es_AR.php b/apps/files_encryption/l10n/es_AR.php
index cac8c465362..666ea59687c 100644
--- a/apps/files_encryption/l10n/es_AR.php
+++ b/apps/files_encryption/l10n/es_AR.php
@@ -10,6 +10,8 @@ $TRANSLATIONS = array(
"Could not update the private key password. Maybe the old password was not correct." => "No fue posible actualizar la contraseña de clave privada. Tal vez la contraseña anterior no es correcta.",
"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "¡Tu clave privada no es válida! Tal vez tu contraseña fue cambiada desde fuera del sistema de ownCloud (por ej. desde tu cuenta de sistema). Podés actualizar tu clave privada en la sección de \"configuración personal\", para recuperar el acceso a tus archivos.",
"Missing requirements." => "Requisitos incompletos.",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o una versión más reciente esté instalado y que OpenSSL junto con la extensión PHP esté habilitado y configurado apropiadamente. Por ahora, la aplicación de encriptación ha sido deshabilitada.",
+"Following users are not set up for encryption:" => "Los siguientes usuarios no fueron configurados para encriptar:",
"Saving..." => "Guardando...",
"Your private key is not valid! Maybe the your password was changed from outside." => "¡Tu clave privada no es válida! Tal vez tu contraseña fue cambiada desde afuera.",
"You can unlock your private key in your " => "Podés desbloquear tu clave privada en tu",
diff --git a/apps/files_encryption/l10n/fi_FI.php b/apps/files_encryption/l10n/fi_FI.php
index 53b0a6b25cd..b3df41b1f42 100644
--- a/apps/files_encryption/l10n/fi_FI.php
+++ b/apps/files_encryption/l10n/fi_FI.php
@@ -1,11 +1,21 @@
<?php
$TRANSLATIONS = array(
+"Recovery key successfully enabled" => "Palautusavain kytketty päälle onnistuneesti",
"Password successfully changed." => "Salasana vaihdettiin onnistuneesti.",
"Could not change the password. Maybe the old password was not correct." => "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.",
+"Following users are not set up for encryption:" => "Seuraavat käyttäjät eivät ole määrittäneet salausta:",
"Saving..." => "Tallennetaan...",
+"personal settings" => "henkilökohtaiset asetukset",
"Encryption" => "Salaus",
+"Recovery key password" => "Palautusavaimen salasana",
"Enabled" => "Käytössä",
"Disabled" => "Ei käytössä",
-"Change Password" => "Vaihda salasana"
+"Change recovery key password:" => "Vaihda palautusavaimen salasana:",
+"Old Recovery key password" => "Vanha palautusavaimen salasana",
+"New Recovery key password" => "Uusi palautusavaimen salasana",
+"Change Password" => "Vaihda salasana",
+"Old log-in password" => "Vanha kirjautumis-salasana",
+"Current log-in password" => "Nykyinen kirjautumis-salasana",
+"Enable password recovery:" => "Ota salasanan palautus käyttöön:"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/lt_LT.php b/apps/files_encryption/l10n/lt_LT.php
index 9fbf7b29604..4ededb716f4 100644
--- a/apps/files_encryption/l10n/lt_LT.php
+++ b/apps/files_encryption/l10n/lt_LT.php
@@ -6,12 +6,34 @@ $TRANSLATIONS = array(
"Could not disable recovery key. Please check your recovery key password!" => "Neišėjo išjungti jūsų atkūrimo rakto. Prašome jį patikrinti!",
"Password successfully changed." => "Slaptažodis sėkmingai pakeistas",
"Could not change the password. Maybe the old password was not correct." => "Slaptažodis nebuvo pakeistas. Gali būti, kad buvo neteisingai suvestas senasis.",
+"Private key password successfully updated." => "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.",
+"Could not update the private key password. Maybe the old password was not correct." => "Nepavyko atnaujinti privataus rakto slaptažodžio. Gali būti, kad buvo neteisingai suvestas senasis.",
+"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." => "Jūsų privatus raktas yra netinkamas! Panašu, kad Jūsų slaptažodis buvo pakeistas išorėje ownCloud sistemos (pvz. Jūsų organizacijos kataloge). Galite atnaujinti savo privataus rakto slaptažodį savo asmeniniuose nustatymuose, kad atkurti prieigą prie savo šifruotų failų.",
+"Missing requirements." => "Trūkstami laukai.",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Prašome įsitikinti, kad PHP 5.3.3 ar naujesnė yra įdiegta ir kad OpenSSL kartu su PHP plėtiniu yra šjungti ir teisingai sukonfigūruoti. Kol kas šifravimo programa bus išjungta.",
+"Following users are not set up for encryption:" => "Sekantys naudotojai nenustatyti šifravimui:",
"Saving..." => "Saugoma...",
+"Your private key is not valid! Maybe the your password was changed from outside." => "Jūsų privatus raktas yra netinkamas! Galbūt Jūsų slaptažodis buvo pakeistas iš išorės?",
+"You can unlock your private key in your " => "Galite atrakinti savo privatų raktą savo",
+"personal settings" => "asmeniniai nustatymai",
"Encryption" => "Šifravimas",
+"Enable recovery key (allow to recover users files in case of password loss):" => "Įjunkite atkūrimo raktą, (leisti atkurti naudotojų failus praradus slaptažodį):",
+"Recovery key password" => "Atkūrimo rakto slaptažodis",
"Enabled" => "Įjungta",
"Disabled" => "Išjungta",
+"Change recovery key password:" => "Pakeisti atkūrimo rakto slaptažodį:",
+"Old Recovery key password" => "Senas atkūrimo rakto slaptažodis",
+"New Recovery key password" => "Naujas atkūrimo rakto slaptažodis",
"Change Password" => "Pakeisti slaptažodį",
-"File recovery settings updated" => "Failų atstatymo nustatymai pakeisti",
+"Your private key password no longer match your log-in password:" => "Privatus rakto slaptažodis daugiau neatitinka Jūsų prisijungimo slaptažodžio:",
+"Set your old private key password to your current log-in password." => "Nustatyti Jūsų privataus rakto slaptažodį į Jūsų dabartinį prisijungimo.",
+" If you don't remember your old password you can ask your administrator to recover your files." => "Jei nepamenate savo seno slaptažodžio, galite paprašyti administratoriaus atkurti Jūsų failus.",
+"Old log-in password" => "Senas prisijungimo slaptažodis",
+"Current log-in password" => "Dabartinis prisijungimo slaptažodis",
+"Update Private Key Password" => "Atnaujinti privataus rakto slaptažodį",
+"Enable password recovery:" => "Įjungti slaptažodžio atkūrimą:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Įjungus šią funkciją jums bus suteiktas pakartotinis priėjimas prie Jūsų šifruotų failų pamiršus slaptažodį.",
+"File recovery settings updated" => "Failų atkūrimo nustatymai pakeisti",
"Could not update file recovery" => "Neišėjo atnaujinti failų atkūrimo"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_encryption/l10n/nn_NO.php b/apps/files_encryption/l10n/nn_NO.php
index b99d0751540..bb30d69c592 100644
--- a/apps/files_encryption/l10n/nn_NO.php
+++ b/apps/files_encryption/l10n/nn_NO.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Lagrar …"
+"Saving..." => "Lagrar …",
+"Encryption" => "Kryptering"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/pa.php b/apps/files_encryption/l10n/pa.php
new file mode 100644
index 00000000000..58670990409
--- /dev/null
+++ b/apps/files_encryption/l10n/pa.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Saving..." => "...ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/te.php b/apps/files_encryption/l10n/te.php
new file mode 100644
index 00000000000..10c7a08a554
--- /dev/null
+++ b/apps/files_encryption/l10n/te.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"personal settings" => "వ్యక్తిగత అమరికలు"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/uk.php b/apps/files_encryption/l10n/uk.php
index 680beddfe68..e4fb053a71a 100644
--- a/apps/files_encryption/l10n/uk.php
+++ b/apps/files_encryption/l10n/uk.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"Saving..." => "Зберігаю...",
-"Encryption" => "Шифрування"
+"Encryption" => "Шифрування",
+"Change Password" => "Змінити Пароль"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php
index 6863b0871c7..7143fcff0f6 100755
--- a/apps/files_encryption/lib/keymanager.php
+++ b/apps/files_encryption/lib/keymanager.php
@@ -223,22 +223,10 @@ class Keymanager {
*/
public static function getFileKey(\OC_FilesystemView $view, $userId, $filePath) {
- // try reusing key file if part file
- if (self::isPartialFilePath($filePath)) {
-
- $result = self::getFileKey($view, $userId, self::fixPartialFilePath($filePath));
-
- if ($result) {
-
- return $result;
-
- }
-
- }
-
$util = new Util($view, \OCP\User::getUser());
list($owner, $filename) = $util->getUidAndFilename($filePath);
+ $filename = self::fixPartialFilePath($filename);
$filePath_f = ltrim($filename, '/');
// in case of system wide mount points the keys are stored directly in the data directory
@@ -427,18 +415,6 @@ class Keymanager {
public static function getShareKey(\OC_FilesystemView $view, $userId, $filePath) {
// try reusing key file if part file
- if (self::isPartialFilePath($filePath)) {
-
- $result = self::getShareKey($view, $userId, self::fixPartialFilePath($filePath));
-
- if ($result) {
-
- return $result;
-
- }
-
- }
-
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
@@ -446,7 +422,7 @@ class Keymanager {
$util = new Util($view, \OCP\User::getUser());
list($owner, $filename) = $util->getUidAndFilename($filePath);
-
+ $filename = self::fixPartialFilePath($filename);
// in case of system wide mount points the keys are stored directly in the data directory
if ($util->isSystemWideMountPoint($filename)) {
$shareKeyPath = '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey';
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
index e6d6841d396..4ec810a5199 100644
--- a/apps/files_encryption/lib/proxy.php
+++ b/apps/files_encryption/lib/proxy.php
@@ -50,7 +50,6 @@ class Proxy extends \OC_FileProxy {
private static function shouldEncrypt($path) {
if (is_null(self::$enableEncryption)) {
-
if (
\OCP\App::isEnabled('files_encryption') === true
&& Crypt::mode() === 'server'
diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php
index 335ea3733eb..083b33c03cb 100644
--- a/apps/files_encryption/lib/stream.php
+++ b/apps/files_encryption/lib/stream.php
@@ -81,7 +81,7 @@ class Stream {
* @return bool
*/
public function stream_open($path, $mode, $options, &$opened_path) {
-
+
// assume that the file already exist before we decide it finally in getKey()
$this->newFile = false;
@@ -106,12 +106,12 @@ class Stream {
if ($this->relPath === false) {
$this->relPath = Helper::getPathToRealFile($this->rawPath);
}
-
+
if($this->relPath === false) {
\OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to user/files or to user/files_versions', \OCP\Util::ERROR);
return false;
}
-
+
// Disable fileproxies so we can get the file size and open the source file without recursive encryption
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
@@ -188,7 +188,7 @@ class Stream {
}
// Get the data from the file handle
- $data = fread($this->handle, 8192);
+ $data = fread($this->handle, $count);
$result = null;
@@ -272,7 +272,7 @@ class Stream {
} else {
$this->newFile = true;
-
+
return false;
}
@@ -296,9 +296,9 @@ class Stream {
return strlen($data);
}
- // Disable the file proxies so that encryption is not
- // automatically attempted when the file is written to disk -
- // we are handling that separately here and we don't want to
+ // Disable the file proxies so that encryption is not
+ // automatically attempted when the file is written to disk -
+ // we are handling that separately here and we don't want to
// get into an infinite loop
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
@@ -311,7 +311,7 @@ class Stream {
$pointer = ftell($this->handle);
// Get / generate the keyfile for the file we're handling
- // If we're writing a new file (not overwriting an existing
+ // If we're writing a new file (not overwriting an existing
// one), save the newly generated keyfile
if (!$this->getKey()) {
@@ -319,7 +319,7 @@ class Stream {
}
- // If extra data is left over from the last round, make sure it
+ // If extra data is left over from the last round, make sure it
// is integrated into the next 6126 / 8192 block
if ($this->writeCache) {
@@ -344,12 +344,12 @@ class Stream {
if ($remainingLength < 6126) {
// Set writeCache to contents of $data
- // The writeCache will be carried over to the
- // next write round, and added to the start of
- // $data to ensure that written blocks are
- // always the correct length. If there is still
- // data in writeCache after the writing round
- // has finished, then the data will be written
+ // The writeCache will be carried over to the
+ // next write round, and added to the start of
+ // $data to ensure that written blocks are
+ // always the correct length. If there is still
+ // data in writeCache after the writing round
+ // has finished, then the data will be written
// to disk by $this->flush().
$this->writeCache = $data;
@@ -363,7 +363,7 @@ class Stream {
$encrypted = $this->preWriteEncrypt($chunk, $this->plainKey);
- // Write the data chunk to disk. This will be
+ // Write the data chunk to disk. This will be
// attended to the last data chunk if the file
// being handled totals more than 6126 bytes
fwrite($this->handle, $encrypted);
@@ -488,6 +488,7 @@ class Stream {
$this->meta['mode'] !== 'rb' &&
$this->size > 0
) {
+
// only write keyfiles if it was a new file
if ($this->newFile === true) {
@@ -535,6 +536,7 @@ class Stream {
// set fileinfo
$this->rootView->putFileInfo($this->rawPath, $fileInfo);
+
}
return fclose($this->handle);
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index b8d68623493..df4d35cab0b 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -201,10 +201,11 @@ class Util {
if (false === $this->recoveryEnabledForUser()) {
// create database configuration
- $sql = 'INSERT INTO `*PREFIX*encryption` (`uid`,`mode`,`recovery_enabled`) VALUES (?,?,?)';
+ $sql = 'INSERT INTO `*PREFIX*encryption` (`uid`,`mode`,`recovery_enabled`,`migration_status`) VALUES (?,?,?,?)';
$args = array(
$this->userId,
'server-side',
+ 0,
0
);
$query = \OCP\DB::prepare($sql);
@@ -329,72 +330,73 @@ class Util {
$this->view->is_dir($directory)
&& $handle = $this->view->opendir($directory)
) {
-
- while (false !== ($file = readdir($handle))) {
-
- if (
- $file !== "."
- && $file !== ".."
- ) {
-
- $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file);
- $relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath);
-
- // If the path is a directory, search
- // its contents
- if ($this->view->is_dir($filePath)) {
-
- $this->findEncFiles($filePath, $found);
-
- // If the path is a file, determine
- // its encryption status
- } elseif ($this->view->is_file($filePath)) {
-
- // Disable proxies again, some-
- // where they got re-enabled :/
- \OC_FileProxy::$enabled = false;
-
- $isEncryptedPath = $this->isEncryptedPath($filePath);
- // If the file is encrypted
- // NOTE: If the userId is
- // empty or not set, file will
- // detected as plain
- // NOTE: This is inefficient;
- // scanning every file like this
- // will eat server resources :(
- if (
- Keymanager::getFileKey($this->view, $this->userId, $relPath)
- && $isEncryptedPath
- ) {
-
- $found['encrypted'][] = array(
- 'name' => $file,
- 'path' => $filePath
- );
-
- // If the file uses old
- // encryption system
- } elseif (Crypt::isLegacyEncryptedContent($isEncryptedPath, $relPath)) {
-
- $found['legacy'][] = array(
- 'name' => $file,
- 'path' => $filePath
- );
-
- // If the file is not encrypted
- } else {
-
- $found['plain'][] = array(
- 'name' => $file,
- 'path' => $relPath
- );
+ if(is_resource($handle)) {
+ while (false !== ($file = readdir($handle))) {
+
+ if (
+ $file !== "."
+ && $file !== ".."
+ ) {
+
+ $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file);
+ $relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath);
+
+ // If the path is a directory, search
+ // its contents
+ if ($this->view->is_dir($filePath)) {
+
+ $this->findEncFiles($filePath, $found);
+
+ // If the path is a file, determine
+ // its encryption status
+ } elseif ($this->view->is_file($filePath)) {
+
+ // Disable proxies again, some-
+ // where they got re-enabled :/
+ \OC_FileProxy::$enabled = false;
+
+ $isEncryptedPath = $this->isEncryptedPath($filePath);
+ // If the file is encrypted
+ // NOTE: If the userId is
+ // empty or not set, file will
+ // detected as plain
+ // NOTE: This is inefficient;
+ // scanning every file like this
+ // will eat server resources :(
+ if (
+ Keymanager::getFileKey($this->view, $this->userId, $relPath)
+ && $isEncryptedPath
+ ) {
+
+ $found['encrypted'][] = array(
+ 'name' => $file,
+ 'path' => $filePath
+ );
+
+ // If the file uses old
+ // encryption system
+ } elseif (Crypt::isLegacyEncryptedContent($isEncryptedPath, $relPath)) {
+
+ $found['legacy'][] = array(
+ 'name' => $file,
+ 'path' => $filePath
+ );
+
+ // If the file is not encrypted
+ } else {
+
+ $found['plain'][] = array(
+ 'name' => $file,
+ 'path' => $relPath
+ );
+
+ }
}
}
}
-
}
\OC_FileProxy::$enabled = true;
@@ -508,10 +510,11 @@ class Util {
// get the size from filesystem
$fullPath = $this->view->getLocalFile($path);
- $size = filesize($fullPath);
+ $size = $this->view->filesize($path);
// calculate last chunk nr
$lastChunkNr = floor($size / 8192);
+ $lastChunkSize = $size - ($lastChunkNr * 8192);
// open stream
$stream = fopen('crypt://' . $path, "r");
@@ -524,7 +527,7 @@ class Util {
fseek($stream, $lastChunckPos);
// get the content of the last chunk
- $lastChunkContent = fread($stream, 8192);
+ $lastChunkContent = fread($stream, $lastChunkSize);
// calc the real file size with the size of the last chunk
$realSize = (($lastChunkNr * 6126) + strlen($lastChunkContent));
@@ -1136,6 +1139,11 @@ class Util {
// Make sure that a share key is generated for the owner too
list($owner, $ownerPath) = $this->getUidAndFilename($filePath);
+ $pathinfo = pathinfo($ownerPath);
+ if(array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') {
+ $ownerPath = $pathinfo['dirname'] . '/' . $pathinfo['filename'];
+ }
+
$userIds = array();
if ($sharingEnabled) {
@@ -1289,8 +1297,25 @@ class Util {
*/
public function getUidAndFilename($path) {
+ $pathinfo = pathinfo($path);
+ $partfile = false;
+ $parentFolder = false;
+ if (array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') {
+ // if the real file exists we check this file
+ $filePath = $this->userFilesDir . '/' .$pathinfo['dirname'] . '/' . $pathinfo['filename'];
+ if ($this->view->file_exists($filePath)) {
+ $pathToCheck = $pathinfo['dirname'] . '/' . $pathinfo['filename'];
+ } else { // otherwise we look for the parent
+ $pathToCheck = $pathinfo['dirname'];
+ $parentFolder = true;
+ }
+ $partfile = true;
+ } else {
+ $pathToCheck = $path;
+ }
+
$view = new \OC\Files\View($this->userFilesDir);
- $fileOwnerUid = $view->getOwner($path);
+ $fileOwnerUid = $view->getOwner($pathToCheck);
// handle public access
if ($this->isPublic) {
@@ -1319,12 +1344,18 @@ class Util {
$filename = $path;
} else {
-
- $info = $view->getFileInfo($path);
+ $info = $view->getFileInfo($pathToCheck);
$ownerView = new \OC\Files\View('/' . $fileOwnerUid . '/files');
// Fetch real file path from DB
- $filename = $ownerView->getPath($info['fileid']); // TODO: Check that this returns a path without including the user data dir
+ $filename = $ownerView->getPath($info['fileid']);
+ if ($parentFolder) {
+ $filename = $filename . '/'. $pathinfo['filename'];
+ }
+
+ if ($partfile) {
+ $filename = $filename . '.' . $pathinfo['extension'];
+ }
}
@@ -1333,10 +1364,9 @@ class Util {
\OC_Filesystem::normalizePath($filename)
);
}
-
-
}
+
/**
* @brief go recursively through a dir and collect all files and sub files.
* @param string $dir relative to the users files folder
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/Prods.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/Prods.inc.php
index e7fa44b34d1..7e0fafdad83 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/Prods.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/Prods.inc.php
@@ -1,4 +1,3 @@
<?php
require_once("autoload.inc.php");
require_once("ProdsConfig.inc.php");
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsConfig.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsConfig.inc.php
index 478c90d631f..1089932a3e2 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsConfig.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsConfig.inc.php
@@ -15,5 +15,3 @@ if (file_exists(__DIR__ . "/prods.ini")) {
else {
$GLOBALS['PRODS_CONFIG'] = array();
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsPath.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsPath.class.php
index be7c6c56788..fdf100b77a4 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsPath.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsPath.class.php
@@ -279,5 +279,3 @@ abstract class ProdsPath
}
}
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsQuery.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsQuery.class.php
index 62469725970..5e8dc92d594 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsQuery.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsQuery.class.php
@@ -103,5 +103,3 @@ class ProdsQuery
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsRule.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsRule.class.php
index 42308d9cc35..d14d87ad1aa 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsRule.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsRule.class.php
@@ -58,5 +58,3 @@ class ProdsRule
return $result;
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsStreamer.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsStreamer.class.php
index 27b927bb033..67ef096c5c5 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/ProdsStreamer.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/ProdsStreamer.class.php
@@ -432,5 +432,3 @@ stream_wrapper_register('rods', 'ProdsStreamer')
or die ('Failed to register protocol:rods');
stream_wrapper_register('rods+ticket', 'ProdsStreamer')
or die ('Failed to register protocol:rods');
-?>
-
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSAccount.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSAccount.class.php
index f47f85bc238..ba4c5ad96b0 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSAccount.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSAccount.class.php
@@ -199,5 +199,3 @@ class RODSAccount
return $dir->toURI();
}
}
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSConn.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSConn.class.php
index 0498f42cfaa..c10f880a5cc 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSConn.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSConn.class.php
@@ -1611,5 +1611,3 @@ class RODSConn
return $results;
}
}
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSConnManager.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSConnManager.class.php
index 830e01bde84..b3e8155da4d 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSConnManager.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSConnManager.class.php
@@ -77,5 +77,3 @@ class RODSConnManager
}
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSException.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSException.class.php
index 52eb95bbfb5..97116a102c1 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSException.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSException.class.php
@@ -180,5 +180,3 @@ class RODSException extends Exception
}
}
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueConds.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueConds.class.php
index 848f29e85e9..4bc10cc549f 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueConds.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueConds.class.php
@@ -110,5 +110,3 @@ class RODSGenQueConds
return $this->cond;
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueResults.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueResults.class.php
index 41be1069afd..899b4f0e3b4 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueResults.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueResults.class.php
@@ -95,5 +95,3 @@ class RODSGenQueResults
return $this->numrow;
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueSelFlds.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueSelFlds.class.php
index 10a32f6614f..aa391613d07 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueSelFlds.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSGenQueSelFlds.class.php
@@ -156,5 +156,3 @@ class RODSGenQueSelFlds
}
}
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSKeyValPair.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSKeyValPair.class.php
index 31b720cf19c..f347f7c988a 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSKeyValPair.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSKeyValPair.class.php
@@ -46,5 +46,3 @@ class RODSKeyValPair
return $new_keyval;
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSMessage.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSMessage.class.php
index ca3e8bc23a6..243903a42df 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSMessage.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSMessage.class.php
@@ -181,5 +181,3 @@ class RODSMessage
return $rods_msg->pack();
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RODSObjIOOpr.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/RODSObjIOOpr.inc.php
index 95807d12ea8..1d367e900bc 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RODSObjIOOpr.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RODSObjIOOpr.inc.php
@@ -17,4 +17,3 @@ define ("RSYNC_OPR", 14);
define ("PHYMV_OPR", 15);
define ("PHYMV_SRC", 16);
define ("PHYMV_DEST", 17);
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RodsAPINum.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/RodsAPINum.inc.php
index c4e2c031174..258dfcab39d 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RodsAPINum.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RodsAPINum.inc.php
@@ -214,4 +214,3 @@ $GLOBALS['PRODS_API_NUMS_REV'] = array(
'1100' => 'SSL_START_AN',
'1101' => 'SSL_END_AN',
);
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RodsConst.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/RodsConst.inc.php
index 1d51f619197..ecc2f5c2593 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RodsConst.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RodsConst.inc.php
@@ -4,5 +4,3 @@
// are doing!
define ("ORDER_BY", 0x400);
define ("ORDER_BY_DESC", 0x800);
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RodsErrorTable.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/RodsErrorTable.inc.php
index 7c4bb170d4a..177ca5b1260 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RodsErrorTable.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RodsErrorTable.inc.php
@@ -584,4 +584,3 @@ $GLOBALS['PRODS_ERR_CODES_REV'] = array(
'-993000' => 'PAM_AUTH_PASSWORD_FAILED',
'-994000' => 'PAM_AUTH_PASSWORD_INVALID_TTL',
);
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryKeyWd.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryKeyWd.inc.php
index ff830c6d6aa..55ad02e3b82 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryKeyWd.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryKeyWd.inc.php
@@ -222,4 +222,3 @@ $GLOBALS['PRODS_GENQUE_KEYWD_REV'] = array(
"lastExeTime" => 'RULE_LAST_EXE_TIME_KW',
"exeStatus" => 'RULE_EXE_STATUS_KW',
);
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryNum.inc.php b/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryNum.inc.php
index 82de94095b2..a65823ec877 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryNum.inc.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/RodsGenQueryNum.inc.php
@@ -232,4 +232,3 @@ $GLOBALS['PRODS_GENQUE_NUMS_REV'] = array(
'1105' => 'COL_TOKEN_VALUE3',
'1106' => 'COL_TOKEN_COMMENT',
);
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RODSPacket.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RODSPacket.class.php
index 89040882d20..e5cff1f60e3 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RODSPacket.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RODSPacket.class.php
@@ -246,5 +246,3 @@ class RODSPacket
}
*/
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_BinBytesBuf.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_BinBytesBuf.class.php
index 8cabcd0ae42..a7598bb7e62 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_BinBytesBuf.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_BinBytesBuf.class.php
@@ -10,5 +10,3 @@ class RP_BinBytesBuf extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollInp.class.php
index b7ad6fd0cad..05c51cf56c0 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollInp.class.php
@@ -15,5 +15,3 @@ class RP_CollInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollOprStat.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollOprStat.class.php
index 939d2e37596..a9140050bc7 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollOprStat.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_CollOprStat.class.php
@@ -13,5 +13,3 @@ class RP_CollOprStat extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjCopyInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjCopyInp.class.php
index c16b3628f5e..481ff34a22a 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjCopyInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjCopyInp.class.php
@@ -15,5 +15,3 @@ class RP_DataObjCopyInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjInp.class.php
index f7a8f939b82..f6200d1761c 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_DataObjInp.class.php
@@ -18,5 +18,3 @@ class RP_DataObjInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecCmdOut.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecCmdOut.class.php
index 55dcb02383d..a7559e3c256 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecCmdOut.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecCmdOut.class.php
@@ -52,5 +52,3 @@ class RP_ExecCmdOut extends RODSPacket
}
}
}
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecMyRuleInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecMyRuleInp.class.php
index 88a62fc2b0c..2eb5dbd6ff9 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecMyRuleInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ExecMyRuleInp.class.php
@@ -18,5 +18,3 @@ class RP_ExecMyRuleInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryInp.class.php
index 2e1e29a2bfe..cf4bf340606 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryInp.class.php
@@ -21,5 +21,3 @@ class RP_GenQueryInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryOut.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryOut.class.php
index e9f31dd5368..afec88c45b1 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryOut.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_GenQueryOut.class.php
@@ -18,5 +18,3 @@ class RP_GenQueryOut extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxIvalPair.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxIvalPair.class.php
index ac56bc93df8..e8af5c9fc5c 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxIvalPair.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxIvalPair.class.php
@@ -23,5 +23,3 @@ class RP_InxIvalPair extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxValPair.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxValPair.class.php
index 787d27fd103..4a08780f4a3 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxValPair.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_InxValPair.class.php
@@ -40,5 +40,3 @@ class RP_InxValPair extends RODSPacket
}
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_KeyValPair.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_KeyValPair.class.php
index 6d8dd12ff12..905d88bc8a2 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_KeyValPair.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_KeyValPair.class.php
@@ -43,5 +43,3 @@ class RP_KeyValPair extends RODSPacket
}
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MiscSvrInfo.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MiscSvrInfo.class.php
index 65ee3580e97..4f54c9c4e76 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MiscSvrInfo.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MiscSvrInfo.class.php
@@ -13,5 +13,3 @@ class RP_MiscSvrInfo extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ModAVUMetadataInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ModAVUMetadataInp.class.php
index b67b7083d44..467541734df 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ModAVUMetadataInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_ModAVUMetadataInp.class.php
@@ -14,5 +14,3 @@ class RP_ModAVUMetadataInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParam.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParam.class.php
index abf9bc471bb..fa5d4fcc3dc 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParam.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParam.class.php
@@ -41,5 +41,3 @@ class RP_MsParam extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParamArray.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParamArray.class.php
index b747c098dd2..b664abe62bc 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParamArray.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsParamArray.class.php
@@ -17,5 +17,3 @@ class RP_MsParamArray extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsgHeader.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsgHeader.class.php
index 0249da9a05d..f1b03f779d1 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsgHeader.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_MsgHeader.class.php
@@ -12,6 +12,3 @@ class RP_MsgHeader extends RODSPacket
}
}
-
-?>
- \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RHostAddr.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RHostAddr.class.php
index 28602f3150f..2ac70dc22cc 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RHostAddr.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RHostAddr.class.php
@@ -11,5 +11,3 @@ class RP_RHostAddr extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RodsObjStat.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RodsObjStat.class.php
index 290a4c9a5b0..96f427a2de5 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RodsObjStat.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_RodsObjStat.class.php
@@ -16,5 +16,3 @@ class RP_RodsObjStat extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_STR.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_STR.class.php
index 3f5a91a35d0..af7739988d4 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_STR.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_STR.class.php
@@ -10,5 +10,3 @@ class RP_STR extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_SqlResult.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_SqlResult.class.php
index 1950f096f13..e6ee1c3adbb 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_SqlResult.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_SqlResult.class.php
@@ -11,5 +11,3 @@ class RP_SqlResult extends RODSPacket
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_StartupPack.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_StartupPack.class.php
index a411bd7425b..700fbd34428 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_StartupPack.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_StartupPack.class.php
@@ -14,5 +14,3 @@ class RP_StartupPack extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_TransStat.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_TransStat.class.php
index bb591f01343..5c962649df0 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_TransStat.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_TransStat.class.php
@@ -12,5 +12,3 @@ class RP_TransStat extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_Version.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_Version.class.php
index a08cb6cc24c..9fa9b7d1c35 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_Version.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_Version.class.php
@@ -12,5 +12,3 @@ class RP_Version extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authRequestOut.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authRequestOut.class.php
index 9dc87140635..a702650c0eb 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authRequestOut.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authRequestOut.class.php
@@ -10,5 +10,3 @@ class RP_authRequestOut extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authResponseInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authResponseInp.class.php
index 23d754df0ac..3f9cbc618f7 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authResponseInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_authResponseInp.class.php
@@ -10,5 +10,3 @@ class RP_authResponseInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjCloseInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjCloseInp.class.php
index d16e1b3f3a4..d37afe23c95 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjCloseInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjCloseInp.class.php
@@ -12,5 +12,3 @@ class RP_dataObjCloseInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjReadInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjReadInp.class.php
index 29bd1b68e35..31b12354714 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjReadInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjReadInp.class.php
@@ -12,5 +12,3 @@ class RP_dataObjReadInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjWriteInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjWriteInp.class.php
index 5327d7a8932..175b7e83402 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjWriteInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_dataObjWriteInp.class.php
@@ -12,5 +12,3 @@ class RP_dataObjWriteInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekInp.class.php
index e28a7b3b498..83b77f4704f 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekInp.class.php
@@ -12,5 +12,3 @@ class RP_fileLseekInp extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekOut.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekOut.class.php
index cf01741bea6..45811e7ca68 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekOut.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_fileLseekOut.class.php
@@ -11,5 +11,3 @@ class RP_fileLseekOut extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_getTempPasswordOut.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_getTempPasswordOut.class.php
index ba073e97939..29c1001df68 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_getTempPasswordOut.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_getTempPasswordOut.class.php
@@ -10,5 +10,3 @@ class RP_getTempPasswordOut extends RODSPacket
}
}
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestInp.class.php
index 0bbc2334a82..e42ac918d45 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestInp.class.php
@@ -10,4 +10,3 @@ class RP_pamAuthRequestInp extends RODSPacket
}
}
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestOut.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestOut.class.php
index 01959954c97..b3ec1306556 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestOut.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_pamAuthRequestOut.class.php
@@ -10,4 +10,3 @@ class RP_pamAuthRequestOut extends RODSPacket
}
}
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslEndInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslEndInp.class.php
index 530f3048604..26470378a7d 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslEndInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslEndInp.class.php
@@ -10,4 +10,3 @@ class RP_sslEndInp extends RODSPacket
}
}
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslStartInp.class.php b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslStartInp.class.php
index 03c8365898e..a23756e7860 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslStartInp.class.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/packet/RP_sslStartInp.class.php
@@ -10,4 +10,3 @@ class RP_sslStartInp extends RODSPacket
}
}
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsAPINum.php b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsAPINum.php
index 382a85c051e..98c1f6cabdf 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsAPINum.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsAPINum.php
@@ -66,5 +66,3 @@ $outputstr = $outputstr . ");\n";
$outputstr = $outputstr . "?>\n";
file_put_contents($prods_api_num_file, $outputstr);
-
-?>
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsErrorCodes.php b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsErrorCodes.php
index d5c43773845..142b4af5702 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsErrorCodes.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsErrorCodes.php
@@ -71,5 +71,3 @@ $outputstr = $outputstr . ");\n";
$outputstr = $outputstr . "?>\n";
file_put_contents($prods_error_table_file, $outputstr);
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryKeyWd.php b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryKeyWd.php
index 4372a849aac..5a5968d25af 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryKeyWd.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryKeyWd.php
@@ -69,5 +69,3 @@ $outputstr = $outputstr . ");\n";
$outputstr = $outputstr . "?>\n";
file_put_contents($prods_genque_keywd_file, $outputstr);
-
-?> \ No newline at end of file
diff --git a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryNum.php b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryNum.php
index 03fa051f092..0be297826e6 100644
--- a/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryNum.php
+++ b/apps/files_external/3rdparty/irodsphp/prods/src/setRodsGenQueryNum.php
@@ -59,5 +59,3 @@ $outputstr = $outputstr . ");\n";
$outputstr = $outputstr . "?>\n";
file_put_contents($prods_genque_num_file, $outputstr);
-
-?> \ No newline at end of file
diff --git a/apps/files_external/l10n/de_CH.php b/apps/files_external/l10n/de_CH.php
new file mode 100644
index 00000000000..85e2f2d91fd
--- /dev/null
+++ b/apps/files_external/l10n/de_CH.php
@@ -0,0 +1,28 @@
+<?php
+$TRANSLATIONS = array(
+"Access granted" => "Zugriff gestattet",
+"Error configuring Dropbox storage" => "Fehler beim Einrichten von Dropbox",
+"Grant access" => "Zugriff gestatten",
+"Please provide a valid Dropbox app key and secret." => "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein.",
+"Error configuring Google Drive storage" => "Fehler beim Einrichten von Google Drive",
+"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Warnung:</b> «smbclient» ist nicht installiert. Das Einhängen von CIFS/SMB-Freigaben ist nicht möglich. Bitten Sie Ihren Systemadministrator, dies zu installieren.",
+"<b>Warning:</b> 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." => "<b>Warnung::</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Bitte wenden Sie sich an Ihren Systemadministrator.",
+"<b>Warning:</b> 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." => "<b>Achtung:</b> Die Curl-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Laden von ownCloud / WebDAV oder GoogleDrive Freigaben ist nicht möglich. Bitte Sie Ihren Systemadministrator, das Modul zu installieren.",
+"External Storage" => "Externer Speicher",
+"Folder name" => "Ordnername",
+"External storage" => "Externer Speicher",
+"Configuration" => "Konfiguration",
+"Options" => "Optionen",
+"Applicable" => "Zutreffend",
+"Add storage" => "Speicher hinzufügen",
+"None set" => "Nicht definiert",
+"All Users" => "Alle Benutzer",
+"Groups" => "Gruppen",
+"Users" => "Benutzer",
+"Delete" => "Löschen",
+"Enable User External Storage" => "Externen Speicher für Benutzer aktivieren",
+"Allow users to mount their own external storage" => "Erlaubt Benutzern, ihre eigenen externen Speicher einzubinden",
+"SSL root certificates" => "SSL-Root-Zertifikate",
+"Import Root Certificate" => "Root-Zertifikate importieren"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/en_GB.php b/apps/files_external/l10n/en_GB.php
new file mode 100644
index 00000000000..8adca794dda
--- /dev/null
+++ b/apps/files_external/l10n/en_GB.php
@@ -0,0 +1,28 @@
+<?php
+$TRANSLATIONS = array(
+"Access granted" => "Access granted",
+"Error configuring Dropbox storage" => "Error configuring Dropbox storage",
+"Grant access" => "Grant access",
+"Please provide a valid Dropbox app key and secret." => "Please provide a valid Dropbox app key and secret.",
+"Error configuring Google Drive storage" => "Error configuring Google Drive storage",
+"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.",
+"<b>Warning:</b> 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." => "<b>Warning:</b> 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.",
+"<b>Warning:</b> 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." => "<b>Warning:</b> 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.",
+"External Storage" => "External Storage",
+"Folder name" => "Folder name",
+"External storage" => "External storage",
+"Configuration" => "Configuration",
+"Options" => "Options",
+"Applicable" => "Applicable",
+"Add storage" => "Add storage",
+"None set" => "None set",
+"All Users" => "All Users",
+"Groups" => "Groups",
+"Users" => "Users",
+"Delete" => "Delete",
+"Enable User External Storage" => "Enable User External Storage",
+"Allow users to mount their own external storage" => "Allow users to mount their own external storage",
+"SSL root certificates" => "SSL root certificates",
+"Import Root Certificate" => "Import Root Certificate"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/pa.php b/apps/files_external/l10n/pa.php
new file mode 100644
index 00000000000..d633784f5ce
--- /dev/null
+++ b/apps/files_external/l10n/pa.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"Groups" => "ਗਰੁੱਪ",
+"Delete" => "ਹਟਾਓ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php
index 2d7bcd4ac37..c08a266b48c 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/amazons3.php
@@ -183,17 +183,20 @@ class AmazonS3 extends \OC\Files\Storage\Common {
}
$dh = $this->opendir($path);
- while (($file = readdir($dh)) !== false) {
- if ($file === '.' || $file === '..') {
- continue;
- }
- if ($this->is_dir($path . '/' . $file)) {
- $this->rmdir($path . '/' . $file);
- } else {
- $this->unlink($path . '/' . $file);
+ if(is_resource($dh)) {
+ while (($file = readdir($dh)) !== false) {
+ if ($file === '.' || $file === '..') {
+ continue;
+ }
+
+ if ($this->is_dir($path . '/' . $file)) {
+ $this->rmdir($path . '/' . $file);
+ } else {
+ $this->unlink($path . '/' . $file);
+ }
}
- }
+ }
try {
$result = $this->connection->deleteObject(array(
@@ -464,15 +467,17 @@ class AmazonS3 extends \OC\Files\Storage\Common {
}
$dh = $this->opendir($path1);
- while (($file = readdir($dh)) !== false) {
- if ($file === '.' || $file === '..') {
- continue;
+ if(is_resource($dh)) {
+ while (($file = readdir($dh)) !== false) {
+ if ($file === '.' || $file === '..') {
+ continue;
+ }
+
+ $source = $path1 . '/' . $file;
+ $target = $path2 . '/' . $file;
+ $this->copy($source, $target);
}
-
- $source = $path1 . '/' . $file;
- $target = $path2 . '/' . $file;
- $this->copy($source, $target);
- }
+ }
}
return true;
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 1935740cd2e..659959e662e 100755
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -378,7 +378,7 @@ class OC_Mount_Config {
}
$result = array();
$handle = opendir($path);
- if ( ! $handle) {
+ if(!is_resource($handle)) {
return array();
}
while (false !== ($file = readdir($handle))) {
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index 215bdcda6c2..b63b5885de1 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -206,14 +206,16 @@ class Google extends \OC\Files\Storage\Common {
public function rmdir($path) {
if (trim($path, '/') === '') {
$dir = $this->opendir($path);
- while (($file = readdir($dh)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
- if (!$this->unlink($path.'/'.$file)) {
- return false;
+ if(is_resource($dir)) {
+ while (($file = readdir($dir)) !== false) {
+ if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
+ if (!$this->unlink($path.'/'.$file)) {
+ return false;
+ }
}
}
+ closedir($dir);
}
- closedir($dir);
$this->driveFiles = array();
return true;
} else {
diff --git a/apps/files_external/lib/irods.php b/apps/files_external/lib/irods.php
index 7ec3b3a0cfc..6d4f66e856e 100644
--- a/apps/files_external/lib/irods.php
+++ b/apps/files_external/lib/irods.php
@@ -27,12 +27,12 @@ class iRODS extends \OC\Files\Storage\StreamWrapper{
private $auth_mode;
public function __construct($params) {
- if (isset($params['host']) && isset($params['user']) && isset($params['password'])) {
+ if (isset($params['host'])) {
$this->host = $params['host'];
- $this->port = $params['port'];
- $this->user = $params['user'];
- $this->password = $params['password'];
- $this->use_logon_credentials = $params['use_logon_credentials'];
+ $this->port = isset($params['port']) ? $params['port'] : 1247;
+ $this->user = isset($params['user']) ? $params['user'] : '';
+ $this->password = isset($params['password']) ? $params['password'] : '';
+ $this->use_logon_credentials = ($params['use_logon_credentials'] === 'true');
$this->zone = $params['zone'];
$this->auth_mode = isset($params['auth_mode']) ? $params['auth_mode'] : '';
@@ -42,10 +42,11 @@ class iRODS extends \OC\Files\Storage\StreamWrapper{
}
// take user and password from the session
- if ($this->use_logon_credentials && isset($_SESSION['irods-credentials']) )
+ if ($this->use_logon_credentials && \OC::$session->exists('irods-credentials'))
{
- $this->user = $_SESSION['irods-credentials']['uid'];
- $this->password = $_SESSION['irods-credentials']['password'];
+ $params = \OC::$session->get('irods-credentials');
+ $this->user = $params['uid'];
+ $this->password = $params['password'];
}
//create the root folder if necessary
@@ -55,11 +56,11 @@ class iRODS extends \OC\Files\Storage\StreamWrapper{
} else {
throw new \Exception();
}
-
+
}
public static function login( $params ) {
- $_SESSION['irods-credentials'] = $params;
+ \OC::$session->set('irods-credentials', $params);
}
public function getId(){
@@ -137,11 +138,13 @@ class iRODS extends \OC\Files\Storage\StreamWrapper{
private function collectionMTime($path) {
$dh = $this->opendir($path);
$lastCTime = $this->filemtime($path);
- while (($file = readdir($dh)) !== false) {
- if ($file != '.' and $file != '..') {
- $time = $this->filemtime($file);
- if ($time > $lastCTime) {
- $lastCTime = $time;
+ if(is_resource($dh)) {
+ while (($file = readdir($dh)) !== false) {
+ if ($file != '.' and $file != '..') {
+ $time = $this->filemtime($file);
+ if ($time > $lastCTime) {
+ $lastCTime = $time;
+ }
}
}
}
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index 8e7a28fba1a..ecd4dae0484 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -99,11 +99,13 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
private function shareMTime() {
$dh=$this->opendir('');
$lastCtime=0;
- while (($file = readdir($dh)) !== false) {
- if ($file!='.' and $file!='..') {
- $ctime=$this->filemtime($file);
- if ($ctime>$lastCtime) {
- $lastCtime=$ctime;
+ if(is_resource($dh)) {
+ while (($file = readdir($dh)) !== false) {
+ if ($file!='.' and $file!='..') {
+ $ctime=$this->filemtime($file);
+ if ($ctime>$lastCtime) {
+ $lastCtime=$ctime;
+ }
}
}
}
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 357c6fdf540..67320b1cdb6 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -7,8 +7,6 @@ function fileDownloadPath(dir, file) {
return url;
}
-var form_data;
-
$(document).ready(function() {
$('#data-upload-form').tipsy({gravity:'ne', fade:true});
@@ -50,19 +48,23 @@ $(document).ready(function() {
});
}
- // 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()
- };
+ var file_upload_start = $('#file_upload_start');
+ file_upload_start.on('fileuploadadd', function(e, data) {
+ // Add custom data to the upload handler
+ data.formData = {
+ requesttoken: $('#publicUploadRequestToken').val(),
+ dirToken: $('#dirToken').val(),
+ subdir: $('input#dir').val()
+ };
+ });
- // Add Uploadprogress Wrapper to controls bar
- $('#controls').append($('#additional_controls div#uploadprogresswrapper'));
+ // Add Uploadprogress Wrapper to controls bar
+ $('#controls').append($('#additional_controls div#uploadprogresswrapper'));
- // Cancel upload trigger
- $('#cancel_upload_button').click(Files.cancelUploads);
+ // Cancel upload trigger
+ $('#cancel_upload_button').click(function() {
+ OC.Upload.cancelUploads();
+ procesSelection();
+ });
});
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 3be89a39fa0..03ed02f41ef 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -4,7 +4,7 @@ $(document).ready(function() {
if (typeof OC.Share !== 'undefined' && typeof FileActions !== 'undefined' && !disableSharing) {
- $('#fileList').one('fileActionsReady',function(){
+ $('#fileList').on('fileActionsReady',function(){
OC.Share.loadIcons('file');
});
diff --git a/apps/files_sharing/l10n/de_CH.php b/apps/files_sharing/l10n/de_CH.php
new file mode 100644
index 00000000000..1bd24f9d9c4
--- /dev/null
+++ b/apps/files_sharing/l10n/de_CH.php
@@ -0,0 +1,19 @@
+<?php
+$TRANSLATIONS = array(
+"The password is wrong. Try again." => "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
+"Password" => "Passwort",
+"Submit" => "Bestätigen",
+"Sorry, this link doesn’t seem to work anymore." => "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
+"Reasons might be:" => "Gründe könnten sein:",
+"the item was removed" => "Das Element wurde entfernt",
+"the link expired" => "Der Link ist abgelaufen",
+"sharing is disabled" => "Teilen ist deaktiviert",
+"For more info, please ask the person who sent this link." => "Für mehr Informationen, fragen Sie bitte die Person, die Ihnen diesen Link geschickt hat.",
+"%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",
+"Upload" => "Hochladen",
+"Cancel upload" => "Upload abbrechen",
+"No preview available for" => "Es ist keine Vorschau verfügbar für"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/en_GB.php b/apps/files_sharing/l10n/en_GB.php
new file mode 100644
index 00000000000..337c108651e
--- /dev/null
+++ b/apps/files_sharing/l10n/en_GB.php
@@ -0,0 +1,19 @@
+<?php
+$TRANSLATIONS = array(
+"The password is wrong. Try again." => "The password is wrong. Try again.",
+"Password" => "Password",
+"Submit" => "Submit",
+"Sorry, this link doesn’t seem to work anymore." => "Sorry, this link doesn’t seem to work anymore.",
+"Reasons might be:" => "Reasons might be:",
+"the item was removed" => "the item was removed",
+"the link expired" => "the link expired",
+"sharing is disabled" => "sharing is disabled",
+"For more info, please ask the person who sent this link." => "For more info, please ask the person who sent this link.",
+"%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",
+"Upload" => "Upload",
+"Cancel upload" => "Cancel upload",
+"No preview available for" => "No preview available for"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/es.php b/apps/files_sharing/l10n/es.php
index 1f238d083fb..e163da766f3 100644
--- a/apps/files_sharing/l10n/es.php
+++ b/apps/files_sharing/l10n/es.php
@@ -3,7 +3,7 @@ $TRANSLATIONS = array(
"The password is wrong. Try again." => "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" => "Contraseña",
"Submit" => "Enviar",
-"Sorry, this link doesn’t seem to work anymore." => "Este enlace parece no funcionar más.",
+"Sorry, this link doesn’t seem to work anymore." => "Vaya, este enlace parece que no volverá a funcionar.",
"Reasons might be:" => "Las causas podrían ser:",
"the item was removed" => "el elemento fue eliminado",
"the link expired" => "el enlace expiró",
diff --git a/apps/files_sharing/l10n/es_AR.php b/apps/files_sharing/l10n/es_AR.php
index fed0b1e7b30..7c9dcb94ac1 100644
--- a/apps/files_sharing/l10n/es_AR.php
+++ b/apps/files_sharing/l10n/es_AR.php
@@ -3,6 +3,12 @@ $TRANSLATIONS = array(
"The password is wrong. Try again." => "La contraseña no es correcta. Probá de nuevo.",
"Password" => "Contraseña",
"Submit" => "Enviar",
+"Sorry, this link doesn’t seem to work anymore." => "Perdón, este enlace parece no funcionar más.",
+"Reasons might be:" => "Las causas podrían ser:",
+"the item was removed" => "el elemento fue borrado",
+"the link expired" => "el enlace expiró",
+"sharing is disabled" => "compartir está desactivado",
+"For more info, please ask the person who sent this link." => "Para mayor información, contactá a la persona que te mandó el enlace.",
"%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",
diff --git a/apps/files_sharing/l10n/hi.php b/apps/files_sharing/l10n/hi.php
index 74a2c320438..63a5d528f3b 100644
--- a/apps/files_sharing/l10n/hi.php
+++ b/apps/files_sharing/l10n/hi.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "पासवर्ड"
+"Password" => "पासवर्ड",
+"Upload" => "अपलोड "
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/lt_LT.php b/apps/files_sharing/l10n/lt_LT.php
index 5d0e58e2fb2..90ae6a39a07 100644
--- a/apps/files_sharing/l10n/lt_LT.php
+++ b/apps/files_sharing/l10n/lt_LT.php
@@ -1,7 +1,14 @@
<?php
$TRANSLATIONS = array(
+"The password is wrong. Try again." => "Netinka slaptažodis: Bandykite dar kartą.",
"Password" => "Slaptažodis",
"Submit" => "Išsaugoti",
+"Sorry, this link doesn’t seem to work anymore." => "Atleiskite, panašu, kad nuoroda yra neveiksni.",
+"Reasons might be:" => "Galimos priežastys:",
+"the item was removed" => "elementas buvo pašalintas",
+"the link expired" => "baigėsi nuorodos galiojimo laikas",
+"sharing is disabled" => "dalinimasis yra išjungtas",
+"For more info, please ask the person who sent this link." => "Dėl tikslesnės informacijos susisiekite su asmeniu atsiuntusiu nuorodą.",
"%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",
diff --git a/apps/files_sharing/l10n/nn_NO.php b/apps/files_sharing/l10n/nn_NO.php
index bcb6538b09f..94272943e40 100644
--- a/apps/files_sharing/l10n/nn_NO.php
+++ b/apps/files_sharing/l10n/nn_NO.php
@@ -1,7 +1,14 @@
<?php
$TRANSLATIONS = array(
+"The password is wrong. Try again." => "Passordet er gale. Prøv igjen.",
"Password" => "Passord",
"Submit" => "Send",
+"Sorry, this link doesn’t seem to work anymore." => "Orsak, denne lenkja fungerer visst ikkje lenger.",
+"Reasons might be:" => "Moglege grunnar:",
+"the item was removed" => "fila/mappa er fjerna",
+"the link expired" => "lenkja har gått ut på dato",
+"sharing is disabled" => "deling er slått av",
+"For more info, please ask the person who sent this link." => "Spør den som sende deg lenkje om du vil ha meir informasjon.",
"%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",
diff --git a/apps/files_sharing/l10n/pa.php b/apps/files_sharing/l10n/pa.php
new file mode 100644
index 00000000000..6c14eda59df
--- /dev/null
+++ b/apps/files_sharing/l10n/pa.php
@@ -0,0 +1,8 @@
+<?php
+$TRANSLATIONS = array(
+"Password" => "ਪਾਸਵਰ",
+"Download" => "ਡਾਊਨਲੋਡ",
+"Upload" => "ਅੱਪਲੋਡ",
+"Cancel upload" => "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/sq.php b/apps/files_sharing/l10n/sq.php
index ae29e5738ff..d2077663e8d 100644
--- a/apps/files_sharing/l10n/sq.php
+++ b/apps/files_sharing/l10n/sq.php
@@ -1,7 +1,14 @@
<?php
$TRANSLATIONS = array(
+"The password is wrong. Try again." => "Kodi është i gabuar. Provojeni përsëri.",
"Password" => "Kodi",
"Submit" => "Parashtro",
+"Sorry, this link doesn’t seem to work anymore." => "Ju kërkojmë ndjesë, kjo lidhje duket sikur nuk punon më.",
+"Reasons might be:" => "Arsyet mund të jenë:",
+"the item was removed" => "elementi është eliminuar",
+"the link expired" => "lidhja ka skaduar",
+"sharing is disabled" => "ndarja është çaktivizuar",
+"For more info, please ask the person who sent this link." => "Për më shumë informacione, ju lutem pyesni personin që iu dërgoi këtë lidhje.",
"%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",
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index d91acbbb2bd..257da89c84e 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -221,7 +221,8 @@ class Shared extends \OC\Files\Storage\Common {
public function filemtime($path) {
if ($path == '' || $path == '/') {
$mtime = 0;
- if ($dh = $this->opendir($path)) {
+ $dh = $this->opendir($path);
+ if(is_resource($dh)) {
while (($filename = readdir($dh)) !== false) {
$tempmtime = $this->filemtime($filename);
if ($tempmtime > $mtime) {
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index ec6b4e815f8..136767aeb45 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -19,6 +19,20 @@ function fileCmp($a, $b) {
}
}
+function determineIcon($file, $sharingRoot, $sharingToken) {
+ // for folders we simply reuse the files logic
+ if($file['type'] == 'dir') {
+ return \OCA\Files\Helper::determineIcon($file);
+ }
+
+ $relativePath = substr($file['path'], 6);
+ $relativePath = substr($relativePath, strlen($sharingRoot));
+ if($file['isPreviewAvailable']) {
+ return OCP\publicPreview_icon($relativePath, $sharingToken);
+ }
+ return OCP\mimetype_icon($file['mimetype']);
+}
+
if (isset($_GET['t'])) {
$token = $_GET['t'];
$linkItem = OCP\Share::getShareByToken($token);
@@ -133,6 +147,7 @@ if (isset($path)) {
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
$tmpl->assign('fileTarget', basename($linkItem['file_target']));
$tmpl->assign('dirToken', $linkItem['token']);
+ $tmpl->assign('disableSharing', true);
$allowPublicUploadEnabled = (bool) ($linkItem['permissions'] & OCP\PERMISSION_CREATE);
if (\OCP\App::isEnabled('files_encryption')) {
$allowPublicUploadEnabled = false;
@@ -155,6 +170,7 @@ if (isset($path)) {
$tmpl->assign('dir', $getPath);
OCP\Util::addStyle('files', 'files');
+ OCP\Util::addStyle('files', 'upload');
OCP\Util::addScript('files', 'files');
OCP\Util::addScript('files', 'filelist');
OCP\Util::addscript('files', 'keyboardshortcuts');
@@ -176,6 +192,7 @@ if (isset($path)) {
}
$i['directory'] = $getPath;
$i['permissions'] = OCP\PERMISSION_READ;
+ $i['icon'] = determineIcon($i, $basePath, $token);
$files[] = $i;
}
usort($files, "fileCmp");
@@ -191,7 +208,6 @@ if (isset($path)) {
}
$list = new OCP\Template('files', 'part.list', '');
$list->assign('files', $files);
- $list->assign('disableSharing', true);
$list->assign('baseURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&path=');
$list->assign('downloadURL',
OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=');
diff --git a/apps/files_trashbin/ajax/list.php b/apps/files_trashbin/ajax/list.php
new file mode 100644
index 00000000000..c9dc13b7840
--- /dev/null
+++ b/apps/files_trashbin/ajax/list.php
@@ -0,0 +1,51 @@
+<?php
+
+// only need filesystem apps
+$RUNTIME_APPTYPES=array('filesystem');
+
+// Init owncloud
+
+
+OCP\JSON::checkLoggedIn();
+
+// Load the files
+$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';
+$doBreadcrumb = isset( $_GET['breadcrumb'] ) ? true : false;
+$data = array();
+
+// Make breadcrumb
+if($doBreadcrumb) {
+ $breadcrumb = \OCA\Files_Trashbin\Helper::makeBreadcrumb($dir);
+
+ $breadcrumbNav = new OCP\Template('files_trashbin', 'part.breadcrumb', '');
+ $breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
+ $breadcrumbNav->assign('baseURL', OCP\Util::linkTo('files_trashbin', 'index.php') . '?dir=');
+ $breadcrumbNav->assign('home', OCP\Util::linkTo('files', 'index.php'));
+
+ $data['breadcrumb'] = $breadcrumbNav->fetchPage();
+}
+
+// make filelist
+$files = \OCA\Files_Trashbin\Helper::getTrashFiles($dir);
+
+if ($files === null){
+ header("HTTP/1.0 404 Not Found");
+ exit();
+}
+
+$dirlisting = false;
+if ($dir && $dir !== '/') {
+ $dirlisting = true;
+}
+
+$encodedDir = \OCP\Util::encodePath($dir);
+$list = new OCP\Template('files_trashbin', 'part.list', '');
+$list->assign('files', $files, false);
+$list->assign('baseURL', OCP\Util::linkTo('files_trashbin', 'index.php'). '?dir='.$encodedDir);
+$list->assign('downloadURL', OCP\Util::linkToRoute('download', array('file' => '/')));
+$list->assign('dirlisting', $dirlisting);
+$list->assign('disableDownloadActions', true);
+$data['files'] = $list->fetchPage();
+
+OCP\JSON::success(array('data' => $data));
+
diff --git a/apps/files_trashbin/appinfo/app.php b/apps/files_trashbin/appinfo/app.php
index 2c101f0a723..d30a601ef56 100644
--- a/apps/files_trashbin/appinfo/app.php
+++ b/apps/files_trashbin/appinfo/app.php
@@ -1,7 +1,7 @@
<?php
-OC::$CLASSPATH['OCA\Files_Trashbin\Hooks'] = 'files_trashbin/lib/hooks.php';
-OC::$CLASSPATH['OCA\Files_Trashbin\Trashbin'] = 'files_trashbin/lib/trash.php';
+//OC::$CLASSPATH['OCA\Files_Trashbin\Hooks'] = 'files_trashbin/lib/hooks.php';
+//OC::$CLASSPATH['OCA\Files_Trashbin\Trashbin'] = 'files_trashbin/lib/trash.php';
// register hooks
\OCA\Files_Trashbin\Trashbin::registerHooks();
diff --git a/apps/files_trashbin/index.php b/apps/files_trashbin/index.php
index 0baeab1de97..d8661e170a5 100644
--- a/apps/files_trashbin/index.php
+++ b/apps/files_trashbin/index.php
@@ -10,91 +10,52 @@ OCP\Util::addScript('files_trashbin', 'disableDefaultActions');
OCP\Util::addScript('files', 'fileactions');
$tmpl = new OCP\Template('files_trashbin', 'index', 'user');
-$user = \OCP\User::getUser();
-$view = new OC_Filesystemview('/'.$user.'/files_trashbin/files');
-
OCP\Util::addStyle('files', 'files');
OCP\Util::addScript('files', 'filelist');
+// filelist overrides
+OCP\Util::addScript('files_trashbin', 'filelist');
+OCP\Util::addscript('files', 'files');
$dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : '';
-$result = array();
-if ($dir) {
- $dirlisting = true;
- $dirContent = $view->opendir($dir);
- $i = 0;
- while(($entryName = readdir($dirContent)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($entryName)) {
- $pos = strpos($dir.'/', '/', 1);
- $tmp = substr($dir, 0, $pos);
- $pos = strrpos($tmp, '.d');
- $timestamp = substr($tmp, $pos+2);
- $result[] = array(
- 'id' => $entryName,
- 'timestamp' => $timestamp,
- 'mime' => $view->getMimeType($dir.'/'.$entryName),
- 'type' => $view->is_dir($dir.'/'.$entryName) ? 'dir' : 'file',
- 'location' => $dir,
- );
- }
- }
- closedir($dirContent);
-
-} else {
- $dirlisting = false;
- $query = \OC_DB::prepare('SELECT `id`,`location`,`timestamp`,`type`,`mime` FROM `*PREFIX*files_trash` WHERE `user` = ?');
- $result = $query->execute(array($user))->fetchAll();
+$isIE8 = false;
+preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
+if (count($matches) > 0 && $matches[1] <= 8){
+ $isIE8 = true;
}
-$files = array();
-foreach ($result as $r) {
- $i = array();
- $i['name'] = $r['id'];
- $i['date'] = OCP\Util::formatDate($r['timestamp']);
- $i['timestamp'] = $r['timestamp'];
- $i['mimetype'] = $r['mime'];
- $i['type'] = $r['type'];
- if ($i['type'] === 'file') {
- $fileinfo = pathinfo($r['id']);
- $i['basename'] = $fileinfo['filename'];
- $i['extension'] = isset($fileinfo['extension']) ? ('.'.$fileinfo['extension']) : '';
+// if IE8 and "?dir=path" was specified, reformat the URL to use a hash like "#?dir=path"
+if ($isIE8 && isset($_GET['dir'])){
+ if ($dir === ''){
+ $dir = '/';
}
- $i['directory'] = $r['location'];
- if ($i['directory'] === '/') {
- $i['directory'] = '';
- }
- $i['permissions'] = OCP\PERMISSION_READ;
- $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($r['mime']);
- $files[] = $i;
+ header('Location: ' . OCP\Util::linkTo('files_trashbin', 'index.php') . '#?dir=' . \OCP\Util::encodePath($dir));
+ exit();
}
-function fileCmp($a, $b) {
- if ($a['type'] === 'dir' and $b['type'] !== 'dir') {
- return -1;
- } elseif ($a['type'] !== 'dir' and $b['type'] === 'dir') {
- return 1;
- } else {
- return strnatcasecmp($a['name'], $b['name']);
- }
+$ajaxLoad = false;
+
+if (!$isIE8){
+ $files = \OCA\Files_Trashbin\Helper::getTrashFiles($dir);
+}
+else{
+ $files = array();
+ $ajaxLoad = true;
}
-usort($files, "fileCmp");
-
-// Make breadcrumb
-$pathtohere = '';
-$breadcrumb = array();
-foreach (explode('/', $dir) as $i) {
- if ($i !== '') {
- if ( preg_match('/^(.+)\.d[0-9]+$/', $i, $match) ) {
- $name = $match[1];
- } else {
- $name = $i;
- }
- $pathtohere .= '/' . $i;
- $breadcrumb[] = array('dir' => $pathtohere, 'name' => $name);
- }
+// Redirect if directory does not exist
+if ($files === null){
+ header('Location: ' . OCP\Util::linkTo('files_trashbin', 'index.php'));
+ exit();
}
+$dirlisting = false;
+if ($dir && $dir !== '/') {
+ $dirlisting = true;
+}
+
+$breadcrumb = \OCA\Files_Trashbin\Helper::makeBreadcrumb($dir);
+
$breadcrumbNav = new OCP\Template('files_trashbin', 'part.breadcrumb', '');
$breadcrumbNav->assign('breadcrumb', $breadcrumb);
$breadcrumbNav->assign('baseURL', OCP\Util::linkTo('files_trashbin', 'index.php') . '?dir=');
@@ -106,7 +67,6 @@ $list->assign('files', $files);
$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);
$list->assign('disableDownloadActions', true);
@@ -114,6 +74,8 @@ $tmpl->assign('dirlisting', $dirlisting);
$tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage());
$tmpl->assign('fileList', $list->fetchPage());
$tmpl->assign('files', $files);
-$tmpl->assign('dir', \OC\Files\Filesystem::normalizePath($view->getAbsolutePath()));
+$tmpl->assign('dir', $dir);
+$tmpl->assign('disableSharing', true);
+$tmpl->assign('ajaxLoad', true);
$tmpl->printPage();
diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js
new file mode 100644
index 00000000000..cd5a67ddfe0
--- /dev/null
+++ b/apps/files_trashbin/js/filelist.js
@@ -0,0 +1,24 @@
+// override reload with own ajax call
+FileList.reload = function(){
+ FileList.showMask();
+ if (FileList._reloadCall){
+ FileList._reloadCall.abort();
+ }
+ $.ajax({
+ url: OC.filePath('files_trashbin','ajax','list.php'),
+ data: {
+ dir : $('#dir').val(),
+ breadcrumb: true
+ },
+ error: function(result) {
+ FileList.reloadCallback(result);
+ },
+ success: function(result) {
+ FileList.reloadCallback(result);
+ }
+ });
+}
+
+FileList.linkTo = function(dir){
+ return OC.linkTo('files_trashbin', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
+}
diff --git a/apps/files_trashbin/js/trash.js b/apps/files_trashbin/js/trash.js
index 40c0bdb3829..d73eadb6011 100644
--- a/apps/files_trashbin/js/trash.js
+++ b/apps/files_trashbin/js/trash.js
@@ -171,9 +171,15 @@ $(document).ready(function() {
action(filename);
}
}
+
+ // event handlers for breadcrumb items
+ $('#controls').delegate('.crumb:not(.home) a', 'click', onClickBreadcrumb);
});
- FileActions.actions.dir = {};
+ FileActions.actions.dir = {
+ // only keep 'Open' action for navigation
+ 'Open': FileActions.actions.dir.Open
+ };
});
function processSelection(){
@@ -246,3 +252,9 @@ function disableActions() {
$(".action").css("display", "none");
$(":input:checkbox").css("display", "none");
}
+function onClickBreadcrumb(e){
+ var $el = $(e.target).closest('.crumb');
+ e.preventDefault();
+ FileList.changeDirectory(decodeURIComponent($el.data('dir')));
+}
+
diff --git a/apps/files_trashbin/l10n/ach.php b/apps/files_trashbin/l10n/ach.php
new file mode 100644
index 00000000000..5569f410cc9
--- /dev/null
+++ b/apps/files_trashbin/l10n/ach.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files_trashbin/l10n/af_ZA.php b/apps/files_trashbin/l10n/af_ZA.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/af_ZA.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/be.php b/apps/files_trashbin/l10n/be.php
new file mode 100644
index 00000000000..50df7ff5a97
--- /dev/null
+++ b/apps/files_trashbin/l10n/be.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("","","",""),
+"_%n file_::_%n files_" => array("","","","")
+);
+$PLURAL_FORMS = "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_trashbin/l10n/bs.php b/apps/files_trashbin/l10n/bs.php
new file mode 100644
index 00000000000..af7033bd183
--- /dev/null
+++ b/apps/files_trashbin/l10n/bs.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"Name" => "Ime",
+"_%n folder_::_%n folders_" => array("","",""),
+"_%n file_::_%n files_" => array("","","")
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_trashbin/l10n/de_AT.php b/apps/files_trashbin/l10n/de_AT.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/de_AT.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/de_CH.php b/apps/files_trashbin/l10n/de_CH.php
new file mode 100644
index 00000000000..92290a0de50
--- /dev/null
+++ b/apps/files_trashbin/l10n/de_CH.php
@@ -0,0 +1,19 @@
+<?php
+$TRANSLATIONS = array(
+"Couldn't delete %s permanently" => "Konnte %s nicht dauerhaft löschen",
+"Couldn't restore %s" => "Konnte %s nicht wiederherstellen",
+"perform restore operation" => "Wiederherstellung ausführen",
+"Error" => "Fehler",
+"delete file permanently" => "Datei dauerhaft löschen",
+"Delete permanently" => "Endgültig löschen",
+"Name" => "Name",
+"Deleted" => "Gelöscht",
+"_%n folder_::_%n folders_" => array("%n Ordner","%n Ordner"),
+"_%n file_::_%n files_" => array("%n Datei","%n Dateien"),
+"restored" => "Wiederhergestellt",
+"Nothing in here. Your trash bin is empty!" => "Nichts zu löschen, Ihr Papierkorb ist leer!",
+"Restore" => "Wiederherstellen",
+"Delete" => "Löschen",
+"Deleted Files" => "Gelöschte Dateien"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/en@pirate.php b/apps/files_trashbin/l10n/en@pirate.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/en@pirate.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/en_GB.php b/apps/files_trashbin/l10n/en_GB.php
new file mode 100644
index 00000000000..be9d8b9f520
--- /dev/null
+++ b/apps/files_trashbin/l10n/en_GB.php
@@ -0,0 +1,19 @@
+<?php
+$TRANSLATIONS = array(
+"Couldn't delete %s permanently" => "Couldn't delete %s permanently",
+"Couldn't restore %s" => "Couldn't restore %s",
+"perform restore operation" => "perform restore operation",
+"Error" => "Error",
+"delete file permanently" => "delete file permanently",
+"Delete permanently" => "Delete permanently",
+"Name" => "Name",
+"Deleted" => "Deleted",
+"_%n folder_::_%n folders_" => array("%n folder","%n folders"),
+"_%n file_::_%n files_" => array("%n file","%n files"),
+"restored" => "restored",
+"Nothing in here. Your trash bin is empty!" => "Nothing in here. Your recycle bin is empty!",
+"Restore" => "Restore",
+"Delete" => "Delete",
+"Deleted Files" => "Deleted Files"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/es.php b/apps/files_trashbin/l10n/es.php
index 956d89ae688..a5639c2c714 100644
--- a/apps/files_trashbin/l10n/es.php
+++ b/apps/files_trashbin/l10n/es.php
@@ -8,8 +8,8 @@ $TRANSLATIONS = array(
"Delete permanently" => "Eliminar permanentemente",
"Name" => "Nombre",
"Deleted" => "Eliminado",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetas"),
+"_%n file_::_%n files_" => array("%n archivo","%n archivos"),
"restored" => "recuperado",
"Nothing in here. Your trash bin is empty!" => "No hay nada aquí. ¡Tu papelera esta vacía!",
"Restore" => "Recuperar",
diff --git a/apps/files_trashbin/l10n/es_AR.php b/apps/files_trashbin/l10n/es_AR.php
index 6f47255b506..0cb969a3483 100644
--- a/apps/files_trashbin/l10n/es_AR.php
+++ b/apps/files_trashbin/l10n/es_AR.php
@@ -8,8 +8,9 @@ $TRANSLATIONS = array(
"Delete permanently" => "Borrar de manera permanente",
"Name" => "Nombre",
"Deleted" => "Borrado",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("%n directorio","%n directorios"),
+"_%n file_::_%n files_" => array("%n archivo","%n archivos"),
+"restored" => "recuperado",
"Nothing in here. Your trash bin is empty!" => "No hay nada acá. ¡La papelera está vacía!",
"Restore" => "Recuperar",
"Delete" => "Borrar",
diff --git a/apps/files_trashbin/l10n/es_MX.php b/apps/files_trashbin/l10n/es_MX.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/es_MX.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/hi.php b/apps/files_trashbin/l10n/hi.php
new file mode 100644
index 00000000000..71711218b14
--- /dev/null
+++ b/apps/files_trashbin/l10n/hi.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"Error" => "त्रुटि",
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/ka.php b/apps/files_trashbin/l10n/ka.php
new file mode 100644
index 00000000000..70f10d7c0bf
--- /dev/null
+++ b/apps/files_trashbin/l10n/ka.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/km.php b/apps/files_trashbin/l10n/km.php
new file mode 100644
index 00000000000..70f10d7c0bf
--- /dev/null
+++ b/apps/files_trashbin/l10n/km.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/kn.php b/apps/files_trashbin/l10n/kn.php
new file mode 100644
index 00000000000..70f10d7c0bf
--- /dev/null
+++ b/apps/files_trashbin/l10n/kn.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/lt_LT.php b/apps/files_trashbin/l10n/lt_LT.php
index c4a12ff2175..0a51290f4d9 100644
--- a/apps/files_trashbin/l10n/lt_LT.php
+++ b/apps/files_trashbin/l10n/lt_LT.php
@@ -8,8 +8,9 @@ $TRANSLATIONS = array(
"Delete permanently" => "Ištrinti negrįžtamai",
"Name" => "Pavadinimas",
"Deleted" => "Ištrinti",
-"_%n folder_::_%n folders_" => array("","",""),
-"_%n file_::_%n files_" => array("","",""),
+"_%n folder_::_%n folders_" => array("","","%n aplankų"),
+"_%n file_::_%n files_" => array("","","%n failų"),
+"restored" => "atstatyta",
"Nothing in here. Your trash bin is empty!" => "Nieko nėra. Jūsų šiukšliadėžė tuščia!",
"Restore" => "Atstatyti",
"Delete" => "Ištrinti",
diff --git a/apps/files_trashbin/l10n/ml_IN.php b/apps/files_trashbin/l10n/ml_IN.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/ml_IN.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/my_MM.php b/apps/files_trashbin/l10n/my_MM.php
new file mode 100644
index 00000000000..70f10d7c0bf
--- /dev/null
+++ b/apps/files_trashbin/l10n/my_MM.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/ne.php b/apps/files_trashbin/l10n/ne.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/ne.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/nn_NO.php b/apps/files_trashbin/l10n/nn_NO.php
index 9e351668e33..73fe48211c2 100644
--- a/apps/files_trashbin/l10n/nn_NO.php
+++ b/apps/files_trashbin/l10n/nn_NO.php
@@ -8,8 +8,9 @@ $TRANSLATIONS = array(
"Delete permanently" => "Slett for godt",
"Name" => "Namn",
"Deleted" => "Sletta",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"),
+"_%n file_::_%n files_" => array("%n fil","%n filer"),
+"restored" => "gjenoppretta",
"Nothing in here. Your trash bin is empty!" => "Ingenting her. Papirkorga di er tom!",
"Restore" => "Gjenopprett",
"Delete" => "Slett",
diff --git a/apps/files_trashbin/l10n/nqo.php b/apps/files_trashbin/l10n/nqo.php
new file mode 100644
index 00000000000..70f10d7c0bf
--- /dev/null
+++ b/apps/files_trashbin/l10n/nqo.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/pa.php b/apps/files_trashbin/l10n/pa.php
new file mode 100644
index 00000000000..e53707fd707
--- /dev/null
+++ b/apps/files_trashbin/l10n/pa.php
@@ -0,0 +1,8 @@
+<?php
+$TRANSLATIONS = array(
+"Error" => "ਗਲਤੀ",
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"Delete" => "ਹਟਾਓ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/pl.php b/apps/files_trashbin/l10n/pl.php
index e8295e2ff03..c838a6b956c 100644
--- a/apps/files_trashbin/l10n/pl.php
+++ b/apps/files_trashbin/l10n/pl.php
@@ -8,8 +8,8 @@ $TRANSLATIONS = array(
"Delete permanently" => "Trwale usuń",
"Name" => "Nazwa",
"Deleted" => "Usunięte",
-"_%n folder_::_%n folders_" => array("","",""),
-"_%n file_::_%n files_" => array("","",""),
+"_%n folder_::_%n folders_" => array("","","%n katalogów"),
+"_%n file_::_%n files_" => array("","","%n plików"),
"restored" => "przywrócony",
"Nothing in here. Your trash bin is empty!" => "Nic tu nie ma. Twój kosz jest pusty!",
"Restore" => "Przywróć",
diff --git a/apps/files_trashbin/l10n/pt_BR.php b/apps/files_trashbin/l10n/pt_BR.php
index 1e3c67ba027..e0e8c8faec6 100644
--- a/apps/files_trashbin/l10n/pt_BR.php
+++ b/apps/files_trashbin/l10n/pt_BR.php
@@ -8,8 +8,8 @@ $TRANSLATIONS = array(
"Delete permanently" => "Excluir permanentemente",
"Name" => "Nome",
"Deleted" => "Excluído",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("","%n pastas"),
+"_%n file_::_%n files_" => array("%n arquivo","%n arquivos"),
"restored" => "restaurado",
"Nothing in here. Your trash bin is empty!" => "Nada aqui. Sua lixeira está vazia!",
"Restore" => "Restaurar",
diff --git a/apps/files_trashbin/l10n/ro.php b/apps/files_trashbin/l10n/ro.php
index 0b1d2cd9e17..12377bb0652 100644
--- a/apps/files_trashbin/l10n/ro.php
+++ b/apps/files_trashbin/l10n/ro.php
@@ -3,8 +3,8 @@ $TRANSLATIONS = array(
"Error" => "Eroare",
"Delete permanently" => "Stergere permanenta",
"Name" => "Nume",
-"_%n folder_::_%n folders_" => array("","",""),
-"_%n file_::_%n files_" => array("","",""),
+"_%n folder_::_%n folders_" => array("","","%n directoare"),
+"_%n file_::_%n files_" => array("","","%n fișiere"),
"Delete" => "Șterge"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/files_trashbin/l10n/sk.php b/apps/files_trashbin/l10n/sk.php
new file mode 100644
index 00000000000..94aaf9b3a94
--- /dev/null
+++ b/apps/files_trashbin/l10n/sk.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("","",""),
+"_%n file_::_%n files_" => array("","","")
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files_trashbin/l10n/sq.php b/apps/files_trashbin/l10n/sq.php
index 1b7b5b828c8..50ca7d901b5 100644
--- a/apps/files_trashbin/l10n/sq.php
+++ b/apps/files_trashbin/l10n/sq.php
@@ -8,8 +8,9 @@ $TRANSLATIONS = array(
"Delete permanently" => "Elimino përfundimisht",
"Name" => "Emri",
"Deleted" => "Eliminuar",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("%n dosje","%n dosje"),
+"_%n file_::_%n files_" => array("%n skedar","%n skedarë"),
+"restored" => "rivendosur",
"Nothing in here. Your trash bin is empty!" => "Këtu nuk ka asgjë. Koshi juaj është bosh!",
"Restore" => "Rivendos",
"Delete" => "Elimino",
diff --git a/apps/files_trashbin/l10n/sr@latin.php b/apps/files_trashbin/l10n/sr@latin.php
index 483d1e3ca2b..fa30afcf4bf 100644
--- a/apps/files_trashbin/l10n/sr@latin.php
+++ b/apps/files_trashbin/l10n/sr@latin.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Error" => "Greška",
"Name" => "Ime",
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
diff --git a/apps/files_trashbin/l10n/sw_KE.php b/apps/files_trashbin/l10n/sw_KE.php
new file mode 100644
index 00000000000..0acad00e8b5
--- /dev/null
+++ b/apps/files_trashbin/l10n/sw_KE.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php
new file mode 100644
index 00000000000..99f534565f9
--- /dev/null
+++ b/apps/files_trashbin/lib/helper.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace OCA\Files_Trashbin;
+
+class Helper
+{
+ /**
+ * Retrieves the contents of a trash bin directory.
+ * @param string $dir path to the directory inside the trashbin
+ * or empty to retrieve the root of the trashbin
+ * @return array of files
+ */
+ public static function getTrashFiles($dir){
+ $result = array();
+ $user = \OCP\User::getUser();
+
+ if ($dir && $dir !== '/') {
+ $view = new \OC_Filesystemview('/'.$user.'/files_trashbin/files');
+ $dirContent = $view->opendir($dir);
+ if ($dirContent === false){
+ return null;
+ }
+ if(is_resource($dirContent)){
+ while(($entryName = readdir($dirContent)) !== false) {
+ if (!\OC\Files\Filesystem::isIgnoredDir($entryName)) {
+ $pos = strpos($dir.'/', '/', 1);
+ $tmp = substr($dir, 0, $pos);
+ $pos = strrpos($tmp, '.d');
+ $timestamp = substr($tmp, $pos+2);
+ $result[] = array(
+ 'id' => $entryName,
+ 'timestamp' => $timestamp,
+ 'mime' => $view->getMimeType($dir.'/'.$entryName),
+ 'type' => $view->is_dir($dir.'/'.$entryName) ? 'dir' : 'file',
+ 'location' => $dir,
+ );
+ }
+ }
+ closedir($dirContent);
+ }
+ } else {
+ $query = \OC_DB::prepare('SELECT `id`,`location`,`timestamp`,`type`,`mime` FROM `*PREFIX*files_trash` WHERE `user` = ?');
+ $result = $query->execute(array($user))->fetchAll();
+ }
+
+ $files = array();
+ foreach ($result as $r) {
+ $i = array();
+ $i['name'] = $r['id'];
+ $i['date'] = \OCP\Util::formatDate($r['timestamp']);
+ $i['timestamp'] = $r['timestamp'];
+ $i['mimetype'] = $r['mime'];
+ $i['type'] = $r['type'];
+ if ($i['type'] === 'file') {
+ $fileinfo = pathinfo($r['id']);
+ $i['basename'] = $fileinfo['filename'];
+ $i['extension'] = isset($fileinfo['extension']) ? ('.'.$fileinfo['extension']) : '';
+ }
+ $i['directory'] = $r['location'];
+ if ($i['directory'] === '/') {
+ $i['directory'] = '';
+ }
+ $i['permissions'] = \OCP\PERMISSION_READ;
+ $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($r['mime']);
+ $i['icon'] = \OCA\Files\Helper::determineIcon($i);
+ $files[] = $i;
+ }
+
+ usort($files, array('\OCA\Files\Helper', 'fileCmp'));
+
+ return $files;
+ }
+
+ /**
+ * Splits the given path into a breadcrumb structure.
+ * @param string $dir path to process
+ * @return array where each entry is a hash of the absolute
+ * directory path and its name
+ */
+ public static function makeBreadcrumb($dir){
+ // Make breadcrumb
+ $pathtohere = '';
+ $breadcrumb = array();
+ foreach (explode('/', $dir) as $i) {
+ if ($i !== '') {
+ if ( preg_match('/^(.+)\.d[0-9]+$/', $i, $match) ) {
+ $name = $match[1];
+ } else {
+ $name = $i;
+ }
+ $pathtohere .= '/' . $i;
+ $breadcrumb[] = array('dir' => $pathtohere, 'name' => $name);
+ }
+ }
+ return $breadcrumb;
+ }
+}
diff --git a/apps/files_trashbin/lib/trash.php b/apps/files_trashbin/lib/trashbin.php
index c79afdc0c2e..c79afdc0c2e 100644
--- a/apps/files_trashbin/lib/trash.php
+++ b/apps/files_trashbin/lib/trashbin.php
diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php
index 88c32b1f3eb..82ba0608834 100644
--- a/apps/files_trashbin/templates/index.php
+++ b/apps/files_trashbin/templates/index.php
@@ -5,10 +5,14 @@
</div>
<div id='notification'></div>
-<?php if (isset($_['files']) && count($_['files']) === 0 && $_['dirlisting'] === false):?>
+<?php if (isset($_['files']) && count($_['files']) === 0 && $_['dirlisting'] === false && !$_['ajaxLoad']):?>
<div id="emptycontent"><?php p($l->t('Nothing in here. Your trash bin is empty!'))?></div>
<?php endif; ?>
+<input type="hidden" name="ajaxLoad" id="ajaxLoad" value="<?php p($_['ajaxLoad']); ?>" />
+<input type="hidden" id="disableSharing" data-status="<?php p($_['disableSharing']); ?>"></input>
+<input type="hidden" name="dir" value="<?php p($_['dir']) ?>" id="dir">
+
<table id="filestable">
<thead>
<tr>
diff --git a/apps/files_trashbin/templates/part.breadcrumb.php b/apps/files_trashbin/templates/part.breadcrumb.php
index 8ecab58e5c8..4acc298adbe 100644
--- a/apps/files_trashbin/templates/part.breadcrumb.php
+++ b/apps/files_trashbin/templates/part.breadcrumb.php
@@ -1,11 +1,11 @@
-<div class="crumb">
+<div class="crumb home">
<a href="<?php print_unescaped($_['home']); ?>">
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
</a>
</div>
<?php if(count($_["breadcrumb"])):?>
<div class="crumb svg"
- data-dir='<?php print_unescaped($_['baseURL']); ?>'>
+ data-dir='/'>
<a href="<?php p($_['baseURL']); ?>"><?php p($l->t("Deleted Files")); ?></a>
</div>
<?php endif;?>
diff --git a/apps/files_trashbin/templates/part.list.php b/apps/files_trashbin/templates/part.list.php
index f7cc6b01bbb..78709d986ae 100644
--- a/apps/files_trashbin/templates/part.list.php
+++ b/apps/files_trashbin/templates/part.list.php
@@ -1,4 +1,3 @@
-<input type="hidden" id="disableSharing" data-status="<?php p($_['disableSharing']); ?>">
<?php foreach($_['files'] as $file):
$relative_deleted_date = OCP\relative_modified_date($file['timestamp']);
// the older the file, the brighter the shade of grey; days*14
@@ -12,7 +11,7 @@
data-permissions='<?php p($file['permissions']); ?>'
<?php if ( $_['dirlisting'] ): ?>
id="<?php p($file['directory'].'/'.$file['name']);?>"
- data-file="<?php p($file['directory'].'/'.$file['name']);?>"
+ data-file="<?php p($name);?>"
data-timestamp=''
data-dirlisting=1
<?php else: ?>
diff --git a/apps/files_versions/l10n/cy_GB.php b/apps/files_versions/l10n/cy_GB.php
new file mode 100644
index 00000000000..fa35dfd5218
--- /dev/null
+++ b/apps/files_versions/l10n/cy_GB.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Restore" => "Adfer"
+);
+$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/files_versions/l10n/de_CH.php b/apps/files_versions/l10n/de_CH.php
new file mode 100644
index 00000000000..c8b45eee500
--- /dev/null
+++ b/apps/files_versions/l10n/de_CH.php
@@ -0,0 +1,10 @@
+<?php
+$TRANSLATIONS = array(
+"Could not revert: %s" => "Konnte %s nicht zurücksetzen",
+"Versions" => "Versionen",
+"Failed to revert {file} to revision {timestamp}." => "Konnte {file} der Revision {timestamp} nicht rückgänging machen.",
+"More versions..." => "Mehrere Versionen...",
+"No other versions available" => "Keine anderen Versionen verfügbar",
+"Restore" => "Wiederherstellen"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/l10n/en_GB.php b/apps/files_versions/l10n/en_GB.php
new file mode 100644
index 00000000000..af22b8fb0b2
--- /dev/null
+++ b/apps/files_versions/l10n/en_GB.php
@@ -0,0 +1,10 @@
+<?php
+$TRANSLATIONS = array(
+"Could not revert: %s" => "Could not revert: %s",
+"Versions" => "Versions",
+"Failed to revert {file} to revision {timestamp}." => "Failed to revert {file} to revision {timestamp}.",
+"More versions..." => "More versions...",
+"No other versions available" => "No other versions available",
+"Restore" => "Restore"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/l10n/es.php b/apps/files_versions/l10n/es.php
index a6031698e06..b7acc376978 100644
--- a/apps/files_versions/l10n/es.php
+++ b/apps/files_versions/l10n/es.php
@@ -3,7 +3,7 @@ $TRANSLATIONS = array(
"Could not revert: %s" => "No se puede revertir: %s",
"Versions" => "Revisiones",
"Failed to revert {file} to revision {timestamp}." => "No se ha podido revertir {archivo} a revisión {timestamp}.",
-"More versions..." => "Más...",
+"More versions..." => "Más versiones...",
"No other versions available" => "No hay otras versiones disponibles",
"Restore" => "Recuperar"
);
diff --git a/apps/files_versions/l10n/es_AR.php b/apps/files_versions/l10n/es_AR.php
index 068f835d0af..3008220122f 100644
--- a/apps/files_versions/l10n/es_AR.php
+++ b/apps/files_versions/l10n/es_AR.php
@@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "No se pudo revertir: %s ",
"Versions" => "Versiones",
+"Failed to revert {file} to revision {timestamp}." => "Falló al revertir {file} a la revisión {timestamp}.",
+"More versions..." => "Más versiones...",
+"No other versions available" => "No hay más versiones disponibles",
"Restore" => "Recuperar"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/l10n/lt_LT.php b/apps/files_versions/l10n/lt_LT.php
index 4e1af5fcc29..3afcfbe3b5f 100644
--- a/apps/files_versions/l10n/lt_LT.php
+++ b/apps/files_versions/l10n/lt_LT.php
@@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "Nepavyko atstatyti: %s",
"Versions" => "Versijos",
+"Failed to revert {file} to revision {timestamp}." => "Nepavyko atstatyti {file} į būseną {timestamp}.",
+"More versions..." => "Daugiau versijų...",
+"No other versions available" => "Nėra daugiau versijų",
"Restore" => "Atstatyti"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_versions/l10n/nn_NO.php b/apps/files_versions/l10n/nn_NO.php
index 79b518bc18d..608d72aaaed 100644
--- a/apps/files_versions/l10n/nn_NO.php
+++ b/apps/files_versions/l10n/nn_NO.php
@@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "Klarte ikkje å tilbakestilla: %s",
"Versions" => "Utgåver",
+"Failed to revert {file} to revision {timestamp}." => "Klarte ikkje å tilbakestilla {file} til utgåva {timestamp}.",
+"More versions..." => "Fleire utgåver …",
+"No other versions available" => "Ingen andre utgåver tilgjengeleg",
"Restore" => "Gjenopprett"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/l10n/sq.php b/apps/files_versions/l10n/sq.php
new file mode 100644
index 00000000000..5a7a23a217f
--- /dev/null
+++ b/apps/files_versions/l10n/sq.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Restore" => "Rivendos"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/de_CH.php b/apps/user_ldap/l10n/de_CH.php
new file mode 100644
index 00000000000..df9175e73b1
--- /dev/null
+++ b/apps/user_ldap/l10n/de_CH.php
@@ -0,0 +1,87 @@
+<?php
+$TRANSLATIONS = array(
+"Failed to clear the mappings." => "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.",
+"The configuration is invalid. Please look in the ownCloud log for further details." => "Die Konfiguration ist ungültig, sehen Sie für weitere Details bitte im ownCloud Log nach",
+"Deletion failed" => "Löschen fehlgeschlagen",
+"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",
+"Connection test failed" => "Verbindungstest fehlgeschlagen",
+"Do you really want to delete the current Server Configuration?" => "Möchten Sie die aktuelle Serverkonfiguration wirklich löschen?",
+"Confirm Deletion" => "Löschung bestätigen",
+"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Warnung:</b> Die Anwendungen user_ldap und user_webdavauth sind inkompatibel. Es kann demzufolge zu unerwarteten Verhalten kommen. Bitten Sie Ihren Systemadministator eine der beiden Anwendungen zu deaktivieren.",
+"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitten Sie Ihren Systemadministrator das Modul zu installieren.",
+"Server configuration" => "Serverkonfiguration",
+"Add Server Configuration" => "Serverkonfiguration hinzufügen",
+"Host" => "Host",
+"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Sie können das Protokoll auslassen, ausser wenn Sie SSL benötigen. Beginnen Sie dann mit ldaps://",
+"Base DN" => "Basis-DN",
+"One Base DN per line" => "Ein Basis-DN pro Zeile",
+"You can specify Base DN for users and groups in the Advanced tab" => "Sie können Basis-DN für Benutzer und Gruppen in dem «Erweitert»-Reiter konfigurieren",
+"User DN" => "Benutzer-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." => "Der DN des Benutzers für LDAP-Bind, z.B.: uid=agent,dc=example,dc=com. Für einen anonymen Zugriff lassen Sie DN und Passwort leer.",
+"Password" => "Passwort",
+"For anonymous access, leave DN and Password empty." => "Lassen Sie die Felder DN und Passwort für einen anonymen Zugang leer.",
+"User Login Filter" => "Benutzer-Login-Filter",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. %%uid ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"",
+"User List Filter" => "Benutzer-Filter-Liste",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Definiert den Filter für die Wiederherstellung eines Benutzers (kein Platzhalter). Beispiel: \"objectClass=person\"",
+"Group Filter" => "Gruppen-Filter",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Definiert den Filter für die Wiederherstellung einer Gruppe (kein Platzhalter). Beispiel: \"objectClass=posixGroup\"",
+"Connection Settings" => "Verbindungseinstellungen",
+"Configuration Active" => "Konfiguration aktiv",
+"When unchecked, this configuration will be skipped." => "Wenn nicht angehakt, wird diese Konfiguration übersprungen.",
+"Port" => "Port",
+"Backup (Replica) Host" => "Backup Host (Kopie)",
+"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Geben Sie einen optionalen Backup Host an. Es muss sich um eine Kopie des Haupt LDAP/AD Servers handeln.",
+"Backup (Replica) Port" => "Backup Port",
+"Disable Main Server" => "Hauptserver deaktivieren",
+"Only connect to the replica server." => "Nur zum Replikat-Server verbinden.",
+"Use TLS" => "Nutze TLS",
+"Do not use it additionally for LDAPS connections, it will fail." => "Benutzen Sie es nicht in Verbindung mit LDAPS Verbindungen, es wird fehlschlagen.",
+"Case insensitve LDAP server (Windows)" => "LDAP-Server (Windows: Gross- und Kleinschreibung bleibt unbeachtet)",
+"Turn off SSL certificate validation." => "Schalten Sie die SSL-Zertifikatsprüfung aus.",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, importieren Sie das SSL-Zertifikat des LDAP-Servers in Ihren %s Server.",
+"Cache Time-To-Live" => "Speichere Time-To-Live zwischen",
+"in seconds. A change empties the cache." => "in Sekunden. Eine Änderung leert den Cache.",
+"Directory Settings" => "Ordnereinstellungen",
+"User Display Name Field" => "Feld für den Anzeigenamen des Benutzers",
+"The LDAP attribute to use to generate the user's display name." => "Das LDAP-Attribut zur Generierung des Anzeigenamens des Benutzers.",
+"Base User Tree" => "Basis-Benutzerbaum",
+"One User Base DN per line" => "Ein Benutzer Basis-DN pro Zeile",
+"User Search Attributes" => "Benutzersucheigenschaften",
+"Optional; one attribute per line" => "Optional; ein Attribut pro Zeile",
+"Group Display Name Field" => "Feld für den Anzeigenamen der Gruppe",
+"The LDAP attribute to use to generate the groups's display name." => "Das LDAP-Attribut zur Generierung des Anzeigenamens der Gruppen.",
+"Base Group Tree" => "Basis-Gruppenbaum",
+"One Group Base DN per line" => "Ein Gruppen Basis-DN pro Zeile",
+"Group Search Attributes" => "Gruppensucheigenschaften",
+"Group-Member association" => "Assoziation zwischen Gruppe und Benutzer",
+"Special Attributes" => "Spezielle Eigenschaften",
+"Quota Field" => "Kontingent-Feld",
+"Quota Default" => "Standard-Kontingent",
+"in bytes" => "in Bytes",
+"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. 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. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "Standardmässig 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 Zeichen werden mittels ihrer korrespondierenden Zeichen ersetzt oder einfach ausgelassen. Bei Kollisionen 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ässig vorausgewählte Namen des Heimatverzeichnisses. Es ist auch ein Teil der 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 nur auf neu gemappte (hinzugefügte) LDAP-Benutzer auswirken.",
+"Internal Username Attribute:" => "Interne Eigenschaften des Benutzers:",
+"Override UUID detection" => "UUID-Erkennung überschreiben",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Standardmässig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Ausserdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Sie müssen allerdings sicherstellen, dass Ihre gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Lassen Sie es frei, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer und -Gruppen aus.",
+"UUID Attribute:" => "UUID-Attribut:",
+"Username-LDAP User Mapping" => "LDAP-Benutzernamenzuordnung",
+"Usernames are used 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 username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Die Benutzernamen werden genutzt, 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 (mappen) von Benutzernamen zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit dem LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen durch gefunden. Der interne Benutzername, wird in überall verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste zurück. 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"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/en_GB.php b/apps/user_ldap/l10n/en_GB.php
new file mode 100644
index 00000000000..d613be34868
--- /dev/null
+++ b/apps/user_ldap/l10n/en_GB.php
@@ -0,0 +1,87 @@
+<?php
+$TRANSLATIONS = array(
+"Failed to clear the mappings." => "Failed to clear the mappings.",
+"Failed to delete the server configuration" => "Failed to delete the server configuration",
+"The configuration is valid and the connection could be established!" => "The configuration is valid and the connection could be established!",
+"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "The configuration is valid, but the Bind failed. Please check the server settings and credentials.",
+"The configuration is invalid. Please look in the ownCloud log for further details." => "The configuration is invalid. Please look in the ownCloud log for further details.",
+"Deletion failed" => "Deletion failed",
+"Take over settings from recent server configuration?" => "Take over settings from recent server configuration?",
+"Keep settings?" => "Keep settings?",
+"Cannot add server configuration" => "Cannot add server configuration",
+"mappings cleared" => "mappings cleared",
+"Success" => "Success",
+"Error" => "Error",
+"Connection test succeeded" => "Connection test succeeded",
+"Connection test failed" => "Connection test failed",
+"Do you really want to delete the current Server Configuration?" => "Do you really want to delete the current Server Configuration?",
+"Confirm Deletion" => "Confirm Deletion",
+"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them.",
+"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.",
+"Server configuration" => "Server configuration",
+"Add Server Configuration" => "Add Server Configuration",
+"Host" => "Host",
+"You can omit the protocol, except you require SSL. Then start with ldaps://" => "You can omit the protocol, except you require SSL. Then start with ldaps://",
+"Base DN" => "Base DN",
+"One Base DN per line" => "One Base DN per line",
+"You can specify Base DN for users and groups in the Advanced tab" => "You can specify Base DN for users and groups in the Advanced tab",
+"User DN" => "User 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." => "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.",
+"Password" => "Password",
+"For anonymous access, leave DN and Password empty." => "For anonymous access, leave DN and Password empty.",
+"User Login Filter" => "User Login Filter",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"",
+"User List Filter" => "User List Filter",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"",
+"Group Filter" => "Group Filter",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"",
+"Connection Settings" => "Connection Settings",
+"Configuration Active" => "Configuration Active",
+"When unchecked, this configuration will be skipped." => "When unchecked, this configuration will be skipped.",
+"Port" => "Port",
+"Backup (Replica) Host" => "Backup (Replica) Host",
+"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Give an optional backup host. It must be a replica of the main LDAP/AD server.",
+"Backup (Replica) Port" => "Backup (Replica) Port",
+"Disable Main Server" => "Disable Main Server",
+"Only connect to the replica server." => "Only connect to the replica server.",
+"Use TLS" => "Use TLS",
+"Do not use it additionally for LDAPS connections, it will fail." => "Do not use it additionally for LDAPS connections, it will fail.",
+"Case insensitve LDAP server (Windows)" => "Case insensitve LDAP server (Windows)",
+"Turn off SSL certificate validation." => "Turn off SSL certificate validation.",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server.",
+"Cache Time-To-Live" => "Cache Time-To-Live",
+"in seconds. A change empties the cache." => "in seconds. A change empties the cache.",
+"Directory Settings" => "Directory Settings",
+"User Display Name Field" => "User Display Name Field",
+"The LDAP attribute to use to generate the user's display name." => "The LDAP attribute to use to generate the user's display name.",
+"Base User Tree" => "Base User Tree",
+"One User Base DN per line" => "One User Base DN per line",
+"User Search Attributes" => "User Search Attributes",
+"Optional; one attribute per line" => "Optional; one attribute per line",
+"Group Display Name Field" => "Group Display Name Field",
+"The LDAP attribute to use to generate the groups's display name." => "The LDAP attribute to use to generate the group's display name.",
+"Base Group Tree" => "Base Group Tree",
+"One Group Base DN per line" => "One Group Base DN per line",
+"Group Search Attributes" => "Group Search Attributes",
+"Group-Member association" => "Group-Member association",
+"Special Attributes" => "Special Attributes",
+"Quota Field" => "Quota Field",
+"Quota Default" => "Quota Default",
+"in bytes" => "in bytes",
+"Email Field" => "Email Field",
+"User Home Folder Naming Rule" => "User Home Folder Naming Rule",
+"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute.",
+"Internal Username" => "Internal Username",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar 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.",
+"Internal Username Attribute:" => "Internal Username Attribute:",
+"Override UUID detection" => "Override UUID detection",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "By default, the UUID attribute is automatically detected. The UUID attribute is used to unambiguously 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.",
+"UUID Attribute:" => "UUID Attribute:",
+"Username-LDAP User Mapping" => "Username-LDAP User Mapping",
+"Usernames are used 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 username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Usernames are used to store and assign (meta) data. In order to precisely identify and recognise users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.",
+"Clear Username-LDAP User Mapping" => "Clear Username-LDAP User Mapping",
+"Clear Groupname-LDAP Group Mapping" => "Clear Groupname-LDAP Group Mapping",
+"Test Configuration" => "Test Configuration",
+"Help" => "Help"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/es.php b/apps/user_ldap/l10n/es.php
index e5994273635..4f37d5177a7 100644
--- a/apps/user_ldap/l10n/es.php
+++ b/apps/user_ldap/l10n/es.php
@@ -16,6 +16,7 @@ $TRANSLATIONS = array(
"Connection test failed" => "La prueba de conexión falló",
"Do you really want to delete the current Server Configuration?" => "¿Realmente desea eliminar la configuración actual del servidor?",
"Confirm Deletion" => "Confirmar eliminación",
+"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Advertencia:</b> Las apps user_ldap y user_webdavauth son incompatibles. Puede que experimente un comportamiento inesperado. Pregunte al su administrador de sistemas para desactivar uno de ellos.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Advertencia:</b> El módulo LDAP de PHP no está instalado, el sistema no funcionará. Por favor consulte al administrador del sistema para instalarlo.",
"Server configuration" => "Configuración del Servidor",
"Add Server Configuration" => "Agregar configuracion del servidor",
@@ -29,8 +30,11 @@ $TRANSLATIONS = array(
"Password" => "Contraseña",
"For anonymous access, leave DN and Password empty." => "Para acceso anónimo, deje DN y contraseña vacíos.",
"User Login Filter" => "Filtro de inicio de sesión de usuario",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Define el filtro a aplicar cuando se intenta identificar. %%uid remplazará al nombre de usuario en el proceso de identificación. Por ejemplo: \"uid=%%uid\"",
"User List Filter" => "Lista de filtros de usuario",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Define el filtro a aplicar, cuando se obtienen usuarios (sin comodines). Por ejemplo: \"objectClass=person\"",
"Group Filter" => "Filtro de grupo",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Define el filtro a aplicar, cuando se obtienen grupos (sin comodines). Por ejemplo: \"objectClass=posixGroup\"",
"Connection Settings" => "Configuración de conexión",
"Configuration Active" => "Configuracion activa",
"When unchecked, this configuration will be skipped." => "Cuando deseleccione, esta configuracion sera omitida.",
@@ -39,19 +43,23 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Dar un servidor de copia de seguridad opcional. Debe ser una réplica del servidor principal LDAP / AD.",
"Backup (Replica) Port" => "Puerto para copias de seguridad (Replica)",
"Disable Main Server" => "Deshabilitar servidor principal",
+"Only connect to the replica server." => "Conectar sólo con el servidor de réplica.",
"Use TLS" => "Usar TLS",
"Do not use it additionally for LDAPS connections, it will fail." => "No lo use para conexiones LDAPS, Fallará.",
"Case insensitve LDAP server (Windows)" => "Servidor de LDAP no sensible a mayúsculas/minúsculas (Windows)",
"Turn off SSL certificate validation." => "Apagar la validación por certificado SSL.",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "No se recomienda, ¡utilízalo únicamente para pruebas! Si la conexión únicamente funciona con esta opción, importa el certificado SSL del servidor LDAP en tu servidor %s.",
"Cache Time-To-Live" => "Cache TTL",
"in seconds. A change empties the cache." => "en segundos. Un cambio vacía la caché.",
"Directory Settings" => "Configuracion de directorio",
"User Display Name Field" => "Campo de nombre de usuario a mostrar",
+"The LDAP attribute to use to generate the user's display name." => "El campo LDAP a usar para generar el nombre para mostrar del usuario.",
"Base User Tree" => "Árbol base de usuario",
"One User Base DN per line" => "Un DN Base de Usuario por línea",
"User Search Attributes" => "Atributos de la busqueda de usuario",
"Optional; one attribute per line" => "Opcional; un atributo por linea",
"Group Display Name Field" => "Campo de nombre de grupo a mostrar",
+"The LDAP attribute to use to generate the groups's display name." => "El campo LDAP a usar para generar el nombre para mostrar del grupo.",
"Base Group Tree" => "Árbol base de grupo",
"One Group Base DN per line" => "Un DN Base de Grupo por línea",
"Group Search Attributes" => "Atributos de busqueda de grupo",
@@ -64,10 +72,13 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "Regla para la carpeta Home 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, especifique un atributo LDAP/AD.",
"Internal Username" => "Nombre de usuario interno",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "El nombre de usuario interno será creado de forma predeterminada desde el atributo UUID. Esto asegura que el nombre de usuario es único y los caracteres no necesitan ser convertidos. En el nombre de usuario interno sólo se pueden usar estos caracteres: [ a-zA-Z0-9_.@- ]. El resto de caracteres son sustituidos por su correspondiente en ASCII o simplemente omitidos. En caso de duplicidades, se añadirá o incrementará un número. El nombre de usuario interno es usado para identificar un usuario. Es también el nombre predeterminado para la carpeta personal del usuario en ownCloud. También es parte de URLs remotas, por ejemplo, para todos los servicios *DAV. Con esta configuración el comportamiento predeterminado puede ser cambiado. Para conseguir un comportamiento similar a como era antes de ownCloud 5, introduzca el campo del nombre para mostrar del usuario en la siguiente caja. Déjelo vacío para el comportamiento predeterminado. Los cambios solo tendrán efecto en los usuarios LDAP mapeados (añadidos) recientemente.",
"Internal Username Attribute:" => "Atributo Nombre de usuario Interno:",
"Override UUID detection" => "Sobrescribir la detección UUID",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Por defecto, el atributo UUID es autodetectado. Este atributo es usado para identificar indudablemente usuarios y grupos LDAP. Además, el nombre de usuario interno será creado en base al UUID, si no ha sido especificado otro comportamiento arriba. Puedes sobrescribir la configuración y pasar un atributo de tu elección. Debes asegurarte de que el atributo de tu elección sea accesible por los usuarios y grupos y ser único. Déjalo en blanco para usar el comportamiento por defecto. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.",
"UUID Attribute:" => "Atributo UUID:",
"Username-LDAP User Mapping" => "Asignación del Nombre de usuario de un usuario LDAP",
+"Usernames are used 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 username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Los usuarios son usados para almacenar y asignar (meta) datos. Con el fin de identificar de forma precisa y reconocer usuarios, cada usuario de LDAP tendrá un nombre de usuario interno. Esto requiere un mapeo entre el nombre de usuario y el usuario del LDAP. El nombre de usuario creado es mapeado respecto al UUID del usuario en el LDAP. De forma adicional, el DN es cacheado para reducir la interacción entre el LDAP, pero no es usado para identificar. Si el DN cambia, los cambios serán aplicados. El nombre de usuario interno es usado por encima de todo. Limpiar los mapeos dejará restos por todas partes, no es sensible a configuración, ¡afecta a todas las configuraciones del LDAP! Nunca limpies los mapeos en un entorno de producción, únicamente en una fase de desarrollo 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" => "Configuración de prueba",
diff --git a/apps/user_ldap/l10n/es_AR.php b/apps/user_ldap/l10n/es_AR.php
index ecfcae32f46..2436df8de77 100644
--- a/apps/user_ldap/l10n/es_AR.php
+++ b/apps/user_ldap/l10n/es_AR.php
@@ -16,6 +16,7 @@ $TRANSLATIONS = array(
"Connection test failed" => "Falló es test de conexión",
"Do you really want to delete the current Server Configuration?" => "¿Realmente desea borrar la configuración actual del servidor?",
"Confirm Deletion" => "Confirmar borrado",
+"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Advertencia:</b> Las apps user_ldap y user_webdavauth son incompatibles. Puede ser que experimentes comportamientos inesperados. Pedile al administrador que desactive uno de ellos.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Atención:</b> El módulo PHP LDAP no está instalado, este elemento no va a funcionar. Por favor, pedile al administrador que lo instale.",
"Server configuration" => "Configuración del Servidor",
"Add Server Configuration" => "Añadir Configuración del Servidor",
@@ -29,8 +30,11 @@ $TRANSLATIONS = array(
"Password" => "Contraseña",
"For anonymous access, leave DN and Password empty." => "Para acceso anónimo, dejá DN y contraseña vacíos.",
"User Login Filter" => "Filtro de inicio de sesión de usuario",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Define el filtro a aplicar cuando se intenta ingresar. %%uid remplaza el nombre de usuario en el proceso de identificación. Por ejemplo: \"uid=%%uid\"",
"User List Filter" => "Lista de filtros de usuario",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Define el filtro a aplicar al obtener usuarios (sin comodines). Por ejemplo: \"objectClass=person\"",
"Group Filter" => "Filtro de grupo",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Define el filtro a aplicar al obtener grupos (sin comodines). Por ejemplo: \"objectClass=posixGroup\"",
"Connection Settings" => "Configuración de Conección",
"Configuration Active" => "Configuración activa",
"When unchecked, this configuration will be skipped." => "Si no está seleccionada, esta configuración será omitida.",
@@ -39,19 +43,23 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Dar un servidor de copia de seguridad opcional. Debe ser una réplica del servidor principal LDAP/AD.",
"Backup (Replica) Port" => "Puerto para copia de seguridad (réplica)",
"Disable Main Server" => "Deshabilitar el Servidor Principal",
+"Only connect to the replica server." => "Conectarse únicamente al servidor de réplica.",
"Use TLS" => "Usar TLS",
"Do not use it additionally for LDAPS connections, it will fail." => "No usar adicionalmente para conexiones LDAPS, las mismas fallarán",
"Case insensitve LDAP server (Windows)" => "Servidor de LDAP sensible a mayúsculas/minúsculas (Windows)",
"Turn off SSL certificate validation." => "Desactivar la validación por certificado SSL.",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "No es recomendado, ¡Usalo solamente para pruebas! Si la conexión únicamente funciona con esta opción, importá el certificado SSL del servidor LDAP en tu servidor %s.",
"Cache Time-To-Live" => "Tiempo de vida del caché",
"in seconds. A change empties the cache." => "en segundos. Cambiarlo vacía la cache.",
"Directory Settings" => "Configuración de Directorio",
"User Display Name Field" => "Campo de nombre de usuario a mostrar",
+"The LDAP attribute to use to generate the user's display name." => "El atributo LDAP a usar para generar el nombre de usuario mostrado.",
"Base User Tree" => "Árbol base de usuario",
"One User Base DN per line" => "Una DN base de usuario por línea",
"User Search Attributes" => "Atributos de la búsqueda de usuario",
"Optional; one attribute per line" => "Opcional; un atributo por linea",
"Group Display Name Field" => "Campo de nombre de grupo a mostrar",
+"The LDAP attribute to use to generate the groups's display name." => "El atributo LDAP a usar para generar el nombre de grupo mostrado.",
"Base Group Tree" => "Árbol base de grupo",
"One Group Base DN per line" => "Una DN base de grupo por línea",
"Group Search Attributes" => "Atributos de búsqueda de grupo",
@@ -64,10 +72,13 @@ $TRANSLATIONS = array(
"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. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "Por defecto, el nombre de usuario interno es creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no es necesaria una conversión de caracteres. El nombre de usuario interno sólo se pueden usar estos caracteres: [ a-zA-Z0-9_.@- ]. El resto de caracteres son sustituidos por su correspondiente en ASCII o simplemente omitidos. En caso colisiones, se agregará o incrementará un número. El nombre de usuario interno es usado para identificar un usuario. Es también el nombre predeterminado para el directorio personal del usuario en ownCloud. También es parte de las URLs remotas, por ejemplo, para los servicios *DAV. Con esta opción, se puede cambiar el comportamiento por defecto. Para conseguir un comportamiento similar a versiones anteriores a ownCloud 5, ingresá el atributo del nombre mostrado en el campo siguiente. Dejalo vacío para el comportamiento por defecto. Los cambios solo tendrán efecto en los nuevos usuarios LDAP mapeados (agregados).",
"Internal Username Attribute:" => "Atributo Nombre Interno de usuario:",
"Override UUID detection" => "Sobrescribir la detección UUID",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Por defecto, el atributo UUID es detectado automáticamente. Este atributo es usado para identificar de manera certera usuarios y grupos LDAP. Además, el nombre de usuario interno será creado en base al UUID, si no fue especificado otro comportamiento más arriba. Podés sobrescribir la configuración y pasar un atributo de tu elección. Tenés que asegurarte que el atributo de tu elección sea accesible por los usuarios y grupos y que sea ú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 mapeados (agregados).",
"UUID Attribute:" => "Atributo UUID:",
"Username-LDAP User Mapping" => "Asignación del Nombre de usuario de un usuario LDAP",
+"Usernames are used 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 username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Los usuarios son usados para almacenar y asignar datos (metadatos). Con el fin de identificar de forma precisa y reconocer usuarios, a cada usuario de LDAP se será asignado un nombre de usuario interno. Esto requiere un mapeo entre el nombre de usuario y el usuario del LDAP. El nombre de usuario creado es mapeado respecto al UUID del usuario en el LDAP. De forma adicional, el DN es dejado en caché para reducir la interacción entre el LDAP, pero no es usado para la identificación. Si el DN cambia, los cambios van a ser aplicados. El nombre de usuario interno es usado en todos los lugares. Vaciar los mapeos, deja restos por todas partes. Vaciar los mapeos, no es sensible a configuración, ¡afecta a todas las configuraciones del LDAP! Nunca limpies los mapeos en un entorno de producción, solamente en fase de desarrollo 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",
diff --git a/apps/user_ldap/l10n/fr.php b/apps/user_ldap/l10n/fr.php
index 0c7d3ad078f..8b6027b81e6 100644
--- a/apps/user_ldap/l10n/fr.php
+++ b/apps/user_ldap/l10n/fr.php
@@ -16,6 +16,7 @@ $TRANSLATIONS = array(
"Connection test failed" => "Test de connexion échoué",
"Do you really want to delete the current Server Configuration?" => "Êtes-vous vraiment sûr de vouloir effacer la configuration actuelle du serveur ?",
"Confirm Deletion" => "Confirmer la suppression",
+"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Avertissement :</b> Les applications user_ldap et user_webdavauth sont incompatibles. Des dysfonctionnements peuvent survenir. Contactez votre administrateur système pour qu'il désactive l'une d'elles.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Attention :</b> Le module php LDAP n'est pas installé, par conséquent cette extension ne pourra fonctionner. Veuillez contacter votre administrateur système afin qu'il l'installe.",
"Server configuration" => "Configuration du serveur",
"Add Server Configuration" => "Ajouter une configuration du serveur",
@@ -29,8 +30,11 @@ $TRANSLATIONS = array(
"Password" => "Mot de passe",
"For anonymous access, leave DN and Password empty." => "Pour un accès anonyme, laisser le DN utilisateur et le mot de passe vides.",
"User Login Filter" => "Modèle d'authentification utilisateurs",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Définit le filtre à appliquer lors d'une tentative de connexion. %%uid remplace le nom d'utilisateur lors de la connexion. Exemple : \"uid=%%uid\"",
"User List Filter" => "Filtre d'utilisateurs",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Définit le filtre à appliquer lors de la récupération des utilisateurs. Exemple : \"objectClass=person\"",
"Group Filter" => "Filtre de groupes",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Définit le filtre à appliquer lors de la récupération des groupes. Exemple : \"objectClass=posixGroup\"",
"Connection Settings" => "Paramètres de connexion",
"Configuration Active" => "Configuration active",
"When unchecked, this configuration will be skipped." => "Lorsque non cochée, la configuration sera ignorée.",
@@ -39,19 +43,23 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Fournir un serveur de backup optionnel. Il doit s'agir d'une réplique du serveur LDAP/AD principal.",
"Backup (Replica) Port" => "Port du serveur de backup (réplique)",
"Disable Main Server" => "Désactiver le serveur principal",
+"Only connect to the replica server." => "Se connecter uniquement au serveur de replica.",
"Use TLS" => "Utiliser TLS",
"Do not use it additionally for LDAPS connections, it will fail." => "À ne pas utiliser pour les connexions LDAPS (cela échouera).",
"Case insensitve LDAP server (Windows)" => "Serveur LDAP insensible à la casse (Windows)",
"Turn off SSL certificate validation." => "Désactiver la validation du certificat SSL.",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.",
"Cache Time-To-Live" => "Durée de vie du cache",
"in seconds. A change empties the cache." => "en secondes. Tout changement vide le cache.",
"Directory Settings" => "Paramètres du répertoire",
"User Display Name Field" => "Champ \"nom d'affichage\" de l'utilisateur",
+"The LDAP attribute to use to generate the user's display name." => "L'attribut LDAP utilisé pour générer le nom d'utilisateur affiché.",
"Base User Tree" => "DN racine de l'arbre utilisateurs",
"One User Base DN per line" => "Un DN racine utilisateur par ligne",
"User Search Attributes" => "Recherche des attributs utilisateur",
"Optional; one attribute per line" => "Optionnel, un attribut par ligne",
"Group Display Name Field" => "Champ \"nom d'affichage\" du groupe",
+"The LDAP attribute to use to generate the groups's display name." => "L'attribut LDAP utilisé pour générer le nom de groupe affiché.",
"Base Group Tree" => "DN racine de l'arbre groupes",
"One Group Base DN per line" => "Un DN racine groupe par ligne",
"Group Search Attributes" => "Recherche des attributs du groupe",
@@ -64,10 +72,13 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "Convention de nommage du répertoire utilisateur",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Laisser vide ",
"Internal Username" => "Nom d'utilisateur interne",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Ceci permet d'assurer que le nom d'utilisateur est unique et que les caractères ne nécessitent pas de conversion. Le nom d'utilisateur interne doit contenir uniquement les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leur correspondance ASCII ou simplement omis. En cas de collision, un nombre est incrémenté/décrémenté. Le nom d'utilisateur interne est utilisé pour identifier l'utilisateur au sein du système. C'est aussi le nom par défaut du répertoire utilisateur dans ownCloud. C'est aussi le port d'URLs distants, par exemple pour tous les services *DAV. Le comportement par défaut peut être modifié à l'aide de ce paramètre. Pour obtenir un comportement similaire aux versions précédentes à ownCloud 5, saisir le nom d'utilisateur à afficher dans le champ suivant. Laissez à blanc pour le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux (ajoutés) utilisateurs LDAP.",
"Internal Username Attribute:" => "Nom d'utilisateur interne:",
"Override UUID detection" => "Surcharger la détection d'UUID",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.",
"UUID Attribute:" => "Attribut UUID :",
"Username-LDAP User Mapping" => "Association Nom d'utilisateur-Utilisateur LDAP",
+"Usernames are used 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 username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Les noms d'utilisateurs sont utilisés pour le stockage et l'assignation de (meta) données. Pour identifier et reconnaitre précisément les utilisateurs, chaque utilisateur LDAP aura un nom interne spécifique. Cela requiert l'association d'un nom d'utilisateur ownCloud à un nom d'utilisateur LDAP. Le nom d'utilisateur créé est associé à l'attribut UUID de l'utilisateur LDAP. Par ailleurs, le DN est mémorisé en cache pour limiter les interactions LDAP mais il n'est pas utilisé pour l'identification. Si le DN est modifié, ces modifications seront retrouvées. Seul le nom interne à ownCloud est utilisé au sein du produit. Supprimer les associations créera des orphelins et l'action affectera toutes les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mais uniquement sur des environnements de tests et d'expérimentation.",
"Clear Username-LDAP User Mapping" => "Supprimer l'association utilisateur interne-utilisateur LDAP",
"Clear Groupname-LDAP Group Mapping" => "Supprimer l'association nom de groupe-groupe LDAP",
"Test Configuration" => "Tester la configuration",
diff --git a/apps/user_ldap/l10n/lt_LT.php b/apps/user_ldap/l10n/lt_LT.php
index 7e8b389af7f..f0522016825 100644
--- a/apps/user_ldap/l10n/lt_LT.php
+++ b/apps/user_ldap/l10n/lt_LT.php
@@ -1,12 +1,57 @@
<?php
$TRANSLATIONS = array(
+"Failed to clear the mappings." => "Nepavyko išvalyti sąsajų.",
+"Failed to delete the server configuration" => "Nepavyko pašalinti serverio konfigūracijos",
"Deletion failed" => "Ištrinti nepavyko",
+"Keep settings?" => "Išlaikyti nustatymus?",
+"mappings cleared" => "susiejimai išvalyti",
+"Success" => "Sėkmingai",
"Error" => "Klaida",
+"Connection test succeeded" => "Ryšio patikrinimas pavyko",
+"Connection test failed" => "Ryšio patikrinimas nepavyko",
+"Do you really want to delete the current Server Configuration?" => "Ar tikrai norite ištrinti dabartinę serverio konfigūraciją?",
+"Confirm Deletion" => "Patvirtinkite trynimą",
+"Server configuration" => "Serverio konfigūravimas",
+"Add Server Configuration" => "Pridėti serverio konfigūraciją",
+"Host" => "Mazgas",
+"Base DN" => "Bazinis DN",
+"One Base DN per line" => "Vienas bazinis DN eilutėje",
+"User DN" => "Naudotojas DN",
"Password" => "Slaptažodis",
+"For anonymous access, leave DN and Password empty." => "Anoniminiam prisijungimui, palikite DN ir Slaptažodis laukus tuščius.",
+"User Login Filter" => "Naudotojo prisijungimo filtras",
+"User List Filter" => "Naudotojo sąrašo filtras",
"Group Filter" => "Grupės filtras",
+"Connection Settings" => "Ryšio nustatymai",
+"Configuration Active" => "Konfigūracija aktyvi",
+"When unchecked, this configuration will be skipped." => "Kai nepažymėta, ši konfigūracija bus praleista.",
"Port" => "Prievadas",
+"Backup (Replica) Host" => "Atsarginės kopijos (Replica) mazgas",
+"Backup (Replica) Port" => "Atsarginės kopijos (Replica) prievadas",
+"Disable Main Server" => "Išjungti pagrindinį serverį",
+"Only connect to the replica server." => "Tik prisijungti prie reprodukcinio (replica) serverio.",
"Use TLS" => "Naudoti TLS",
"Turn off SSL certificate validation." => "Išjungti SSL sertifikato tikrinimą.",
+"Directory Settings" => "Katalogo nustatymai",
+"Base User Tree" => "Bazinis naudotojo medis",
+"User Search Attributes" => "Naudotojo paieškos atributai",
+"Base Group Tree" => "Bazinis grupės medis",
+"Group Search Attributes" => "Grupės paieškos atributai",
+"Group-Member association" => "Grupės-Nario sąsaja",
+"Special Attributes" => "Specialūs atributai",
+"Quota Field" => "Kvotos laukas",
+"Quota Default" => "Numatyta kvota",
+"in bytes" => "baitais",
+"Email Field" => "El. pašto laukas",
+"User Home Folder Naming Rule" => "Naudotojo namų aplanko pavadinimo taisyklė",
+"Internal Username" => "Vidinis naudotojo vardas",
+"Internal Username Attribute:" => "Vidinis naudotojo vardo atributas:",
+"Override UUID detection" => "Perrašyti UUID aptikimą",
+"UUID Attribute:" => "UUID atributas:",
+"Username-LDAP User Mapping" => "Naudotojo vardo - LDAP naudotojo sąsaja",
+"Clear Username-LDAP User Mapping" => "Išvalyti naudotojo vardo - LDAP naudotojo sąsają",
+"Clear Groupname-LDAP Group Mapping" => "Išvalyti grupės pavadinimo - LDAP naudotojo sąsają",
+"Test Configuration" => "Bandyti konfigūraciją",
"Help" => "Pagalba"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_ldap/l10n/nn_NO.php b/apps/user_ldap/l10n/nn_NO.php
index 5e584aa31e3..470114d9359 100644
--- a/apps/user_ldap/l10n/nn_NO.php
+++ b/apps/user_ldap/l10n/nn_NO.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Deletion failed" => "Feil ved sletting",
"Error" => "Feil",
+"Host" => "Tenar",
"Password" => "Passord",
"Help" => "Hjelp"
);
diff --git a/apps/user_ldap/l10n/pa.php b/apps/user_ldap/l10n/pa.php
new file mode 100644
index 00000000000..ac486a8ca2f
--- /dev/null
+++ b/apps/user_ldap/l10n/pa.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"Error" => "ਗਲਤੀ",
+"Password" => "ਪਾਸਵਰ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/ru.php b/apps/user_ldap/l10n/ru.php
index f26e26f1e77..f1cf51dc51b 100644
--- a/apps/user_ldap/l10n/ru.php
+++ b/apps/user_ldap/l10n/ru.php
@@ -30,8 +30,11 @@ $TRANSLATIONS = array(
"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. Example: \"uid=%%uid\"" => "Определяет фильтр для применения при попытке входа. %%uid заменяет имя пользователя при входе в систему. Например: \"uid=%%uid\"",
"User List Filter" => "Фильтр списка пользователей",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Определяет фильтр, использующийся при получении пользователей (без подмены переменных). Например: \"objectClass=person\"",
"Group Filter" => "Фильтр группы",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Определяет фильтр, использующийся при получении групп (без подмены переменных). Например: \"objectClass=posixGroup\"",
"Connection Settings" => "Настройки подключения",
"Configuration Active" => "Конфигурация активна",
"When unchecked, this configuration will be skipped." => "Когда галочка снята, эта конфигурация будет пропущена.",
@@ -40,19 +43,23 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Укажите дополнительный резервный сервер. Он должен быть репликой главного LDAP/AD сервера.",
"Backup (Replica) Port" => "Порт резервного сервера",
"Disable Main Server" => "Отключение главного сервера",
+"Only connect to the replica server." => "Только подключение к серверу реплик.",
"Use TLS" => "Использовать TLS",
"Do not use it additionally for LDAPS connections, it will fail." => "Не используйте совместно с безопасными подключениями (LDAPS), это не сработает.",
"Case insensitve LDAP server (Windows)" => "Нечувствительный к регистру сервер LDAP (Windows)",
"Turn off SSL certificate validation." => "Отключить проверку сертификата SSL.",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Не рекомендуется, используйте только в режиме тестирования! Если соединение работает только с этой опцией, импортируйте на ваш %s сервер сертификат SSL сервера LDAP.",
"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 display name." => "Атрибут LDAP, который используется для генерации отображаемого имени пользователя.",
"Base User Tree" => "База пользовательского дерева",
"One User Base DN per line" => "По одной базовому DN пользователей в строке.",
"User Search Attributes" => "Поисковые атрибуты пользователя",
"Optional; one attribute per line" => "Опционально; один атрибут на линию",
"Group Display Name Field" => "Поле отображаемого имени группы",
+"The LDAP attribute to use to generate the groups's display name." => "Атрибут LDAP, который используется для генерации отображаемого имени группы.",
"Base Group Tree" => "База группового дерева",
"One Group Base DN per line" => "По одной базовому DN групп в строке.",
"Group Search Attributes" => "Атрибуты поиска для группы",
@@ -65,10 +72,13 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "Правило именования Домашней Папки Пользователя",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Оставьте имя пользователя пустым (по умолчанию). Иначе укажите атрибут LDAP/AD.",
"Internal Username" => "Внутреннее имя пользователя",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "По-умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по-умолчанию для папки пользователя в ownCloud. Оно также портом для удаленных ссылок, к примеру, для всех сервисов *DAV. С помощию данной настройки можно изменить поведение по-умолчанию. Чтобы достичь поведения, как было настроено до изменения, ownCloud 5 выводит атрибут имени пользователя в этом поле. Оставьте его пустым для режима по-умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.",
"Internal Username Attribute:" => "Аттрибут для внутреннего имени:",
"Override UUID detection" => "Переопределить нахождение UUID",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "По-умолчанию, ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно индентифицировать пользователей и группы LDAP. Также, на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по-умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.",
"UUID Attribute:" => "Аттрибут для UUID:",
"Username-LDAP User Mapping" => "Соответствия Имя-Пользователь LDAP",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "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" => "Тестовая конфигурация",
diff --git a/apps/user_ldap/l10n/sr@latin.php b/apps/user_ldap/l10n/sr@latin.php
index 07db505ecf3..24fff94fc65 100644
--- a/apps/user_ldap/l10n/sr@latin.php
+++ b/apps/user_ldap/l10n/sr@latin.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Error" => "Greška",
"Password" => "Lozinka",
"Help" => "Pomoć"
);
diff --git a/apps/user_webdavauth/l10n/de_CH.php b/apps/user_webdavauth/l10n/de_CH.php
new file mode 100644
index 00000000000..2c31957d251
--- /dev/null
+++ b/apps/user_webdavauth/l10n/de_CH.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"WebDAV Authentication" => "WebDAV-Authentifizierung",
+"Address: " => "Adresse:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/en_GB.php b/apps/user_webdavauth/l10n/en_GB.php
new file mode 100644
index 00000000000..c0982083377
--- /dev/null
+++ b/apps/user_webdavauth/l10n/en_GB.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"WebDAV Authentication" => "WebDAV Authentication",
+"Address: " => "Address: ",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials."
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es.php b/apps/user_webdavauth/l10n/es.php
index cd8ec6659a4..951aabe24ae 100644
--- a/apps/user_webdavauth/l10n/es.php
+++ b/apps/user_webdavauth/l10n/es.php
@@ -1,7 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "Autenticación de WevDAV",
+"WebDAV Authentication" => "Autenticación mediante WevDAV",
"Address: " => "Dirección:",
-"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "onwCloud enviará las credenciales de usuario a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas."
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es_AR.php b/apps/user_webdavauth/l10n/es_AR.php
index 608b0ad8179..4ec0bf5a626 100644
--- a/apps/user_webdavauth/l10n/es_AR.php
+++ b/apps/user_webdavauth/l10n/es_AR.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "Autenticación de WevDAV"
+"WebDAV Authentication" => "Autenticación de WebDAV",
+"Address: " => "Dirección:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales del usuario serán enviadas a esta dirección. Este plug-in verificará la respuesta e interpretará los códigos de estado HTTP 401 y 403 como credenciales inválidas y cualquier otra respuesta como válida."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/fa.php b/apps/user_webdavauth/l10n/fa.php
new file mode 100644
index 00000000000..ad061226d43
--- /dev/null
+++ b/apps/user_webdavauth/l10n/fa.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"WebDAV Authentication" => "اعتبار سنجی WebDAV "
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/lt_LT.php b/apps/user_webdavauth/l10n/lt_LT.php
index 90fc2d5ac3e..41a7fa9502d 100644
--- a/apps/user_webdavauth/l10n/lt_LT.php
+++ b/apps/user_webdavauth/l10n/lt_LT.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV autorizavimas"
+"WebDAV Authentication" => "WebDAV autentikacija",
+"Address: " => "Adresas:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Naudotojo duomenys bus nusiųsti šiuo adresu. Šis įskiepis patikrins gautą atsakymą ir interpretuos HTTP būsenos kodą 401 ir 403 kaip negaliojančius duomenis, ir visus kitus gautus atsakymus kaip galiojančius duomenis. "
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/nn_NO.php b/apps/user_webdavauth/l10n/nn_NO.php
index 519b942f9f5..909231b5f58 100644
--- a/apps/user_webdavauth/l10n/nn_NO.php
+++ b/apps/user_webdavauth/l10n/nn_NO.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV-autentisering"
+"WebDAV Authentication" => "WebDAV-autentisering",
+"Address: " => "Adresse:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Innloggingsinformasjon blir sendt til denne nettadressa. Dette programtillegget kontrollerer svaret og tolkar HTTP-statuskodane 401 og 403 som ugyldige, og alle andre svar som gyldige."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/uk.php b/apps/user_webdavauth/l10n/uk.php
index fcde044ec75..dff8b308c5d 100644
--- a/apps/user_webdavauth/l10n/uk.php
+++ b/apps/user_webdavauth/l10n/uk.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "Аутентифікація WebDAV"
+"WebDAV Authentication" => "Аутентифікація WebDAV",
+"Address: " => "Адреса:"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";