summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.htaccess2
-rw-r--r--.user.ini2
m---------3rdparty0
-rw-r--r--apps/encryption/l10n/ca.js2
-rw-r--r--apps/encryption/l10n/ca.json2
-rw-r--r--apps/encryption/l10n/es.js4
-rw-r--r--apps/encryption/l10n/es.json4
-rw-r--r--apps/encryption/l10n/uk.js1
-rw-r--r--apps/encryption/l10n/uk.json1
-rw-r--r--apps/encryption/lib/crypto/encryptall.php6
-rw-r--r--apps/files/css/detailsView.css8
-rw-r--r--apps/files/css/files.css17
-rw-r--r--apps/files/js/detailsview.js61
-rw-r--r--apps/files/js/detailtabview.js17
-rw-r--r--apps/files/js/file-upload.js65
-rw-r--r--apps/files/js/fileactions.js4
-rw-r--r--apps/files/js/fileactionsmenu.js8
-rw-r--r--apps/files/js/filelist.js88
-rw-r--r--apps/files/js/files.js21
-rw-r--r--apps/files/js/mainfileinfodetailview.js35
-rw-r--r--apps/files/js/newfilemenu.js3
-rw-r--r--apps/files/l10n/ar.js4
-rw-r--r--apps/files/l10n/ar.json4
-rw-r--r--apps/files/l10n/ast.js4
-rw-r--r--apps/files/l10n/ast.json4
-rw-r--r--apps/files/l10n/az.js4
-rw-r--r--apps/files/l10n/az.json4
-rw-r--r--apps/files/l10n/bg_BG.js4
-rw-r--r--apps/files/l10n/bg_BG.json4
-rw-r--r--apps/files/l10n/bn_BD.js4
-rw-r--r--apps/files/l10n/bn_BD.json4
-rw-r--r--apps/files/l10n/bn_IN.js5
-rw-r--r--apps/files/l10n/bn_IN.json5
-rw-r--r--apps/files/l10n/bs.js3
-rw-r--r--apps/files/l10n/bs.json3
-rw-r--r--apps/files/l10n/ca.js4
-rw-r--r--apps/files/l10n/ca.json4
-rw-r--r--apps/files/l10n/cs_CZ.js4
-rw-r--r--apps/files/l10n/cs_CZ.json4
-rw-r--r--apps/files/l10n/cy_GB.js4
-rw-r--r--apps/files/l10n/cy_GB.json4
-rw-r--r--apps/files/l10n/da.js4
-rw-r--r--apps/files/l10n/da.json4
-rw-r--r--apps/files/l10n/de.js4
-rw-r--r--apps/files/l10n/de.json4
-rw-r--r--apps/files/l10n/de_AT.js5
-rw-r--r--apps/files/l10n/de_AT.json5
-rw-r--r--apps/files/l10n/de_DE.js4
-rw-r--r--apps/files/l10n/de_DE.json4
-rw-r--r--apps/files/l10n/el.js4
-rw-r--r--apps/files/l10n/el.json4
-rw-r--r--apps/files/l10n/en_GB.js4
-rw-r--r--apps/files/l10n/en_GB.json4
-rw-r--r--apps/files/l10n/eo.js4
-rw-r--r--apps/files/l10n/eo.json4
-rw-r--r--apps/files/l10n/es.js4
-rw-r--r--apps/files/l10n/es.json4
-rw-r--r--apps/files/l10n/es_AR.js4
-rw-r--r--apps/files/l10n/es_AR.json4
-rw-r--r--apps/files/l10n/es_CL.js2
-rw-r--r--apps/files/l10n/es_CL.json2
-rw-r--r--apps/files/l10n/es_MX.js4
-rw-r--r--apps/files/l10n/es_MX.json4
-rw-r--r--apps/files/l10n/et_EE.js4
-rw-r--r--apps/files/l10n/et_EE.json4
-rw-r--r--apps/files/l10n/eu.js4
-rw-r--r--apps/files/l10n/eu.json4
-rw-r--r--apps/files/l10n/fa.js4
-rw-r--r--apps/files/l10n/fa.json4
-rw-r--r--apps/files/l10n/fi_FI.js4
-rw-r--r--apps/files/l10n/fi_FI.json4
-rw-r--r--apps/files/l10n/fr.js4
-rw-r--r--apps/files/l10n/fr.json4
-rw-r--r--apps/files/l10n/gl.js4
-rw-r--r--apps/files/l10n/gl.json4
-rw-r--r--apps/files/l10n/he.js4
-rw-r--r--apps/files/l10n/he.json4
-rw-r--r--apps/files/l10n/hi.js1
-rw-r--r--apps/files/l10n/hi.json1
-rw-r--r--apps/files/l10n/hr.js4
-rw-r--r--apps/files/l10n/hr.json4
-rw-r--r--apps/files/l10n/hu_HU.js6
-rw-r--r--apps/files/l10n/hu_HU.json6
-rw-r--r--apps/files/l10n/hy.js4
-rw-r--r--apps/files/l10n/hy.json4
-rw-r--r--apps/files/l10n/ia.js2
-rw-r--r--apps/files/l10n/ia.json2
-rw-r--r--apps/files/l10n/id.js4
-rw-r--r--apps/files/l10n/id.json4
-rw-r--r--apps/files/l10n/is.js3
-rw-r--r--apps/files/l10n/is.json3
-rw-r--r--apps/files/l10n/it.js4
-rw-r--r--apps/files/l10n/it.json4
-rw-r--r--apps/files/l10n/ja.js4
-rw-r--r--apps/files/l10n/ja.json4
-rw-r--r--apps/files/l10n/ka_GE.js4
-rw-r--r--apps/files/l10n/ka_GE.json4
-rw-r--r--apps/files/l10n/km.js4
-rw-r--r--apps/files/l10n/km.json4
-rw-r--r--apps/files/l10n/kn.js3
-rw-r--r--apps/files/l10n/kn.json3
-rw-r--r--apps/files/l10n/ko.js4
-rw-r--r--apps/files/l10n/ko.json4
-rw-r--r--apps/files/l10n/lb.js4
-rw-r--r--apps/files/l10n/lb.json4
-rw-r--r--apps/files/l10n/lt_LT.js4
-rw-r--r--apps/files/l10n/lt_LT.json4
-rw-r--r--apps/files/l10n/lv.js4
-rw-r--r--apps/files/l10n/lv.json4
-rw-r--r--apps/files/l10n/mk.js4
-rw-r--r--apps/files/l10n/mk.json4
-rw-r--r--apps/files/l10n/ms_MY.js3
-rw-r--r--apps/files/l10n/ms_MY.json3
-rw-r--r--apps/files/l10n/nb_NO.js4
-rw-r--r--apps/files/l10n/nb_NO.json4
-rw-r--r--apps/files/l10n/nl.js4
-rw-r--r--apps/files/l10n/nl.json4
-rw-r--r--apps/files/l10n/nn_NO.js4
-rw-r--r--apps/files/l10n/nn_NO.json4
-rw-r--r--apps/files/l10n/oc.js4
-rw-r--r--apps/files/l10n/oc.json4
-rw-r--r--apps/files/l10n/pa.js6
-rw-r--r--apps/files/l10n/pa.json6
-rw-r--r--apps/files/l10n/pl.js4
-rw-r--r--apps/files/l10n/pl.json4
-rw-r--r--apps/files/l10n/pt_BR.js4
-rw-r--r--apps/files/l10n/pt_BR.json4
-rw-r--r--apps/files/l10n/pt_PT.js4
-rw-r--r--apps/files/l10n/pt_PT.json4
-rw-r--r--apps/files/l10n/ro.js4
-rw-r--r--apps/files/l10n/ro.json4
-rw-r--r--apps/files/l10n/ru.js4
-rw-r--r--apps/files/l10n/ru.json4
-rw-r--r--apps/files/l10n/si_LK.js3
-rw-r--r--apps/files/l10n/si_LK.json3
-rw-r--r--apps/files/l10n/sk_SK.js14
-rw-r--r--apps/files/l10n/sk_SK.json14
-rw-r--r--apps/files/l10n/sl.js4
-rw-r--r--apps/files/l10n/sl.json4
-rw-r--r--apps/files/l10n/sq.js3
-rw-r--r--apps/files/l10n/sq.json3
-rw-r--r--apps/files/l10n/sr.js4
-rw-r--r--apps/files/l10n/sr.json4
-rw-r--r--apps/files/l10n/sr@latin.js4
-rw-r--r--apps/files/l10n/sr@latin.json4
-rw-r--r--apps/files/l10n/sv.js4
-rw-r--r--apps/files/l10n/sv.json4
-rw-r--r--apps/files/l10n/ta_IN.js1
-rw-r--r--apps/files/l10n/ta_IN.json1
-rw-r--r--apps/files/l10n/ta_LK.js4
-rw-r--r--apps/files/l10n/ta_LK.json4
-rw-r--r--apps/files/l10n/te.js4
-rw-r--r--apps/files/l10n/te.json4
-rw-r--r--apps/files/l10n/th_TH.js4
-rw-r--r--apps/files/l10n/th_TH.json4
-rw-r--r--apps/files/l10n/tr.js4
-rw-r--r--apps/files/l10n/tr.json4
-rw-r--r--apps/files/l10n/ug.js3
-rw-r--r--apps/files/l10n/ug.json3
-rw-r--r--apps/files/l10n/uk.js4
-rw-r--r--apps/files/l10n/uk.json4
-rw-r--r--apps/files/l10n/ur_PK.js4
-rw-r--r--apps/files/l10n/ur_PK.json4
-rw-r--r--apps/files/l10n/vi.js4
-rw-r--r--apps/files/l10n/vi.json4
-rw-r--r--apps/files/l10n/zh_CN.js6
-rw-r--r--apps/files/l10n/zh_CN.json6
-rw-r--r--apps/files/l10n/zh_HK.js5
-rw-r--r--apps/files/l10n/zh_HK.json5
-rw-r--r--apps/files/l10n/zh_TW.js4
-rw-r--r--apps/files/l10n/zh_TW.json4
-rw-r--r--apps/files/templates/fileexists.html8
-rw-r--r--apps/files/templates/list.php4
-rw-r--r--apps/files/tests/js/detailsviewSpec.js85
-rw-r--r--apps/files/tests/js/fileactionsmenuSpec.js37
-rw-r--r--apps/files/tests/js/filelistSpec.js61
-rw-r--r--apps/files_external/controller/globalstoragescontroller.php13
-rw-r--r--apps/files_external/controller/storagescontroller.php16
-rw-r--r--apps/files_external/controller/userstoragescontroller.php13
-rw-r--r--apps/files_external/js/settings.js13
-rw-r--r--apps/files_external/l10n/ast.js1
-rw-r--r--apps/files_external/l10n/ast.json1
-rw-r--r--apps/files_external/l10n/az.js1
-rw-r--r--apps/files_external/l10n/az.json1
-rw-r--r--apps/files_external/l10n/bg_BG.js1
-rw-r--r--apps/files_external/l10n/bg_BG.json1
-rw-r--r--apps/files_external/l10n/ca.js2
-rw-r--r--apps/files_external/l10n/ca.json2
-rw-r--r--apps/files_external/l10n/cs_CZ.js5
-rw-r--r--apps/files_external/l10n/cs_CZ.json5
-rw-r--r--apps/files_external/l10n/da.js4
-rw-r--r--apps/files_external/l10n/da.json4
-rw-r--r--apps/files_external/l10n/de.js2
-rw-r--r--apps/files_external/l10n/de.json2
-rw-r--r--apps/files_external/l10n/de_DE.js2
-rw-r--r--apps/files_external/l10n/de_DE.json2
-rw-r--r--apps/files_external/l10n/el.js5
-rw-r--r--apps/files_external/l10n/el.json5
-rw-r--r--apps/files_external/l10n/en_GB.js2
-rw-r--r--apps/files_external/l10n/en_GB.json2
-rw-r--r--apps/files_external/l10n/es.js7
-rw-r--r--apps/files_external/l10n/es.json7
-rw-r--r--apps/files_external/l10n/et_EE.js2
-rw-r--r--apps/files_external/l10n/et_EE.json2
-rw-r--r--apps/files_external/l10n/eu.js1
-rw-r--r--apps/files_external/l10n/eu.json1
-rw-r--r--apps/files_external/l10n/fi_FI.js1
-rw-r--r--apps/files_external/l10n/fi_FI.json1
-rw-r--r--apps/files_external/l10n/fr.js5
-rw-r--r--apps/files_external/l10n/fr.json5
-rw-r--r--apps/files_external/l10n/gl.js2
-rw-r--r--apps/files_external/l10n/gl.json2
-rw-r--r--apps/files_external/l10n/hr.js1
-rw-r--r--apps/files_external/l10n/hr.json1
-rw-r--r--apps/files_external/l10n/id.js12
-rw-r--r--apps/files_external/l10n/id.json12
-rw-r--r--apps/files_external/l10n/it.js4
-rw-r--r--apps/files_external/l10n/it.json4
-rw-r--r--apps/files_external/l10n/ja.js2
-rw-r--r--apps/files_external/l10n/ja.json2
-rw-r--r--apps/files_external/l10n/ko.js2
-rw-r--r--apps/files_external/l10n/ko.json2
-rw-r--r--apps/files_external/l10n/nb_NO.js4
-rw-r--r--apps/files_external/l10n/nb_NO.json4
-rw-r--r--apps/files_external/l10n/nl.js4
-rw-r--r--apps/files_external/l10n/nl.json4
-rw-r--r--apps/files_external/l10n/oc.js3
-rw-r--r--apps/files_external/l10n/oc.json3
-rw-r--r--apps/files_external/l10n/pl.js2
-rw-r--r--apps/files_external/l10n/pl.json2
-rw-r--r--apps/files_external/l10n/pt_BR.js4
-rw-r--r--apps/files_external/l10n/pt_BR.json4
-rw-r--r--apps/files_external/l10n/pt_PT.js1
-rw-r--r--apps/files_external/l10n/pt_PT.json1
-rw-r--r--apps/files_external/l10n/ru.js2
-rw-r--r--apps/files_external/l10n/ru.json2
-rw-r--r--apps/files_external/l10n/sk_SK.js38
-rw-r--r--apps/files_external/l10n/sk_SK.json38
-rw-r--r--apps/files_external/l10n/sl.js2
-rw-r--r--apps/files_external/l10n/sl.json2
-rw-r--r--apps/files_external/l10n/sr.js2
-rw-r--r--apps/files_external/l10n/sr.json2
-rw-r--r--apps/files_external/l10n/sr@latin.js1
-rw-r--r--apps/files_external/l10n/sr@latin.json1
-rw-r--r--apps/files_external/l10n/sv.js1
-rw-r--r--apps/files_external/l10n/sv.json1
-rw-r--r--apps/files_external/l10n/th_TH.js4
-rw-r--r--apps/files_external/l10n/th_TH.json4
-rw-r--r--apps/files_external/l10n/tr.js2
-rw-r--r--apps/files_external/l10n/tr.json2
-rw-r--r--apps/files_external/l10n/uk.js1
-rw-r--r--apps/files_external/l10n/uk.json1
-rw-r--r--apps/files_external/l10n/zh_CN.js1
-rw-r--r--apps/files_external/l10n/zh_CN.json1
-rw-r--r--apps/files_external/lib/auth/authmechanism.php8
-rw-r--r--apps/files_external/lib/backend/backend.php7
-rw-r--r--apps/files_external/lib/backend/local.php2
-rw-r--r--apps/files_external/lib/backend/sftp_key.php8
-rw-r--r--apps/files_external/lib/backend/smb_oc.php8
-rw-r--r--apps/files_external/lib/config.php14
-rw-r--r--apps/files_external/lib/config/configadapter.php2
-rw-r--r--apps/files_external/lib/identifiertrait.php34
-rw-r--r--apps/files_external/lib/permissionstrait.php164
-rw-r--r--apps/files_external/lib/visibilitytrait.php136
-rw-r--r--apps/files_external/personal.php6
-rw-r--r--apps/files_external/service/backendservice.php20
-rw-r--r--apps/files_external/service/globalstoragesservice.php9
-rw-r--r--apps/files_external/service/storagesservice.php45
-rw-r--r--apps/files_external/service/userglobalstoragesservice.php2
-rw-r--r--apps/files_external/service/userstoragesservice.php9
-rw-r--r--apps/files_external/settings.php10
-rw-r--r--apps/files_external/templates/settings.php9
-rw-r--r--apps/files_external/tests/controller/globalstoragescontrollertest.php4
-rw-r--r--apps/files_external/tests/controller/storagescontrollertest.php16
-rw-r--r--apps/files_external/tests/controller/userstoragescontrollertest.php19
-rwxr-xr-xapps/files_external/tests/env/start-amazons3-ceph.sh2
-rwxr-xr-xapps/files_external/tests/env/start-ftp-morrisjobke.sh2
-rwxr-xr-xapps/files_external/tests/env/start-sftp-atmoz.sh2
-rwxr-xr-xapps/files_external/tests/env/start-smb-silvershell.sh2
-rwxr-xr-xapps/files_external/tests/env/start-smb-windows.sh2
-rwxr-xr-xapps/files_external/tests/env/start-webdav-ownCloud.sh2
-rwxr-xr-xapps/files_external/tests/env/stop-amazons3-ceph.sh2
-rwxr-xr-xapps/files_external/tests/env/stop-ftp-morrisjobke.sh2
-rwxr-xr-xapps/files_external/tests/env/stop-sftp-atmoz.sh2
-rwxr-xr-xapps/files_external/tests/env/stop-smb-silvershell.sh2
-rwxr-xr-xapps/files_external/tests/env/stop-smb-windows.sh2
-rwxr-xr-xapps/files_external/tests/env/stop-webdav-ownCloud.sh2
-rw-r--r--apps/files_external/tests/service/backendservicetest.php6
-rw-r--r--apps/files_external/tests/service/storagesservicetest.php46
-rw-r--r--apps/files_external/tests/service/userglobalstoragesservicetest.php14
-rw-r--r--apps/files_sharing/ajax/publicpreview.php4
-rw-r--r--apps/files_sharing/api/sharees.php20
-rw-r--r--apps/files_sharing/css/authenticate.css3
-rw-r--r--apps/files_sharing/css/sharetabview.css6
-rw-r--r--apps/files_sharing/js/public.js28
-rw-r--r--apps/files_sharing/js/share.js32
-rw-r--r--apps/files_sharing/l10n/ca.js2
-rw-r--r--apps/files_sharing/l10n/ca.json2
-rw-r--r--apps/files_sharing/l10n/cs_CZ.js3
-rw-r--r--apps/files_sharing/l10n/cs_CZ.json3
-rw-r--r--apps/files_sharing/l10n/el.js6
-rw-r--r--apps/files_sharing/l10n/el.json6
-rw-r--r--apps/files_sharing/l10n/es.js3
-rw-r--r--apps/files_sharing/l10n/es.json3
-rw-r--r--apps/files_sharing/l10n/fr.js3
-rw-r--r--apps/files_sharing/l10n/fr.json3
-rw-r--r--apps/files_sharing/l10n/hu_HU.js4
-rw-r--r--apps/files_sharing/l10n/hu_HU.json4
-rw-r--r--apps/files_sharing/l10n/id.js4
-rw-r--r--apps/files_sharing/l10n/id.json4
-rw-r--r--apps/files_sharing/l10n/oc.js72
-rw-r--r--apps/files_sharing/l10n/oc.json72
-rw-r--r--apps/files_sharing/l10n/sk_SK.js4
-rw-r--r--apps/files_sharing/l10n/sk_SK.json4
-rw-r--r--apps/files_sharing/l10n/th_TH.js3
-rw-r--r--apps/files_sharing/l10n/th_TH.json3
-rw-r--r--apps/files_sharing/lib/activity.php8
-rw-r--r--apps/files_sharing/lib/capabilities.php42
-rw-r--r--apps/files_sharing/lib/connector/publicauth.php5
-rw-r--r--apps/files_sharing/lib/controllers/sharecontroller.php10
-rw-r--r--apps/files_sharing/lib/middleware/sharingcheckmiddleware.php21
-rw-r--r--apps/files_sharing/lib/mountprovider.php3
-rw-r--r--apps/files_sharing/lib/sharedstorage.php21
-rw-r--r--apps/files_sharing/publicwebdav.php3
-rw-r--r--apps/files_sharing/tests/api/shareestest.php438
-rw-r--r--apps/files_sharing/tests/capabilities.php37
-rw-r--r--apps/files_sharing/tests/js/shareSpec.js13
-rw-r--r--apps/files_sharing/tests/middleware/sharingcheckmiddleware.php55
-rw-r--r--apps/files_trashbin/l10n/oc.js4
-rw-r--r--apps/files_trashbin/l10n/oc.json4
-rw-r--r--apps/files_trashbin/lib/trashbin.php2
-rw-r--r--apps/files_trashbin/templates/index.php2
-rw-r--r--apps/files_trashbin/tests/expiration.php1
-rw-r--r--apps/files_versions/js/filesplugin.js2
-rw-r--r--apps/files_versions/js/versionstabview.js13
-rw-r--r--apps/files_versions/lib/storage.php3
-rw-r--r--apps/files_versions/tests/expirationtest.php1
-rw-r--r--apps/files_versions/tests/versions.php37
-rw-r--r--apps/user_ldap/group_ldap.php7
-rw-r--r--apps/user_ldap/js/wizard/wizardTabLoginFilter.js13
-rw-r--r--apps/user_ldap/l10n/oc.js150
-rw-r--r--apps/user_ldap/l10n/oc.json150
-rw-r--r--apps/user_ldap/l10n/zh_CN.js12
-rw-r--r--apps/user_ldap/l10n/zh_CN.json12
-rw-r--r--apps/user_ldap/lib/access.php33
-rw-r--r--apps/user_ldap/lib/user/manager.php37
-rw-r--r--apps/user_ldap/lib/user/user.php183
-rw-r--r--apps/user_ldap/templates/part.wizard-loginfilter.php2
-rw-r--r--apps/user_ldap/tests/access.php101
-rw-r--r--apps/user_ldap/tests/group_ldap.php6
-rw-r--r--apps/user_ldap/tests/user/manager.php42
-rw-r--r--apps/user_ldap/tests/user/user.php168
-rw-r--r--apps/user_ldap/tests/user_ldap.php18
-rw-r--r--apps/user_ldap/user_ldap.php60
-rwxr-xr-xautotest-external.sh2
-rwxr-xr-xautotest-js.sh2
-rwxr-xr-xautotest.sh2
-rw-r--r--build/integration/.gitignore3
-rw-r--r--build/integration/composer.json7
-rw-r--r--build/integration/config/behat.yml17
-rw-r--r--build/integration/features/bootstrap/FeatureContext.php142
-rw-r--r--build/integration/features/provisioning-v1.feature32
-rw-r--r--build/integration/features/provisioning-v2.feature9
-rwxr-xr-xbuild/integration/run.sh19
-rwxr-xr-xbuildjsdocs.sh2
-rw-r--r--config/config.sample.php68
-rw-r--r--core/ajax/preview.php4
-rw-r--r--core/ajax/share.php41
-rw-r--r--core/ajax/update.php6
-rw-r--r--core/command/app/checkcode.php66
-rw-r--r--core/command/config/listconfigs.php43
-rw-r--r--core/command/upgrade.php6
-rw-r--r--core/css/apps.css8
-rw-r--r--core/css/fixes.css13
-rw-r--r--core/css/mobile.css4
-rw-r--r--core/css/styles.css20
-rw-r--r--core/img/actions/close.pngbin206 -> 493 bytes
-rw-r--r--core/img/actions/close.svg9
-rw-r--r--core/img/actions/upload.pngbin144 -> 142 bytes
-rw-r--r--core/img/actions/upload.svg4
-rw-r--r--core/img/actions/view-close.pngbin317 -> 1442 bytes
-rw-r--r--core/img/actions/view-close.svg9
-rw-r--r--core/img/actions/view-next.pngbin232 -> 1215 bytes
-rw-r--r--core/img/actions/view-next.svg10
-rw-r--r--core/img/actions/view-pause.pngbin108 -> 682 bytes
-rw-r--r--core/img/actions/view-pause.svg12
-rw-r--r--core/img/actions/view-play.pngbin154 -> 870 bytes
-rw-r--r--core/img/actions/view-play.svg12
-rw-r--r--core/img/actions/view-previous.pngbin231 -> 1189 bytes
-rw-r--r--core/img/actions/view-previous.svg10
-rw-r--r--core/img/filetypes/application-pdf.pngbin1022 -> 892 bytes
-rw-r--r--core/img/filetypes/application.pngbin614 -> 805 bytes
-rw-r--r--core/img/filetypes/audio.pngbin781 -> 640 bytes
-rw-r--r--core/img/filetypes/file.pngbin251 -> 306 bytes
-rw-r--r--core/img/filetypes/folder-drag-accept.pngbin188 -> 283 bytes
-rw-r--r--core/img/filetypes/folder-external.pngbin549 -> 595 bytes
-rw-r--r--core/img/filetypes/folder-public.pngbin602 -> 693 bytes
-rw-r--r--core/img/filetypes/folder-shared.pngbin726 -> 655 bytes
-rw-r--r--core/img/filetypes/folder-starred.pngbin683 -> 655 bytes
-rw-r--r--core/img/filetypes/folder.pngbin215 -> 276 bytes
-rw-r--r--core/img/filetypes/image.pngbin394 -> 486 bytes
-rw-r--r--core/img/filetypes/package-x-generic.pngbin210 -> 302 bytes
-rw-r--r--core/img/filetypes/text-calendar.pngbin572 -> 570 bytes
-rw-r--r--core/img/filetypes/text-code.pngbin314 -> 591 bytes
-rw-r--r--core/img/filetypes/text-vcard.pngbin1098 -> 889 bytes
-rw-r--r--core/img/filetypes/text.pngbin270 -> 382 bytes
-rw-r--r--core/img/filetypes/video.pngbin239 -> 318 bytes
-rw-r--r--core/img/filetypes/x-office-document.pngbin270 -> 380 bytes
-rw-r--r--core/img/filetypes/x-office-presentation.pngbin179 -> 259 bytes
-rw-r--r--core/img/filetypes/x-office-spreadsheet.pngbin266 -> 362 bytes
-rwxr-xr-xcore/img/image-optimization.sh2
-rw-r--r--core/img/logo-icon-175px.pngbin0 -> 2946 bytes
-rw-r--r--core/js/js.js44
-rw-r--r--core/js/multiselect.js3
-rw-r--r--core/js/oc-dialogs.js97
-rw-r--r--core/js/sharedialogexpirationview.js2
-rw-r--r--core/js/sharedialoglinkshareview.js28
-rw-r--r--core/js/sharedialogshareelistview.js20
-rw-r--r--core/js/sharedialogview.js31
-rw-r--r--core/js/shareitemmodel.js46
-rw-r--r--core/js/tests/specs/shareitemmodelSpec.js111
-rw-r--r--core/l10n/bg_BG.js1
-rw-r--r--core/l10n/bg_BG.json1
-rw-r--r--core/l10n/ca.js2
-rw-r--r--core/l10n/ca.json2
-rw-r--r--core/l10n/cs_CZ.js4
-rw-r--r--core/l10n/cs_CZ.json4
-rw-r--r--core/l10n/da.js4
-rw-r--r--core/l10n/da.json4
-rw-r--r--core/l10n/de.js2
-rw-r--r--core/l10n/de.json2
-rw-r--r--core/l10n/de_DE.js2
-rw-r--r--core/l10n/de_DE.json2
-rw-r--r--core/l10n/el.js6
-rw-r--r--core/l10n/el.json6
-rw-r--r--core/l10n/en_GB.js2
-rw-r--r--core/l10n/en_GB.json2
-rw-r--r--core/l10n/es.js5
-rw-r--r--core/l10n/es.json5
-rw-r--r--core/l10n/et_EE.js2
-rw-r--r--core/l10n/et_EE.json2
-rw-r--r--core/l10n/eu.js1
-rw-r--r--core/l10n/eu.json1
-rw-r--r--core/l10n/fi_FI.js4
-rw-r--r--core/l10n/fi_FI.json4
-rw-r--r--core/l10n/fr.js4
-rw-r--r--core/l10n/fr.json4
-rw-r--r--core/l10n/gl.js2
-rw-r--r--core/l10n/gl.json2
-rw-r--r--core/l10n/hr.js1
-rw-r--r--core/l10n/hr.json1
-rw-r--r--core/l10n/hu_HU.js3
-rw-r--r--core/l10n/hu_HU.json3
-rw-r--r--core/l10n/id.js4
-rw-r--r--core/l10n/id.json4
-rw-r--r--core/l10n/is.js4
-rw-r--r--core/l10n/is.json4
-rw-r--r--core/l10n/it.js4
-rw-r--r--core/l10n/it.json4
-rw-r--r--core/l10n/ja.js2
-rw-r--r--core/l10n/ja.json2
-rw-r--r--core/l10n/ko.js2
-rw-r--r--core/l10n/ko.json2
-rw-r--r--core/l10n/nb_NO.js2
-rw-r--r--core/l10n/nb_NO.json2
-rw-r--r--core/l10n/nl.js4
-rw-r--r--core/l10n/nl.json4
-rw-r--r--core/l10n/oc.js1
-rw-r--r--core/l10n/oc.json1
-rw-r--r--core/l10n/pt_BR.js4
-rw-r--r--core/l10n/pt_BR.json4
-rw-r--r--core/l10n/pt_PT.js2
-rw-r--r--core/l10n/pt_PT.json2
-rw-r--r--core/l10n/ru.js2
-rw-r--r--core/l10n/ru.json2
-rw-r--r--core/l10n/sk_SK.js2
-rw-r--r--core/l10n/sk_SK.json2
-rw-r--r--core/l10n/sr.js2
-rw-r--r--core/l10n/sr.json2
-rw-r--r--core/l10n/sv.js1
-rw-r--r--core/l10n/sv.json1
-rw-r--r--core/l10n/th_TH.js4
-rw-r--r--core/l10n/th_TH.json4
-rw-r--r--core/l10n/tr.js2
-rw-r--r--core/l10n/tr.json2
-rw-r--r--core/l10n/uk.js26
-rw-r--r--core/l10n/uk.json26
-rw-r--r--core/l10n/zh_CN.js2
-rw-r--r--core/l10n/zh_CN.json2
-rw-r--r--core/register_command.php3
-rw-r--r--core/search/js/search.js4
-rw-r--r--core/shipped.json4
-rw-r--r--core/templates/login.php4
-rw-r--r--l10n/.tx/config6
-rw-r--r--l10n/rm-old.sh2
-rw-r--r--lib/base.php80
-rw-r--r--lib/l10n/af_ZA.js3
-rw-r--r--lib/l10n/af_ZA.json3
-rw-r--r--lib/l10n/ar.js1
-rw-r--r--lib/l10n/ar.json1
-rw-r--r--lib/l10n/ast.js1
-rw-r--r--lib/l10n/ast.json1
-rw-r--r--lib/l10n/bg_BG.js1
-rw-r--r--lib/l10n/bg_BG.json1
-rw-r--r--lib/l10n/bn_BD.js3
-rw-r--r--lib/l10n/bn_BD.json3
-rw-r--r--lib/l10n/bs.js1
-rw-r--r--lib/l10n/bs.json1
-rw-r--r--lib/l10n/ca.js1
-rw-r--r--lib/l10n/ca.json1
-rw-r--r--lib/l10n/cs_CZ.js1
-rw-r--r--lib/l10n/cs_CZ.json1
-rw-r--r--lib/l10n/cy_GB.js3
-rw-r--r--lib/l10n/cy_GB.json3
-rw-r--r--lib/l10n/da.js1
-rw-r--r--lib/l10n/da.json1
-rw-r--r--lib/l10n/de.js1
-rw-r--r--lib/l10n/de.json1
-rw-r--r--lib/l10n/de_DE.js1
-rw-r--r--lib/l10n/de_DE.json1
-rw-r--r--lib/l10n/el.js1
-rw-r--r--lib/l10n/el.json1
-rw-r--r--lib/l10n/en_GB.js1
-rw-r--r--lib/l10n/en_GB.json1
-rw-r--r--lib/l10n/eo.js1
-rw-r--r--lib/l10n/eo.json1
-rw-r--r--lib/l10n/es.js1
-rw-r--r--lib/l10n/es.json1
-rw-r--r--lib/l10n/es_AR.js1
-rw-r--r--lib/l10n/es_AR.json1
-rw-r--r--lib/l10n/es_MX.js1
-rw-r--r--lib/l10n/es_MX.json1
-rw-r--r--lib/l10n/et_EE.js1
-rw-r--r--lib/l10n/et_EE.json1
-rw-r--r--lib/l10n/eu.js1
-rw-r--r--lib/l10n/eu.json1
-rw-r--r--lib/l10n/fa.js1
-rw-r--r--lib/l10n/fa.json1
-rw-r--r--lib/l10n/fi_FI.js1
-rw-r--r--lib/l10n/fi_FI.json1
-rw-r--r--lib/l10n/fr.js1
-rw-r--r--lib/l10n/fr.json1
-rw-r--r--lib/l10n/gl.js1
-rw-r--r--lib/l10n/gl.json1
-rw-r--r--lib/l10n/he.js1
-rw-r--r--lib/l10n/he.json1
-rw-r--r--lib/l10n/hi.js3
-rw-r--r--lib/l10n/hi.json3
-rw-r--r--lib/l10n/hr.js1
-rw-r--r--lib/l10n/hr.json1
-rw-r--r--lib/l10n/hu_HU.js1
-rw-r--r--lib/l10n/hu_HU.json1
-rw-r--r--lib/l10n/ia.js3
-rw-r--r--lib/l10n/ia.json3
-rw-r--r--lib/l10n/id.js1
-rw-r--r--lib/l10n/id.json1
-rw-r--r--lib/l10n/is.js3
-rw-r--r--lib/l10n/is.json3
-rw-r--r--lib/l10n/it.js1
-rw-r--r--lib/l10n/it.json1
-rw-r--r--lib/l10n/ja.js1
-rw-r--r--lib/l10n/ja.json1
-rw-r--r--lib/l10n/ka_GE.js1
-rw-r--r--lib/l10n/ka_GE.json1
-rw-r--r--lib/l10n/km.js1
-rw-r--r--lib/l10n/km.json1
-rw-r--r--lib/l10n/kn.js1
-rw-r--r--lib/l10n/kn.json1
-rw-r--r--lib/l10n/ko.js1
-rw-r--r--lib/l10n/ko.json1
-rw-r--r--lib/l10n/ku_IQ.js3
-rw-r--r--lib/l10n/ku_IQ.json3
-rw-r--r--lib/l10n/lb.js1
-rw-r--r--lib/l10n/lb.json1
-rw-r--r--lib/l10n/lt_LT.js1
-rw-r--r--lib/l10n/lt_LT.json1
-rw-r--r--lib/l10n/lv.js1
-rw-r--r--lib/l10n/lv.json1
-rw-r--r--lib/l10n/mk.js1
-rw-r--r--lib/l10n/mk.json1
-rw-r--r--lib/l10n/ms_MY.js3
-rw-r--r--lib/l10n/ms_MY.json3
-rw-r--r--lib/l10n/my_MM.js3
-rw-r--r--lib/l10n/my_MM.json3
-rw-r--r--lib/l10n/nb_NO.js1
-rw-r--r--lib/l10n/nb_NO.json1
-rw-r--r--lib/l10n/nl.js1
-rw-r--r--lib/l10n/nl.json1
-rw-r--r--lib/l10n/nn_NO.js1
-rw-r--r--lib/l10n/nn_NO.json1
-rw-r--r--lib/l10n/oc.js2
-rw-r--r--lib/l10n/oc.json2
-rw-r--r--lib/l10n/pl.js1
-rw-r--r--lib/l10n/pl.json1
-rw-r--r--lib/l10n/pt_BR.js1
-rw-r--r--lib/l10n/pt_BR.json1
-rw-r--r--lib/l10n/pt_PT.js1
-rw-r--r--lib/l10n/pt_PT.json1
-rw-r--r--lib/l10n/ro.js1
-rw-r--r--lib/l10n/ro.json1
-rw-r--r--lib/l10n/ru.js1
-rw-r--r--lib/l10n/ru.json1
-rw-r--r--lib/l10n/si_LK.js3
-rw-r--r--lib/l10n/si_LK.json3
-rw-r--r--lib/l10n/sk_SK.js18
-rw-r--r--lib/l10n/sk_SK.json18
-rw-r--r--lib/l10n/sl.js1
-rw-r--r--lib/l10n/sl.json1
-rw-r--r--lib/l10n/sq.js1
-rw-r--r--lib/l10n/sq.json1
-rw-r--r--lib/l10n/sr.js1
-rw-r--r--lib/l10n/sr.json1
-rw-r--r--lib/l10n/sr@latin.js3
-rw-r--r--lib/l10n/sr@latin.json3
-rw-r--r--lib/l10n/sv.js1
-rw-r--r--lib/l10n/sv.json1
-rw-r--r--lib/l10n/ta_LK.js3
-rw-r--r--lib/l10n/ta_LK.json3
-rw-r--r--lib/l10n/th_TH.js1
-rw-r--r--lib/l10n/th_TH.json1
-rw-r--r--lib/l10n/tr.js1
-rw-r--r--lib/l10n/tr.json1
-rw-r--r--lib/l10n/ug.js1
-rw-r--r--lib/l10n/ug.json1
-rw-r--r--lib/l10n/uk.js1
-rw-r--r--lib/l10n/uk.json1
-rw-r--r--lib/l10n/ur_PK.js3
-rw-r--r--lib/l10n/ur_PK.json3
-rw-r--r--lib/l10n/vi.js3
-rw-r--r--lib/l10n/vi.json3
-rw-r--r--lib/l10n/zh_CN.js1
-rw-r--r--lib/l10n/zh_CN.json1
-rw-r--r--lib/l10n/zh_HK.js3
-rw-r--r--lib/l10n/zh_HK.json3
-rw-r--r--lib/l10n/zh_TW.js1
-rw-r--r--lib/l10n/zh_TW.json1
-rw-r--r--lib/private/allconfig.php11
-rw-r--r--lib/private/app.php4
-rw-r--r--lib/private/app/codechecker/infochecker.php146
-rw-r--r--lib/private/assetic/separatorfilter.php57
-rw-r--r--lib/private/connector/sabre/listenerplugin.php12
-rw-r--r--lib/private/db/querybuilder/quotehelper.php2
-rw-r--r--lib/private/encryption/decryptall.php2
-rw-r--r--lib/private/files.php97
-rw-r--r--lib/private/files/cache/scanner.php4
-rw-r--r--lib/private/files/storage/wrapper/permissionsmask.php2
-rw-r--r--lib/private/files/utils/scanner.php7
-rw-r--r--lib/private/files/view.php5
-rw-r--r--lib/private/helper.php4
-rw-r--r--lib/private/l10n.php7
-rw-r--r--lib/private/lock/dblockingprovider.php4
-rw-r--r--lib/private/log.php36
-rw-r--r--lib/private/preview.php23
-rw-r--r--lib/private/preview/image.php6
-rw-r--r--lib/private/preview/txt.php2
-rw-r--r--lib/private/repair.php2
-rw-r--r--lib/private/response.php2
-rw-r--r--lib/private/server.php1
-rw-r--r--lib/private/session/cryptowrapper.php2
-rw-r--r--lib/private/session/internal.php2
-rw-r--r--lib/private/session/memory.php2
-rw-r--r--lib/private/share/share.php1
-rw-r--r--lib/private/streamer.php124
-rw-r--r--lib/private/systemconfig.php54
-rw-r--r--lib/private/template.php117
-rw-r--r--lib/private/templatelayout.php15
-rw-r--r--lib/private/updater.php16
-rw-r--r--lib/private/util.php53
-rw-r--r--lib/public/appframework/http/contentsecuritypolicy.php1
-rw-r--r--lib/public/iconfig.php15
-rw-r--r--lib/public/ilogger.php10
-rw-r--r--lib/public/iservercontainer.php6
-rw-r--r--lib/public/sabrepluginevent.php82
-rw-r--r--lib/public/sabrepluginexception.php41
-rw-r--r--lib/public/util.php17
-rw-r--r--lib/repair/repairmimetypes.php66
-rw-r--r--settings/admin.php3
-rw-r--r--settings/js/users/users.js29
-rw-r--r--settings/l10n/da.js1
-rw-r--r--settings/l10n/da.json1
-rw-r--r--settings/l10n/el.js1
-rw-r--r--settings/l10n/el.json1
-rw-r--r--settings/l10n/es_AR.js3
-rw-r--r--settings/l10n/es_AR.json3
-rw-r--r--settings/l10n/fi_FI.js1
-rw-r--r--settings/l10n/fi_FI.json1
-rw-r--r--settings/l10n/fr.js4
-rw-r--r--settings/l10n/fr.json4
-rw-r--r--settings/l10n/it.js1
-rw-r--r--settings/l10n/it.json1
-rw-r--r--settings/l10n/nl.js1
-rw-r--r--settings/l10n/nl.json1
-rw-r--r--settings/l10n/oc.js1
-rw-r--r--settings/l10n/oc.json1
-rw-r--r--settings/l10n/pt_BR.js1
-rw-r--r--settings/l10n/pt_BR.json1
-rw-r--r--settings/l10n/th_TH.js1
-rw-r--r--settings/l10n/th_TH.json1
-rw-r--r--settings/l10n/uk.js88
-rw-r--r--settings/l10n/uk.json88
-rw-r--r--settings/l10n/zh_CN.js3
-rw-r--r--settings/l10n/zh_CN.json3
-rw-r--r--settings/personal.php2
-rw-r--r--settings/templates/admin.php5
-rw-r--r--settings/templates/users/main.php15
-rw-r--r--settings/users.php7
-rw-r--r--tests/apps/testapp-infoxml-version-different/appinfo/info.xml9
-rw-r--r--tests/apps/testapp-infoxml-version-different/appinfo/version1
-rw-r--r--tests/apps/testapp-infoxml-version/appinfo/info.xml9
-rw-r--r--tests/apps/testapp-infoxml-version/appinfo/version1
-rw-r--r--tests/apps/testapp-infoxml/appinfo/info.xml9
-rw-r--r--tests/apps/testapp-name-missing/appinfo/info.xml8
-rw-r--r--tests/apps/testapp-version-missing/appinfo/info.xml8
-rw-r--r--tests/apps/testapp-version/appinfo/info.xml8
-rw-r--r--tests/apps/testapp-version/appinfo/version1
-rw-r--r--tests/core/command/config/listconfigstest.php25
-rw-r--r--tests/lib/app/codechecker/infocheckertest.php73
-rw-r--r--tests/lib/appframework/controller/ControllerTest.php2
-rw-r--r--tests/lib/appframework/http/ContentSecurityPolicyTest.php106
-rw-r--r--tests/lib/appframework/http/DataResponseTest.php2
-rw-r--r--tests/lib/appframework/http/ResponseTest.php2
-rw-r--r--tests/lib/configtests.php (renamed from tests/lib/config.php)6
-rw-r--r--tests/lib/db/querybuilder/quotehelpertest.php4
-rw-r--r--tests/lib/encryption/decryptalltest.php16
-rw-r--r--tests/lib/files/storage/storage.php25
-rw-r--r--tests/lib/files/view.php135
-rw-r--r--tests/lib/logger.php44
-rw-r--r--tests/lib/preview.php45
-rw-r--r--tests/lib/repair/repairmimetypes.php11
-rw-r--r--tests/lib/share/share.php37
-rw-r--r--tests/lib/util.php2
731 files changed, 5954 insertions, 1622 deletions
diff --git a/.htaccess b/.htaccess
index 35c478860d5..392b9b41559 100644
--- a/.htaccess
+++ b/.htaccess
@@ -28,7 +28,7 @@
php_value mbstring.func_overload 0
php_value always_populate_raw_post_data -1
php_value default_charset 'UTF-8'
- php_value output_buffering off
+ php_value output_buffering 0
<IfModule mod_env.c>
SetEnv htaccessWorking true
</IfModule>
diff --git a/.user.ini b/.user.ini
index 66bf6484fe2..68ef3e8672c 100644
--- a/.user.ini
+++ b/.user.ini
@@ -4,4 +4,4 @@ memory_limit=512M
mbstring.func_overload=0
always_populate_raw_post_data=-1
default_charset='UTF-8'
-output_buffering=off \ No newline at end of file
+output_buffering=0
diff --git a/3rdparty b/3rdparty
-Subproject 338ab170afcb4770e79cc4427a9803cb29a0a23
+Subproject 1914e923a4589e619b930e1ca587041d6fd3a1f
diff --git a/apps/encryption/l10n/ca.js b/apps/encryption/l10n/ca.js
index 9a318f2d4c2..b9ca7f97565 100644
--- a/apps/encryption/l10n/ca.js
+++ b/apps/encryption/l10n/ca.js
@@ -5,6 +5,8 @@ OC.L10N.register(
"Could not enable recovery key. Please check your recovery key password!" : "No s'ha pogut activar la clau de recuperació. Comproveu contrasenya de la clau de recuperació!",
"Recovery key successfully disabled" : "La clau de recuperació s'ha descativat",
"Could not disable recovery key. Please check your recovery key password!" : "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!",
+ "Please provide a new recovery password" : "Siusplau proporcioneu una nova contrasenya de recuperació",
+ "Please repeat the new recovery password" : "Repetiu la nova contrasenya de recuperació",
"Password successfully changed." : "La contrasenya s'ha canviat.",
"Could not change the password. Maybe the old password was not correct." : "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.",
"Private key password successfully updated." : "La contrasenya de la clau privada s'ha actualitzat.",
diff --git a/apps/encryption/l10n/ca.json b/apps/encryption/l10n/ca.json
index b172da4a0df..cedebee12c0 100644
--- a/apps/encryption/l10n/ca.json
+++ b/apps/encryption/l10n/ca.json
@@ -3,6 +3,8 @@
"Could not enable recovery key. Please check your recovery key password!" : "No s'ha pogut activar la clau de recuperació. Comproveu contrasenya de la clau de recuperació!",
"Recovery key successfully disabled" : "La clau de recuperació s'ha descativat",
"Could not disable recovery key. Please check your recovery key password!" : "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!",
+ "Please provide a new recovery password" : "Siusplau proporcioneu una nova contrasenya de recuperació",
+ "Please repeat the new recovery password" : "Repetiu la nova contrasenya de recuperació",
"Password successfully changed." : "La contrasenya s'ha canviat.",
"Could not change the password. Maybe the old password was not correct." : "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.",
"Private key password successfully updated." : "La contrasenya de la clau privada s'ha actualitzat.",
diff --git a/apps/encryption/l10n/es.js b/apps/encryption/l10n/es.js
index cadedbcc0d4..6b49b3917fd 100644
--- a/apps/encryption/l10n/es.js
+++ b/apps/encryption/l10n/es.js
@@ -28,10 +28,10 @@ OC.L10N.register(
"one-time password for server-side-encryption" : "Contraseña de un solo uso para el cifrado en el lado servidor",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede leer este archivo, probablemente sea un archivo compartido. Consulte con el propietario del mismo y que lo vuelva a compartir con usted.",
- "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.\n\n",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.\n\n",
"The share will expire on %s." : "El objeto dejará de ser compartido el %s.",
"Cheers!" : "¡Saludos!",
- "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.<br><br>",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.<br><br>",
"Enable recovery key" : "Activa la clave de recuperación",
"Disable recovery key" : "Desactiva la clave de recuperación",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clave de recuperación es una clave de cifrado extra que se usa para cifrar ficheros. Permite la recuperación de los ficheros de un usuario si él o ella olvida su contraseña.",
diff --git a/apps/encryption/l10n/es.json b/apps/encryption/l10n/es.json
index 9bdad94cb6d..3f21b4c09a0 100644
--- a/apps/encryption/l10n/es.json
+++ b/apps/encryption/l10n/es.json
@@ -26,10 +26,10 @@
"one-time password for server-side-encryption" : "Contraseña de un solo uso para el cifrado en el lado servidor",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede leer este archivo, probablemente sea un archivo compartido. Consulte con el propietario del mismo y que lo vuelva a compartir con usted.",
- "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.\n\n",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: '%s'.\n\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.\n\n",
"The share will expire on %s." : "El objeto dejará de ser compartido el %s.",
"Cheers!" : "¡Saludos!",
- "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor logese en el interfaz web, vaya a la sección , 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la neva en su correspondiente campo.<br><br>",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,\n<br><br>\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: <strong>%s</strong>\n<br><br>\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.<br><br>",
"Enable recovery key" : "Activa la clave de recuperación",
"Disable recovery key" : "Desactiva la clave de recuperación",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clave de recuperación es una clave de cifrado extra que se usa para cifrar ficheros. Permite la recuperación de los ficheros de un usuario si él o ella olvida su contraseña.",
diff --git a/apps/encryption/l10n/uk.js b/apps/encryption/l10n/uk.js
index 553478a7f4c..aa1821729ef 100644
--- a/apps/encryption/l10n/uk.js
+++ b/apps/encryption/l10n/uk.js
@@ -24,6 +24,7 @@ OC.L10N.register(
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невірний закритий ключ для доданку шифрування. Оновіть пароль до вашого закритого ключа в особистих налаштуваннях.",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову",
"Encryption App is enabled and ready" : "Додаток кодування дозволений і готовий",
+ "one-time password for server-side-encryption" : "одноразовий пароль для шифрування на сервері",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.",
"The share will expire on %s." : "Спільний доступ закінчиться %s.",
"Cheers!" : "Будьмо!",
diff --git a/apps/encryption/l10n/uk.json b/apps/encryption/l10n/uk.json
index e474e25cea4..cf54cadc708 100644
--- a/apps/encryption/l10n/uk.json
+++ b/apps/encryption/l10n/uk.json
@@ -22,6 +22,7 @@
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невірний закритий ключ для доданку шифрування. Оновіть пароль до вашого закритого ключа в особистих налаштуваннях.",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову",
"Encryption App is enabled and ready" : "Додаток кодування дозволений і готовий",
+ "one-time password for server-side-encryption" : "одноразовий пароль для шифрування на сервері",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.",
"The share will expire on %s." : "Спільний доступ закінчиться %s.",
"Cheers!" : "Будьмо!",
diff --git a/apps/encryption/lib/crypto/encryptall.php b/apps/encryption/lib/crypto/encryptall.php
index a0c69c13fdd..8e97fe341b4 100644
--- a/apps/encryption/lib/crypto/encryptall.php
+++ b/apps/encryption/lib/crypto/encryptall.php
@@ -280,6 +280,12 @@ class EncryptAll {
$newPasswords[] = [$uid, $password];
}
}
+
+ if (empty($newPasswords)) {
+ $this->output->writeln("\nAll users already had a key-pair, no further action needed.\n");
+ return;
+ }
+
$table->setRows($newPasswords);
$table->render();
diff --git a/apps/files/css/detailsView.css b/apps/files/css/detailsView.css
index 8acf884f219..485c20e6865 100644
--- a/apps/files/css/detailsView.css
+++ b/apps/files/css/detailsView.css
@@ -32,12 +32,18 @@
#app-sidebar .image .thumbnail {
width:100%;
display:block;
- height: 250px;
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
float: none;
margin: 0;
+ height: auto;
+}
+
+#app-sidebar .image .thumbnail .stretcher {
+ content: '';
+ display: block;
+ padding-bottom: 56.25%; /* sets height of .thumbnail to 9/16 of the width */
}
#app-sidebar .image.portrait .thumbnail {
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index c0701fb18b8..1d4d0774482 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -186,9 +186,15 @@ table th .sort-indicator {
filter: alpha(opacity=30);
opacity: .3;
}
-.sort-indicator.hidden {
+.sort-indicator.hidden,
+.multiselect .sort-indicator,
+table.multiselect th:hover .sort-indicator.hidden,
+table.multiselect th:focus .sort-indicator.hidden {
visibility: hidden;
}
+.multiselect .sort, .multiselect .sort span {
+ cursor: default;
+}
table th:hover .sort-indicator.hidden,
table th:focus .sort-indicator.hidden {
visibility: visible;
@@ -574,6 +580,9 @@ a.action > img {
#fileList .popovermenu {
margin-right: 21px;
}
+.ie8 #fileList .popovermenu {
+ margin-top: -10px;
+}
.ie8 #fileList a.action img,
#fileList tr:hover a.action,
@@ -746,6 +755,12 @@ table.dragshadow td.size {
margin: 0;
}
+.newFileMenu.popovermenu a.menuitem.active {
+ opacity: 1;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ filter: alpha(opacity=100);
+}
+
.newFileMenu.bubble:after {
left: 75px;
right: auto;
diff --git a/apps/files/js/detailsview.js b/apps/files/js/detailsview.js
index b01f9cea610..f04adcf1292 100644
--- a/apps/files/js/detailsview.js
+++ b/apps/files/js/detailsview.js
@@ -132,16 +132,22 @@
closeLabel: t('files', 'Close')
};
- if (this._tabViews.length > 1) {
- // only render headers if there is more than one available
- templateVars.tabHeaders = _.map(this._tabViews, function(tabView, i) {
- return {
- tabId: tabView.id,
- tabIndex: i,
- label: tabView.getLabel()
- };
- });
- }
+ this._tabViews = this._tabViews.sort(function(tabA, tabB) {
+ var orderA = tabA.order || 0;
+ var orderB = tabB.order || 0;
+ if (orderA === orderB) {
+ return OC.Util.naturalSortCompare(tabA.getLabel(), tabB.getLabel());
+ }
+ return orderA - orderB;
+ });
+
+ templateVars.tabHeaders = _.map(this._tabViews, function(tabView, i) {
+ return {
+ tabId: tabView.id,
+ tabIndex: i,
+ label: tabView.getLabel()
+ };
+ });
this.$el.html(this.template(templateVars));
@@ -158,6 +164,8 @@
this.selectTab(this._currentTabId);
+ this._updateTabVisibilities();
+
this._dirty = false;
},
@@ -216,6 +224,8 @@
if (this._dirty) {
this.render();
+ } else {
+ this._updateTabVisibilities();
}
if (this._currentTabId) {
@@ -233,6 +243,37 @@
},
/**
+ * Update tab headers based on the current model
+ */
+ _updateTabVisibilities: function() {
+ // update tab header visibilities
+ var self = this;
+ var deselect = false;
+ var countVisible = 0;
+ var $tabHeaders = this.$el.find('.tabHeaders li');
+ _.each(this._tabViews, function(tabView) {
+ var isVisible = tabView.canDisplay(self.model);
+ if (isVisible) {
+ countVisible += 1;
+ }
+ if (!isVisible && self._currentTabId === tabView.id) {
+ deselect = true;
+ }
+ $tabHeaders.filterAttr('data-tabid', tabView.id).toggleClass('hidden', !isVisible);
+ });
+
+ // hide the whole container if there is only one tab
+ this.$el.find('.tabHeaders').toggleClass('hidden', countVisible <= 1);
+
+ if (deselect) {
+ // select the first visible tab instead
+ var visibleTabId = this.$el.find('.tabHeader:not(.hidden):first').attr('data-tabid');
+ this.selectTab(visibleTabId);
+ }
+
+ },
+
+ /**
* Returns the file info.
*
* @return {OCA.Files.FileInfoModel} file info
diff --git a/apps/files/js/detailtabview.js b/apps/files/js/detailtabview.js
index 449047cf252..0bd34a88188 100644
--- a/apps/files/js/detailtabview.js
+++ b/apps/files/js/detailtabview.js
@@ -29,11 +29,15 @@
_template: null,
- initialize: function() {
+ initialize: function(options) {
+ options = options || {};
if (!this.id) {
this.id = 'detailTabView' + DetailTabView._TAB_COUNT;
DetailTabView._TAB_COUNT++;
}
+ if (options.order) {
+ this.order = options.order || 0;
+ }
},
/**
@@ -91,6 +95,17 @@
*/
nextPage: function() {
// load the next page, if applicable
+ },
+
+ /**
+ * Returns whether the current tab is able to display
+ * the given file info, for example based on mime type.
+ *
+ * @param {OCA.Files.FileInfoModel} fileInfo file info model
+ * @return {bool} whether to display this tab
+ */
+ canDisplay: function(fileInfo) {
+ return true;
}
});
DetailTabView._TAB_COUNT = 0;
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 17f0f777169..03330ad7c5d 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -18,7 +18,7 @@
* - TODO music upload button
*/
-/* global Files, FileList, jQuery, oc_requesttoken, humanFileSize, getUniqueName */
+/* global jQuery, oc_requesttoken, humanFileSize */
/**
* Function that will allow us to know if Ajax uploads are supported
@@ -139,6 +139,9 @@ OC.Upload = {
if (data.data) {
data.data.append('resolution', 'replace');
} else {
+ if (!data.formData) {
+ data.formData = [];
+ }
data.formData.push({name:'resolution', value:'replace'}); //hack for ie8
}
data.submit();
@@ -152,6 +155,9 @@ OC.Upload = {
if (data.data) {
data.data.append('resolution', 'autorename');
} else {
+ if (!data.formData) {
+ data.formData = [];
+ }
data.formData.push({name:'resolution', value:'autorename'}); //hack for ie8
}
data.submit();
@@ -164,8 +170,9 @@ OC.Upload = {
}
},
/**
- * TODO checks the list of existing files prior to uploading and shows a simple dialog to choose
+ * checks the list of existing files prior to uploading and shows a simple dialog to choose
* skip all, replace all or choose which files to keep
+ *
* @param {array} selection of files to upload
* @param {object} callbacks - object with several callback methods
* @param {function} callbacks.onNoConflicts
@@ -175,14 +182,34 @@ OC.Upload = {
* @param {function} callbacks.onCancel
*/
checkExistingFiles: function (selection, callbacks) {
- /*
- $.each(selection.uploads, function(i, upload) {
- var $row = OCA.Files.App.fileList.findFileEl(upload.files[0].name);
- if ($row) {
- // TODO check filelist before uploading and show dialog on conflicts, use callbacks
+ var fileList = OCA.Files.App.fileList;
+ var conflicts = [];
+ // only keep non-conflicting uploads
+ selection.uploads = _.filter(selection.uploads, function(upload) {
+ var fileInfo = fileList.findFile(upload.files[0].name);
+ if (fileInfo) {
+ conflicts.push([
+ // original
+ _.extend(fileInfo, {
+ directory: fileInfo.directory || fileInfo.path || fileList.getCurrentDirectory()
+ }),
+ // replacement (File object)
+ upload
+ ]);
+ return false;
}
+ return true;
});
- */
+ if (conflicts.length) {
+ _.each(conflicts, function(conflictData) {
+ OC.dialogs.fileexists(conflictData[1], conflictData[0], conflictData[1].files[0], OC.Upload);
+ });
+ }
+
+ // upload non-conflicting files
+ // note: when reaching the server they might still meet conflicts
+ // if the folder was concurrently modified, these will get added
+ // to the already visible dialog, if applicable
callbacks.onNoConflicts(selection);
},
@@ -368,18 +395,18 @@ OC.Upload = {
},
submit: function(e, data) {
OC.Upload.rememberUpload(data);
- if ( ! data.formData ) {
- var fileDirectory = '';
- if(typeof data.files[0].relativePath !== 'undefined') {
- fileDirectory = data.files[0].relativePath;
- }
- // noone set update parameters, we set the minimum
- data.formData = {
- requesttoken: oc_requesttoken,
- dir: data.targetDir || FileList.getCurrentDirectory(),
- file_directory: fileDirectory
- };
+ if (!data.formData) {
+ data.formData = [];
+ }
+
+ var fileDirectory = '';
+ if(typeof data.files[0].relativePath !== 'undefined') {
+ fileDirectory = data.files[0].relativePath;
}
+ // FIXME: prevent re-adding the same
+ data.formData.push({name: 'requesttoken', value: oc_requesttoken});
+ data.formData.push({name: 'dir', value: data.targetDir || FileList.getCurrentDirectory()});
+ data.formData.push({name: 'file_directory', value: fileDirectory});
},
fail: function(e, data) {
OC.Upload.log('fail', e, data);
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index d3904f2f6d3..bde0b094b87 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -141,6 +141,7 @@
name: name,
displayName: action.displayName,
mime: mime,
+ order: action.order || 0,
icon: action.icon,
permissions: action.permissions,
type: action.type || FileActions.TYPE_DROPDOWN
@@ -565,6 +566,7 @@
this.registerAction({
name: 'Download',
displayName: t('files', 'Download'),
+ order: -20,
mime: 'all',
permissions: OC.PERMISSION_READ,
icon: function () {
@@ -596,6 +598,7 @@
name: 'Rename',
displayName: t('files', 'Rename'),
mime: 'all',
+ order: -30,
permissions: OC.PERMISSION_UPDATE,
icon: function() {
return OC.imagePath('core', 'actions/rename');
@@ -617,6 +620,7 @@
name: 'Delete',
displayName: t('files', 'Delete'),
mime: 'all',
+ order: 1000,
// permission is READ because we show a hint instead if there is no permission
permissions: OC.PERMISSION_DELETE,
icon: function() {
diff --git a/apps/files/js/fileactionsmenu.js b/apps/files/js/fileactionsmenu.js
index 5ab0e42f93e..67cbb48c965 100644
--- a/apps/files/js/fileactionsmenu.js
+++ b/apps/files/js/fileactionsmenu.js
@@ -100,6 +100,14 @@
(!defaultAction || actionSpec.name !== defaultAction.name)
);
});
+ items = items.sort(function(actionA, actionB) {
+ var orderA = actionA.order || 0;
+ var orderB = actionB.order || 0;
+ if (orderB === orderA) {
+ return OC.Util.naturalSortCompare(actionA.displayName, actionB.displayName);
+ }
+ return orderA - orderB;
+ });
items = _.map(items, function(item) {
item.nameLowerCase = item.name.toLowerCase();
return item;
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 4b1b38d783c..9c4e43b3b8b 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -239,13 +239,6 @@
this.updateSearch();
- this.$el.on('click', function(event) {
- var $target = $(event.target);
- // click outside file row ?
- if (!$target.closest('tbody').length && !$target.closest('#app-sidebar').length) {
- self._updateDetailsView(null);
- }
- });
this.$fileList.on('click','td.filename>a.name', _.bind(this._onClickFile, this));
this.$fileList.on('change', 'td.filename>.selectCheckBox', _.bind(this._onClickFileCheckbox, this));
this.$el.on('urlChanged', _.bind(this._onUrlChanged, this));
@@ -278,6 +271,9 @@
if (this._newButton) {
this._newButton.remove();
}
+ if (this._detailsView) {
+ this._detailsView.remove();
+ }
// TODO: also unregister other event handlers
this.fileActions.off('registerAction', this._onFileActionsUpdated);
this.fileActions.off('setDefault', this._onFileActionsUpdated);
@@ -302,11 +298,11 @@
name: 'Details',
displayName: t('files', 'Details'),
mime: 'all',
+ order: -50,
icon: OC.imagePath('core', 'actions/details'),
permissions: OC.PERMISSION_READ,
actionHandler: function(fileName, context) {
self._updateDetailsView(fileName);
- OC.Apps.showAppSidebar(self._detailsView.$el);
}
});
}
@@ -407,9 +403,14 @@
this._currentFileModel.off();
}
this._currentFileModel = null;
+ OC.Apps.hideAppSidebar(this._detailsView.$el);
return;
}
+ if (this._detailsView.$el.hasClass('disappear')) {
+ OC.Apps.showAppSidebar(this._detailsView.$el);
+ }
+
var $tr = this.findFileEl(fileName);
var model = this.getModelForFile($tr);
@@ -452,10 +453,10 @@
* Selected/deselects the given file element and updated
* the internal selection cache.
*
- * @param $tr single file row element
- * @param state true to select, false to deselect
+ * @param {Object} $tr single file row element
+ * @param {bool} state true to select, false to deselect
*/
- _selectFileEl: function($tr, state) {
+ _selectFileEl: function($tr, state, showDetailsView) {
var $checkbox = $tr.find('td.filename>.selectCheckBox');
var oldData = !!this._selectedFiles[$tr.data('id')];
var data;
@@ -474,11 +475,8 @@
delete this._selectedFiles[$tr.data('id')];
this._selectionSummary.remove(data);
}
- if (this._selectionSummary.getTotal() === 1) {
+ if (this._detailsView && this._selectionSummary.getTotal() === 1 && !this._detailsView.$el.hasClass('disappear')) {
this._updateDetailsView(_.values(this._selectedFiles)[0].name);
- } else {
- // show nothing when multiple files are selected
- this._updateDetailsView(null);
}
this.$el.find('.select-all').prop('checked', this._selectionSummary.getTotal() === this.files.length);
},
@@ -488,6 +486,9 @@
*/
_onClickFile: function(event) {
var $tr = $(event.target).closest('tr');
+ if ($tr.hasClass('dragging')) {
+ return;
+ }
if (this._allowSelection && (event.ctrlKey || event.shiftKey)) {
event.preventDefault();
if (event.shiftKey) {
@@ -551,9 +552,13 @@
*/
_onClickFileCheckbox: function(e) {
var $tr = $(e.target).closest('tr');
- this._selectFileEl($tr, !$tr.hasClass('selected'));
+ var state = !$tr.hasClass('selected');
+ this._selectFileEl($tr, state);
this._lastChecked = $tr;
this.updateSelectionSummary();
+ if (state) {
+ this._updateDetailsView($tr.attr('data-file'));
+ }
},
/**
@@ -623,6 +628,9 @@
* Event handler when clicking on a table header
*/
_onClickHeader: function(e) {
+ if (this.$table.hasClass('multiselect')) {
+ return;
+ }
var $target = $(e.target);
var sort;
if (!$target.is('a')) {
@@ -718,8 +726,23 @@
return true;
},
/**
- * Returns the tr element for a given file name
- * @param fileName file name
+ * Returns the file info for the given file name from the internal collection.
+ *
+ * @param {string} fileName file name
+ * @return {OCA.Files.FileInfo} file info or null if it was not found
+ *
+ * @since 8.2
+ */
+ findFile: function(fileName) {
+ return _.find(this.files, function(aFile) {
+ return (aFile.name === fileName);
+ }) || null;
+ },
+ /**
+ * Returns the tr element for a given file name, but only if it was already rendered.
+ *
+ * @param {string} fileName file name
+ * @return {Object} jQuery object of the matching row
*/
findFileEl: function(fileName){
// use filterAttr to avoid escaping issues
@@ -925,7 +948,7 @@
if (this._allowSelection) {
td.append(
'<input id="select-' + this.id + '-' + fileData.id +
- '" type="checkbox" class="selectCheckBox"/><label for="select-' + this.id + '-' + fileData.id + '">' +
+ '" type="checkbox" class="selectCheckBox checkbox"/><label for="select-' + this.id + '-' + fileData.id + '">' +
'<div class="thumbnail" style="background-image:url(' + icon + '); background-size: 32px;"></div>' +
'<span class="hidden-visually">' + t('files', 'Select') + '</span>' +
'</label>'
@@ -1304,8 +1327,10 @@
sortdirection: this._sortDirection
}
});
- // close sidebar
- this._updateDetailsView(null);
+ if (this._detailsView) {
+ // close sidebar
+ this._updateDetailsView(null);
+ }
var callBack = this.reloadCallback.bind(this);
return this._reloadCall.then(callBack, callBack);
},
@@ -1386,15 +1411,15 @@
generatePreviewUrl: function(urlSpec) {
urlSpec = urlSpec || {};
if (!urlSpec.x) {
- urlSpec.x = this.$table.data('preview-x') || 36;
+ urlSpec.x = this.$table.data('preview-x') || 32;
}
if (!urlSpec.y) {
- urlSpec.y = this.$table.data('preview-y') || 36;
+ urlSpec.y = this.$table.data('preview-y') || 32;
}
urlSpec.x *= window.devicePixelRatio;
urlSpec.y *= window.devicePixelRatio;
- urlSpec.x = Math.floor(urlSpec.x);
- urlSpec.y = Math.floor(urlSpec.y);
+ urlSpec.x = Math.ceil(urlSpec.x);
+ urlSpec.y = Math.ceil(urlSpec.y);
urlSpec.forceIcon = 0;
return OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
},
@@ -1512,11 +1537,12 @@
remove: function(name, options){
options = options || {};
var fileEl = this.findFileEl(name);
+ var fileId = fileEl.data('id');
var index = fileEl.index();
if (!fileEl.length) {
return null;
}
- if (this._selectedFiles[fileEl.data('id')]) {
+ if (this._selectedFiles[fileId]) {
// remove from selection first
this._selectFileEl(fileEl, false);
this.updateSelectionSummary();
@@ -1526,6 +1552,14 @@
fileEl.find('td.filename').draggable('destroy');
}
this.files.splice(index, 1);
+ if (this._currentFileModel && this._currentFileModel.get('id') === fileId) {
+ // Note: in the future we should call destroy() directly on the model
+ // and the model will take care of the deletion.
+ // Here we only trigger the event to notify listeners that
+ // the file was removed.
+ this._currentFileModel.trigger('destroy');
+ this._updateDetailsView(null);
+ }
fileEl.remove();
// TODO: improve performance on batch update
this.isEmpty = !this.files.length;
@@ -1876,7 +1910,7 @@
* @return {bool} true if the file exists in the list, false otherwise
*/
inList:function(file) {
- return this.findFileEl(file).length;
+ return this.findFile(file);
},
/**
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 4fdc9eb2110..9ab7609cc40 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -356,7 +356,7 @@ var createDragShadow = function(event) {
var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked');
if (!isDragSelected) {
//select dragged file
- FileList._selectFileEl($(event.target).parents('tr:first'), true);
+ FileList._selectFileEl($(event.target).parents('tr:first'), true, false);
}
// do not show drag shadow for too many files
@@ -365,7 +365,7 @@ var createDragShadow = function(event) {
if (!isDragSelected && selectedFiles.length === 1) {
//revert the selection
- FileList._selectFileEl($(event.target).parents('tr:first'), false);
+ FileList._selectFileEl($(event.target).parents('tr:first'), false, false);
}
// build dragshadow
@@ -413,22 +413,17 @@ var dragOptions={
cursor: 'move',
start: function(event, ui){
var $selectedFiles = $('td.filename input:checkbox:checked');
- if($selectedFiles.length > 1){
- $selectedFiles.parents('tr').fadeTo(250, 0.2);
- }
- else{
- $(this).fadeTo(250, 0.2);
+ if (!$selectedFiles.length) {
+ $selectedFiles = $(this);
}
+ $selectedFiles.closest('tr').fadeTo(250, 0.2).addClass('dragging');
},
stop: function(event, ui) {
var $selectedFiles = $('td.filename input:checkbox:checked');
- if($selectedFiles.length > 1){
- $selectedFiles.parents('tr').fadeTo(250, 1);
- }
- else{
- $(this).fadeTo(250, 1);
+ if (!$selectedFiles.length) {
+ $selectedFiles = $(this);
}
- $('#fileList tr td.filename').addClass('ui-draggable');
+ $selectedFiles.closest('tr').fadeTo(250, 1).removeClass('dragging');
}
};
// sane browsers support using the distance option
diff --git a/apps/files/js/mainfileinfodetailview.js b/apps/files/js/mainfileinfodetailview.js
index 830f074f3f1..b50e92dea8c 100644
--- a/apps/files/js/mainfileinfodetailview.js
+++ b/apps/files/js/mainfileinfodetailview.js
@@ -10,7 +10,7 @@
(function() {
var TEMPLATE =
- '<div class="thumbnailContainer"><a href="#" class="thumbnail action-default"></a></div>' +
+ '<div class="thumbnailContainer"><a href="#" class="thumbnail action-default"><div class="stretcher"/></a></div>' +
'<div class="file-details-container">' +
'<div class="fileName"><h3 title="{{name}}" class="ellipsis">{{name}}</h3></div>' +
' <div class="file-details ellipsis">' +
@@ -131,6 +131,7 @@
} else {
// TODO: special icons / shared / external
$iconDiv.css('background-image', 'url("' + OC.MimeType.getIconUrl('dir') + '")');
+ OC.Util.scaleFixForIE8($iconDiv);
}
this.$el.find('[title]').tooltip({placement: 'bottom'});
} else {
@@ -140,13 +141,18 @@
},
loadPreview: function(path, mime, etag, $iconDiv, $container, isImage) {
- var maxImageHeight = ($container.parent().width() + 50) / (16/9); // 30px for negative margin
+ var maxImageWidth = $container.parent().width() + 50; // 50px for negative margins
+ var maxImageHeight = maxImageWidth / (16/9);
var smallPreviewSize = 75;
var isLandscape = function(img) {
return img.width > (img.height * 1.2);
};
+ var isSmall = function(img) {
+ return (img.width * 1.1) < (maxImageWidth * window.devicePixelRatio);
+ };
+
var getTargetHeight = function(img) {
if(isImage) {
var targetHeight = img.height / window.devicePixelRatio;
@@ -159,13 +165,23 @@
}
};
+ var getTargetRatio = function(img){
+ var ratio = img.width / img.height;
+ if (ratio > 16/9) {
+ return ratio;
+ } else {
+ return 16/9;
+ }
+ };
+
this._fileList.lazyLoadPreview({
path: path,
mime: mime,
etag: etag,
y: isImage ? maxImageHeight : smallPreviewSize,
- x: isImage ? 99999 /* only limit on y */ : smallPreviewSize,
+ x: isImage ? maxImageWidth : smallPreviewSize,
a: isImage ? 1 : null,
+ mode: isImage ? 'cover' : null,
callback: function (previewUrl, img) {
$iconDiv.previewImg = previewUrl;
@@ -176,9 +192,7 @@
$iconDiv.removeClass('icon-loading icon-32');
var targetHeight = getTargetHeight(img);
if (this.model.isImage() && targetHeight > smallPreviewSize) {
- if (!isLandscape(img)) {
- $container.addClass('portrait');
- }
+ $container.addClass((isLandscape(img) && !isSmall(img))? 'landscape': 'portrait');
$container.addClass('image');
}
@@ -186,7 +200,13 @@
// when we dont have a preview we show the mime icon in the error handler
$iconDiv.css({
'background-image': 'url("' + previewUrl + '")',
- 'height': targetHeight
+ height: (targetHeight > smallPreviewSize)? 'auto': targetHeight,
+ 'max-height': isSmall(img)? targetHeight: null
+ });
+
+ var targetRatio = getTargetRatio(img);
+ $iconDiv.find('.stretcher').css({
+ 'padding-bottom': (100 / targetRatio) + '%'
});
}.bind(this),
error: function () {
@@ -195,6 +215,7 @@
$iconDiv.css({
'background-image': 'url("' + $iconDiv.previewImg + '")'
});
+ OC.Util.scaleFixForIE8($iconDiv);
}.bind(this)
});
}
diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js
index 4c021e6b873..0a67aba202b 100644
--- a/apps/files/js/newfilemenu.js
+++ b/apps/files/js/newfilemenu.js
@@ -84,6 +84,8 @@
OC.hideMenus();
} else {
event.preventDefault();
+ this.$el.find('.menuitem.active').removeClass('active');
+ $target.addClass('active');
this._promptFileName($target);
}
},
@@ -210,6 +212,7 @@
fileType: 'folder'
}]
}));
+ OC.Util.scaleFixForIE8(this.$('.svg'));
},
/**
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index 6dab5f6ba27..f6bc5581b76 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -29,6 +29,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.",
"Actions" : "* تطبيقات.\n* أنشطة.",
"Download" : "تحميل",
+ "Rename" : "إعادة التسمية",
+ "Delete" : "إلغاء",
+ "Details" : "تفاصيل",
"Pending" : "قيد الانتظار",
"Error moving file" : "حدث خطأ أثناء نقل الملف",
"Error" : "خطأ",
@@ -71,7 +74,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>",
"Cancel upload" : "إلغاء الرفع",
- "Delete" : "إلغاء",
"Upload too large" : "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
"Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات ."
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index 745d82dc19b..2de484b30f2 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -27,6 +27,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.",
"Actions" : "* تطبيقات.\n* أنشطة.",
"Download" : "تحميل",
+ "Rename" : "إعادة التسمية",
+ "Delete" : "إلغاء",
+ "Details" : "تفاصيل",
"Pending" : "قيد الانتظار",
"Error moving file" : "حدث خطأ أثناء نقل الملف",
"Error" : "خطأ",
@@ -69,7 +72,6 @@
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>",
"Cancel upload" : "إلغاء الرفع",
- "Delete" : "إلغاء",
"Upload too large" : "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
"Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات ."
diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js
index 33bf5e37c0a..ffba40ec793 100644
--- a/apps/files/l10n/ast.js
+++ b/apps/files/l10n/ast.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.",
"Actions" : "Aiciones",
"Download" : "Descargar",
+ "Rename" : "Renomar",
+ "Delete" : "Desaniciar",
+ "Details" : "Detalles",
"Select" : "Esbillar",
"Pending" : "Pendiente",
"Unable to determine date" : "Imposible determinar la fecha",
@@ -92,7 +95,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>",
"Cancel upload" : "Encaboxar xuba",
- "Delete" : "Desaniciar",
"Upload too large" : "La xuba ye abondo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.",
"Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.",
diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json
index 601bf2d85f1..353511d5586 100644
--- a/apps/files/l10n/ast.json
+++ b/apps/files/l10n/ast.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.",
"Actions" : "Aiciones",
"Download" : "Descargar",
+ "Rename" : "Renomar",
+ "Delete" : "Desaniciar",
+ "Details" : "Detalles",
"Select" : "Esbillar",
"Pending" : "Pendiente",
"Unable to determine date" : "Imposible determinar la fecha",
@@ -90,7 +93,6 @@
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>",
"Cancel upload" : "Encaboxar xuba",
- "Delete" : "Desaniciar",
"Upload too large" : "La xuba ye abondo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.",
"Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.",
diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js
index 54b17d6df55..b278fad62b1 100644
--- a/apps/files/l10n/az.js
+++ b/apps/files/l10n/az.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
"Actions" : "İşlər",
"Download" : "Yüklə",
+ "Rename" : "Adı dəyiş",
+ "Delete" : "Sil",
+ "Details" : "Detallar",
"Select" : "Seç",
"Pending" : "Gözləmə",
"Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
- "Delete" : "Sil",
"Upload too large" : "Yüklənmə şox böyükdür",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.",
"Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.",
diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json
index 14d728f248a..8603939790d 100644
--- a/apps/files/l10n/az.json
+++ b/apps/files/l10n/az.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
"Actions" : "İşlər",
"Download" : "Yüklə",
+ "Rename" : "Adı dəyiş",
+ "Delete" : "Sil",
+ "Details" : "Detallar",
"Select" : "Seç",
"Pending" : "Gözləmə",
"Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
- "Delete" : "Sil",
"Upload too large" : "Yüklənmə şox böyükdür",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.",
"Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.",
diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js
index f21c5de9dc1..98e0e2bd4b9 100644
--- a/apps/files/l10n/bg_BG.js
+++ b/apps/files/l10n/bg_BG.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.",
"Actions" : "Действия",
"Download" : "Изтегли",
+ "Rename" : "Преименуване",
+ "Delete" : "Изтрий",
+ "Details" : "Подробности",
"Select" : "Избери",
"Pending" : "Чакащо",
"Unable to determine date" : "Неуспешно установяване на дата",
@@ -100,7 +103,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Качи съдържание или синхронизирай с твоите устройства!",
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
- "Delete" : "Изтрий",
"Upload too large" : "Прекалено голям файл за качване.",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.",
"Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.",
diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json
index 6778eff6da8..48d6729232b 100644
--- a/apps/files/l10n/bg_BG.json
+++ b/apps/files/l10n/bg_BG.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.",
"Actions" : "Действия",
"Download" : "Изтегли",
+ "Rename" : "Преименуване",
+ "Delete" : "Изтрий",
+ "Details" : "Подробности",
"Select" : "Избери",
"Pending" : "Чакащо",
"Unable to determine date" : "Неуспешно установяване на дата",
@@ -98,7 +101,6 @@
"Upload some content or sync with your devices!" : "Качи съдържание или синхронизирай с твоите устройства!",
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
- "Delete" : "Изтрий",
"Upload too large" : "Прекалено голям файл за качване.",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.",
"Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.",
diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js
index 1272966209b..bc8d7ce8d5c 100644
--- a/apps/files/l10n/bn_BD.js
+++ b/apps/files/l10n/bn_BD.js
@@ -29,6 +29,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
"Actions" : "পদক্ষেপসমূহ",
"Download" : "ডাউনলোড",
+ "Rename" : "পূনঃনামকরণ",
+ "Delete" : "মুছে",
+ "Details" : "বিস্তারিত",
"Pending" : "মুলতুবি",
"Error moving file." : "ফাইল সরাতে সমস্যা হলো।",
"Error moving file" : "ফাইল সরাতে সমস্যা হলো",
@@ -65,7 +68,6 @@ OC.L10N.register(
"Settings" : "নিয়ামকসমূহ",
"WebDAV" : "WebDAV",
"Cancel upload" : "আপলোড বাতিল কর",
- "Delete" : "মুছে",
"Upload too large" : "আপলোডের আকারটি অনেক বড়",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
"Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।"
diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json
index 472aae78865..43ebbc8ad96 100644
--- a/apps/files/l10n/bn_BD.json
+++ b/apps/files/l10n/bn_BD.json
@@ -27,6 +27,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
"Actions" : "পদক্ষেপসমূহ",
"Download" : "ডাউনলোড",
+ "Rename" : "পূনঃনামকরণ",
+ "Delete" : "মুছে",
+ "Details" : "বিস্তারিত",
"Pending" : "মুলতুবি",
"Error moving file." : "ফাইল সরাতে সমস্যা হলো।",
"Error moving file" : "ফাইল সরাতে সমস্যা হলো",
@@ -63,7 +66,6 @@
"Settings" : "নিয়ামকসমূহ",
"WebDAV" : "WebDAV",
"Cancel upload" : "আপলোড বাতিল কর",
- "Delete" : "মুছে",
"Upload too large" : "আপলোডের আকারটি অনেক বড়",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
"Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।"
diff --git a/apps/files/l10n/bn_IN.js b/apps/files/l10n/bn_IN.js
index 995c9ad45d1..d7f61133133 100644
--- a/apps/files/l10n/bn_IN.js
+++ b/apps/files/l10n/bn_IN.js
@@ -16,6 +16,8 @@ OC.L10N.register(
"Files" : "ফাইলস",
"Close" : "বন্ধ",
"Download" : "ডাউনলোড করুন",
+ "Rename" : "পুনঃনামকরণ",
+ "Delete" : "মুছে ফেলা",
"Pending" : "মুলতুবি",
"Error" : "ভুল",
"Name" : "নাম",
@@ -32,7 +34,6 @@ OC.L10N.register(
"You deleted %1$s" : "আপনি %1$s কে মুছেছেন",
"%2$s deleted %1$s" : "%2$s মুছেছে %1$s কে",
"Save" : "সেভ",
- "Settings" : "সেটিংস",
- "Delete" : "মুছে ফেলা"
+ "Settings" : "সেটিংস"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/bn_IN.json b/apps/files/l10n/bn_IN.json
index 17ce39d023a..f2d5d9fbf74 100644
--- a/apps/files/l10n/bn_IN.json
+++ b/apps/files/l10n/bn_IN.json
@@ -14,6 +14,8 @@
"Files" : "ফাইলস",
"Close" : "বন্ধ",
"Download" : "ডাউনলোড করুন",
+ "Rename" : "পুনঃনামকরণ",
+ "Delete" : "মুছে ফেলা",
"Pending" : "মুলতুবি",
"Error" : "ভুল",
"Name" : "নাম",
@@ -30,7 +32,6 @@
"You deleted %1$s" : "আপনি %1$s কে মুছেছেন",
"%2$s deleted %1$s" : "%2$s মুছেছে %1$s কে",
"Save" : "সেভ",
- "Settings" : "সেটিংস",
- "Delete" : "মুছে ফেলা"
+ "Settings" : "সেটিংস"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js
index f10c87bfef8..6ca6ebe90c5 100644
--- a/apps/files/l10n/bs.js
+++ b/apps/files/l10n/bs.js
@@ -38,6 +38,8 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
"Download" : "Preuzmi",
+ "Rename" : "Preimenuj",
+ "Delete" : "Izbriši",
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemoguće odrediti datum",
@@ -81,7 +83,6 @@ OC.L10N.register(
"Cancel upload" : "Prekini učitavanje",
"Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!",
"Select all" : "Označi sve",
- "Delete" : "Izbriši",
"Upload too large" : "Učitavanje je preveliko",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.",
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.",
diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json
index 7d8a87f6398..553662622f2 100644
--- a/apps/files/l10n/bs.json
+++ b/apps/files/l10n/bs.json
@@ -36,6 +36,8 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
"Download" : "Preuzmi",
+ "Rename" : "Preimenuj",
+ "Delete" : "Izbriši",
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemoguće odrediti datum",
@@ -79,7 +81,6 @@
"Cancel upload" : "Prekini učitavanje",
"Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!",
"Select all" : "Označi sve",
- "Delete" : "Izbriši",
"Upload too large" : "Učitavanje je preveliko",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.",
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.",
diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js
index f8388534802..b5cd0beedfe 100644
--- a/apps/files/l10n/ca.js
+++ b/apps/files/l10n/ca.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.",
"Actions" : "Accions",
"Download" : "Baixa",
+ "Rename" : "Reanomena",
+ "Delete" : "Esborra",
+ "Details" : "Detalls",
"Select" : "Selecciona",
"Pending" : "Pendent",
"Unable to determine date" : "No s'ha pogut determinar la data",
@@ -103,7 +106,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.",
"No entries found in this folder" : "No hi ha entrades en aquesta carpeta",
"Select all" : "Seleccionar tot",
- "Delete" : "Esborra",
"Upload too large" : "La pujada és massa gran",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
"Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu",
diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json
index 10a39fc941a..7558821627f 100644
--- a/apps/files/l10n/ca.json
+++ b/apps/files/l10n/ca.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.",
"Actions" : "Accions",
"Download" : "Baixa",
+ "Rename" : "Reanomena",
+ "Delete" : "Esborra",
+ "Details" : "Detalls",
"Select" : "Selecciona",
"Pending" : "Pendent",
"Unable to determine date" : "No s'ha pogut determinar la data",
@@ -101,7 +104,6 @@
"Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.",
"No entries found in this folder" : "No hi ha entrades en aquesta carpeta",
"Select all" : "Seleccionar tot",
- "Delete" : "Esborra",
"Upload too large" : "La pujada és massa gran",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
"Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu",
diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js
index a5c1449e995..7ef3a2ec9aa 100644
--- a/apps/files/l10n/cs_CZ.js
+++ b/apps/files/l10n/cs_CZ.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.",
"Actions" : "Činnosti",
"Download" : "Stáhnout",
+ "Rename" : "Přejmenovat",
+ "Delete" : "Smazat",
+ "Details" : "Podrobnosti",
"Select" : "Vybrat",
"Pending" : "Nevyřízené",
"Unable to determine date" : "Nelze určit datum",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
- "Delete" : "Smazat",
"Upload too large" : "Odesílaný soubor je příliš velký",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.",
"Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.",
diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json
index 1da4bfb8868..55b374f9ea6 100644
--- a/apps/files/l10n/cs_CZ.json
+++ b/apps/files/l10n/cs_CZ.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.",
"Actions" : "Činnosti",
"Download" : "Stáhnout",
+ "Rename" : "Přejmenovat",
+ "Delete" : "Smazat",
+ "Details" : "Podrobnosti",
"Select" : "Vybrat",
"Pending" : "Nevyřízené",
"Unable to determine date" : "Nelze určit datum",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
- "Delete" : "Smazat",
"Upload too large" : "Odesílaný soubor je příliš velký",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.",
"Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.",
diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js
index bdf61e20f24..2f64d032f01 100644
--- a/apps/files/l10n/cy_GB.js
+++ b/apps/files/l10n/cy_GB.js
@@ -20,6 +20,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.",
"Actions" : "Gweithredoedd",
"Download" : "Llwytho i lawr",
+ "Rename" : "Ailenwi",
+ "Delete" : "Dileu",
+ "Details" : "Manylion",
"Pending" : "I ddod",
"Error" : "Gwall",
"{new_name} already exists" : "{new_name} yn bodoli'n barod",
@@ -39,7 +42,6 @@ OC.L10N.register(
"Save" : "Cadw",
"Settings" : "Gosodiadau",
"Cancel upload" : "Diddymu llwytho i fyny",
- "Delete" : "Dileu",
"Upload too large" : "Maint llwytho i fyny'n rhy fawr",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.",
"Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio."
diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json
index eb66c24ec62..602cc780abe 100644
--- a/apps/files/l10n/cy_GB.json
+++ b/apps/files/l10n/cy_GB.json
@@ -18,6 +18,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.",
"Actions" : "Gweithredoedd",
"Download" : "Llwytho i lawr",
+ "Rename" : "Ailenwi",
+ "Delete" : "Dileu",
+ "Details" : "Manylion",
"Pending" : "I ddod",
"Error" : "Gwall",
"{new_name} already exists" : "{new_name} yn bodoli'n barod",
@@ -37,7 +40,6 @@
"Save" : "Cadw",
"Settings" : "Gosodiadau",
"Cancel upload" : "Diddymu llwytho i fyny",
- "Delete" : "Dileu",
"Upload too large" : "Maint llwytho i fyny'n rhy fawr",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.",
"Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio."
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index cc7aac18351..84d342e85d9 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.",
"Actions" : "Handlinger",
"Download" : "Download",
+ "Rename" : "Omdøb",
+ "Delete" : "Slet",
+ "Details" : "Detaljer",
"Select" : "Vælg",
"Pending" : "Afventer",
"Unable to determine date" : "Kan ikke fastslå datoen",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
- "Delete" : "Slet",
"Upload too large" : "Upload er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
"Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.",
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index b77937420f4..53de8656af2 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.",
"Actions" : "Handlinger",
"Download" : "Download",
+ "Rename" : "Omdøb",
+ "Delete" : "Slet",
+ "Details" : "Detaljer",
"Select" : "Vælg",
"Pending" : "Afventer",
"Unable to determine date" : "Kan ikke fastslå datoen",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
- "Delete" : "Slet",
"Upload too large" : "Upload er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
"Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.",
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 5e22e05f80d..2f9a48f0fd4 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.",
"Actions" : "Aktionen",
"Download" : "Herunterladen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Details" : "Details",
"Select" : "Auswählen",
"Pending" : "Ausstehend",
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
@@ -107,7 +110,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!",
"No entries found in this folder" : "Keine Einträge in diesem Ordner",
"Select all" : "Alle auswählen",
- "Delete" : "Löschen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 5e93d2b3856..6457eded01a 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.",
"Actions" : "Aktionen",
"Download" : "Herunterladen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Details" : "Details",
"Select" : "Auswählen",
"Pending" : "Ausstehend",
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
@@ -105,7 +108,6 @@
"Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!",
"No entries found in this folder" : "Keine Einträge in diesem Ordner",
"Select all" : "Alle auswählen",
- "Delete" : "Löschen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js
index 70adef6bb08..4f5296dc11f 100644
--- a/apps/files/l10n/de_AT.js
+++ b/apps/files/l10n/de_AT.js
@@ -4,6 +4,8 @@ OC.L10N.register(
"Unknown error" : "Unbekannter Fehler",
"Files" : "Dateien",
"Download" : "Herunterladen",
+ "Delete" : "Löschen",
+ "Details" : "Details",
"Error" : "Fehler",
"Upload" : "Hochladen",
"New folder" : "Neuer Ordner",
@@ -18,7 +20,6 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s löschte %1$s",
"Save" : "Speichern",
"Settings" : "Einstellungen",
- "Cancel upload" : "Hochladen abbrechen",
- "Delete" : "Löschen"
+ "Cancel upload" : "Hochladen abbrechen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json
index 8766f264741..91ec7e5e4e1 100644
--- a/apps/files/l10n/de_AT.json
+++ b/apps/files/l10n/de_AT.json
@@ -2,6 +2,8 @@
"Unknown error" : "Unbekannter Fehler",
"Files" : "Dateien",
"Download" : "Herunterladen",
+ "Delete" : "Löschen",
+ "Details" : "Details",
"Error" : "Fehler",
"Upload" : "Hochladen",
"New folder" : "Neuer Ordner",
@@ -16,7 +18,6 @@
"%2$s deleted %1$s" : "%2$s löschte %1$s",
"Save" : "Speichern",
"Settings" : "Einstellungen",
- "Cancel upload" : "Hochladen abbrechen",
- "Delete" : "Löschen"
+ "Cancel upload" : "Hochladen abbrechen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 34c6c8fb4a6..9a75b417ace 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
"Actions" : "Aktionen",
"Download" : "Herunterladen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Details" : "Details",
"Select" : "Auswählen",
"Pending" : "Ausstehend",
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
@@ -105,7 +108,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
- "Delete" : "Löschen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 390e5e0e575..910ad9ac6aa 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
"Actions" : "Aktionen",
"Download" : "Herunterladen",
+ "Rename" : "Umbenennen",
+ "Delete" : "Löschen",
+ "Details" : "Details",
"Select" : "Auswählen",
"Pending" : "Ausstehend",
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
@@ -103,7 +106,6 @@
"Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!",
"No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden",
"Select all" : "Alle auswählen",
- "Delete" : "Löschen",
"Upload too large" : "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js
index fe65869c3bb..895ffe19267 100644
--- a/apps/files/l10n/el.js
+++ b/apps/files/l10n/el.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.",
"Actions" : "Ενέργειες",
"Download" : "Λήψη",
+ "Rename" : "Μετονομασία",
+ "Delete" : "Διαγραφή",
+ "Details" : "Λεπτομέρειες",
"Select" : "Επιλογή",
"Pending" : "Εκκρεμεί",
"Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
"Select all" : "Επιλογή όλων",
- "Delete" : "Διαγραφή",
"Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.",
"Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.",
diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json
index 37ff95b406e..0d24b6c7015 100644
--- a/apps/files/l10n/el.json
+++ b/apps/files/l10n/el.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.",
"Actions" : "Ενέργειες",
"Download" : "Λήψη",
+ "Rename" : "Μετονομασία",
+ "Delete" : "Διαγραφή",
+ "Details" : "Λεπτομέρειες",
"Select" : "Επιλογή",
"Pending" : "Εκκρεμεί",
"Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Μεταφόρτωση περιεχομένου ή συγχρονισμός με τις συσκευές σας!",
"No entries found in this folder" : "Δεν βρέθηκαν καταχωρήσεις σε αυτόν το φάκελο",
"Select all" : "Επιλογή όλων",
- "Delete" : "Διαγραφή",
"Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.",
"Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.",
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index decfe4dcd83..5109eb0743b 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "File upload is in progress. Leaving the page now will cancel the upload.",
"Actions" : "Actions",
"Download" : "Download",
+ "Rename" : "Rename",
+ "Delete" : "Delete",
+ "Details" : "Details",
"Select" : "Select",
"Pending" : "Pending",
"Unable to determine date" : "Unable to determine date",
@@ -101,7 +104,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
"No entries found in this folder" : "No entries found in this folder",
"Select all" : "Select all",
- "Delete" : "Delete",
"Upload too large" : "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.",
"Files are being scanned, please wait." : "Files are being scanned, please wait.",
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index cf06affa55e..1f9acabeda3 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "File upload is in progress. Leaving the page now will cancel the upload.",
"Actions" : "Actions",
"Download" : "Download",
+ "Rename" : "Rename",
+ "Delete" : "Delete",
+ "Details" : "Details",
"Select" : "Select",
"Pending" : "Pending",
"Unable to determine date" : "Unable to determine date",
@@ -99,7 +102,6 @@
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
"No entries found in this folder" : "No entries found in this folder",
"Select all" : "Select all",
- "Delete" : "Delete",
"Upload too large" : "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.",
"Files are being scanned, please wait." : "Files are being scanned, please wait.",
diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js
index 3c208a6bc17..b881c3d9d01 100644
--- a/apps/files/l10n/eo.js
+++ b/apps/files/l10n/eo.js
@@ -31,6 +31,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.",
"Actions" : "Agoj",
"Download" : "Elŝuti",
+ "Rename" : "Alinomigi",
+ "Delete" : "Forigi",
+ "Details" : "Detaloj",
"Select" : "Elekti",
"Pending" : "Traktotaj",
"Error moving file" : "Eraris movo de dosiero",
@@ -76,7 +79,6 @@ OC.L10N.register(
"Cancel upload" : "Nuligi alŝuton",
"No files in here" : "Neniu dosiero estas ĉi tie",
"Select all" : "Elekti ĉion",
- "Delete" : "Forigi",
"Upload too large" : "Alŝuto tro larĝa",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
"Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi."
diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json
index bf69b68d883..93f3bdbede1 100644
--- a/apps/files/l10n/eo.json
+++ b/apps/files/l10n/eo.json
@@ -29,6 +29,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.",
"Actions" : "Agoj",
"Download" : "Elŝuti",
+ "Rename" : "Alinomigi",
+ "Delete" : "Forigi",
+ "Details" : "Detaloj",
"Select" : "Elekti",
"Pending" : "Traktotaj",
"Error moving file" : "Eraris movo de dosiero",
@@ -74,7 +77,6 @@
"Cancel upload" : "Nuligi alŝuton",
"No files in here" : "Neniu dosiero estas ĉi tie",
"Select all" : "Elekti ĉion",
- "Delete" : "Forigi",
"Upload too large" : "Alŝuto tro larĝa",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
"Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi."
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 318a86e5884..11dce6e8da5 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"Actions" : "Acciones",
"Download" : "Descargar",
+ "Rename" : "Renombrar",
+ "Delete" : "Eliminar",
+ "Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendiente",
"Unable to determine date" : "No se pudo determinar la fecha",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.",
"No entries found in this folder" : "No hay entradas en esta carpeta",
"Select all" : "Seleccionar todo",
- "Delete" : "Eliminar",
"Upload too large" : "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 26761bf2073..6a325f1c3c6 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"Actions" : "Acciones",
"Download" : "Descargar",
+ "Rename" : "Renombrar",
+ "Delete" : "Eliminar",
+ "Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendiente",
"Unable to determine date" : "No se pudo determinar la fecha",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.",
"No entries found in this folder" : "No hay entradas en esta carpeta",
"Select all" : "Seleccionar todo",
- "Delete" : "Eliminar",
"Upload too large" : "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.",
diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js
index f99464401b6..f81f0e6bed1 100644
--- a/apps/files/l10n/es_AR.js
+++ b/apps/files/l10n/es_AR.js
@@ -31,6 +31,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.",
"Actions" : "Acciones",
"Download" : "Descargar",
+ "Rename" : "Cambiar nombre",
+ "Delete" : "Borrar",
+ "Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendientes",
"Error moving file" : "Error moviendo el archivo",
@@ -75,7 +78,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
- "Delete" : "Borrar",
"Upload too large" : "El tamaño del archivo que querés subir es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ",
"Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá."
diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json
index 43dc9d35c3c..a9d5c8ece30 100644
--- a/apps/files/l10n/es_AR.json
+++ b/apps/files/l10n/es_AR.json
@@ -29,6 +29,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.",
"Actions" : "Acciones",
"Download" : "Descargar",
+ "Rename" : "Cambiar nombre",
+ "Delete" : "Borrar",
+ "Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendientes",
"Error moving file" : "Error moviendo el archivo",
@@ -73,7 +76,6 @@
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
- "Delete" : "Borrar",
"Upload too large" : "El tamaño del archivo que querés subir es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ",
"Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá."
diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js
index c6269cdafd1..9b0929f50af 100644
--- a/apps/files/l10n/es_CL.js
+++ b/apps/files/l10n/es_CL.js
@@ -4,6 +4,8 @@ OC.L10N.register(
"Unknown error" : "Error desconocido",
"Files" : "Archivos",
"Download" : "Descargar",
+ "Rename" : "Renombrar",
+ "Details" : "detalles",
"Error" : "Error",
"Upload" : "Subir",
"New folder" : "Nuevo directorio",
diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json
index 75215c9cb7f..57c23a61ea7 100644
--- a/apps/files/l10n/es_CL.json
+++ b/apps/files/l10n/es_CL.json
@@ -2,6 +2,8 @@
"Unknown error" : "Error desconocido",
"Files" : "Archivos",
"Download" : "Descargar",
+ "Rename" : "Renombrar",
+ "Details" : "detalles",
"Error" : "Error",
"Upload" : "Subir",
"New folder" : "Nuevo directorio",
diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js
index b58037005aa..29514b18226 100644
--- a/apps/files/l10n/es_MX.js
+++ b/apps/files/l10n/es_MX.js
@@ -31,6 +31,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"Actions" : "Acciones",
"Download" : "Descargar",
+ "Rename" : "Renombrar",
+ "Delete" : "Eliminar",
+ "Details" : "Detalles",
"Pending" : "Pendiente",
"Error moving file" : "Error moviendo archivo",
"Error" : "Error",
@@ -65,7 +68,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
- "Delete" : "Eliminar",
"Upload too large" : "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere."
diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json
index 5655fd4bf09..520f2d0c446 100644
--- a/apps/files/l10n/es_MX.json
+++ b/apps/files/l10n/es_MX.json
@@ -29,6 +29,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"Actions" : "Acciones",
"Download" : "Descargar",
+ "Rename" : "Renombrar",
+ "Delete" : "Eliminar",
+ "Details" : "Detalles",
"Pending" : "Pendiente",
"Error moving file" : "Error moviendo archivo",
"Error" : "Error",
@@ -63,7 +66,6 @@
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>",
"Cancel upload" : "Cancelar subida",
- "Delete" : "Eliminar",
"Upload too large" : "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere."
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index 173c6d5503a..86bda48300b 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.",
"Actions" : "Tegevused",
"Download" : "Lae alla",
+ "Rename" : "Nimeta ümber",
+ "Delete" : "Kustuta",
+ "Details" : "Üksikasjad",
"Select" : "Vali",
"Pending" : "Ootel",
"Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud",
@@ -106,7 +109,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
"No entries found in this folder" : "Selles kaustast ei leitud kirjeid",
"Select all" : "Vali kõik",
- "Delete" : "Kustuta",
"Upload too large" : "Üleslaadimine on liiga suur",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
"Files are being scanned, please wait." : "Faile skannitakse, palun oota.",
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index d880d3d4720..a95de6cf039 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.",
"Actions" : "Tegevused",
"Download" : "Lae alla",
+ "Rename" : "Nimeta ümber",
+ "Delete" : "Kustuta",
+ "Details" : "Üksikasjad",
"Select" : "Vali",
"Pending" : "Ootel",
"Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud",
@@ -104,7 +107,6 @@
"Upload some content or sync with your devices!" : "Laadi sisu üles või süngi oma seadmetega!",
"No entries found in this folder" : "Selles kaustast ei leitud kirjeid",
"Select all" : "Vali kõik",
- "Delete" : "Kustuta",
"Upload too large" : "Üleslaadimine on liiga suur",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
"Files are being scanned, please wait." : "Faile skannitakse, palun oota.",
diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js
index 249e73b1871..c01afc96c55 100644
--- a/apps/files/l10n/eu.js
+++ b/apps/files/l10n/eu.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.",
"Actions" : "Ekintzak",
"Download" : "Deskargatu",
+ "Rename" : "Berrizendatu",
+ "Delete" : "Ezabatu",
+ "Details" : "Xehetasunak",
"Select" : "hautatu",
"Pending" : "Zain",
"Unable to determine date" : "Ezin izan da data zehaztu",
@@ -96,7 +99,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!",
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
"Select all" : "Hautatu dena",
- "Delete" : "Ezabatu",
"Upload too large" : "Igoera handiegia da",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
"Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json
index 5e610f3f4fa..997e8bf73cf 100644
--- a/apps/files/l10n/eu.json
+++ b/apps/files/l10n/eu.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.",
"Actions" : "Ekintzak",
"Download" : "Deskargatu",
+ "Rename" : "Berrizendatu",
+ "Delete" : "Ezabatu",
+ "Details" : "Xehetasunak",
"Select" : "hautatu",
"Pending" : "Zain",
"Unable to determine date" : "Ezin izan da data zehaztu",
@@ -94,7 +97,6 @@
"Upload some content or sync with your devices!" : "Igo edukiren bat edo sinkronizatu zure gailuekin!",
"No entries found in this folder" : "Ez da sarrerarik aurkitu karpeta honetan",
"Select all" : "Hautatu dena",
- "Delete" : "Ezabatu",
"Upload too large" : "Igoera handiegia da",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
"Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js
index 984c53c3740..d238f45eb7e 100644
--- a/apps/files/l10n/fa.js
+++ b/apps/files/l10n/fa.js
@@ -24,6 +24,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ",
"Actions" : "فعالیت ها",
"Download" : "دانلود",
+ "Rename" : "تغییرنام",
+ "Delete" : "حذف",
+ "Details" : "جزئیات",
"Pending" : "در انتظار",
"Error" : "خطا",
"{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.",
@@ -61,7 +64,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید</a>",
"Cancel upload" : "متوقف کردن بار گذاری",
- "Delete" : "حذف",
"Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
"Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید"
diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json
index 361dbee1a1f..5985202ae8d 100644
--- a/apps/files/l10n/fa.json
+++ b/apps/files/l10n/fa.json
@@ -22,6 +22,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ",
"Actions" : "فعالیت ها",
"Download" : "دانلود",
+ "Rename" : "تغییرنام",
+ "Delete" : "حذف",
+ "Details" : "جزئیات",
"Pending" : "در انتظار",
"Error" : "خطا",
"{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.",
@@ -59,7 +62,6 @@
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید</a>",
"Cancel upload" : "متوقف کردن بار گذاری",
- "Delete" : "حذف",
"Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
"Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید"
diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js
index c6615a61234..a44c9f4fcd9 100644
--- a/apps/files/l10n/fi_FI.js
+++ b/apps/files/l10n/fi_FI.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.",
"Actions" : "Toiminnot",
"Download" : "Lataa",
+ "Rename" : "Nimeä uudelleen",
+ "Delete" : "Poista",
+ "Details" : "Tiedot",
"Select" : "Valitse",
"Pending" : "Odottaa",
"Unable to determine date" : "Päivämäärän määrittäminen epäonnistui",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
"No entries found in this folder" : "Ei kohteita tässä kansiossa",
"Select all" : "Valitse kaikki",
- "Delete" : "Poista",
"Upload too large" : "Lähetettävä tiedosto on liian suuri",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
"Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.",
diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json
index 9be7c66d37a..7528802b94b 100644
--- a/apps/files/l10n/fi_FI.json
+++ b/apps/files/l10n/fi_FI.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.",
"Actions" : "Toiminnot",
"Download" : "Lataa",
+ "Rename" : "Nimeä uudelleen",
+ "Delete" : "Poista",
+ "Details" : "Tiedot",
"Select" : "Valitse",
"Pending" : "Odottaa",
"Unable to determine date" : "Päivämäärän määrittäminen epäonnistui",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!",
"No entries found in this folder" : "Ei kohteita tässä kansiossa",
"Select all" : "Valitse kaikki",
- "Delete" : "Poista",
"Upload too large" : "Lähetettävä tiedosto on liian suuri",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
"Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 3b84a6c0c53..bd39511a431 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"Actions" : "Actions",
"Download" : "Télécharger",
+ "Rename" : "Renommer",
+ "Delete" : "Supprimer",
+ "Details" : "Détails",
"Select" : "Sélectionner",
"Pending" : "En attente",
"Unable to determine date" : "Impossible de déterminer la date",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
- "Delete" : "Supprimer",
"Upload too large" : "Téléversement trop volumineux",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.",
"Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 4d05b5a42c3..dbff6e6731d 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"Actions" : "Actions",
"Download" : "Télécharger",
+ "Rename" : "Renommer",
+ "Delete" : "Supprimer",
+ "Details" : "Détails",
"Select" : "Sélectionner",
"Pending" : "En attente",
"Unable to determine date" : "Impossible de déterminer la date",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
- "Delete" : "Supprimer",
"Upload too large" : "Téléversement trop volumineux",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.",
"Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.",
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index 4293b3ab9ba..2910ab97ea4 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
"Actions" : "Accións",
"Download" : "Descargar",
+ "Rename" : "Renomear",
+ "Delete" : "Eliminar",
+ "Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendentes",
"Unable to determine date" : "Non é posíbel determinar a data",
@@ -107,7 +110,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
"No entries found in this folder" : "Non se atoparon entradas neste cartafol",
"Select all" : "Seleccionar todo",
- "Delete" : "Eliminar",
"Upload too large" : "Envío grande de máis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.",
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index 34eeaa6a369..386df1569a9 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
"Actions" : "Accións",
"Download" : "Descargar",
+ "Rename" : "Renomear",
+ "Delete" : "Eliminar",
+ "Details" : "Detalles",
"Select" : "Seleccionar",
"Pending" : "Pendentes",
"Unable to determine date" : "Non é posíbel determinar a data",
@@ -105,7 +108,6 @@
"Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!",
"No entries found in this folder" : "Non se atoparon entradas neste cartafol",
"Select all" : "Seleccionar todo",
- "Delete" : "Eliminar",
"Upload too large" : "Envío grande de máis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.",
diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js
index 94956cbff0e..1eaf54aad71 100644
--- a/apps/files/l10n/he.js
+++ b/apps/files/l10n/he.js
@@ -24,6 +24,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.",
"Actions" : "פעולות",
"Download" : "הורדה",
+ "Rename" : "שינוי שם",
+ "Delete" : "מחיקה",
+ "Details" : "פרטים",
"Select" : "בחר",
"Pending" : "ממתין",
"Error" : "שגיאה",
@@ -57,7 +60,6 @@ OC.L10N.register(
"Settings" : "הגדרות",
"WebDAV" : "WebDAV",
"Cancel upload" : "ביטול ההעלאה",
- "Delete" : "מחיקה",
"Upload too large" : "העלאה גדולה מידי",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
"Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין."
diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json
index 8dfc57f3276..fe56eef25c2 100644
--- a/apps/files/l10n/he.json
+++ b/apps/files/l10n/he.json
@@ -22,6 +22,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.",
"Actions" : "פעולות",
"Download" : "הורדה",
+ "Rename" : "שינוי שם",
+ "Delete" : "מחיקה",
+ "Details" : "פרטים",
"Select" : "בחר",
"Pending" : "ממתין",
"Error" : "שגיאה",
@@ -55,7 +58,6 @@
"Settings" : "הגדרות",
"WebDAV" : "WebDAV",
"Cancel upload" : "ביטול ההעלאה",
- "Delete" : "מחיקה",
"Upload too large" : "העלאה גדולה מידי",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
"Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין."
diff --git a/apps/files/l10n/hi.js b/apps/files/l10n/hi.js
index c040105875d..2a546af9b1e 100644
--- a/apps/files/l10n/hi.js
+++ b/apps/files/l10n/hi.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Files" : "फाइलें ",
"Close" : "बंद करें ",
+ "Details" : "विवरण ",
"Error" : "त्रुटि",
"Upload" : "अपलोड ",
"New folder" : "नया फ़ोल्डर",
diff --git a/apps/files/l10n/hi.json b/apps/files/l10n/hi.json
index 70db8f9d7f1..47830eca416 100644
--- a/apps/files/l10n/hi.json
+++ b/apps/files/l10n/hi.json
@@ -1,6 +1,7 @@
{ "translations": {
"Files" : "फाइलें ",
"Close" : "बंद करें ",
+ "Details" : "विवरण ",
"Error" : "त्रुटि",
"Upload" : "अपलोड ",
"New folder" : "नया फ़ोल्डर",
diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js
index 379d43f4dbd..d6e48d1da13 100644
--- a/apps/files/l10n/hr.js
+++ b/apps/files/l10n/hr.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
"Download" : "Preuzimanje",
+ "Rename" : "Preimenujte",
+ "Delete" : "Izbrišite",
+ "Details" : "Detalji",
"Select" : "Selektiraj",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemogucnost odredjivanja datuma",
@@ -96,7 +99,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Aplodujte neki sadrzaj ili sinkronizirajte sa vasim uredjajem!",
"No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ",
"Select all" : "Selektiraj sve",
- "Delete" : "Izbrišite",
"Upload too large" : "Unos je prevelik",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.",
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.",
diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json
index a8d935848ea..99f7737b66c 100644
--- a/apps/files/l10n/hr.json
+++ b/apps/files/l10n/hr.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.",
"Actions" : "Radnje",
"Download" : "Preuzimanje",
+ "Rename" : "Preimenujte",
+ "Delete" : "Izbrišite",
+ "Details" : "Detalji",
"Select" : "Selektiraj",
"Pending" : "Na čekanju",
"Unable to determine date" : "Nemogucnost odredjivanja datuma",
@@ -94,7 +97,6 @@
"Upload some content or sync with your devices!" : "Aplodujte neki sadrzaj ili sinkronizirajte sa vasim uredjajem!",
"No entries found in this folder" : "Zapis nije pronadjen u ovom direktorijumu ",
"Select all" : "Selektiraj sve",
- "Delete" : "Izbrišite",
"Upload too large" : "Unos je prevelik",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.",
"Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.",
diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js
index 8b9b7c17f15..dfa628279c9 100644
--- a/apps/files/l10n/hu_HU.js
+++ b/apps/files/l10n/hu_HU.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
"Actions" : "Műveletek",
"Download" : "Letöltés",
+ "Rename" : "Átnevezés",
+ "Delete" : "Törlés",
+ "Details" : "Részletek",
"Select" : "Kiválaszt",
"Pending" : "Folyamatban",
"Unable to determine date" : "Nem lehet meghatározni a dátumot",
@@ -95,7 +98,7 @@ OC.L10N.register(
"%2$s restored %1$s" : "%1$s visszatöltötte %2$s",
"%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett",
"%s could not be renamed" : "%s átnevezése nem sikerült",
- "Upload (max. %s)" : "Feltöltés (max. %s)",
+ "Upload (max. %s)" : "Feltöltés (max.: %s)",
"File handling" : "Fájlkezelés",
"Maximum upload size" : "Maximális feltölthető fájlméret",
"max. possible: " : "max. lehetséges: ",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel!",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
"Select all" : "Összes kijelölése",
- "Delete" : "Törlés",
"Upload too large" : "A feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.",
"Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!",
diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json
index 6d82cd60413..0a6c87b9892 100644
--- a/apps/files/l10n/hu_HU.json
+++ b/apps/files/l10n/hu_HU.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
"Actions" : "Műveletek",
"Download" : "Letöltés",
+ "Rename" : "Átnevezés",
+ "Delete" : "Törlés",
+ "Details" : "Részletek",
"Select" : "Kiválaszt",
"Pending" : "Folyamatban",
"Unable to determine date" : "Nem lehet meghatározni a dátumot",
@@ -93,7 +96,7 @@
"%2$s restored %1$s" : "%1$s visszatöltötte %2$s",
"%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett",
"%s could not be renamed" : "%s átnevezése nem sikerült",
- "Upload (max. %s)" : "Feltöltés (max. %s)",
+ "Upload (max. %s)" : "Feltöltés (max.: %s)",
"File handling" : "Fájlkezelés",
"Maximum upload size" : "Maximális feltölthető fájlméret",
"max. possible: " : "max. lehetséges: ",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Tölts fel néhány tartalmat, vagy szinkronizálj az eszközöddel!",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
"Select all" : "Összes kijelölése",
- "Delete" : "Törlés",
"Upload too large" : "A feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.",
"Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!",
diff --git a/apps/files/l10n/hy.js b/apps/files/l10n/hy.js
index 9ddfc91b18b..7c49399856c 100644
--- a/apps/files/l10n/hy.js
+++ b/apps/files/l10n/hy.js
@@ -3,7 +3,7 @@ OC.L10N.register(
{
"Close" : "Փակել",
"Download" : "Բեռնել",
- "Save" : "Պահպանել",
- "Delete" : "Ջնջել"
+ "Delete" : "Ջնջել",
+ "Save" : "Պահպանել"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/hy.json b/apps/files/l10n/hy.json
index 2c9d1859b12..8501b7eb9b2 100644
--- a/apps/files/l10n/hy.json
+++ b/apps/files/l10n/hy.json
@@ -1,7 +1,7 @@
{ "translations": {
"Close" : "Փակել",
"Download" : "Բեռնել",
- "Save" : "Պահպանել",
- "Delete" : "Ջնջել"
+ "Delete" : "Ջնջել",
+ "Save" : "Պահպանել"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js
index 9b5d321937e..84f3b4d8c45 100644
--- a/apps/files/l10n/ia.js
+++ b/apps/files/l10n/ia.js
@@ -9,6 +9,7 @@ OC.L10N.register(
"Home" : "Domo",
"Close" : "Clauder",
"Download" : "Discargar",
+ "Delete" : "Deler",
"Error" : "Error",
"Name" : "Nomine",
"Size" : "Dimension",
@@ -36,7 +37,6 @@ OC.L10N.register(
"Maximum upload size" : "Dimension maxime de incargamento",
"Save" : "Salveguardar",
"Settings" : "Configurationes",
- "Delete" : "Deler",
"Upload too large" : "Incargamento troppo longe"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json
index 461634d526a..2843f8789ac 100644
--- a/apps/files/l10n/ia.json
+++ b/apps/files/l10n/ia.json
@@ -7,6 +7,7 @@
"Home" : "Domo",
"Close" : "Clauder",
"Download" : "Discargar",
+ "Delete" : "Deler",
"Error" : "Error",
"Name" : "Nomine",
"Size" : "Dimension",
@@ -34,7 +35,6 @@
"Maximum upload size" : "Dimension maxime de incargamento",
"Save" : "Salveguardar",
"Settings" : "Configurationes",
- "Delete" : "Deler",
"Upload too large" : "Incargamento troppo longe"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js
index e41d94643a9..4eb8836d1c8 100644
--- a/apps/files/l10n/id.js
+++ b/apps/files/l10n/id.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.",
"Actions" : "Tindakan",
"Download" : "Unduh",
+ "Rename" : "Ubah nama",
+ "Delete" : "Hapus",
+ "Details" : "Rincian",
"Select" : "Pilih",
"Pending" : "Tertunda",
"Unable to determine date" : "Tidak dapat menentukan tanggal",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!",
"No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini",
"Select all" : "Pilih Semua",
- "Delete" : "Hapus",
"Upload too large" : "Yang diunggah terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.",
"Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.",
diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json
index 6be0c1a226c..bcf66fa3a1e 100644
--- a/apps/files/l10n/id.json
+++ b/apps/files/l10n/id.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.",
"Actions" : "Tindakan",
"Download" : "Unduh",
+ "Rename" : "Ubah nama",
+ "Delete" : "Hapus",
+ "Details" : "Rincian",
"Select" : "Pilih",
"Pending" : "Tertunda",
"Unable to determine date" : "Tidak dapat menentukan tanggal",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Unggah beberapa konten dan sinkronisasikan dengan perangkat Anda!",
"No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini",
"Select all" : "Pilih Semua",
- "Delete" : "Hapus",
"Upload too large" : "Yang diunggah terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.",
"Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.",
diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js
index 7ac24eba462..780dbe4301f 100644
--- a/apps/files/l10n/is.js
+++ b/apps/files/l10n/is.js
@@ -17,6 +17,8 @@ OC.L10N.register(
"Upload cancelled." : "Hætt við innsendingu.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.",
"Download" : "Niðurhal",
+ "Rename" : "Endurskýra",
+ "Delete" : "Eyða",
"Select" : "Velja",
"Pending" : "Bíður",
"Error" : "Villa",
@@ -38,7 +40,6 @@ OC.L10N.register(
"Cancel upload" : "Hætta við innsendingu",
"No entries found in this folder" : "Engar skrár fundust í þessari möppu",
"Select all" : "Velja allt",
- "Delete" : "Eyða",
"Upload too large" : "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
"Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu."
diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json
index 8e723d963a7..aed9568f7d0 100644
--- a/apps/files/l10n/is.json
+++ b/apps/files/l10n/is.json
@@ -15,6 +15,8 @@
"Upload cancelled." : "Hætt við innsendingu.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.",
"Download" : "Niðurhal",
+ "Rename" : "Endurskýra",
+ "Delete" : "Eyða",
"Select" : "Velja",
"Pending" : "Bíður",
"Error" : "Villa",
@@ -36,7 +38,6 @@
"Cancel upload" : "Hætta við innsendingu",
"No entries found in this folder" : "Engar skrár fundust í þessari möppu",
"Select all" : "Velja allt",
- "Delete" : "Eyða",
"Upload too large" : "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
"Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu."
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index aa92ffc0f70..681940955dc 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.",
"Actions" : "Azioni",
"Download" : "Scarica",
+ "Rename" : "Rinomina",
+ "Delete" : "Elimina",
+ "Details" : "Dettagli",
"Select" : "Seleziona",
"Pending" : "In corso",
"Unable to determine date" : "Impossibile determinare la data",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!",
"No entries found in this folder" : "Nessuna voce trovata in questa cartella",
"Select all" : "Seleziona tutto",
- "Delete" : "Elimina",
"Upload too large" : "Caricamento troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
"Files are being scanned, please wait." : "Scansione dei file in corso, attendi",
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 8f18858b2eb..1075d43e984 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.",
"Actions" : "Azioni",
"Download" : "Scarica",
+ "Rename" : "Rinomina",
+ "Delete" : "Elimina",
+ "Details" : "Dettagli",
"Select" : "Seleziona",
"Pending" : "In corso",
"Unable to determine date" : "Impossibile determinare la data",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!",
"No entries found in this folder" : "Nessuna voce trovata in questa cartella",
"Select all" : "Seleziona tutto",
- "Delete" : "Elimina",
"Upload too large" : "Caricamento troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
"Files are being scanned, please wait." : "Scansione dei file in corso, attendi",
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 91e75e6e76a..dbf66176c06 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
"Actions" : "アクション",
"Download" : "ダウンロード",
+ "Rename" : "名前の変更",
+ "Delete" : "削除",
+ "Details" : "詳細",
"Select" : "選択",
"Pending" : "中断",
"Unable to determine date" : "更新日不明",
@@ -108,7 +111,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
"Select all" : "すべて選択",
- "Delete" : "削除",
"Upload too large" : "アップロードには大きすぎます。",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。",
"Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。",
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 7c0c94c0348..5a562f400c0 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
"Actions" : "アクション",
"Download" : "ダウンロード",
+ "Rename" : "名前の変更",
+ "Delete" : "削除",
+ "Details" : "詳細",
"Select" : "選択",
"Pending" : "中断",
"Unable to determine date" : "更新日不明",
@@ -106,7 +109,6 @@
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
"Select all" : "すべて選択",
- "Delete" : "削除",
"Upload too large" : "アップロードには大きすぎます。",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。",
"Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。",
diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js
index 33135feb7cc..c76e75864f9 100644
--- a/apps/files/l10n/ka_GE.js
+++ b/apps/files/l10n/ka_GE.js
@@ -22,6 +22,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას",
"Actions" : "მოქმედებები",
"Download" : "ჩამოტვირთვა",
+ "Rename" : "გადარქმევა",
+ "Delete" : "წაშლა",
+ "Details" : "დეტალური ინფორმაცია",
"Pending" : "მოცდის რეჟიმში",
"Error" : "შეცდომა",
"{new_name} already exists" : "{new_name} უკვე არსებობს",
@@ -44,7 +47,6 @@ OC.L10N.register(
"Settings" : "პარამეტრები",
"WebDAV" : "WebDAV",
"Cancel upload" : "ატვირთვის გაუქმება",
- "Delete" : "წაშლა",
"Upload too large" : "ასატვირთი ფაილი ძალიან დიდია",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
"Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ."
diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json
index ef3f109d306..058bee2618b 100644
--- a/apps/files/l10n/ka_GE.json
+++ b/apps/files/l10n/ka_GE.json
@@ -20,6 +20,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას",
"Actions" : "მოქმედებები",
"Download" : "ჩამოტვირთვა",
+ "Rename" : "გადარქმევა",
+ "Delete" : "წაშლა",
+ "Details" : "დეტალური ინფორმაცია",
"Pending" : "მოცდის რეჟიმში",
"Error" : "შეცდომა",
"{new_name} already exists" : "{new_name} უკვე არსებობს",
@@ -42,7 +45,6 @@
"Settings" : "პარამეტრები",
"WebDAV" : "WebDAV",
"Cancel upload" : "ატვირთვის გაუქმება",
- "Delete" : "წაშლა",
"Upload too large" : "ასატვირთი ფაილი ძალიან დიდია",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
"Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ."
diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js
index 6b8517e7229..030bdd35eda 100644
--- a/apps/files/l10n/km.js
+++ b/apps/files/l10n/km.js
@@ -10,6 +10,9 @@ OC.L10N.register(
"Close" : "បិទ",
"Upload cancelled." : "បាន​បោះបង់​ការ​ផ្ទុក​ឡើង។",
"Download" : "ទាញយក",
+ "Rename" : "ប្ដូរ​ឈ្មោះ",
+ "Delete" : "លុប",
+ "Details" : "ព័ត៌មាន​លម្អិត",
"Pending" : "កំពុង​រង់ចាំ",
"Error" : "កំហុស",
"{new_name} already exists" : "មាន​ឈ្មោះ {new_name} រួច​ហើយ",
@@ -33,7 +36,6 @@ OC.L10N.register(
"Settings" : "ការកំណត់",
"WebDAV" : "WebDAV",
"Cancel upload" : "បោះបង់​ការ​ផ្ទុកឡើង",
- "Delete" : "លុប",
"Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json
index ebbb9a8b4ab..679787a5ce2 100644
--- a/apps/files/l10n/km.json
+++ b/apps/files/l10n/km.json
@@ -8,6 +8,9 @@
"Close" : "បិទ",
"Upload cancelled." : "បាន​បោះបង់​ការ​ផ្ទុក​ឡើង។",
"Download" : "ទាញយក",
+ "Rename" : "ប្ដូរ​ឈ្មោះ",
+ "Delete" : "លុប",
+ "Details" : "ព័ត៌មាន​លម្អិត",
"Pending" : "កំពុង​រង់ចាំ",
"Error" : "កំហុស",
"{new_name} already exists" : "មាន​ឈ្មោះ {new_name} រួច​ហើយ",
@@ -31,7 +34,6 @@
"Settings" : "ការកំណត់",
"WebDAV" : "WebDAV",
"Cancel upload" : "បោះបង់​ការ​ផ្ទុកឡើង",
- "Delete" : "លុប",
"Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js
index 9bd8982fdaf..7538d9b033e 100644
--- a/apps/files/l10n/kn.js
+++ b/apps/files/l10n/kn.js
@@ -29,6 +29,8 @@ OC.L10N.register(
"Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.",
"Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.",
"Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ",
+ "Rename" : "ಮರುಹೆಸರಿಸು",
+ "Delete" : "ಅಳಿಸಿ",
"Select" : "ಆಯ್ಕೆ ಮಾಡಿ",
"Pending" : "ಬಾಕಿ ಇದೆ",
"Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
@@ -64,7 +66,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Cancel upload" : "ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ",
"Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ",
- "Delete" : "ಅಳಿಸಿ",
"Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.",
"Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.",
diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json
index 803b1c87cf4..b9f55d4151a 100644
--- a/apps/files/l10n/kn.json
+++ b/apps/files/l10n/kn.json
@@ -27,6 +27,8 @@
"Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.",
"Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.",
"Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ",
+ "Rename" : "ಮರುಹೆಸರಿಸು",
+ "Delete" : "ಅಳಿಸಿ",
"Select" : "ಆಯ್ಕೆ ಮಾಡಿ",
"Pending" : "ಬಾಕಿ ಇದೆ",
"Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
@@ -62,7 +64,6 @@
"WebDAV" : "WebDAV",
"Cancel upload" : "ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ",
"Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ",
- "Delete" : "ಅಳಿಸಿ",
"Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.",
"Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.",
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index 709e0faa0cb..87b7d0e655c 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
"Actions" : "작업",
"Download" : "다운로드",
+ "Rename" : "이름 바꾸기",
+ "Delete" : "삭제",
+ "Details" : "자세한 정보",
"Select" : "선택",
"Pending" : "대기 중",
"Unable to determine date" : "날짜를 결정할 수 없음",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
"No entries found in this folder" : "이 폴더에 항목 없음",
"Select all" : "모두 선택",
- "Delete" : "삭제",
"Upload too large" : "업로드한 파일이 너무 큼",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
"Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.",
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index e8f89a5c142..8a9dc1cf432 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
"Actions" : "작업",
"Download" : "다운로드",
+ "Rename" : "이름 바꾸기",
+ "Delete" : "삭제",
+ "Details" : "자세한 정보",
"Select" : "선택",
"Pending" : "대기 중",
"Unable to determine date" : "날짜를 결정할 수 없음",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "파일을 업로드하거나 장치와 동기화하십시오!",
"No entries found in this folder" : "이 폴더에 항목 없음",
"Select all" : "모두 선택",
- "Delete" : "삭제",
"Upload too large" : "업로드한 파일이 너무 큼",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
"Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.",
diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js
index 513d802c1e4..047aac2dbb3 100644
--- a/apps/files/l10n/lb.js
+++ b/apps/files/l10n/lb.js
@@ -15,6 +15,9 @@ OC.L10N.register(
"Upload cancelled." : "Upload ofgebrach.",
"File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.",
"Download" : "Download",
+ "Rename" : "Ëmbenennen",
+ "Delete" : "Läschen",
+ "Details" : "Detailer",
"Select" : "Auswielen",
"Error" : "Fehler",
"Name" : "Numm",
@@ -33,7 +36,6 @@ OC.L10N.register(
"Cancel upload" : "Upload ofbriechen",
"No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
"Select all" : "All auswielen",
- "Delete" : "Läschen",
"Upload too large" : "Upload ze grouss",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
"Files are being scanned, please wait." : "Fichieren gi gescannt, war weg."
diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json
index fb586a90991..f298444a35f 100644
--- a/apps/files/l10n/lb.json
+++ b/apps/files/l10n/lb.json
@@ -13,6 +13,9 @@
"Upload cancelled." : "Upload ofgebrach.",
"File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.",
"Download" : "Download",
+ "Rename" : "Ëmbenennen",
+ "Delete" : "Läschen",
+ "Details" : "Detailer",
"Select" : "Auswielen",
"Error" : "Fehler",
"Name" : "Numm",
@@ -31,7 +34,6 @@
"Cancel upload" : "Upload ofbriechen",
"No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
"Select all" : "All auswielen",
- "Delete" : "Läschen",
"Upload too large" : "Upload ze grouss",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
"Files are being scanned, please wait." : "Fichieren gi gescannt, war weg."
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index 26fb351f50d..063789aae5b 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
"Actions" : "Veiksmai",
"Download" : "Atsisiųsti",
+ "Rename" : "Pervadinti",
+ "Delete" : "Ištrinti",
+ "Details" : "Informacija",
"Select" : "Pasirinkiti",
"Pending" : "Laukiantis",
"Unable to determine date" : "Nepavyksta nustatyti datos",
@@ -105,7 +108,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!",
"No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
- "Delete" : "Ištrinti",
"Upload too large" : "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje",
"Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.",
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index ee8fb0480c2..d7aa2cc9c35 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
"Actions" : "Veiksmai",
"Download" : "Atsisiųsti",
+ "Rename" : "Pervadinti",
+ "Delete" : "Ištrinti",
+ "Details" : "Informacija",
"Select" : "Pasirinkiti",
"Pending" : "Laukiantis",
"Unable to determine date" : "Nepavyksta nustatyti datos",
@@ -103,7 +106,6 @@
"Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!",
"No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
- "Delete" : "Ištrinti",
"Upload too large" : "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje",
"Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.",
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
index e86b2d335e7..fa5ddf4f402 100644
--- a/apps/files/l10n/lv.js
+++ b/apps/files/l10n/lv.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.",
"Actions" : "Darbības",
"Download" : "Lejupielādēt",
+ "Rename" : "Pārsaukt",
+ "Delete" : "Dzēst",
+ "Details" : "Detaļas",
"Select" : "Norādīt",
"Pending" : "Gaida savu kārtu",
"Unable to determine date" : "Neizdevās noteikt datumu",
@@ -98,7 +101,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!",
"No entries found in this folder" : "Šajā mapē nekas nav atrasts",
"Select all" : "Atzīmēt visu",
- "Delete" : "Dzēst",
"Upload too large" : "Datne ir par lielu, lai to augšupielādētu",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu",
"Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.",
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
index 7a5a53c1305..b164c88e381 100644
--- a/apps/files/l10n/lv.json
+++ b/apps/files/l10n/lv.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.",
"Actions" : "Darbības",
"Download" : "Lejupielādēt",
+ "Rename" : "Pārsaukt",
+ "Delete" : "Dzēst",
+ "Details" : "Detaļas",
"Select" : "Norādīt",
"Pending" : "Gaida savu kārtu",
"Unable to determine date" : "Neizdevās noteikt datumu",
@@ -96,7 +99,6 @@
"Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!",
"No entries found in this folder" : "Šajā mapē nekas nav atrasts",
"Select all" : "Atzīmēt visu",
- "Delete" : "Dzēst",
"Upload too large" : "Datne ir par lielu, lai to augšupielādētu",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu",
"Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.",
diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js
index b9225ac6708..e6265c851e8 100644
--- a/apps/files/l10n/mk.js
+++ b/apps/files/l10n/mk.js
@@ -28,6 +28,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.",
"Actions" : "Акции",
"Download" : "Преземи",
+ "Rename" : "Преименувај",
+ "Delete" : "Избриши",
+ "Details" : "Детали:",
"Select" : "Избери",
"Pending" : "Чека",
"Error moving file" : "Грешка при префрлање на датотека",
@@ -63,7 +66,6 @@ OC.L10N.register(
"Settings" : "Подесувања",
"WebDAV" : "WebDAV",
"Cancel upload" : "Откажи прикачување",
- "Delete" : "Избриши",
"Upload too large" : "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
"Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте."
diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json
index e6ce76ecb45..0806f7d0966 100644
--- a/apps/files/l10n/mk.json
+++ b/apps/files/l10n/mk.json
@@ -26,6 +26,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.",
"Actions" : "Акции",
"Download" : "Преземи",
+ "Rename" : "Преименувај",
+ "Delete" : "Избриши",
+ "Details" : "Детали:",
"Select" : "Избери",
"Pending" : "Чека",
"Error moving file" : "Грешка при префрлање на датотека",
@@ -61,7 +64,6 @@
"Settings" : "Подесувања",
"WebDAV" : "WebDAV",
"Cancel upload" : "Откажи прикачување",
- "Delete" : "Избриши",
"Upload too large" : "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
"Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте."
diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js
index 0bbbe400b28..7ef2afeb84e 100644
--- a/apps/files/l10n/ms_MY.js
+++ b/apps/files/l10n/ms_MY.js
@@ -13,6 +13,8 @@ OC.L10N.register(
"Close" : "Tutup",
"Upload cancelled." : "Muatnaik dibatalkan.",
"Download" : "Muat turun",
+ "Rename" : "Namakan",
+ "Delete" : "Padam",
"Pending" : "Dalam proses",
"Error" : "Ralat",
"Name" : "Nama",
@@ -31,7 +33,6 @@ OC.L10N.register(
"Save" : "Simpan",
"Settings" : "Tetapan",
"Cancel upload" : "Batal muat naik",
- "Delete" : "Padam",
"Upload too large" : "Muatnaik terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
"Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar."
diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json
index 071fab23194..aec2dd50949 100644
--- a/apps/files/l10n/ms_MY.json
+++ b/apps/files/l10n/ms_MY.json
@@ -11,6 +11,8 @@
"Close" : "Tutup",
"Upload cancelled." : "Muatnaik dibatalkan.",
"Download" : "Muat turun",
+ "Rename" : "Namakan",
+ "Delete" : "Padam",
"Pending" : "Dalam proses",
"Error" : "Ralat",
"Name" : "Nama",
@@ -29,7 +31,6 @@
"Save" : "Simpan",
"Settings" : "Tetapan",
"Cancel upload" : "Batal muat naik",
- "Delete" : "Padam",
"Upload too large" : "Muatnaik terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
"Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar."
diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js
index c91f212cf23..3d27173708d 100644
--- a/apps/files/l10n/nb_NO.js
+++ b/apps/files/l10n/nb_NO.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.",
"Actions" : "Handlinger",
"Download" : "Last ned",
+ "Rename" : "Gi nytt navn",
+ "Delete" : "Slett",
+ "Details" : "Detaljer",
"Select" : "Velg",
"Pending" : "Ventende",
"Unable to determine date" : "Kan ikke fastslå datoen",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
- "Delete" : "Slett",
"Upload too large" : "Filen er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.",
"Files are being scanned, please wait." : "Skanner filer, vennligst vent.",
diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json
index cd476ef3bcf..a7e0cf33b83 100644
--- a/apps/files/l10n/nb_NO.json
+++ b/apps/files/l10n/nb_NO.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.",
"Actions" : "Handlinger",
"Download" : "Last ned",
+ "Rename" : "Gi nytt navn",
+ "Delete" : "Slett",
+ "Details" : "Detaljer",
"Select" : "Velg",
"Pending" : "Ventende",
"Unable to determine date" : "Kan ikke fastslå datoen",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
- "Delete" : "Slett",
"Upload too large" : "Filen er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.",
"Files are being scanned, please wait." : "Skanner filer, vennligst vent.",
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 3470d011dc6..c11318c2890 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.",
"Actions" : "Acties",
"Download" : "Downloaden",
+ "Rename" : "Naam wijzigen",
+ "Delete" : "Verwijderen",
+ "Details" : "Details",
"Select" : "Selecteer",
"Pending" : "In behandeling",
"Unable to determine date" : "Kon datum niet vaststellen",
@@ -109,7 +112,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!",
"No entries found in this folder" : "Niets",
"Select all" : "Alles selecteren",
- "Delete" : "Verwijderen",
"Upload too large" : "Upload is te groot",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
"Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.",
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index 04c0b7916b5..1a80d1eb3f1 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.",
"Actions" : "Acties",
"Download" : "Downloaden",
+ "Rename" : "Naam wijzigen",
+ "Delete" : "Verwijderen",
+ "Details" : "Details",
"Select" : "Selecteer",
"Pending" : "In behandeling",
"Unable to determine date" : "Kon datum niet vaststellen",
@@ -107,7 +110,6 @@
"Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!",
"No entries found in this folder" : "Niets",
"Select all" : "Alles selecteren",
- "Delete" : "Verwijderen",
"Upload too large" : "Upload is te groot",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
"Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.",
diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js
index cc993f5ca6d..924670d596b 100644
--- a/apps/files/l10n/nn_NO.js
+++ b/apps/files/l10n/nn_NO.js
@@ -28,6 +28,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
"Actions" : "Handlingar",
"Download" : "Last ned",
+ "Rename" : "Endra namn",
+ "Delete" : "Slett",
+ "Details" : "Detaljar",
"Pending" : "Under vegs",
"Error moving file" : "Feil ved flytting av fil",
"Error" : "Feil",
@@ -66,7 +69,6 @@ OC.L10N.register(
"Settings" : "Innstillingar",
"WebDAV" : "WebDAV",
"Cancel upload" : "Avbryt opplasting",
- "Delete" : "Slett",
"Upload too large" : "For stor opplasting",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.",
"Files are being scanned, please wait." : "Skannar filer, ver venleg og vent."
diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json
index 62d1cfb2c50..05e6f0a9d2d 100644
--- a/apps/files/l10n/nn_NO.json
+++ b/apps/files/l10n/nn_NO.json
@@ -26,6 +26,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
"Actions" : "Handlingar",
"Download" : "Last ned",
+ "Rename" : "Endra namn",
+ "Delete" : "Slett",
+ "Details" : "Detaljar",
"Pending" : "Under vegs",
"Error moving file" : "Feil ved flytting av fil",
"Error" : "Feil",
@@ -64,7 +67,6 @@
"Settings" : "Innstillingar",
"WebDAV" : "WebDAV",
"Cancel upload" : "Avbryt opplasting",
- "Delete" : "Slett",
"Upload too large" : "For stor opplasting",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.",
"Files are being scanned, please wait." : "Skannar filer, ver venleg og vent."
diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js
index 75bceacac3b..bd44479b285 100644
--- a/apps/files/l10n/oc.js
+++ b/apps/files/l10n/oc.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Lo mandadís del fichièr es en cors. Quitar aquesta pagina ara anullarà lo mandadís del fichièr.",
"Actions" : "Accions",
"Download" : "Telecargar",
+ "Rename" : "Renomenar",
+ "Delete" : "Suprimir",
+ "Details" : "Detalhs",
"Select" : "Seleccionar",
"Pending" : "En espèra",
"Unable to determine date" : "Impossible de determinar la data",
@@ -101,7 +104,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !",
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
"Select all" : "Seleccionar tot",
- "Delete" : "Suprimir",
"Upload too large" : "Mandadís tròp voluminós",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.",
"Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.",
diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json
index 20b690a2ed8..89843ea85c2 100644
--- a/apps/files/l10n/oc.json
+++ b/apps/files/l10n/oc.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Lo mandadís del fichièr es en cors. Quitar aquesta pagina ara anullarà lo mandadís del fichièr.",
"Actions" : "Accions",
"Download" : "Telecargar",
+ "Rename" : "Renomenar",
+ "Delete" : "Suprimir",
+ "Details" : "Detalhs",
"Select" : "Seleccionar",
"Pending" : "En espèra",
"Unable to determine date" : "Impossible de determinar la data",
@@ -99,7 +102,6 @@
"Upload some content or sync with your devices!" : "Depausatz de contengut o sincronizatz vòstres aparelhs !",
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
"Select all" : "Seleccionar tot",
- "Delete" : "Suprimir",
"Upload too large" : "Mandadís tròp voluminós",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.",
"Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.",
diff --git a/apps/files/l10n/pa.js b/apps/files/l10n/pa.js
index c92f4473ccb..dfb7c392837 100644
--- a/apps/files/l10n/pa.js
+++ b/apps/files/l10n/pa.js
@@ -4,10 +4,12 @@ OC.L10N.register(
"Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ",
"Files" : "ਫਾਇਲਾਂ",
"Download" : "ਡਾਊਨਲੋਡ",
+ "Rename" : "ਨਾਂ ਬਦਲੋ",
+ "Delete" : "ਹਟਾਓ",
+ "Details" : "ਵੇਰਵ",
"Error" : "ਗਲਤੀ",
"Upload" : "ਅੱਪਲੋਡ",
"Settings" : "ਸੈਟਿੰਗ",
- "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ",
- "Delete" : "ਹਟਾਓ"
+ "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/pa.json b/apps/files/l10n/pa.json
index 438a0cdb313..c1f4dae97fa 100644
--- a/apps/files/l10n/pa.json
+++ b/apps/files/l10n/pa.json
@@ -2,10 +2,12 @@
"Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ",
"Files" : "ਫਾਇਲਾਂ",
"Download" : "ਡਾਊਨਲੋਡ",
+ "Rename" : "ਨਾਂ ਬਦਲੋ",
+ "Delete" : "ਹਟਾਓ",
+ "Details" : "ਵੇਰਵ",
"Error" : "ਗਲਤੀ",
"Upload" : "ਅੱਪਲੋਡ",
"Settings" : "ਸੈਟਿੰਗ",
- "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ",
- "Delete" : "ਹਟਾਓ"
+ "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index c64f9c97d60..5cba43675dd 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"Actions" : "Akcje",
"Download" : "Pobierz",
+ "Rename" : "Zmień nazwę",
+ "Delete" : "Usuń",
+ "Details" : "Szczegóły",
"Select" : "Wybierz",
"Pending" : "Oczekujące",
"Unable to determine date" : "Nie można ustalić daty",
@@ -97,7 +100,6 @@ OC.L10N.register(
"Cancel upload" : "Anuluj wysyłanie",
"No entries found in this folder" : "Brak wpisów w tym folderze",
"Select all" : "Wybierz wszystko",
- "Delete" : "Usuń",
"Upload too large" : "Ładowany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.",
"Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.",
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index d5a3c33e698..5b09f326134 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"Actions" : "Akcje",
"Download" : "Pobierz",
+ "Rename" : "Zmień nazwę",
+ "Delete" : "Usuń",
+ "Details" : "Szczegóły",
"Select" : "Wybierz",
"Pending" : "Oczekujące",
"Unable to determine date" : "Nie można ustalić daty",
@@ -95,7 +98,6 @@
"Cancel upload" : "Anuluj wysyłanie",
"No entries found in this folder" : "Brak wpisów w tym folderze",
"Select all" : "Wybierz wszystko",
- "Delete" : "Usuń",
"Upload too large" : "Ładowany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.",
"Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 7f154cbbf5e..61c0f3e2e59 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.",
"Actions" : "Ações",
"Download" : "Baixar",
+ "Rename" : "Renomear",
+ "Delete" : "Excluir",
+ "Details" : "Detalhes",
"Select" : "Selecionar",
"Pending" : "Pendente",
"Unable to determine date" : "Impossível determinar a data",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
- "Delete" : "Excluir",
"Upload too large" : "Arquivo muito grande para envio",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.",
"Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index 81c76bb2b84..395976dbfdf 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.",
"Actions" : "Ações",
"Download" : "Baixar",
+ "Rename" : "Renomear",
+ "Delete" : "Excluir",
+ "Details" : "Detalhes",
"Select" : "Selecionar",
"Pending" : "Pendente",
"Unable to determine date" : "Impossível determinar a data",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
- "Delete" : "Excluir",
"Upload too large" : "Arquivo muito grande para envio",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.",
"Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.",
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index 92ce9bd6d10..b395fdd1cd9 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Envio de ficheiro em progresso. Se deixar a página agora, irá cancelar o envio.",
"Actions" : "Ações",
"Download" : "Descarregar",
+ "Rename" : "Renomear",
+ "Delete" : "Apagar",
+ "Details" : "Detalhes",
"Select" : "Selecionar",
"Pending" : "Pendente",
"Unable to determine date" : "Impossível determinar a data",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com os seus aparelhos!",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
"Select all" : "Seleccionar todos",
- "Delete" : "Apagar",
"Upload too large" : "Upload muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.",
"Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 99718047020..afa8a67a5d7 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Envio de ficheiro em progresso. Se deixar a página agora, irá cancelar o envio.",
"Actions" : "Ações",
"Download" : "Descarregar",
+ "Rename" : "Renomear",
+ "Delete" : "Apagar",
+ "Details" : "Detalhes",
"Select" : "Selecionar",
"Pending" : "Pendente",
"Unable to determine date" : "Impossível determinar a data",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com os seus aparelhos!",
"No entries found in this folder" : "Não foram encontradas entradas nesta pasta",
"Select all" : "Seleccionar todos",
- "Delete" : "Apagar",
"Upload too large" : "Upload muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.",
"Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.",
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 35753e97da8..83593b4ba8a 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.",
"Actions" : "Acțiuni",
"Download" : "Descarcă",
+ "Rename" : "Redenumește",
+ "Delete" : "Șterge",
+ "Details" : "Detalii",
"Select" : "Alege",
"Pending" : "În așteptare",
"Error moving file." : "Eroare la mutarea fișierului.",
@@ -91,7 +94,6 @@ OC.L10N.register(
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>",
"Cancel upload" : "Anulează încărcarea",
"Select all" : "Selectează tot",
- "Delete" : "Șterge",
"Upload too large" : "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
"Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.",
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index 22d66f8dbf0..a2544bba28d 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.",
"Actions" : "Acțiuni",
"Download" : "Descarcă",
+ "Rename" : "Redenumește",
+ "Delete" : "Șterge",
+ "Details" : "Detalii",
"Select" : "Alege",
"Pending" : "În așteptare",
"Error moving file." : "Eroare la mutarea fișierului.",
@@ -89,7 +92,6 @@
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>",
"Cancel upload" : "Anulează încărcarea",
"Select all" : "Selectează tot",
- "Delete" : "Șterge",
"Upload too large" : "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
"Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 962698709c3..60583d6baf1 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.",
"Actions" : "Действия",
"Download" : "Скачать",
+ "Rename" : "Переименовать",
+ "Delete" : "Удалить",
+ "Details" : "Подробно",
"Select" : "Выбрать",
"Pending" : "Ожидание",
"Unable to determine date" : "Невозможно определить дату",
@@ -108,7 +111,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
"No entries found in this folder" : "Ничего не найдено",
"Select all" : "Выбрать все",
- "Delete" : "Удалить",
"Upload too large" : "Файл слишком велик",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.",
"Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 410ef1d9cbe..d15e181096f 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.",
"Actions" : "Действия",
"Download" : "Скачать",
+ "Rename" : "Переименовать",
+ "Delete" : "Удалить",
+ "Details" : "Подробно",
"Select" : "Выбрать",
"Pending" : "Ожидание",
"Unable to determine date" : "Невозможно определить дату",
@@ -106,7 +109,6 @@
"Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!",
"No entries found in this folder" : "Ничего не найдено",
"Select all" : "Выбрать все",
- "Delete" : "Удалить",
"Upload too large" : "Файл слишком велик",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.",
"Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.",
diff --git a/apps/files/l10n/si_LK.js b/apps/files/l10n/si_LK.js
index ea63cda82dc..60cd10813d9 100644
--- a/apps/files/l10n/si_LK.js
+++ b/apps/files/l10n/si_LK.js
@@ -14,6 +14,8 @@ OC.L10N.register(
"Upload cancelled." : "උඩුගත කිරීම අත් හරින්න ලදී",
"File upload is in progress. Leaving the page now will cancel the upload." : "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත",
"Download" : "බාන්න",
+ "Rename" : "නැවත නම් කරන්න",
+ "Delete" : "මකා දමන්න",
"Select" : "තෝරන්න",
"Error" : "දෝෂයක්",
"Name" : "නම",
@@ -33,7 +35,6 @@ OC.L10N.register(
"Save" : "සුරකින්න",
"Settings" : "සිටුවම්",
"Cancel upload" : "උඩුගත කිරීම අත් හරින්න",
- "Delete" : "මකා දමන්න",
"Upload too large" : "උඩුගත කිරීම විශාල වැඩිය",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය",
"Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න"
diff --git a/apps/files/l10n/si_LK.json b/apps/files/l10n/si_LK.json
index 6cfbe30ff4a..2f910f1d90b 100644
--- a/apps/files/l10n/si_LK.json
+++ b/apps/files/l10n/si_LK.json
@@ -12,6 +12,8 @@
"Upload cancelled." : "උඩුගත කිරීම අත් හරින්න ලදී",
"File upload is in progress. Leaving the page now will cancel the upload." : "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත",
"Download" : "බාන්න",
+ "Rename" : "නැවත නම් කරන්න",
+ "Delete" : "මකා දමන්න",
"Select" : "තෝරන්න",
"Error" : "දෝෂයක්",
"Name" : "නම",
@@ -31,7 +33,6 @@
"Save" : "සුරකින්න",
"Settings" : "සිටුවම්",
"Cancel upload" : "උඩුගත කිරීම අත් හරින්න",
- "Delete" : "මකා දමන්න",
"Upload too large" : "උඩුගත කිරීම විශාල වැඩිය",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය",
"Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න"
diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js
index ebe1973a9ed..e2fbf695f81 100644
--- a/apps/files/l10n/sk_SK.js
+++ b/apps/files/l10n/sk_SK.js
@@ -38,10 +38,14 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.",
"Actions" : "Akcie",
"Download" : "Sťahovanie",
+ "Rename" : "Premenovať",
+ "Delete" : "Zmazať",
+ "Details" : "Podrobnosti",
"Select" : "Vybrať",
"Pending" : "Čaká",
"Unable to determine date" : "Nemožno určiť dátum",
"This operation is forbidden" : "Táto operácia je zakázaná",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
"Error moving file." : "Chyba pri presune súboru.",
"Error moving file" : "Chyba pri presúvaní súboru",
"Error" : "Chyba",
@@ -62,18 +66,25 @@ OC.L10N.register(
"New" : "Nový",
"\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
"File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
"Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'"],
+ "Path" : "Cesta",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"],
"Favorited" : "Pridané k obľúbeným",
"Favorite" : "Obľúbené",
+ "{newname} already exists" : "{newname} už existuje",
"Upload" : "Nahrať",
"Text file" : "Textový súbor",
+ "New text file.txt" : "Nový text file.txt",
"Folder" : "Priečinok",
"New folder" : "Nový priečinok",
"An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
"A new file or folder has been <strong>created</strong>" : "Nový súbor alebo priečinok bol <strong>vytvorený</strong>",
"A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Obmedzte upozornenia na vytvorenie a zmeny na vaše <strong>obľúbené súbory</strong> <em>(Len streamy)</em>",
"A file or folder has been <strong>deleted</strong>" : "Súbor alebo priečinok bol <strong>odstránený</strong>",
"A file or folder has been <strong>restored</strong>" : "Súbor alebo priečinok bol <strong>obnovený</strong>",
"You created %1$s" : "Vytvorili ste %1$s",
@@ -91,7 +102,9 @@ OC.L10N.register(
"File handling" : "Nastavenie správania sa k súborom",
"Maximum upload size" : "Maximálna veľkosť odosielaného súboru",
"max. possible: " : "najväčšie možné:",
+ "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.",
"Save" : "Uložiť",
+ "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.",
"Settings" : "Nastavenia",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>",
@@ -100,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!",
"No entries found in this folder" : "V tomto priečinku nebolo nič nájdené",
"Select all" : "Vybrať všetko",
- "Delete" : "Zmazať",
"Upload too large" : "Nahrávanie je príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
"Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.",
diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json
index ccd7a045699..e5748baa4c8 100644
--- a/apps/files/l10n/sk_SK.json
+++ b/apps/files/l10n/sk_SK.json
@@ -36,10 +36,14 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.",
"Actions" : "Akcie",
"Download" : "Sťahovanie",
+ "Rename" : "Premenovať",
+ "Delete" : "Zmazať",
+ "Details" : "Podrobnosti",
"Select" : "Vybrať",
"Pending" : "Čaká",
"Unable to determine date" : "Nemožno určiť dátum",
"This operation is forbidden" : "Táto operácia je zakázaná",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu",
"Error moving file." : "Chyba pri presune súboru.",
"Error moving file" : "Chyba pri presúvaní súboru",
"Error" : "Chyba",
@@ -60,18 +64,25 @@
"New" : "Nový",
"\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
"File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
"Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Úloisko používateľa {owner} je takmer plné ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["zodpovedá '{filter}'","zodpovedá '{filter}'","zodpovedá '{filter}'"],
+ "Path" : "Cesta",
+ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"],
"Favorited" : "Pridané k obľúbeným",
"Favorite" : "Obľúbené",
+ "{newname} already exists" : "{newname} už existuje",
"Upload" : "Nahrať",
"Text file" : "Textový súbor",
+ "New text file.txt" : "Nový text file.txt",
"Folder" : "Priečinok",
"New folder" : "Nový priečinok",
"An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe",
"A new file or folder has been <strong>created</strong>" : "Nový súbor alebo priečinok bol <strong>vytvorený</strong>",
"A file or folder has been <strong>changed</strong>" : "Súbor alebo priečinok bol <strong>zmenený</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Obmedzte upozornenia na vytvorenie a zmeny na vaše <strong>obľúbené súbory</strong> <em>(Len streamy)</em>",
"A file or folder has been <strong>deleted</strong>" : "Súbor alebo priečinok bol <strong>odstránený</strong>",
"A file or folder has been <strong>restored</strong>" : "Súbor alebo priečinok bol <strong>obnovený</strong>",
"You created %1$s" : "Vytvorili ste %1$s",
@@ -89,7 +100,9 @@
"File handling" : "Nastavenie správania sa k súborom",
"Maximum upload size" : "Maximálna veľkosť odosielaného súboru",
"max. possible: " : "najväčšie možné:",
+ "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.",
"Save" : "Uložiť",
+ "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.",
"Settings" : "Nastavenia",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>",
@@ -98,7 +111,6 @@
"Upload some content or sync with your devices!" : "Nahrajte nejaký obsah alebo synchronizujte zo svojimi zariadeniami!",
"No entries found in this folder" : "V tomto priečinku nebolo nič nájdené",
"Select all" : "Vybrať všetko",
- "Delete" : "Zmazať",
"Upload too large" : "Nahrávanie je príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
"Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.",
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index 2d296468d69..7ce39724a98 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.",
"Actions" : "Dejanja",
"Download" : "Prejmi",
+ "Rename" : "Preimenuj",
+ "Delete" : "Izbriši",
+ "Details" : "Podrobnosti",
"Select" : "Izberi",
"Pending" : "V čakanju ...",
"Unable to determine date" : "Ni mogoče določiti datuma",
@@ -103,7 +106,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!",
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
- "Delete" : "Izbriši",
"Upload too large" : "Prekoračenje omejitve velikosti",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.",
"Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...",
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 0cb69f5f7a1..b4b28f95bf1 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.",
"Actions" : "Dejanja",
"Download" : "Prejmi",
+ "Rename" : "Preimenuj",
+ "Delete" : "Izbriši",
+ "Details" : "Podrobnosti",
"Select" : "Izberi",
"Pending" : "V čakanju ...",
"Unable to determine date" : "Ni mogoče določiti datuma",
@@ -101,7 +104,6 @@
"Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!",
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
- "Delete" : "Izbriši",
"Upload too large" : "Prekoračenje omejitve velikosti",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.",
"Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...",
diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js
index 2b87c39d968..296efe6381d 100644
--- a/apps/files/l10n/sq.js
+++ b/apps/files/l10n/sq.js
@@ -36,6 +36,8 @@ OC.L10N.register(
"Could not get result from server." : "Nuk mund të merret ndonjë rezultat nga serveri.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin",
"Download" : "Shkarko",
+ "Rename" : "Riemëro",
+ "Delete" : "Fshi",
"Pending" : "Në vijim",
"Error moving file." : "Gabim në lëvizjen e skedarëve.",
"Error moving file" : "Gabim lëvizjen dokumentave",
@@ -86,7 +88,6 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">qasje në skedarët tuaj me anë të WebDAV</a>",
"Cancel upload" : "Anullo ngarkimin",
- "Delete" : "Fshi",
"Upload too large" : "Ngarkimi shumë i madh",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.",
"Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni.",
diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json
index 1e755ee80f6..993e38f4644 100644
--- a/apps/files/l10n/sq.json
+++ b/apps/files/l10n/sq.json
@@ -34,6 +34,8 @@
"Could not get result from server." : "Nuk mund të merret ndonjë rezultat nga serveri.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin",
"Download" : "Shkarko",
+ "Rename" : "Riemëro",
+ "Delete" : "Fshi",
"Pending" : "Në vijim",
"Error moving file." : "Gabim në lëvizjen e skedarëve.",
"Error moving file" : "Gabim lëvizjen dokumentave",
@@ -84,7 +86,6 @@
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">qasje në skedarët tuaj me anë të WebDAV</a>",
"Cancel upload" : "Anullo ngarkimin",
- "Delete" : "Fshi",
"Upload too large" : "Ngarkimi shumë i madh",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.",
"Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni.",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 597389e15da..c9b8fd3ac54 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.",
"Actions" : "Радње",
"Download" : "Преузми",
+ "Rename" : "Преименуј",
+ "Delete" : "Обриши",
+ "Details" : "Подаци",
"Select" : "Изабери",
"Pending" : "На чекању",
"Unable to determine date" : "Не могу да одредим датум",
@@ -105,7 +108,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
- "Delete" : "Обриши",
"Upload too large" : "Отпремање је превелико",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.",
"Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index ec2fcc101e6..8a1ed30cefe 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.",
"Actions" : "Радње",
"Download" : "Преузми",
+ "Rename" : "Преименуј",
+ "Delete" : "Обриши",
+ "Details" : "Подаци",
"Select" : "Изабери",
"Pending" : "На чекању",
"Unable to determine date" : "Не могу да одредим датум",
@@ -103,7 +106,6 @@
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
- "Delete" : "Обриши",
"Upload too large" : "Отпремање је превелико",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.",
"Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.",
diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js
index b00575619e9..9c7732e4e71 100644
--- a/apps/files/l10n/sr@latin.js
+++ b/apps/files/l10n/sr@latin.js
@@ -37,6 +37,9 @@ OC.L10N.register(
"Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.",
"Download" : "Preuzmi",
+ "Rename" : "Preimenuj",
+ "Delete" : "Obriši",
+ "Details" : "Detaljnije",
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Ne mogu da odredim datum",
@@ -100,7 +103,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!",
"No entries found in this folder" : "Nema ničega u ovoj fascikli",
"Select all" : "Označi sve",
- "Delete" : "Obriši",
"Upload too large" : "Otpremanje je preveliko",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.",
"Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.",
diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json
index b6ffda5aa6b..0eb117e6026 100644
--- a/apps/files/l10n/sr@latin.json
+++ b/apps/files/l10n/sr@latin.json
@@ -35,6 +35,9 @@
"Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.",
"File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.",
"Download" : "Preuzmi",
+ "Rename" : "Preimenuj",
+ "Delete" : "Obriši",
+ "Details" : "Detaljnije",
"Select" : "Izaberi",
"Pending" : "Na čekanju",
"Unable to determine date" : "Ne mogu da odredim datum",
@@ -98,7 +101,6 @@
"Upload some content or sync with your devices!" : "Otpremite neki sadržaj ili sinhronizujte sa vašim uređajima!",
"No entries found in this folder" : "Nema ničega u ovoj fascikli",
"Select all" : "Označi sve",
- "Delete" : "Obriši",
"Upload too large" : "Otpremanje je preveliko",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.",
"Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.",
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 5f9a08404d7..a5dc7478f80 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.",
"Actions" : "Åtgärder",
"Download" : "Ladda ner",
+ "Rename" : "Byt namn",
+ "Delete" : "Radera",
+ "Details" : "Detaljer",
"Select" : "Välj",
"Pending" : "Väntar",
"Unable to determine date" : "Misslyckades avgöra datum",
@@ -94,7 +97,6 @@ OC.L10N.register(
"Cancel upload" : "Avbryt uppladdning",
"Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
"Select all" : "Välj allt",
- "Delete" : "Radera",
"Upload too large" : "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
"Files are being scanned, please wait." : "Filer skannas, var god vänta",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index e6775948cf6..afcbb6100db 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.",
"Actions" : "Åtgärder",
"Download" : "Ladda ner",
+ "Rename" : "Byt namn",
+ "Delete" : "Radera",
+ "Details" : "Detaljer",
"Select" : "Välj",
"Pending" : "Väntar",
"Unable to determine date" : "Misslyckades avgöra datum",
@@ -92,7 +95,6 @@
"Cancel upload" : "Avbryt uppladdning",
"Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!",
"Select all" : "Välj allt",
- "Delete" : "Radera",
"Upload too large" : "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
"Files are being scanned, please wait." : "Filer skannas, var god vänta",
diff --git a/apps/files/l10n/ta_IN.js b/apps/files/l10n/ta_IN.js
index c8453338084..85ed1ea3141 100644
--- a/apps/files/l10n/ta_IN.js
+++ b/apps/files/l10n/ta_IN.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files",
{
"Files" : "கோப்புகள்",
+ "Details" : "விவரங்கள்",
"Upload" : "பதிவேற்று",
"New folder" : "புதிய கோப்புறை",
"A new file or folder has been <strong>created</strong>" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் <strong> உருவாக்கப்பட்டுள்ளது.</strong>",
diff --git a/apps/files/l10n/ta_IN.json b/apps/files/l10n/ta_IN.json
index 392601a3756..bb7117bc62e 100644
--- a/apps/files/l10n/ta_IN.json
+++ b/apps/files/l10n/ta_IN.json
@@ -1,5 +1,6 @@
{ "translations": {
"Files" : "கோப்புகள்",
+ "Details" : "விவரங்கள்",
"Upload" : "பதிவேற்று",
"New folder" : "புதிய கோப்புறை",
"A new file or folder has been <strong>created</strong>" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் <strong> உருவாக்கப்பட்டுள்ளது.</strong>",
diff --git a/apps/files/l10n/ta_LK.js b/apps/files/l10n/ta_LK.js
index 90a955e135b..de912eaea2e 100644
--- a/apps/files/l10n/ta_LK.js
+++ b/apps/files/l10n/ta_LK.js
@@ -16,6 +16,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.",
"Actions" : "செயல்கள்",
"Download" : "பதிவிறக்குக",
+ "Rename" : "பெயர்மாற்றம்",
+ "Delete" : "நீக்குக",
+ "Details" : "விவரங்கள்",
"Select" : "தெரிக",
"Pending" : "நிலுவையிலுள்ள",
"Error" : "வழு",
@@ -34,7 +37,6 @@ OC.L10N.register(
"Save" : "சேமிக்க ",
"Settings" : "அமைப்புகள்",
"Cancel upload" : "பதிவேற்றலை இரத்து செய்க",
- "Delete" : "நீக்குக",
"Upload too large" : "பதிவேற்றல் மிகப்பெரியது",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.",
"Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்."
diff --git a/apps/files/l10n/ta_LK.json b/apps/files/l10n/ta_LK.json
index 64220b86744..b14853b503e 100644
--- a/apps/files/l10n/ta_LK.json
+++ b/apps/files/l10n/ta_LK.json
@@ -14,6 +14,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.",
"Actions" : "செயல்கள்",
"Download" : "பதிவிறக்குக",
+ "Rename" : "பெயர்மாற்றம்",
+ "Delete" : "நீக்குக",
+ "Details" : "விவரங்கள்",
"Select" : "தெரிக",
"Pending" : "நிலுவையிலுள்ள",
"Error" : "வழு",
@@ -32,7 +35,6 @@
"Save" : "சேமிக்க ",
"Settings" : "அமைப்புகள்",
"Cancel upload" : "பதிவேற்றலை இரத்து செய்க",
- "Delete" : "நீக்குக",
"Upload too large" : "பதிவேற்றல் மிகப்பெரியது",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.",
"Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்."
diff --git a/apps/files/l10n/te.js b/apps/files/l10n/te.js
index 51f6b1c5291..9badfac3532 100644
--- a/apps/files/l10n/te.js
+++ b/apps/files/l10n/te.js
@@ -2,13 +2,13 @@ OC.L10N.register(
"files",
{
"Close" : "మూసివేయి",
+ "Delete" : "తొలగించు",
"Error" : "పొరపాటు",
"Name" : "పేరు",
"Size" : "పరిమాణం",
"Folder" : "సంచయం",
"New folder" : "కొత్త సంచయం",
"Save" : "భద్రపరచు",
- "Settings" : "అమరికలు",
- "Delete" : "తొలగించు"
+ "Settings" : "అమరికలు"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/te.json b/apps/files/l10n/te.json
index fa7efa9d702..21d09484cd8 100644
--- a/apps/files/l10n/te.json
+++ b/apps/files/l10n/te.json
@@ -1,12 +1,12 @@
{ "translations": {
"Close" : "మూసివేయి",
+ "Delete" : "తొలగించు",
"Error" : "పొరపాటు",
"Name" : "పేరు",
"Size" : "పరిమాణం",
"Folder" : "సంచయం",
"New folder" : "కొత్త సంచయం",
"Save" : "భద్రపరచు",
- "Settings" : "అమరికలు",
- "Delete" : "తొలగించు"
+ "Settings" : "అమరికలు"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js
index 2b092551a17..021179c6432 100644
--- a/apps/files/l10n/th_TH.js
+++ b/apps/files/l10n/th_TH.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"Actions" : "การกระทำ",
"Download" : "ดาวน์โหลด",
+ "Rename" : "เปลี่ยนชื่อ",
+ "Delete" : "ลบ",
+ "Details" : "รายละเอียด",
"Select" : "เลือก",
"Pending" : "อยู่ระหว่างดำเนินการ",
"Unable to determine date" : "ไม่สามารถกำหนดวัน",
@@ -110,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "อัพโหลดเนื้อหาบางส่วนหรือประสานข้อมูลกับอุปกรณ์ของคุณ! อีกครั้ง",
"No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
"Select all" : "เลือกทั้งหมด",
- "Delete" : "ลบ",
"Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
"Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json
index 3125adc820f..6ce9bc4b9ed 100644
--- a/apps/files/l10n/th_TH.json
+++ b/apps/files/l10n/th_TH.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"Actions" : "การกระทำ",
"Download" : "ดาวน์โหลด",
+ "Rename" : "เปลี่ยนชื่อ",
+ "Delete" : "ลบ",
+ "Details" : "รายละเอียด",
"Select" : "เลือก",
"Pending" : "อยู่ระหว่างดำเนินการ",
"Unable to determine date" : "ไม่สามารถกำหนดวัน",
@@ -108,7 +111,6 @@
"Upload some content or sync with your devices!" : "อัพโหลดเนื้อหาบางส่วนหรือประสานข้อมูลกับอุปกรณ์ของคุณ! อีกครั้ง",
"No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
"Select all" : "เลือกทั้งหมด",
- "Delete" : "ลบ",
"Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
"Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 157280b696c..6b2f9a14dcf 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.",
"Actions" : "Eylemler",
"Download" : "İndir",
+ "Rename" : "Yeniden adlandır",
+ "Delete" : "Sil",
+ "Details" : "Ayrıntılar",
"Select" : "Seç",
"Pending" : "Bekliyor",
"Unable to determine date" : "Tarih tespit edilemedi",
@@ -108,7 +111,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Select all" : "Tümünü seç",
- "Delete" : "Sil",
"Upload too large" : "Yükleme çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.",
"Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.",
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 8a15f7ff315..9f59757f715 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.",
"Actions" : "Eylemler",
"Download" : "İndir",
+ "Rename" : "Yeniden adlandır",
+ "Delete" : "Sil",
+ "Details" : "Ayrıntılar",
"Select" : "Seç",
"Pending" : "Bekliyor",
"Unable to determine date" : "Tarih tespit edilemedi",
@@ -106,7 +109,6 @@
"Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Select all" : "Tümünü seç",
- "Delete" : "Sil",
"Upload too large" : "Yükleme çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.",
"Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.",
diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js
index 8d6dabd50d7..4371e15067f 100644
--- a/apps/files/l10n/ug.js
+++ b/apps/files/l10n/ug.js
@@ -16,6 +16,8 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.",
"Actions" : "مەشغۇلاتلار",
"Download" : "چۈشۈر",
+ "Rename" : "ئات ئۆزگەرت",
+ "Delete" : "ئۆچۈر",
"Pending" : "كۈتۈۋاتىدۇ",
"Error" : "خاتالىق",
"{new_name} already exists" : "{new_name} مەۋجۇت",
@@ -32,7 +34,6 @@ OC.L10N.register(
"Settings" : "تەڭشەكلەر",
"WebDAV" : "WebDAV",
"Cancel upload" : "يۈكلەشتىن ۋاز كەچ",
- "Delete" : "ئۆچۈر",
"Upload too large" : "يۈكلەندىغىنى بەك چوڭ"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json
index 86bd8391af2..f6a71d8bda6 100644
--- a/apps/files/l10n/ug.json
+++ b/apps/files/l10n/ug.json
@@ -14,6 +14,8 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.",
"Actions" : "مەشغۇلاتلار",
"Download" : "چۈشۈر",
+ "Rename" : "ئات ئۆزگەرت",
+ "Delete" : "ئۆچۈر",
"Pending" : "كۈتۈۋاتىدۇ",
"Error" : "خاتالىق",
"{new_name} already exists" : "{new_name} مەۋجۇت",
@@ -30,7 +32,6 @@
"Settings" : "تەڭشەكلەر",
"WebDAV" : "WebDAV",
"Cancel upload" : "يۈكلەشتىن ۋاز كەچ",
- "Delete" : "ئۆچۈر",
"Upload too large" : "يۈكلەندىغىنى بەك چوڭ"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index a06cc2f3d73..bf5b0f1d456 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.",
"Actions" : "Дії",
"Download" : "Завантажити",
+ "Rename" : "Перейменувати",
+ "Delete" : "Видалити",
+ "Details" : "Деталі",
"Select" : "Оберіть",
"Pending" : "Очікування",
"Unable to determine date" : "Неможливо визначити дату",
@@ -102,7 +105,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Вивантажте щось або синхронізуйте з пристроями!",
"No entries found in this folder" : "В цій теці нічого немає",
"Select all" : "Вибрати всі",
- "Delete" : "Видалити",
"Upload too large" : "Файл занадто великий",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь вивантажити перевищують максимальний дозволений розмір файлів на цьому сервері.",
"Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.",
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index 964ada95de1..28d307b55be 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.",
"Actions" : "Дії",
"Download" : "Завантажити",
+ "Rename" : "Перейменувати",
+ "Delete" : "Видалити",
+ "Details" : "Деталі",
"Select" : "Оберіть",
"Pending" : "Очікування",
"Unable to determine date" : "Неможливо визначити дату",
@@ -100,7 +103,6 @@
"Upload some content or sync with your devices!" : "Вивантажте щось або синхронізуйте з пристроями!",
"No entries found in this folder" : "В цій теці нічого немає",
"Select all" : "Вибрати всі",
- "Delete" : "Видалити",
"Upload too large" : "Файл занадто великий",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь вивантажити перевищують максимальний дозволений розмір файлів на цьому сервері.",
"Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.",
diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js
index d5e85bfe35c..2265e52d771 100644
--- a/apps/files/l10n/ur_PK.js
+++ b/apps/files/l10n/ur_PK.js
@@ -4,10 +4,10 @@ OC.L10N.register(
"Unknown error" : "غیر معروف خرابی",
"Close" : "بند ",
"Download" : "ڈاؤن لوڈ،",
+ "Delete" : "حذف کریں",
"Error" : "ایرر",
"Name" : "اسم",
"Save" : "حفظ",
- "Settings" : "ترتیبات",
- "Delete" : "حذف کریں"
+ "Settings" : "ترتیبات"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json
index 3da48310dfb..e8eb736811c 100644
--- a/apps/files/l10n/ur_PK.json
+++ b/apps/files/l10n/ur_PK.json
@@ -2,10 +2,10 @@
"Unknown error" : "غیر معروف خرابی",
"Close" : "بند ",
"Download" : "ڈاؤن لوڈ،",
+ "Delete" : "حذف کریں",
"Error" : "ایرر",
"Name" : "اسم",
"Save" : "حفظ",
- "Settings" : "ترتیبات",
- "Delete" : "حذف کریں"
+ "Settings" : "ترتیبات"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js
index 5e83c36abea..2c643e3cfb5 100644
--- a/apps/files/l10n/vi.js
+++ b/apps/files/l10n/vi.js
@@ -33,6 +33,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.",
"Actions" : "Actions",
"Download" : "Tải về",
+ "Rename" : "Sửa tên",
+ "Delete" : "Xóa",
+ "Details" : "Chi tiết",
"Select" : "Chọn",
"Pending" : "Đang chờ",
"Error moving file" : "Lỗi di chuyển tập tin",
@@ -69,7 +72,6 @@ OC.L10N.register(
"Cancel upload" : "Hủy upload",
"No entries found in this folder" : "Chưa có mục nào trong thư mục",
"Select all" : "Chọn tất cả",
- "Delete" : "Xóa",
"Upload too large" : "Tập tin tải lên quá lớn",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
"Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ."
diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json
index 285c0e39240..ac7a1f3828e 100644
--- a/apps/files/l10n/vi.json
+++ b/apps/files/l10n/vi.json
@@ -31,6 +31,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.",
"Actions" : "Actions",
"Download" : "Tải về",
+ "Rename" : "Sửa tên",
+ "Delete" : "Xóa",
+ "Details" : "Chi tiết",
"Select" : "Chọn",
"Pending" : "Đang chờ",
"Error moving file" : "Lỗi di chuyển tập tin",
@@ -67,7 +70,6 @@
"Cancel upload" : "Hủy upload",
"No entries found in this folder" : "Chưa có mục nào trong thư mục",
"Select all" : "Chọn tất cả",
- "Delete" : "Xóa",
"Upload too large" : "Tập tin tải lên quá lớn",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
"Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ."
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 84b31368a14..a56d59e240e 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
"Actions" : "动作",
"Download" : "下载",
+ "Rename" : "重命名",
+ "Delete" : "删除",
+ "Details" : "详细信息",
"Select" : "选择",
"Pending" : "等待",
"Unable to determine date" : "无法确定日期",
@@ -72,8 +75,10 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
+ "{newname} already exists" : "{newname} 已经存在",
"Upload" : "上传",
"Text file" : "文本文件",
+ "New text file.txt" : "创建文本文件 .txt",
"Folder" : "文件夹",
"New folder" : "增加文件夹",
"An error occurred while trying to update the tags" : "更新标签时出错",
@@ -108,7 +113,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
"No entries found in this folder" : "此文件夹中无项目",
"Select all" : "全部选择",
- "Delete" : "删除",
"Upload too large" : "上传文件过大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
"Files are being scanned, please wait." : "文件正在被扫描,请稍候。",
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 4d9a3737a98..c84450a095c 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。",
"Actions" : "动作",
"Download" : "下载",
+ "Rename" : "重命名",
+ "Delete" : "删除",
+ "Details" : "详细信息",
"Select" : "选择",
"Pending" : "等待",
"Unable to determine date" : "无法确定日期",
@@ -70,8 +73,10 @@
"_%n byte_::_%n bytes_" : ["%n 字节"],
"Favorited" : "已收藏",
"Favorite" : "收藏",
+ "{newname} already exists" : "{newname} 已经存在",
"Upload" : "上传",
"Text file" : "文本文件",
+ "New text file.txt" : "创建文本文件 .txt",
"Folder" : "文件夹",
"New folder" : "增加文件夹",
"An error occurred while trying to update the tags" : "更新标签时出错",
@@ -106,7 +111,6 @@
"Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!",
"No entries found in this folder" : "此文件夹中无项目",
"Select all" : "全部选择",
- "Delete" : "删除",
"Upload too large" : "上传文件过大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
"Files are being scanned, please wait." : "文件正在被扫描,请稍候。",
diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js
index 94f4397f23b..421ae5dc92a 100644
--- a/apps/files/l10n/zh_HK.js
+++ b/apps/files/l10n/zh_HK.js
@@ -7,6 +7,8 @@ OC.L10N.register(
"Home" : "主頁",
"Close" : "關閉",
"Download" : "下載",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
"Error" : "錯誤",
"Name" : "名稱",
"Size" : "大小",
@@ -27,7 +29,6 @@ OC.L10N.register(
"Save" : "儲存",
"Settings" : "設定",
"WebDAV" : "WebDAV",
- "Cancel upload" : "取消上戴",
- "Delete" : "刪除"
+ "Cancel upload" : "取消上戴"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json
index 63716aca559..3d1af1593bd 100644
--- a/apps/files/l10n/zh_HK.json
+++ b/apps/files/l10n/zh_HK.json
@@ -5,6 +5,8 @@
"Home" : "主頁",
"Close" : "關閉",
"Download" : "下載",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
"Error" : "錯誤",
"Name" : "名稱",
"Size" : "大小",
@@ -25,7 +27,6 @@
"Save" : "儲存",
"Settings" : "設定",
"WebDAV" : "WebDAV",
- "Cancel upload" : "取消上戴",
- "Delete" : "刪除"
+ "Cancel upload" : "取消上戴"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index 7c013533e2a..772cf083307 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"File upload is in progress. Leaving the page now will cancel the upload." : "檔案上傳中,離開此頁面將會取消上傳。",
"Actions" : "動作",
"Download" : "下載",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
+ "Details" : "詳細資料",
"Select" : "選擇",
"Pending" : "等候中",
"Unable to determine date" : "無法確定日期",
@@ -103,7 +106,6 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "在您的裝置中同步或上傳一些內容",
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
- "Delete" : "刪除",
"Upload too large" : "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。",
"Files are being scanned, please wait." : "正在掃描檔案,請稍等。",
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index 9d1aec9e4f2..4e1a38eccbd 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -36,6 +36,9 @@
"File upload is in progress. Leaving the page now will cancel the upload." : "檔案上傳中,離開此頁面將會取消上傳。",
"Actions" : "動作",
"Download" : "下載",
+ "Rename" : "重新命名",
+ "Delete" : "刪除",
+ "Details" : "詳細資料",
"Select" : "選擇",
"Pending" : "等候中",
"Unable to determine date" : "無法確定日期",
@@ -101,7 +104,6 @@
"Upload some content or sync with your devices!" : "在您的裝置中同步或上傳一些內容",
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
- "Delete" : "刪除",
"Upload too large" : "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。",
"Files are being scanned, please wait." : "正在掃描檔案,請稍等。",
diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html
index c783f9a05c7..e3513237d2b 100644
--- a/apps/files/templates/fileexists.html
+++ b/apps/files/templates/fileexists.html
@@ -3,14 +3,14 @@
<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><input id="checkbox-allnewfiles" class="allnewfiles" type="checkbox" /><label for="checkbox-allnewfiles">{allnewfiles}<span class="count"></span></label></th>
- <th><input id="checkbox-allexistingfiles" class="allexistingfiles" type="checkbox" /><label for="checkbox-allexistingfiles">{allexistingfiles}<span class="count"></span></label></th>
+ <th><input id="checkbox-allnewfiles" class="allnewfiles checkbox" type="checkbox" /><label for="checkbox-allnewfiles">{allnewfiles}<span class="count"></span></label></th>
+ <th><input id="checkbox-allexistingfiles" class="allexistingfiles checkbox" type="checkbox" /><label for="checkbox-allexistingfiles">{allexistingfiles}<span class="count"></span></label></th>
</table>
<div class="conflicts">
<div class="template">
<div class="filename"></div>
<div class="replacement">
- <input type="checkbox" class="u-left"/>
+ <input type="checkbox" class="checkbox u-left"/>
<label>
<span class="svg icon"></span>
<div class="mtime"></div>
@@ -18,7 +18,7 @@
</label>
</div>
<div class="original">
- <input type="checkbox" class="u-left" />
+ <input type="checkbox" class="checkbox u-left" />
<label>
<span class="svg icon"></span>
<div class="mtime"></div>
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index 15af1970dc3..7ebf80ee8b2 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -51,12 +51,12 @@
<p></p>
</div>
-<table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="36" data-preview-y="36">
+<table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="32" data-preview-y="32">
<thead>
<tr>
<th id='headerName' class="hidden column-name">
<div id="headerName-container">
- <input type="checkbox" id="select_all_files" class="select-all"/>
+ <input type="checkbox" id="select_all_files" class="select-all checkbox"/>
<label for="select_all_files">
<span class="hidden-visually"><?php p($l->t('Select all'))?></span>
</label>
diff --git a/apps/files/tests/js/detailsviewSpec.js b/apps/files/tests/js/detailsviewSpec.js
index 852f8b04293..26a16b31530 100644
--- a/apps/files/tests/js/detailsviewSpec.js
+++ b/apps/files/tests/js/detailsviewSpec.js
@@ -144,14 +144,91 @@ describe('OCA.Files.DetailsView tests', function() {
expect(detailsView.$el.find('.tab').eq(0).hasClass('hidden')).toEqual(true);
expect(detailsView.$el.find('.tab').eq(1).hasClass('hidden')).toEqual(false);
});
- it('does not render tab headers when only one tab exists', function() {
+ describe('tab visibility', function() {
+ beforeEach(function() {
+ detailsView.remove();
+ detailsView = new OCA.Files.DetailsView();
+ });
+ it('does not display tab headers when only one tab exists', function() {
+ testView = new OCA.Files.DetailTabView({id: 'test1'});
+ detailsView.addTabView(testView);
+ detailsView.render();
+
+ expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(true);
+ expect(detailsView.$el.find('.tabHeader').length).toEqual(1);
+ });
+ it('does not display tab that do not pass visibility check', function() {
+ testView = new OCA.Files.DetailTabView({id: 'test1'});
+ testView.canDisplay = sinon.stub().returns(false);
+ testView2 = new OCA.Files.DetailTabView({id: 'test2'});
+ var testView3 = new OCA.Files.DetailTabView({id: 'test3'});
+ detailsView.addTabView(testView);
+ detailsView.addTabView(testView2);
+ detailsView.addTabView(testView3);
+
+ var fileInfo = {id: 5, name: 'test.txt'};
+ detailsView.setFileInfo(fileInfo);
+
+ expect(testView.canDisplay.calledOnce).toEqual(true);
+ expect(testView.canDisplay.calledWith(fileInfo)).toEqual(true);
+
+ expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(false);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('hidden')).toEqual(true);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('hidden')).toEqual(false);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test3]').hasClass('hidden')).toEqual(false);
+ });
+ it('does not show tab headers if only one header is visible due to visibility check', function() {
+ testView = new OCA.Files.DetailTabView({id: 'test1'});
+ testView.canDisplay = sinon.stub().returns(false);
+ testView2 = new OCA.Files.DetailTabView({id: 'test2'});
+ detailsView.addTabView(testView);
+ detailsView.addTabView(testView2);
+
+ var fileInfo = {id: 5, name: 'test.txt'};
+ detailsView.setFileInfo(fileInfo);
+
+ expect(testView.canDisplay.calledOnce).toEqual(true);
+ expect(testView.canDisplay.calledWith(fileInfo)).toEqual(true);
+
+ expect(detailsView.$el.find('.tabHeaders').hasClass('hidden')).toEqual(true);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('hidden')).toEqual(true);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('hidden')).toEqual(false);
+ });
+ it('deselects the current tab if a model update does not pass the visibility check', function() {
+ testView = new OCA.Files.DetailTabView({id: 'test1'});
+ testView.canDisplay = function(fileInfo) {
+ return fileInfo.mimetype !== 'httpd/unix-directory';
+ };
+ testView2 = new OCA.Files.DetailTabView({id: 'test2'});
+ detailsView.addTabView(testView);
+ detailsView.addTabView(testView2);
+
+ var fileInfo = {id: 5, name: 'test.txt', mimetype: 'text/plain'};
+ detailsView.setFileInfo(fileInfo);
+
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('selected')).toEqual(true);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('selected')).toEqual(false);
+
+ detailsView.setFileInfo({id: 10, name: 'folder', mimetype: 'httpd/unix-directory'});
+
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test1]').hasClass('selected')).toEqual(false);
+ expect(detailsView.$el.find('.tabHeader[data-tabid=test2]').hasClass('selected')).toEqual(true);
+ });
+ });
+ it('sorts by order and then label', function() {
detailsView.remove();
detailsView = new OCA.Files.DetailsView();
- testView = new OCA.Files.DetailTabView({id: 'test1'});
- detailsView.addTabView(testView);
+ detailsView.addTabView(new OCA.Files.DetailTabView({id: 'abc', order: 20}));
+ detailsView.addTabView(new OCA.Files.DetailTabView({id: 'def', order: 10}));
+ detailsView.addTabView(new OCA.Files.DetailTabView({id: 'jkl'}));
+ detailsView.addTabView(new OCA.Files.DetailTabView({id: 'ghi'}));
detailsView.render();
- expect(detailsView.$el.find('.tabHeader').length).toEqual(0);
+ var tabs = detailsView.$el.find('.tabHeader').map(function() {
+ return $(this).attr('data-tabid');
+ }).toArray();
+
+ expect(tabs).toEqual(['ghi', 'jkl', 'def', 'abc']);
});
});
});
diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js
index 0cfd12a2d04..dee542458b6 100644
--- a/apps/files/tests/js/fileactionsmenuSpec.js
+++ b/apps/files/tests/js/fileactionsmenuSpec.js
@@ -152,6 +152,43 @@ describe('OCA.Files.FileActionsMenu tests', function() {
expect(menu.$el.find('a[data-action=Match]').length).toEqual(1);
expect(menu.$el.find('a[data-action=NoMatch]').length).toEqual(0);
});
+ it('sorts by order attribute, then name', function() {
+ fileActions.registerAction({
+ name: 'Baction',
+ displayName: 'Baction',
+ order: 2,
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_ALL
+ });
+ fileActions.registerAction({
+ name: 'Zaction',
+ displayName: 'Zaction',
+ order: 1,
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_ALL
+ });
+ fileActions.registerAction({
+ name: 'Yaction',
+ displayName: 'Yaction',
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_ALL
+ });
+ fileActions.registerAction({
+ name: 'Waction',
+ displayName: 'Waction',
+ mime: 'text/plain',
+ permissions: OC.PERMISSION_ALL
+ });
+
+ menu.render();
+ var zactionIndex = menu.$el.find('a[data-action=Zaction]').closest('li').index();
+ var bactionIndex = menu.$el.find('a[data-action=Baction]').closest('li').index();
+ expect(zactionIndex).toBeLessThan(bactionIndex);
+
+ var wactionIndex = menu.$el.find('a[data-action=Waction]').closest('li').index();
+ var yactionIndex = menu.$el.find('a[data-action=Yaction]').closest('li').index();
+ expect(wactionIndex).toBeLessThan(yactionIndex);
+ });
});
describe('action handler', function() {
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index c05e7c37214..96018917c85 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -135,6 +135,9 @@ describe('OCA.Files.FileList tests', function() {
});
afterEach(function() {
testFiles = undefined;
+ if (fileList) {
+ fileList.destroy();
+ }
fileList = undefined;
notificationStub.restore();
@@ -1881,8 +1884,9 @@ describe('OCA.Files.FileList tests', function() {
describe('Details sidebar', function() {
beforeEach(function() {
fileList.setFiles(testFiles);
+ fileList.showDetailsView('Two.jpg');
});
- it('Clicking on a file row will trigger file action if no details view configured', function() {
+ it('triggers file action when clicking on row if no details view configured', function() {
fileList._detailsView = null;
var updateDetailsViewStub = sinon.stub(fileList, '_updateDetailsView');
var actionStub = sinon.stub();
@@ -1904,7 +1908,7 @@ describe('OCA.Files.FileList tests', function() {
expect(updateDetailsViewStub.notCalled).toEqual(true);
updateDetailsViewStub.restore();
});
- it('Clicking on a file row will trigger details sidebar', function() {
+ it('highlights current file when clicked and updates sidebar', function() {
fileList.fileActions.setDefault('text/plain', 'Test');
var $tr = fileList.findFileEl('One.txt');
$tr.find('td.filename>a.name').click();
@@ -1912,14 +1916,34 @@ describe('OCA.Files.FileList tests', function() {
expect(fileList._detailsView.getFileInfo().id).toEqual(1);
});
- it('Clicking outside to deselect a file row will trigger details sidebar', function() {
+ it('keeps the last highlighted file when clicking outside', function() {
var $tr = fileList.findFileEl('One.txt');
$tr.find('td.filename>a.name').click();
fileList.$el.find('tfoot').click();
- expect($tr.hasClass('highlighted')).toEqual(false);
- expect(fileList._detailsView.getFileInfo()).toEqual(null);
+ expect($tr.hasClass('highlighted')).toEqual(true);
+ expect(fileList._detailsView.getFileInfo().id).toEqual(1);
+ });
+ it('keeps the last highlighted file when unselecting file using checkbox', function() {
+ var $tr = fileList.findFileEl('One.txt');
+ $tr.find('input:checkbox').click();
+ expect($tr.hasClass('highlighted')).toEqual(true);
+ $tr.find('input:checkbox').click();
+
+ expect($tr.hasClass('highlighted')).toEqual(true);
+ expect(fileList._detailsView.getFileInfo().id).toEqual(1);
+ });
+ it('closes sidebar whenever the currently highlighted file was removed from the list', function() {
+ var $tr = fileList.findFileEl('One.txt');
+ $tr.find('td.filename>a.name').click();
+ expect($tr.hasClass('highlighted')).toEqual(true);
+
+ expect(fileList._detailsView.getFileInfo().id).toEqual(1);
+
+ expect($('#app-sidebar').hasClass('disappear')).toEqual(false);
+ fileList.remove('One.txt');
+ expect($('#app-sidebar').hasClass('disappear')).toEqual(true);
});
it('returns the currently selected model instance when calling getModelForFile', function() {
var $tr = fileList.findFileEl('One.txt');
@@ -1935,6 +1959,14 @@ describe('OCA.Files.FileList tests', function() {
var model3 = fileList.getModelForFile($tr);
expect(model3).toEqual(model1);
});
+ it('closes the sidebar when switching folders', function() {
+ var $tr = fileList.findFileEl('One.txt');
+ $tr.find('td.filename>a.name').click();
+
+ expect($('#app-sidebar').hasClass('disappear')).toEqual(false);
+ fileList.changeDirectory('/another');
+ expect($('#app-sidebar').hasClass('disappear')).toEqual(true);
+ });
});
describe('File actions', function() {
it('Clicking on a file name will trigger default action', function() {
@@ -2156,6 +2188,25 @@ describe('OCA.Files.FileList tests', function() {
expect(fileList.files.length).toEqual(5);
expect(fileList.$fileList.find('tr').length).toEqual(5);
});
+ it('does not sort when clicking on header whenever multiselect is enabled', function() {
+ var sortStub = sinon.stub(OCA.Files.FileList.prototype, 'setSort');
+
+ fileList.setFiles(testFiles);
+ fileList.findFileEl('One.txt').find('input:checkbox:first').click();
+
+ fileList.$el.find('.column-size .columntitle').click();
+
+ expect(sortStub.notCalled).toEqual(true);
+
+ // can sort again after deselecting
+ fileList.findFileEl('One.txt').find('input:checkbox:first').click();
+
+ fileList.$el.find('.column-size .columntitle').click();
+
+ expect(sortStub.calledOnce).toEqual(true);
+
+ sortStub.restore();
+ });
});
describe('create file', function() {
var deferredCreate;
diff --git a/apps/files_external/controller/globalstoragescontroller.php b/apps/files_external/controller/globalstoragescontroller.php
index 7d97fdbb4f4..3c1f2022505 100644
--- a/apps/files_external/controller/globalstoragescontroller.php
+++ b/apps/files_external/controller/globalstoragescontroller.php
@@ -98,7 +98,7 @@ class GlobalStoragesController extends StoragesController {
return $newStorage;
}
- $response = $this->validate($newStorage, BackendService::PERMISSION_CREATE);
+ $response = $this->validate($newStorage);
if (!empty($response)) {
return $response;
}
@@ -154,7 +154,7 @@ class GlobalStoragesController extends StoragesController {
}
$storage->setId($id);
- $response = $this->validate($storage, BackendService::PERMISSION_MODIFY);
+ $response = $this->validate($storage);
if (!empty($response)) {
return $response;
}
@@ -179,14 +179,5 @@ class GlobalStoragesController extends StoragesController {
}
- /**
- * Get the user type for this controller, used in validation
- *
- * @return string BackendService::USER_* constants
- */
- protected function getUserType() {
- return BackendService::USER_ADMIN;
- }
-
}
diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php
index 46202c8ba4a..6a01112f8c5 100644
--- a/apps/files_external/controller/storagescontroller.php
+++ b/apps/files_external/controller/storagescontroller.php
@@ -125,11 +125,10 @@ abstract class StoragesController extends Controller {
* Validate storage config
*
* @param StorageConfig $storage storage config
- * @param int $permissionCheck permission to check
*
* @return DataResponse|null returns response in case of validation error
*/
- protected function validate(StorageConfig $storage, $permissionCheck = BackendService::PERMISSION_CREATE) {
+ protected function validate(StorageConfig $storage) {
$mountPoint = $storage->getMountPoint();
if ($mountPoint === '' || $mountPoint === '/') {
return new DataResponse(
@@ -154,7 +153,7 @@ abstract class StoragesController extends Controller {
$backend = $storage->getBackend();
/** @var AuthMechanism */
$authMechanism = $storage->getAuthMechanism();
- if (!$backend || $backend->checkDependencies()) {
+ if ($backend->checkDependencies()) {
// invalid backend
return new DataResponse(
array(
@@ -166,7 +165,7 @@ abstract class StoragesController extends Controller {
);
}
- if (!$backend->isPermitted($this->getUserType(), $permissionCheck)) {
+ if (!$backend->isVisibleFor($this->service->getVisibilityType())) {
// not permitted to use backend
return new DataResponse(
array(
@@ -177,7 +176,7 @@ abstract class StoragesController extends Controller {
Http::STATUS_UNPROCESSABLE_ENTITY
);
}
- if (!$authMechanism->isPermitted($this->getUserType(), $permissionCheck)) {
+ if (!$authMechanism->isVisibleFor($this->service->getVisibilityType())) {
// not permitted to use auth mechanism
return new DataResponse(
array(
@@ -212,13 +211,6 @@ abstract class StoragesController extends Controller {
}
/**
- * Get the user type for this controller, used in validation
- *
- * @return string BackendService::USER_* constants
- */
- abstract protected function getUserType();
-
- /**
* Check whether the given storage is available / valid.
*
* Note that this operation can be time consuming depending
diff --git a/apps/files_external/controller/userstoragescontroller.php b/apps/files_external/controller/userstoragescontroller.php
index 801c9ab0aae..f39f8a85d2d 100644
--- a/apps/files_external/controller/userstoragescontroller.php
+++ b/apps/files_external/controller/userstoragescontroller.php
@@ -103,7 +103,7 @@ class UserStoragesController extends StoragesController {
return $newStorage;
}
- $response = $this->validate($newStorage, BackendService::PERMISSION_CREATE);
+ $response = $this->validate($newStorage);
if (!empty($response)) {
return $response;
}
@@ -151,7 +151,7 @@ class UserStoragesController extends StoragesController {
}
$storage->setId($id);
- $response = $this->validate($storage, BackendService::PERMISSION_MODIFY);
+ $response = $this->validate($storage);
if (!empty($response)) {
return $response;
}
@@ -187,13 +187,4 @@ class UserStoragesController extends StoragesController {
return parent::destroy($id);
}
- /**
- * Get the user type for this controller, used in validation
- *
- * @return string BackendService::USER_* constants
- */
- protected function getUserType() {
- return BackendService::USER_PERSONAL;
- }
-
}
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index 4319677f4f4..5da34c52193 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -1113,7 +1113,18 @@ $(document).ready(function() {
$('input[name="allowUserMountingBackends\\[\\]"]').bind('change', function() {
OC.msg.startSaving('#userMountingMsg');
- var userMountingBackends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){return $(this).val();}).get();
+
+ var userMountingBackends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){
+ return $(this).val();
+ }).get();
+ var deprecatedBackends = $('input[name="allowUserMountingBackends\\[\\]"][data-deprecate-to]').map(function(){
+ if ($.inArray($(this).data('deprecate-to'), userMountingBackends) !== -1) {
+ return $(this).val();
+ }
+ return null;
+ }).get();
+ userMountingBackends = userMountingBackends.concat(deprecatedBackends);
+
OC.AppConfig.setValue('files_external', 'user_mounting_backends', userMountingBackends.join());
OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('files_external', 'Saved')}});
diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js
index b6084cc1545..21eba8c59d5 100644
--- a/apps/files_external/l10n/ast.js
+++ b/apps/files_external/l10n/ast.js
@@ -39,6 +39,7 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"Root" : "Raíz",
"Share" : "Compartir",
+ "SMB / CIFS using OC login" : "SMB / CIFS usando accesu OC",
"Username as share" : "Nome d'usuariu como Compartición",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json
index ccf882952ae..2464f44ca63 100644
--- a/apps/files_external/l10n/ast.json
+++ b/apps/files_external/l10n/ast.json
@@ -37,6 +37,7 @@
"ownCloud" : "ownCloud",
"Root" : "Raíz",
"Share" : "Compartir",
+ "SMB / CIFS using OC login" : "SMB / CIFS usando accesu OC",
"Username as share" : "Nome d'usuariu como Compartición",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/az.js b/apps/files_external/l10n/az.js
index 9c86576c7fc..f51a743d874 100644
--- a/apps/files_external/l10n/az.js
+++ b/apps/files_external/l10n/az.js
@@ -41,6 +41,7 @@ OC.L10N.register(
"Local" : "Yerli",
"Location" : "Yerləşdiyiniz ünvan",
"Share" : "Yayımla",
+ "SMB / CIFS using OC login" : "OC login istifadə edir SMB / CIFS",
"Username as share" : "Paylaşım üçün istifadəçi adı",
"OpenStack Object Storage" : "OpenStack Obyekt Deposu",
"<b>Note:</b> " : "<b>Qeyd:</b> ",
diff --git a/apps/files_external/l10n/az.json b/apps/files_external/l10n/az.json
index fa300deea8d..317b7948570 100644
--- a/apps/files_external/l10n/az.json
+++ b/apps/files_external/l10n/az.json
@@ -39,6 +39,7 @@
"Local" : "Yerli",
"Location" : "Yerləşdiyiniz ünvan",
"Share" : "Yayımla",
+ "SMB / CIFS using OC login" : "OC login istifadə edir SMB / CIFS",
"Username as share" : "Paylaşım üçün istifadəçi adı",
"OpenStack Object Storage" : "OpenStack Obyekt Deposu",
"<b>Note:</b> " : "<b>Qeyd:</b> ",
diff --git a/apps/files_external/l10n/bg_BG.js b/apps/files_external/l10n/bg_BG.js
index 70eae9d1abd..8a416271bce 100644
--- a/apps/files_external/l10n/bg_BG.js
+++ b/apps/files_external/l10n/bg_BG.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"Root" : "Root",
"Share" : "Споделяне",
+ "SMB / CIFS using OC login" : "SMB / CIFS използвайки OC профил",
"Username as share" : "Потребителско име като споделена папка",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Бележка:</b> ",
diff --git a/apps/files_external/l10n/bg_BG.json b/apps/files_external/l10n/bg_BG.json
index 731897d4a3a..c9191e6d402 100644
--- a/apps/files_external/l10n/bg_BG.json
+++ b/apps/files_external/l10n/bg_BG.json
@@ -41,6 +41,7 @@
"ownCloud" : "ownCloud",
"Root" : "Root",
"Share" : "Споделяне",
+ "SMB / CIFS using OC login" : "SMB / CIFS използвайки OC профил",
"Username as share" : "Потребителско име като споделена папка",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Бележка:</b> ",
diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js
index 9c10f6d5c50..36ea0086c1f 100644
--- a/apps/files_external/l10n/ca.js
+++ b/apps/files_external/l10n/ca.js
@@ -48,7 +48,9 @@ OC.L10N.register(
"Location" : "Ubicació",
"ownCloud" : "ownCloud",
"Root" : "Arrel",
+ "SFTP with secret key login" : "Inici de sessió SFTP amb clau secreta",
"Share" : "Comparteix",
+ "SMB / CIFS using OC login" : "SMB / CIFS usant acreditació OC",
"Username as share" : "Nom d'usuari per compartir",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json
index 123527688c4..ffbacca550f 100644
--- a/apps/files_external/l10n/ca.json
+++ b/apps/files_external/l10n/ca.json
@@ -46,7 +46,9 @@
"Location" : "Ubicació",
"ownCloud" : "ownCloud",
"Root" : "Arrel",
+ "SFTP with secret key login" : "Inici de sessió SFTP amb clau secreta",
"Share" : "Comparteix",
+ "SMB / CIFS using OC login" : "SMB / CIFS usant acreditació OC",
"Username as share" : "Nom d'usuari per compartir",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js
index 503d00893e9..59b3f9b148c 100644
--- a/apps/files_external/l10n/cs_CZ.js
+++ b/apps/files_external/l10n/cs_CZ.js
@@ -30,6 +30,7 @@ OC.L10N.register(
"Saved" : "Uloženo",
"Access key" : "Přístupový klíč",
"Secret key" : "Tajný klíč",
+ "Builtin" : "Zabudované",
"None" : "Žádné",
"OAuth1" : "OAuth1",
"App key" : "Klíč aplikace",
@@ -66,10 +67,14 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Kořen",
+ "SFTP with secret key login" : "SFTP login s tajným klíčem",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Sdílet",
+ "Domain" : "Doména",
+ "SMB / CIFS using OC login" : "SMB / CIFS za použití přihlašovacího jména OC",
"Username as share" : "Uživatelské jméno jako sdílený adresář",
"OpenStack Object Storage" : "OpenStack Object Storage",
+ "Request timeout (seconds)" : "Čas vypršení požadavku (sekundy)",
"<b>Note:</b> " : "<b>Poznámka:</b>",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.",
diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json
index 74aa6cc82e3..08837e76a83 100644
--- a/apps/files_external/l10n/cs_CZ.json
+++ b/apps/files_external/l10n/cs_CZ.json
@@ -28,6 +28,7 @@
"Saved" : "Uloženo",
"Access key" : "Přístupový klíč",
"Secret key" : "Tajný klíč",
+ "Builtin" : "Zabudované",
"None" : "Žádné",
"OAuth1" : "OAuth1",
"App key" : "Klíč aplikace",
@@ -64,10 +65,14 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Kořen",
+ "SFTP with secret key login" : "SFTP login s tajným klíčem",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Sdílet",
+ "Domain" : "Doména",
+ "SMB / CIFS using OC login" : "SMB / CIFS za použití přihlašovacího jména OC",
"Username as share" : "Uživatelské jméno jako sdílený adresář",
"OpenStack Object Storage" : "OpenStack Object Storage",
+ "Request timeout (seconds)" : "Čas vypršení požadavku (sekundy)",
"<b>Note:</b> " : "<b>Poznámka:</b>",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.",
diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js
index 435884aa11d..3d0c15e578d 100644
--- a/apps/files_external/l10n/da.js
+++ b/apps/files_external/l10n/da.js
@@ -75,11 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
- "SFTP with secret key login [DEPRECATED]" : "SFTP med det hemmelige nøgle login [DEPRECATED]",
+ "SFTP with secret key login" : "SFTP med hemmelig nøglelogin",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Del",
"Domain" : "Domæne",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS der bruger OC login [DEPRECATED]",
+ "SMB / CIFS using OC login" : "SMB / CIFS med OC-login",
"Username as share" : "Brugernavn som deling",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Tjenestenavn",
diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json
index 631fb196624..0c70ebcf77a 100644
--- a/apps/files_external/l10n/da.json
+++ b/apps/files_external/l10n/da.json
@@ -73,11 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
- "SFTP with secret key login [DEPRECATED]" : "SFTP med det hemmelige nøgle login [DEPRECATED]",
+ "SFTP with secret key login" : "SFTP med hemmelig nøglelogin",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Del",
"Domain" : "Domæne",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS der bruger OC login [DEPRECATED]",
+ "SMB / CIFS using OC login" : "SMB / CIFS med OC-login",
"Username as share" : "Brugernavn som deling",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Tjenestenavn",
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index fc0af67d3d7..bd4aa124ee1 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Ort",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel",
"Share" : "Share",
+ "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index 4242b817073..f09172d814c 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -47,7 +47,9 @@
"Location" : "Ort",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel",
"Share" : "Share",
+ "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index 9d363aecbf6..db8c77aa35c 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Ort",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel",
"Share" : "Share",
+ "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index 62fe7b0803c..c3a254be26f 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -47,7 +47,9 @@
"Location" : "Ort",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP mit dem Login über einen geheimen Schlüssel",
"Share" : "Share",
+ "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login",
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js
index b311d615c32..4e62178830b 100644
--- a/apps/files_external/l10n/el.js
+++ b/apps/files_external/l10n/el.js
@@ -75,10 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
- "SFTP with secret key login [DEPRECATED]" : "SFTP με σύνδεση με κρυφό κλειδί [ΠΑΡΩΧΗΜΕΝΟ]",
+ "SFTP with secret key login" : "SFTP με σύνδεση με κρυφό κλειδί",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Διαμοιράστε",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC [ΠΑΡΩΧΗΜΕΝΟ]",
+ "Domain" : "Τομέας",
+ "SMB / CIFS using OC login" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC",
"Username as share" : "Όνομα χρήστη ως διαμοιραζόμενος φάκελος",
"OpenStack Object Storage" : "Αποθήκη αντικειμένων OpenStack",
"Service name" : "Όνομα υπηρεσίας",
diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json
index f42a610cc55..8aa6c987225 100644
--- a/apps/files_external/l10n/el.json
+++ b/apps/files_external/l10n/el.json
@@ -73,10 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
- "SFTP with secret key login [DEPRECATED]" : "SFTP με σύνδεση με κρυφό κλειδί [ΠΑΡΩΧΗΜΕΝΟ]",
+ "SFTP with secret key login" : "SFTP με σύνδεση με κρυφό κλειδί",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Διαμοιράστε",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC [ΠΑΡΩΧΗΜΕΝΟ]",
+ "Domain" : "Τομέας",
+ "SMB / CIFS using OC login" : "SMB / CIFS χρησιμοποιώντας λογαριασμό OC",
"Username as share" : "Όνομα χρήστη ως διαμοιραζόμενος φάκελος",
"OpenStack Object Storage" : "Αποθήκη αντικειμένων OpenStack",
"Service name" : "Όνομα υπηρεσίας",
diff --git a/apps/files_external/l10n/en_GB.js b/apps/files_external/l10n/en_GB.js
index 8b1c0cdd328..444d0db1d52 100644
--- a/apps/files_external/l10n/en_GB.js
+++ b/apps/files_external/l10n/en_GB.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Location",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP with secret key login",
"Share" : "Share",
+ "SMB / CIFS using OC login" : "SMB / CIFS using OC login",
"Username as share" : "Username as share",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Note:</b> ",
diff --git a/apps/files_external/l10n/en_GB.json b/apps/files_external/l10n/en_GB.json
index 78feab7a08f..8af92769bdf 100644
--- a/apps/files_external/l10n/en_GB.json
+++ b/apps/files_external/l10n/en_GB.json
@@ -47,7 +47,9 @@
"Location" : "Location",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP with secret key login",
"Share" : "Share",
+ "SMB / CIFS using OC login" : "SMB / CIFS using OC login",
"Username as share" : "Username as share",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Note:</b> ",
diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js
index 62d09425f72..3d9add9c2ec 100644
--- a/apps/files_external/l10n/es.js
+++ b/apps/files_external/l10n/es.js
@@ -7,6 +7,7 @@ OC.L10N.register(
"Storage with id \"%i\" not found" : "No se ha encontrado almacenamiento con id \"%i\"",
"Invalid mount point" : "Punto de montaje no válido",
"Invalid storage backend \"%s\"" : "Motor de almacenamiento no válido «%s»",
+ "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autenticación \"%s\"",
"Personal" : "Personal",
"System" : "Sistema",
"Grant access" : "Conceder acceso",
@@ -35,7 +36,7 @@ OC.L10N.register(
"Client secret" : "Cliente secreto",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
- "API key" : "clave API",
+ "API key" : "Clave API",
"Username and password" : "Nombre de usuario y contraseña",
"Session credentials" : "Credenciales de la sesión",
"Public key" : "Clave pública",
@@ -60,10 +61,14 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Raíz",
+ "SFTP with secret key login" : "Inicio de sesión SFTP con clave secreta",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Compartir",
+ "Domain" : "Dominio",
+ "SMB / CIFS using OC login" : "SMB / CIFS que usan acceso OC",
"Username as share" : "Nombre de usuario como compartir",
"OpenStack Object Storage" : "Almacenamiento de objeto OpenStack",
+ "Service name" : "Nombre del servicio",
"<b>Note:</b> " : "<b>Nota:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json
index 6bcfca820f5..60ae72faf72 100644
--- a/apps/files_external/l10n/es.json
+++ b/apps/files_external/l10n/es.json
@@ -5,6 +5,7 @@
"Storage with id \"%i\" not found" : "No se ha encontrado almacenamiento con id \"%i\"",
"Invalid mount point" : "Punto de montaje no válido",
"Invalid storage backend \"%s\"" : "Motor de almacenamiento no válido «%s»",
+ "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autenticación \"%s\"",
"Personal" : "Personal",
"System" : "Sistema",
"Grant access" : "Conceder acceso",
@@ -33,7 +34,7 @@
"Client secret" : "Cliente secreto",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
- "API key" : "clave API",
+ "API key" : "Clave API",
"Username and password" : "Nombre de usuario y contraseña",
"Session credentials" : "Credenciales de la sesión",
"Public key" : "Clave pública",
@@ -58,10 +59,14 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Raíz",
+ "SFTP with secret key login" : "Inicio de sesión SFTP con clave secreta",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Compartir",
+ "Domain" : "Dominio",
+ "SMB / CIFS using OC login" : "SMB / CIFS que usan acceso OC",
"Username as share" : "Nombre de usuario como compartir",
"OpenStack Object Storage" : "Almacenamiento de objeto OpenStack",
+ "Service name" : "Nombre del servicio",
"<b>Note:</b> " : "<b>Nota:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js
index 50102a5d2eb..ecb40dbc003 100644
--- a/apps/files_external/l10n/et_EE.js
+++ b/apps/files_external/l10n/et_EE.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Asukoht",
"ownCloud" : "ownCloud",
"Root" : "Juur",
+ "SFTP with secret key login" : "SFTP koos salajase võtmega logimisega",
"Share" : "Jaga",
+ "SMB / CIFS using OC login" : "SMB / CIFS kasutades OC logimist",
"Username as share" : "Kasutajanimi kui jagamine",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Märkus:</b>",
diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json
index d307bc9c214..3ab8610f6cc 100644
--- a/apps/files_external/l10n/et_EE.json
+++ b/apps/files_external/l10n/et_EE.json
@@ -47,7 +47,9 @@
"Location" : "Asukoht",
"ownCloud" : "ownCloud",
"Root" : "Juur",
+ "SFTP with secret key login" : "SFTP koos salajase võtmega logimisega",
"Share" : "Jaga",
+ "SMB / CIFS using OC login" : "SMB / CIFS kasutades OC logimist",
"Username as share" : "Kasutajanimi kui jagamine",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Märkus:</b>",
diff --git a/apps/files_external/l10n/eu.js b/apps/files_external/l10n/eu.js
index 199676d7269..fd31a4b6db3 100644
--- a/apps/files_external/l10n/eu.js
+++ b/apps/files_external/l10n/eu.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"Root" : "Erroa",
"Share" : "Partekatu",
+ "SMB / CIFS using OC login" : "SMB / CIFS saioa hasteko OC erabiliz",
"Username as share" : "Erabiltzaile izena elkarbanaketa bezala",
"OpenStack Object Storage" : "OpenStack Objektu Biltegiratzea",
"<b>Note:</b> " : "<b>Oharra:</b>",
diff --git a/apps/files_external/l10n/eu.json b/apps/files_external/l10n/eu.json
index f13311954f7..2270fa96d08 100644
--- a/apps/files_external/l10n/eu.json
+++ b/apps/files_external/l10n/eu.json
@@ -36,6 +36,7 @@
"ownCloud" : "ownCloud",
"Root" : "Erroa",
"Share" : "Partekatu",
+ "SMB / CIFS using OC login" : "SMB / CIFS saioa hasteko OC erabiliz",
"Username as share" : "Erabiltzaile izena elkarbanaketa bezala",
"OpenStack Object Storage" : "OpenStack Objektu Biltegiratzea",
"<b>Note:</b> " : "<b>Oharra:</b>",
diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js
index 92e93d9ed3a..610005fa925 100644
--- a/apps/files_external/l10n/fi_FI.js
+++ b/apps/files_external/l10n/fi_FI.js
@@ -58,6 +58,7 @@ OC.L10N.register(
"SFTP" : "SFTP",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Jaa",
+ "SMB / CIFS using OC login" : "SMB / CIFS käyttäen OC-kirjautumista",
"Username as share" : "Käyttäjänimi jakona",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Palvelun nimi",
diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json
index 6459b33a126..f8961048e2f 100644
--- a/apps/files_external/l10n/fi_FI.json
+++ b/apps/files_external/l10n/fi_FI.json
@@ -56,6 +56,7 @@
"SFTP" : "SFTP",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Jaa",
+ "SMB / CIFS using OC login" : "SMB / CIFS käyttäen OC-kirjautumista",
"Username as share" : "Käyttäjänimi jakona",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Palvelun nimi",
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index 87c7f63bfb5..f183bfeef57 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -41,11 +41,13 @@ OC.L10N.register(
"OAuth2" : "OAuth2",
"Client ID" : "ID Client",
"Client secret" : "Secret client",
+ "OpenStack" : "OpenStack",
"Username" : "Nom d'utilisateur",
"Password" : "Mot de passe",
"API key" : "Clé API",
"Username and password" : "Nom d'utilisateur et mot de passe",
"Session credentials" : "Informations d'identification de session",
+ "RSA public key" : "Clé publique RSA",
"Public key" : "Clef publique",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
@@ -68,8 +70,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP avec identification par clé",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Partage",
+ "Domain" : "Domaine",
+ "SMB / CIFS using OC login" : "SMB / CIFS en utilisant les identifiants OC",
"Username as share" : "Nom d'utilisateur comme nom de partage",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Attention :</b>",
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index dee041e3546..ed5c397f302 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -39,11 +39,13 @@
"OAuth2" : "OAuth2",
"Client ID" : "ID Client",
"Client secret" : "Secret client",
+ "OpenStack" : "OpenStack",
"Username" : "Nom d'utilisateur",
"Password" : "Mot de passe",
"API key" : "Clé API",
"Username and password" : "Nom d'utilisateur et mot de passe",
"Session credentials" : "Informations d'identification de session",
+ "RSA public key" : "Clé publique RSA",
"Public key" : "Clef publique",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
@@ -66,8 +68,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP avec identification par clé",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Partage",
+ "Domain" : "Domaine",
+ "SMB / CIFS using OC login" : "SMB / CIFS en utilisant les identifiants OC",
"Username as share" : "Nom d'utilisateur comme nom de partage",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Attention :</b>",
diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js
index fc4d4ea4931..1fa5f41d64a 100644
--- a/apps/files_external/l10n/gl.js
+++ b/apps/files_external/l10n/gl.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Localización",
"ownCloud" : "ownCloud",
"Root" : "Root (raíz)",
+ "SFTP with secret key login" : "SFTP con chave secreta de acceso",
"Share" : "Compartir",
+ "SMB / CIFS using OC login" : "SMB / CIFS usando acceso OC",
"Username as share" : "Nome de usuario como compartición",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json
index 48bd2c62e9a..a4cacf44faf 100644
--- a/apps/files_external/l10n/gl.json
+++ b/apps/files_external/l10n/gl.json
@@ -47,7 +47,9 @@
"Location" : "Localización",
"ownCloud" : "ownCloud",
"Root" : "Root (raíz)",
+ "SFTP with secret key login" : "SFTP con chave secreta de acceso",
"Share" : "Compartir",
+ "SMB / CIFS using OC login" : "SMB / CIFS usando acceso OC",
"Username as share" : "Nome de usuario como compartición",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/hr.js b/apps/files_external/l10n/hr.js
index 7ab17521581..651470a58fe 100644
--- a/apps/files_external/l10n/hr.js
+++ b/apps/files_external/l10n/hr.js
@@ -36,6 +36,7 @@ OC.L10N.register(
"ownCloud" : "OwnCloud",
"Root" : "Korijen",
"Share" : "Dijeljenje zhajedničkih resursa",
+ "SMB / CIFS using OC login" : "SMB / CIFS uz prijavu putem programa OC",
"Username as share" : "Korisničko ime kao dijeljeni resurs",
"OpenStack Object Storage" : "Prostor za pohranu.....",
"<b>Note:</b> " : "<b>Bilješka:</b>",
diff --git a/apps/files_external/l10n/hr.json b/apps/files_external/l10n/hr.json
index 23188c55fea..80722b18ca4 100644
--- a/apps/files_external/l10n/hr.json
+++ b/apps/files_external/l10n/hr.json
@@ -34,6 +34,7 @@
"ownCloud" : "OwnCloud",
"Root" : "Korijen",
"Share" : "Dijeljenje zhajedničkih resursa",
+ "SMB / CIFS using OC login" : "SMB / CIFS uz prijavu putem programa OC",
"Username as share" : "Korisničko ime kao dijeljeni resurs",
"OpenStack Object Storage" : "Prostor za pohranu.....",
"<b>Note:</b> " : "<b>Bilješka:</b>",
diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js
index be0abf0bbae..e324a70e98e 100644
--- a/apps/files_external/l10n/id.js
+++ b/apps/files_external/l10n/id.js
@@ -12,6 +12,8 @@ OC.L10N.register(
"Invalid mount point" : "Mount point salah",
"Objectstore forbidden" : "Objectstore terlarang",
"Invalid storage backend \"%s\"" : "Backend penyimpanan \"%s\" salah",
+ "Not permitted to use backend \"%s\"" : "Tidak diizinkan menggunakan backend \"%s\"",
+ "Not permitted to use authentication mechanism \"%s\"" : "Tidak diizinkan menggunakan mekanisme otentikasi \"%s\"",
"Unsatisfied backend parameters" : "Parameter backend tidak lengkap",
"Unsatisfied authentication mechanism parameters" : "Parameter mekanisme otentikasi tidak lengkap",
"Personal" : "Pribadi",
@@ -41,11 +43,16 @@ OC.L10N.register(
"OAuth2" : "OAuth2",
"Client ID" : "ID Klien",
"Client secret" : "Rahasia klien",
+ "OpenStack" : "OpenStack",
"Username" : "Nama Pengguna",
"Password" : "Sandi",
+ "Tenant name" : "Nama tenant",
+ "Identity endpoint URL" : "Identitas URL akhir",
+ "Rackspace" : "Rackspace",
"API key" : "Kunci API",
"Username and password" : "Nama pengguna dan sandi",
"Session credentials" : "Kredensial sesi",
+ "RSA public key" : "Kunci publik RSA",
"Public key" : "Kunci Public",
"Amazon S3" : "Amazon S3",
"Bucket" : "Keranjang",
@@ -68,10 +75,15 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP dengan kunci rahasia masuk",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Bagikan",
+ "Domain" : "Domain",
+ "SMB / CIFS using OC login" : "SMB / CIFS menggunakan OC login",
"Username as share" : "Nama pengguna berbagi",
"OpenStack Object Storage" : "OpenStack Object Storage",
+ "Service name" : "Nama layanan",
+ "Request timeout (seconds)" : "Minta waktu habis (detik)",
"<b>Note:</b> " : "<b>Catatan:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.",
diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json
index 6c80a01b970..83f81014b1e 100644
--- a/apps/files_external/l10n/id.json
+++ b/apps/files_external/l10n/id.json
@@ -10,6 +10,8 @@
"Invalid mount point" : "Mount point salah",
"Objectstore forbidden" : "Objectstore terlarang",
"Invalid storage backend \"%s\"" : "Backend penyimpanan \"%s\" salah",
+ "Not permitted to use backend \"%s\"" : "Tidak diizinkan menggunakan backend \"%s\"",
+ "Not permitted to use authentication mechanism \"%s\"" : "Tidak diizinkan menggunakan mekanisme otentikasi \"%s\"",
"Unsatisfied backend parameters" : "Parameter backend tidak lengkap",
"Unsatisfied authentication mechanism parameters" : "Parameter mekanisme otentikasi tidak lengkap",
"Personal" : "Pribadi",
@@ -39,11 +41,16 @@
"OAuth2" : "OAuth2",
"Client ID" : "ID Klien",
"Client secret" : "Rahasia klien",
+ "OpenStack" : "OpenStack",
"Username" : "Nama Pengguna",
"Password" : "Sandi",
+ "Tenant name" : "Nama tenant",
+ "Identity endpoint URL" : "Identitas URL akhir",
+ "Rackspace" : "Rackspace",
"API key" : "Kunci API",
"Username and password" : "Nama pengguna dan sandi",
"Session credentials" : "Kredensial sesi",
+ "RSA public key" : "Kunci publik RSA",
"Public key" : "Kunci Public",
"Amazon S3" : "Amazon S3",
"Bucket" : "Keranjang",
@@ -66,10 +73,15 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
+ "SFTP with secret key login" : "SFTP dengan kunci rahasia masuk",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Bagikan",
+ "Domain" : "Domain",
+ "SMB / CIFS using OC login" : "SMB / CIFS menggunakan OC login",
"Username as share" : "Nama pengguna berbagi",
"OpenStack Object Storage" : "OpenStack Object Storage",
+ "Service name" : "Nama layanan",
+ "Request timeout (seconds)" : "Minta waktu habis (detik)",
"<b>Note:</b> " : "<b>Catatan:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.",
diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js
index 0844e90b903..c39e1764909 100644
--- a/apps/files_external/l10n/it.js
+++ b/apps/files_external/l10n/it.js
@@ -75,11 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Radice",
- "SFTP with secret key login [DEPRECATED]" : "SFTP con accesso a chiave segreta [DEPRECATO]",
+ "SFTP with secret key login" : "SFTP con accesso a chiave segreta",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Condividi",
"Domain" : "Dominio",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS utilizzando le credenziali di OC [DEPRECATO]",
+ "SMB / CIFS using OC login" : "SMB / CIFS utilizzando le credenziali di OC",
"Username as share" : "Nome utente come condivisione",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Nome servizio",
diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json
index cfe633bc328..ca3786bd3f5 100644
--- a/apps/files_external/l10n/it.json
+++ b/apps/files_external/l10n/it.json
@@ -73,11 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Radice",
- "SFTP with secret key login [DEPRECATED]" : "SFTP con accesso a chiave segreta [DEPRECATO]",
+ "SFTP with secret key login" : "SFTP con accesso a chiave segreta",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Condividi",
"Domain" : "Dominio",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS utilizzando le credenziali di OC [DEPRECATO]",
+ "SMB / CIFS using OC login" : "SMB / CIFS utilizzando le credenziali di OC",
"Username as share" : "Nome utente come condivisione",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Nome servizio",
diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js
index f5a9720be2e..c74b55fcddd 100644
--- a/apps/files_external/l10n/ja.js
+++ b/apps/files_external/l10n/ja.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "位置",
"ownCloud" : "ownCloud",
"Root" : "ルート",
+ "SFTP with secret key login" : "秘密鍵でSFTPログイン",
"Share" : "共有",
+ "SMB / CIFS using OC login" : "ownCloudログインを利用したSMB / CIFS",
"Username as share" : "共有名",
"OpenStack Object Storage" : "OpenStack ObjectStorage",
"<b>Note:</b> " : "<b>注意:</b> ",
diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json
index 951e86df8ca..50bfe5c5245 100644
--- a/apps/files_external/l10n/ja.json
+++ b/apps/files_external/l10n/ja.json
@@ -47,7 +47,9 @@
"Location" : "位置",
"ownCloud" : "ownCloud",
"Root" : "ルート",
+ "SFTP with secret key login" : "秘密鍵でSFTPログイン",
"Share" : "共有",
+ "SMB / CIFS using OC login" : "ownCloudログインを利用したSMB / CIFS",
"Username as share" : "共有名",
"OpenStack Object Storage" : "OpenStack ObjectStorage",
"<b>Note:</b> " : "<b>注意:</b> ",
diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js
index 3bed24abe66..f27e885772e 100644
--- a/apps/files_external/l10n/ko.js
+++ b/apps/files_external/l10n/ko.js
@@ -68,8 +68,10 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "루트",
+ "SFTP with secret key login" : "비밀 키 로그인을 사용하는 SFTP",
"SMB / CIFS" : "SMB/CIFS",
"Share" : "공유",
+ "SMB / CIFS using OC login" : "OC 로그인을 사용하는 SMB/CIFS",
"Username as share" : "사용자 이름으로 공유",
"OpenStack Object Storage" : "OpenStack 객체 저장소",
"<b>Note:</b> " : "<b>메모:</b>",
diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json
index 86cecf01329..ab804d58702 100644
--- a/apps/files_external/l10n/ko.json
+++ b/apps/files_external/l10n/ko.json
@@ -66,8 +66,10 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "루트",
+ "SFTP with secret key login" : "비밀 키 로그인을 사용하는 SFTP",
"SMB / CIFS" : "SMB/CIFS",
"Share" : "공유",
+ "SMB / CIFS using OC login" : "OC 로그인을 사용하는 SMB/CIFS",
"Username as share" : "사용자 이름으로 공유",
"OpenStack Object Storage" : "OpenStack 객체 저장소",
"<b>Note:</b> " : "<b>메모:</b>",
diff --git a/apps/files_external/l10n/nb_NO.js b/apps/files_external/l10n/nb_NO.js
index ea912e4cf7a..2057f257adc 100644
--- a/apps/files_external/l10n/nb_NO.js
+++ b/apps/files_external/l10n/nb_NO.js
@@ -75,11 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Rot",
- "SFTP with secret key login [DEPRECATED]" : "SFTP med hemmelig nøkkel for pålogging [FORELDET]",
+ "SFTP with secret key login" : "SFTP med hemmelig nøkkel for pålogging",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Delt ressurs",
"Domain" : "Domene",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS med OC-pålogging [FORELDET]",
+ "SMB / CIFS using OC login" : "SMB / CIFS med OC-pålogging",
"Username as share" : "Brukernavn som share",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Tjenestenavn",
diff --git a/apps/files_external/l10n/nb_NO.json b/apps/files_external/l10n/nb_NO.json
index 800234a931a..36556fd9912 100644
--- a/apps/files_external/l10n/nb_NO.json
+++ b/apps/files_external/l10n/nb_NO.json
@@ -73,11 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Rot",
- "SFTP with secret key login [DEPRECATED]" : "SFTP med hemmelig nøkkel for pålogging [FORELDET]",
+ "SFTP with secret key login" : "SFTP med hemmelig nøkkel for pålogging",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Delt ressurs",
"Domain" : "Domene",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS med OC-pålogging [FORELDET]",
+ "SMB / CIFS using OC login" : "SMB / CIFS med OC-pålogging",
"Username as share" : "Brukernavn som share",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Tjenestenavn",
diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js
index a40b2afa7e8..02661996d5e 100644
--- a/apps/files_external/l10n/nl.js
+++ b/apps/files_external/l10n/nl.js
@@ -75,11 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
- "SFTP with secret key login [DEPRECATED]" : "SFTP inlog met geheime sleutel [VEROUDERD]",
+ "SFTP with secret key login" : "SFTP met geheime sleutel inlog",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Share",
"Domain" : "Domein",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS login met OC [VEROUDERD]",
+ "SMB / CIFS using OC login" : "SMB / CIFS via OC inlog",
"Username as share" : "Gebruikersnaam als share",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Servicenaam",
diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json
index 52507dc4744..ef7f42b1f38 100644
--- a/apps/files_external/l10n/nl.json
+++ b/apps/files_external/l10n/nl.json
@@ -73,11 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Root",
- "SFTP with secret key login [DEPRECATED]" : "SFTP inlog met geheime sleutel [VEROUDERD]",
+ "SFTP with secret key login" : "SFTP met geheime sleutel inlog",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Share",
"Domain" : "Domein",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS login met OC [VEROUDERD]",
+ "SMB / CIFS using OC login" : "SMB / CIFS via OC inlog",
"Username as share" : "Gebruikersnaam als share",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Servicenaam",
diff --git a/apps/files_external/l10n/oc.js b/apps/files_external/l10n/oc.js
index d234d0c62c1..929d14347fc 100644
--- a/apps/files_external/l10n/oc.js
+++ b/apps/files_external/l10n/oc.js
@@ -23,6 +23,7 @@ OC.L10N.register(
"Client secret" : "Secret client",
"Username" : "Nom d'utilizaire",
"Password" : "Senhal",
+ "API key" : "Clau API",
"Public key" : "Clau publica",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
@@ -40,7 +41,9 @@ OC.L10N.register(
"Local" : "Local",
"Location" : "Emplaçament",
"ownCloud" : "ownCloud",
+ "SFTP with secret key login" : "SFTP amb un identificant secret",
"Share" : "Partejar",
+ "SMB / CIFS using OC login" : "SMB / CIFS en utilizant los identificants OC",
"Username as share" : "Nom d'utilizaire coma nom de partiment",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Atencion :</b>",
diff --git a/apps/files_external/l10n/oc.json b/apps/files_external/l10n/oc.json
index 0dfa95426ca..84fef9ec53f 100644
--- a/apps/files_external/l10n/oc.json
+++ b/apps/files_external/l10n/oc.json
@@ -21,6 +21,7 @@
"Client secret" : "Secret client",
"Username" : "Nom d'utilizaire",
"Password" : "Senhal",
+ "API key" : "Clau API",
"Public key" : "Clau publica",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
@@ -38,7 +39,9 @@
"Local" : "Local",
"Location" : "Emplaçament",
"ownCloud" : "ownCloud",
+ "SFTP with secret key login" : "SFTP amb un identificant secret",
"Share" : "Partejar",
+ "SMB / CIFS using OC login" : "SMB / CIFS en utilizant los identificants OC",
"Username as share" : "Nom d'utilizaire coma nom de partiment",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Atencion :</b>",
diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js
index 9fb70e71778..ac24a2b9006 100644
--- a/apps/files_external/l10n/pl.js
+++ b/apps/files_external/l10n/pl.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Lokalizacja",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "Logowanie tajnym kluczem do SFTP",
"Share" : "Udostępnij",
+ "SMB / CIFS using OC login" : "SMB / CIFS przy użyciu loginu OC",
"Username as share" : "Użytkownik jako zasób",
"OpenStack Object Storage" : "Magazyn obiektów OpenStack",
"<b>Note:</b> " : "<b>Uwaga:</b> ",
diff --git a/apps/files_external/l10n/pl.json b/apps/files_external/l10n/pl.json
index d7cd70b8c36..750e7384d68 100644
--- a/apps/files_external/l10n/pl.json
+++ b/apps/files_external/l10n/pl.json
@@ -47,7 +47,9 @@
"Location" : "Lokalizacja",
"ownCloud" : "ownCloud",
"Root" : "Root",
+ "SFTP with secret key login" : "Logowanie tajnym kluczem do SFTP",
"Share" : "Udostępnij",
+ "SMB / CIFS using OC login" : "SMB / CIFS przy użyciu loginu OC",
"Username as share" : "Użytkownik jako zasób",
"OpenStack Object Storage" : "Magazyn obiektów OpenStack",
"<b>Note:</b> " : "<b>Uwaga:</b> ",
diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js
index 68b1c671c3c..3d392a688ee 100644
--- a/apps/files_external/l10n/pt_BR.js
+++ b/apps/files_external/l10n/pt_BR.js
@@ -75,11 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Raiz",
- "SFTP with secret key login [DEPRECATED]" : "SFTP com chave secreta de login [DEPRECATED]",
+ "SFTP with secret key login" : "SFTP com chave secreta de login",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Compartilhar",
"Domain" : "Domínio",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS usando OC de login [DEPRECATED]",
+ "SMB / CIFS using OC login" : "SMB / CIFS usando OC login",
"Username as share" : "Nome de usuário como compartilhado",
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"Service name" : "Nome do serviço",
diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json
index bb4c5b88a2d..9289ac7f388 100644
--- a/apps/files_external/l10n/pt_BR.json
+++ b/apps/files_external/l10n/pt_BR.json
@@ -73,11 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Raiz",
- "SFTP with secret key login [DEPRECATED]" : "SFTP com chave secreta de login [DEPRECATED]",
+ "SFTP with secret key login" : "SFTP com chave secreta de login",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Compartilhar",
"Domain" : "Domínio",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS usando OC de login [DEPRECATED]",
+ "SMB / CIFS using OC login" : "SMB / CIFS usando OC login",
"Username as share" : "Nome de usuário como compartilhado",
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"Service name" : "Nome do serviço",
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index ba1d86a40d0..37a6d35471e 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -67,6 +67,7 @@ OC.L10N.register(
"Root" : "Root",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Compartilhar",
+ "SMB / CIFS using OC login" : "SMB / CIFS utilizando o início de sessão OC",
"Username as share" : "Nome de utilizador como partilha",
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index 24955db65f6..90c863334a5 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -65,6 +65,7 @@
"Root" : "Root",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Compartilhar",
+ "SMB / CIFS using OC login" : "SMB / CIFS utilizando o início de sessão OC",
"Username as share" : "Nome de utilizador como partilha",
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"<b>Note:</b> " : "<b>Nota:</b> ",
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index f76c5526bca..e4415e2e2b3 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Местоположение",
"ownCloud" : "ownCloud",
"Root" : "Корневой каталог",
+ "SFTP with secret key login" : "SFTP с помощью секретного ключа",
"Share" : "Общий доступ",
+ "SMB / CIFS using OC login" : "SMB / CIFS с ипользованием логина OC",
"Username as share" : "Имя пользователя в качестве имени общего ресурса",
"OpenStack Object Storage" : "Хранилище объектов OpenStack",
"<b>Note:</b> " : "<b>Примечание:</b> ",
diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index 3428d05ef4b..1ea452f5408 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -47,7 +47,9 @@
"Location" : "Местоположение",
"ownCloud" : "ownCloud",
"Root" : "Корневой каталог",
+ "SFTP with secret key login" : "SFTP с помощью секретного ключа",
"Share" : "Общий доступ",
+ "SMB / CIFS using OC login" : "SMB / CIFS с ипользованием логина OC",
"Username as share" : "Имя пользователя в качестве имени общего ресурса",
"OpenStack Object Storage" : "Хранилище объектов OpenStack",
"<b>Note:</b> " : "<b>Примечание:</b> ",
diff --git a/apps/files_external/l10n/sk_SK.js b/apps/files_external/l10n/sk_SK.js
index 87ea8c64bc5..2f9732961fb 100644
--- a/apps/files_external/l10n/sk_SK.js
+++ b/apps/files_external/l10n/sk_SK.js
@@ -1,30 +1,58 @@
OC.L10N.register(
"files_external",
{
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Sťahovanie tokenov požiadavky zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Sťahovanie prístupových tokenov zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.",
+ "Please provide a valid app key and secret." : "Zadajte prosím platný aplikačný kľúč a heslo (secret).",
"Step 1 failed. Exception: %s" : "Krok 1 zlyhal. Výnimka: %s",
"Step 2 failed. Exception: %s" : "Krok 2 zlyhal. Výnimka: %s",
"External storage" : "Externé úložisko",
+ "Storage with id \"%i\" not found" : "Úložisko s ID \"%i\" sa nenašlo",
+ "Invalid backend or authentication mechanism class" : "Neplatný backend, prípadne trieda mechanizmu autentifikácie",
"Invalid mount point" : "Chybný prípojný bod",
+ "Objectstore forbidden" : "Objectstore je zakáazaný",
+ "Invalid storage backend \"%s\"" : "Neplatný backend úložiska \"%s\"",
+ "Not permitted to use backend \"%s\"" : "Nie je povolené použiť backend \"%s\"",
+ "Not permitted to use authentication mechanism \"%s\"" : "Nie je povolené použiť autentifikačný mechanizmus \"%s\"",
+ "Unsatisfied backend parameters" : "Nedostatočné parametre backendu",
+ "Unsatisfied authentication mechanism parameters" : "Nedostatočné parametre autentifikačného mechanizmu",
"Personal" : "Osobné",
"System" : "Systém",
"Grant access" : "Povoliť prístup",
"Access granted" : "Prístup povolený",
+ "Error configuring OAuth1" : "Chyba konfigurovania OAuth1",
+ "Error configuring OAuth2" : "Chyba konfigurovania OAuth2",
"Generate keys" : "Vytvoriť kľúče",
"Error generating key pair" : "Chyba pri vytváraní dvojice kľúčov",
"Enable encryption" : "Povoliť šifrovanie",
"Enable previews" : "Povoliť náhľady",
+ "Check for changes" : "Zisťovať zmeny",
"Never" : "Nikdy",
+ "Once every direct access" : "S každým priamym prístupom",
+ "Every time the filesystem is used" : "Vždy keď je použitý súborový systém",
"All users. Type to select user or group." : "Všetci používatelia. Začnite písať pre výber používateľa alebo skupinu.",
"(group)" : "(skupina)",
"Saved" : "Uložené",
+ "Access key" : "Prístupový kľúč",
+ "Secret key" : "Tajný kľúč",
+ "Builtin" : "Vstavaný",
"None" : "Žiadny",
+ "OAuth1" : "OAuth1",
"App key" : "Kľúč aplikácie",
"App secret" : "Heslo aplikácie",
+ "OAuth2" : "OAuth2",
"Client ID" : "Client ID",
"Client secret" : "Heslo klienta",
+ "OpenStack" : "OpenStack",
"Username" : "Používateľské meno",
"Password" : "Heslo",
+ "Tenant name" : "Meno nájomcu",
+ "Identity endpoint URL" : "Endpoint URL identita",
+ "Rackspace" : "Rackspace",
"API key" : "API kľúč",
+ "Username and password" : "Meno a heslo",
+ "Session credentials" : "Pihlasovacie údaje sezóny",
+ "RSA public key" : "RSA verejný kľúč",
"Public key" : "Verejný kľúč",
"Amazon S3" : "Amazon S3",
"Bucket" : "Sektor",
@@ -38,25 +66,35 @@ OC.L10N.register(
"Remote subfolder" : "Vzdialený podpriečinok",
"Secure https://" : "Zabezpečené https://",
"Dropbox" : "Dropbox",
+ "FTP" : "FTP",
"Host" : "Hostiteľ",
"Secure ftps://" : "Zabezpečené ftps://",
+ "Google Drive" : "Google Drive",
"Local" : "Lokálny",
"Location" : "Umiestnenie",
"ownCloud" : "ownCloud",
+ "SFTP" : "SFTP",
"Root" : "Root",
+ "SMB / CIFS" : "SMB / CIFS",
"Share" : "Zdieľať",
+ "Domain" : "Doména",
+ "SMB / CIFS using OC login" : "SMB / CIFS s použitím OC prihlásenia",
"Username as share" : "Používateľské meno ako zdieľaný priečinok",
"OpenStack Object Storage" : "OpenStack Object Storage",
+ "Service name" : "Názov služby",
+ "Request timeout (seconds)" : "Timeout požiadavky (s)",
"<b>Note:</b> " : "<b>Poznámka:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"No external storage configured" : "Žiadne externé úložisko nie je nakonfigurované",
+ "You can add external storages in the personal settings" : "Externé úložisko je možné pridať v osobných nastaveniach",
"Name" : "Názov",
"Storage type" : "Typ úložiska",
"Scope" : "Rozsah",
"External Storage" : "Externé úložisko",
"Folder name" : "Názov priečinka",
+ "Authentication" : "Autentifikácia",
"Configuration" : "Nastavenia",
"Available for" : "K dispozícii pre",
"Advanced settings" : "Rozšírené nastavenia",
diff --git a/apps/files_external/l10n/sk_SK.json b/apps/files_external/l10n/sk_SK.json
index 5e7f4d1fa94..b2b21ffe1bb 100644
--- a/apps/files_external/l10n/sk_SK.json
+++ b/apps/files_external/l10n/sk_SK.json
@@ -1,28 +1,56 @@
{ "translations": {
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Sťahovanie tokenov požiadavky zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Sťahovanie prístupových tokenov zlyhalo. Overte prosím, či je aplikačný kľúč a heslo (secret) zadané správne.",
+ "Please provide a valid app key and secret." : "Zadajte prosím platný aplikačný kľúč a heslo (secret).",
"Step 1 failed. Exception: %s" : "Krok 1 zlyhal. Výnimka: %s",
"Step 2 failed. Exception: %s" : "Krok 2 zlyhal. Výnimka: %s",
"External storage" : "Externé úložisko",
+ "Storage with id \"%i\" not found" : "Úložisko s ID \"%i\" sa nenašlo",
+ "Invalid backend or authentication mechanism class" : "Neplatný backend, prípadne trieda mechanizmu autentifikácie",
"Invalid mount point" : "Chybný prípojný bod",
+ "Objectstore forbidden" : "Objectstore je zakáazaný",
+ "Invalid storage backend \"%s\"" : "Neplatný backend úložiska \"%s\"",
+ "Not permitted to use backend \"%s\"" : "Nie je povolené použiť backend \"%s\"",
+ "Not permitted to use authentication mechanism \"%s\"" : "Nie je povolené použiť autentifikačný mechanizmus \"%s\"",
+ "Unsatisfied backend parameters" : "Nedostatočné parametre backendu",
+ "Unsatisfied authentication mechanism parameters" : "Nedostatočné parametre autentifikačného mechanizmu",
"Personal" : "Osobné",
"System" : "Systém",
"Grant access" : "Povoliť prístup",
"Access granted" : "Prístup povolený",
+ "Error configuring OAuth1" : "Chyba konfigurovania OAuth1",
+ "Error configuring OAuth2" : "Chyba konfigurovania OAuth2",
"Generate keys" : "Vytvoriť kľúče",
"Error generating key pair" : "Chyba pri vytváraní dvojice kľúčov",
"Enable encryption" : "Povoliť šifrovanie",
"Enable previews" : "Povoliť náhľady",
+ "Check for changes" : "Zisťovať zmeny",
"Never" : "Nikdy",
+ "Once every direct access" : "S každým priamym prístupom",
+ "Every time the filesystem is used" : "Vždy keď je použitý súborový systém",
"All users. Type to select user or group." : "Všetci používatelia. Začnite písať pre výber používateľa alebo skupinu.",
"(group)" : "(skupina)",
"Saved" : "Uložené",
+ "Access key" : "Prístupový kľúč",
+ "Secret key" : "Tajný kľúč",
+ "Builtin" : "Vstavaný",
"None" : "Žiadny",
+ "OAuth1" : "OAuth1",
"App key" : "Kľúč aplikácie",
"App secret" : "Heslo aplikácie",
+ "OAuth2" : "OAuth2",
"Client ID" : "Client ID",
"Client secret" : "Heslo klienta",
+ "OpenStack" : "OpenStack",
"Username" : "Používateľské meno",
"Password" : "Heslo",
+ "Tenant name" : "Meno nájomcu",
+ "Identity endpoint URL" : "Endpoint URL identita",
+ "Rackspace" : "Rackspace",
"API key" : "API kľúč",
+ "Username and password" : "Meno a heslo",
+ "Session credentials" : "Pihlasovacie údaje sezóny",
+ "RSA public key" : "RSA verejný kľúč",
"Public key" : "Verejný kľúč",
"Amazon S3" : "Amazon S3",
"Bucket" : "Sektor",
@@ -36,25 +64,35 @@
"Remote subfolder" : "Vzdialený podpriečinok",
"Secure https://" : "Zabezpečené https://",
"Dropbox" : "Dropbox",
+ "FTP" : "FTP",
"Host" : "Hostiteľ",
"Secure ftps://" : "Zabezpečené ftps://",
+ "Google Drive" : "Google Drive",
"Local" : "Lokálny",
"Location" : "Umiestnenie",
"ownCloud" : "ownCloud",
+ "SFTP" : "SFTP",
"Root" : "Root",
+ "SMB / CIFS" : "SMB / CIFS",
"Share" : "Zdieľať",
+ "Domain" : "Doména",
+ "SMB / CIFS using OC login" : "SMB / CIFS s použitím OC prihlásenia",
"Username as share" : "Používateľské meno ako zdieľaný priečinok",
"OpenStack Object Storage" : "OpenStack Object Storage",
+ "Service name" : "Názov služby",
+ "Request timeout (seconds)" : "Timeout požiadavky (s)",
"<b>Note:</b> " : "<b>Poznámka:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.",
"No external storage configured" : "Žiadne externé úložisko nie je nakonfigurované",
+ "You can add external storages in the personal settings" : "Externé úložisko je možné pridať v osobných nastaveniach",
"Name" : "Názov",
"Storage type" : "Typ úložiska",
"Scope" : "Rozsah",
"External Storage" : "Externé úložisko",
"Folder name" : "Názov priečinka",
+ "Authentication" : "Autentifikácia",
"Configuration" : "Nastavenia",
"Available for" : "K dispozícii pre",
"Advanced settings" : "Rozšírené nastavenia",
diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js
index b4c9cc00275..c971920298a 100644
--- a/apps/files_external/l10n/sl.js
+++ b/apps/files_external/l10n/sl.js
@@ -49,7 +49,9 @@ OC.L10N.register(
"Location" : "Mesto",
"ownCloud" : "ownCloud",
"Root" : "Koren",
+ "SFTP with secret key login" : "Prijava preko protokola SFTP z geslom",
"Share" : "Souporaba",
+ "SMB / CIFS using OC login" : "SMB / CIFS z uporabo prijave OC",
"Username as share" : "Uporabniško ime za souporabo",
"OpenStack Object Storage" : "Shramba predmeta OpenStack",
"<b>Note:</b> " : "<b>Opomba:</b> ",
diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json
index 56b64fb17cc..1a8df6097d8 100644
--- a/apps/files_external/l10n/sl.json
+++ b/apps/files_external/l10n/sl.json
@@ -47,7 +47,9 @@
"Location" : "Mesto",
"ownCloud" : "ownCloud",
"Root" : "Koren",
+ "SFTP with secret key login" : "Prijava preko protokola SFTP z geslom",
"Share" : "Souporaba",
+ "SMB / CIFS using OC login" : "SMB / CIFS z uporabo prijave OC",
"Username as share" : "Uporabniško ime za souporabo",
"OpenStack Object Storage" : "Shramba predmeta OpenStack",
"<b>Note:</b> " : "<b>Opomba:</b> ",
diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js
index ddc5878f1f5..633bfbcb423 100644
--- a/apps/files_external/l10n/sr.js
+++ b/apps/files_external/l10n/sr.js
@@ -48,7 +48,9 @@ OC.L10N.register(
"Local" : "локална",
"Location" : "Локација",
"ownCloud" : "оунКлауд",
+ "SFTP with secret key login" : "СФТП са пријавом помоћу тајног кључа",
"Share" : "Дели",
+ "SMB / CIFS using OC login" : "СМБ/ЦИФС користећи оунКлауд пријаву",
"Username as share" : "Корисничко име као дељење",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Напомена:</b> ",
diff --git a/apps/files_external/l10n/sr.json b/apps/files_external/l10n/sr.json
index bc7dc4de21a..820bec758df 100644
--- a/apps/files_external/l10n/sr.json
+++ b/apps/files_external/l10n/sr.json
@@ -46,7 +46,9 @@
"Local" : "локална",
"Location" : "Локација",
"ownCloud" : "оунКлауд",
+ "SFTP with secret key login" : "СФТП са пријавом помоћу тајног кључа",
"Share" : "Дели",
+ "SMB / CIFS using OC login" : "СМБ/ЦИФС користећи оунКлауд пријаву",
"Username as share" : "Корисничко име као дељење",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Напомена:</b> ",
diff --git a/apps/files_external/l10n/sr@latin.js b/apps/files_external/l10n/sr@latin.js
index 64301b4a026..0d1c69f4b75 100644
--- a/apps/files_external/l10n/sr@latin.js
+++ b/apps/files_external/l10n/sr@latin.js
@@ -34,6 +34,7 @@ OC.L10N.register(
"Location" : "Lokacija",
"Root" : "Koren",
"Share" : "Podeli",
+ "SMB / CIFS using OC login" : "SMB / CIFS koji koristi OC prijavljivanje",
"Username as share" : "Korisničko ime i deljeni direktorijum",
"OpenStack Object Storage" : "OpenStack skladište objekata",
"<b>Note:</b> " : "<b>Obratite pažnju:</b>",
diff --git a/apps/files_external/l10n/sr@latin.json b/apps/files_external/l10n/sr@latin.json
index 72fc20844bd..747a9f1082d 100644
--- a/apps/files_external/l10n/sr@latin.json
+++ b/apps/files_external/l10n/sr@latin.json
@@ -32,6 +32,7 @@
"Location" : "Lokacija",
"Root" : "Koren",
"Share" : "Podeli",
+ "SMB / CIFS using OC login" : "SMB / CIFS koji koristi OC prijavljivanje",
"Username as share" : "Korisničko ime i deljeni direktorijum",
"OpenStack Object Storage" : "OpenStack skladište objekata",
"<b>Note:</b> " : "<b>Obratite pažnju:</b>",
diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js
index 08175a56562..2defbf76c8c 100644
--- a/apps/files_external/l10n/sv.js
+++ b/apps/files_external/l10n/sv.js
@@ -39,6 +39,7 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"Root" : "Root",
"Share" : "Dela",
+ "SMB / CIFS using OC login" : "SMB / CIFS använder OC inloggning",
"Username as share" : "Användarnamn till utdelning",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b> OBS: </ b>",
diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json
index c44ad337ab3..ec8b7ef37fb 100644
--- a/apps/files_external/l10n/sv.json
+++ b/apps/files_external/l10n/sv.json
@@ -37,6 +37,7 @@
"ownCloud" : "ownCloud",
"Root" : "Root",
"Share" : "Dela",
+ "SMB / CIFS using OC login" : "SMB / CIFS använder OC inloggning",
"Username as share" : "Användarnamn till utdelning",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b> OBS: </ b>",
diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js
index 89308e5889c..9879265a709 100644
--- a/apps/files_external/l10n/th_TH.js
+++ b/apps/files_external/l10n/th_TH.js
@@ -75,11 +75,11 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "รูท",
- "SFTP with secret key login [DEPRECATED]" : "SFTP กับรหัสลับเข้าสู่ระบบ [ยกเลิก]",
+ "SFTP with secret key login" : "SFTP กับคีย์ลับสำหรับเข้าสู่ระบบ",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "แชร์",
"Domain" : "โดเมน",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS กำลังใช้ OC เข้าสู่ระบบ [ยกเลิก]",
+ "SMB / CIFS using OC login" : "SMB/CIFS กำลังใช้ OC เข้าสู่ระบบ",
"Username as share" : "ชื่อผู้ใช้ที่แชร์",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "ชื่อบริการ",
diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json
index 5b167001e4e..8c00efd7bb2 100644
--- a/apps/files_external/l10n/th_TH.json
+++ b/apps/files_external/l10n/th_TH.json
@@ -73,11 +73,11 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "รูท",
- "SFTP with secret key login [DEPRECATED]" : "SFTP กับรหัสลับเข้าสู่ระบบ [ยกเลิก]",
+ "SFTP with secret key login" : "SFTP กับคีย์ลับสำหรับเข้าสู่ระบบ",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "แชร์",
"Domain" : "โดเมน",
- "SMB / CIFS using OC login [DEPRECATED]" : "SMB / CIFS กำลังใช้ OC เข้าสู่ระบบ [ยกเลิก]",
+ "SMB / CIFS using OC login" : "SMB/CIFS กำลังใช้ OC เข้าสู่ระบบ",
"Username as share" : "ชื่อผู้ใช้ที่แชร์",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "ชื่อบริการ",
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index 652bc611866..b0fed7b5657 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -68,8 +68,10 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Kök",
+ "SFTP with secret key login" : "Gizli anahtar oturumu ile SFTP",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Paylaş",
+ "SMB / CIFS using OC login" : "OC oturumu kullanarak SMB / CIFS",
"Username as share" : "Paylaşım olarak kullanıcı adı",
"OpenStack Object Storage" : "OpenStack Nesne Depolama",
"<b>Note:</b> " : "<b>Not:</b> ",
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 328ecab466f..2a7d69832f8 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -66,8 +66,10 @@
"ownCloud" : "ownCloud",
"SFTP" : "SFTP",
"Root" : "Kök",
+ "SFTP with secret key login" : "Gizli anahtar oturumu ile SFTP",
"SMB / CIFS" : "SMB / CIFS",
"Share" : "Paylaş",
+ "SMB / CIFS using OC login" : "OC oturumu kullanarak SMB / CIFS",
"Username as share" : "Paylaşım olarak kullanıcı adı",
"OpenStack Object Storage" : "OpenStack Nesne Depolama",
"<b>Note:</b> " : "<b>Not:</b> ",
diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js
index 024d4fcf982..68b1787346a 100644
--- a/apps/files_external/l10n/uk.js
+++ b/apps/files_external/l10n/uk.js
@@ -45,6 +45,7 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"Root" : "Батьківський каталог",
"Share" : "Поділитися",
+ "SMB / CIFS using OC login" : "SMB / CIFS з використанням логіна OC",
"Username as share" : "Ім'я для відкритого доступу",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Примітка:</b>",
diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json
index fe5c43a8f39..5765a30dc59 100644
--- a/apps/files_external/l10n/uk.json
+++ b/apps/files_external/l10n/uk.json
@@ -43,6 +43,7 @@
"ownCloud" : "ownCloud",
"Root" : "Батьківський каталог",
"Share" : "Поділитися",
+ "SMB / CIFS using OC login" : "SMB / CIFS з використанням логіна OC",
"Username as share" : "Ім'я для відкритого доступу",
"OpenStack Object Storage" : "OpenStack Object Storage",
"<b>Note:</b> " : "<b>Примітка:</b>",
diff --git a/apps/files_external/l10n/zh_CN.js b/apps/files_external/l10n/zh_CN.js
index 535d945b028..3ba25300d95 100644
--- a/apps/files_external/l10n/zh_CN.js
+++ b/apps/files_external/l10n/zh_CN.js
@@ -30,6 +30,7 @@ OC.L10N.register(
"ownCloud" : "ownCloud",
"Root" : "根路径",
"Share" : "共享",
+ "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登录信息",
"OpenStack Object Storage" : "OpenStack 对象存储",
"<b>Note:</b> " : "<b>注意:</b>",
"Name" : "名称",
diff --git a/apps/files_external/l10n/zh_CN.json b/apps/files_external/l10n/zh_CN.json
index ac75d680c7e..94301573ab9 100644
--- a/apps/files_external/l10n/zh_CN.json
+++ b/apps/files_external/l10n/zh_CN.json
@@ -28,6 +28,7 @@
"ownCloud" : "ownCloud",
"Root" : "根路径",
"Share" : "共享",
+ "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登录信息",
"OpenStack Object Storage" : "OpenStack 对象存储",
"<b>Note:</b> " : "<b>注意:</b>",
"Name" : "名称",
diff --git a/apps/files_external/lib/auth/authmechanism.php b/apps/files_external/lib/auth/authmechanism.php
index ddc0c6a4dca..2ab34ed0105 100644
--- a/apps/files_external/lib/auth/authmechanism.php
+++ b/apps/files_external/lib/auth/authmechanism.php
@@ -22,7 +22,7 @@
namespace OCA\Files_External\Lib\Auth;
use \OCA\Files_External\Lib\StorageConfig;
-use \OCA\Files_External\Lib\PermissionsTrait;
+use \OCA\Files_External\Lib\VisibilityTrait;
use \OCA\Files_External\Lib\IdentifierTrait;
use \OCA\Files_External\Lib\FrontendDefinitionTrait;
use \OCA\Files_External\Lib\StorageModifierTrait;
@@ -40,7 +40,7 @@ use \OCA\Files_External\Lib\StorageModifierTrait;
* scheme, which are provided from the authentication mechanism.
*
* This class uses the following traits:
- * - PermissionsTrait
+ * - VisibilityTrait
* Restrict usage to admin-only/none
* - FrontendDefinitionTrait
* Specify configuration parameters and other definitions
@@ -58,7 +58,7 @@ class AuthMechanism implements \JsonSerializable {
const SCHEME_PUBLICKEY = 'publickey';
const SCHEME_OPENSTACK = 'openstack';
- use PermissionsTrait;
+ use VisibilityTrait;
use FrontendDefinitionTrait;
use StorageModifierTrait;
use IdentifierTrait;
@@ -92,6 +92,8 @@ class AuthMechanism implements \JsonSerializable {
*/
public function jsonSerialize() {
$data = $this->jsonSerializeDefinition();
+ $data += $this->jsonSerializeIdentifier();
+
$data['scheme'] = $this->getScheme();
return $data;
diff --git a/apps/files_external/lib/backend/backend.php b/apps/files_external/lib/backend/backend.php
index 2a2add3ac59..68585cf377e 100644
--- a/apps/files_external/lib/backend/backend.php
+++ b/apps/files_external/lib/backend/backend.php
@@ -22,7 +22,7 @@
namespace OCA\Files_External\Lib\Backend;
use \OCA\Files_External\Lib\StorageConfig;
-use \OCA\Files_External\Lib\PermissionsTrait;
+use \OCA\Files_External\Lib\VisibilityTrait;
use \OCA\Files_External\Lib\FrontendDefinitionTrait;
use \OCA\Files_External\Lib\PriorityTrait;
use \OCA\Files_External\Lib\DependencyTrait;
@@ -43,7 +43,7 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism;
* scheme, which are provided from the authentication mechanism.
*
* This class uses the following traits:
- * - PermissionsTrait
+ * - VisibilityTrait
* Restrict usage to admin-only/none
* - FrontendDefinitionTrait
* Specify configuration parameters and other definitions
@@ -56,7 +56,7 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism;
*/
class Backend implements \JsonSerializable {
- use PermissionsTrait;
+ use VisibilityTrait;
use FrontendDefinitionTrait;
use PriorityTrait;
use DependencyTrait;
@@ -142,6 +142,7 @@ class Backend implements \JsonSerializable {
*/
public function jsonSerialize() {
$data = $this->jsonSerializeDefinition();
+ $data += $this->jsonSerializeIdentifier();
$data['backend'] = $data['name']; // legacy compat
$data['priority'] = $this->getPriority();
diff --git a/apps/files_external/lib/backend/local.php b/apps/files_external/lib/backend/local.php
index a6635491b6e..a80b437fab7 100644
--- a/apps/files_external/lib/backend/local.php
+++ b/apps/files_external/lib/backend/local.php
@@ -39,7 +39,7 @@ class Local extends Backend {
->addParameters([
(new DefinitionParameter('datadir', $l->t('Location'))),
])
- ->setAllowedPermissions(BackendService::USER_PERSONAL, BackendService::PERMISSION_NONE)
+ ->setAllowedVisibility(BackendService::VISIBILITY_ADMIN)
->setPriority(BackendService::PRIORITY_DEFAULT + 50)
->addAuthScheme(AuthMechanism::SCHEME_NULL)
->setLegacyAuthMechanism($legacyAuth)
diff --git a/apps/files_external/lib/backend/sftp_key.php b/apps/files_external/lib/backend/sftp_key.php
index 6a75172026d..13f45f1140c 100644
--- a/apps/files_external/lib/backend/sftp_key.php
+++ b/apps/files_external/lib/backend/sftp_key.php
@@ -27,23 +27,23 @@ use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\PublicKey\RSA;
+use \OCA\Files_External\Lib\Backend\SFTP;
class SFTP_Key extends Backend {
- public function __construct(IL10N $l, RSA $legacyAuth) {
+ public function __construct(IL10N $l, RSA $legacyAuth, SFTP $sftpBackend) {
$this
->setIdentifier('\OC\Files\Storage\SFTP_Key')
->setStorageClass('\OC\Files\Storage\SFTP')
- ->setText($l->t('SFTP with secret key login [DEPRECATED]'))
+ ->setText($l->t('SFTP with secret key login'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
(new DefinitionParameter('root', $l->t('Remote subfolder')))
->setFlag(DefinitionParameter::FLAG_OPTIONAL),
])
- ->removeAllowedPermission(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE)
- ->removeAllowedPermission(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE)
->addAuthScheme(AuthMechanism::SCHEME_PUBLICKEY)
->setLegacyAuthMechanism($legacyAuth)
+ ->deprecateTo($sftpBackend)
;
}
diff --git a/apps/files_external/lib/backend/smb_oc.php b/apps/files_external/lib/backend/smb_oc.php
index d21b0ddaf42..9fc17400884 100644
--- a/apps/files_external/lib/backend/smb_oc.php
+++ b/apps/files_external/lib/backend/smb_oc.php
@@ -29,6 +29,7 @@ use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\Password\SessionCredentials;
use \OCA\Files_External\Lib\StorageConfig;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
+use \OCA\Files_External\Lib\Backend\SMB;
/**
* Deprecated SMB_OC class - use SMB with the password::sessioncredentials auth mechanism
@@ -37,11 +38,11 @@ class SMB_OC extends Backend {
use LegacyDependencyCheckPolyfill;
- public function __construct(IL10N $l, SessionCredentials $legacyAuth) {
+ public function __construct(IL10N $l, SessionCredentials $legacyAuth, SMB $smbBackend) {
$this
->setIdentifier('\OC\Files\Storage\SMB_OC')
->setStorageClass('\OC\Files\Storage\SMB')
- ->setText($l->t('SMB / CIFS using OC login [DEPRECATED]'))
+ ->setText($l->t('SMB / CIFS using OC login'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
(new DefinitionParameter('username_as_share', $l->t('Username as share')))
@@ -51,11 +52,10 @@ class SMB_OC extends Backend {
(new DefinitionParameter('root', $l->t('Remote subfolder')))
->setFlag(DefinitionParameter::FLAG_OPTIONAL),
])
- ->removeAllowedPermission(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE)
- ->removeAllowedPermission(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE)
->setPriority(BackendService::PRIORITY_DEFAULT - 10)
->addAuthScheme(AuthMechanism::SCHEME_PASSWORD)
->setLegacyAuthMechanism($legacyAuth)
+ ->deprecateTo($smbBackend)
;
}
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 2dc7de30a6c..afea7ead4e6 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -112,7 +112,7 @@ class OC_Mount_Config {
* @param string $uid user
* @return array of mount point string as key, mountpoint config as value
*
- * @deprecated 8.2.0 use UserGlobalStoragesService::getAllStorages() and UserStoragesService::getAllStorages()
+ * @deprecated 8.2.0 use UserGlobalStoragesService::getStorages() and UserStoragesService::getStorages()
*/
public static function getAbsoluteMountPoints($uid) {
$mountPoints = array();
@@ -124,7 +124,7 @@ class OC_Mount_Config {
$userGlobalStoragesService->setUser($user);
$userStoragesService->setUser($user);
- foreach ($userGlobalStoragesService->getAllStorages() as $storage) {
+ foreach ($userGlobalStoragesService->getStorages() as $storage) {
$mountPoint = '/'.$uid.'/files'.$storage->getMountPoint();
$mountEntry = self::prepareMountPointEntry($storage, false);
foreach ($mountEntry['options'] as &$option) {
@@ -133,7 +133,7 @@ class OC_Mount_Config {
$mountPoints[$mountPoint] = $mountEntry;
}
- foreach ($userStoragesService->getAllStorages() as $storage) {
+ foreach ($userStoragesService->getStorages() as $storage) {
$mountPoint = '/'.$uid.'/files'.$storage->getMountPoint();
$mountEntry = self::prepareMountPointEntry($storage, true);
foreach ($mountEntry['options'] as &$option) {
@@ -153,13 +153,13 @@ class OC_Mount_Config {
*
* @return array
*
- * @deprecated 8.2.0 use GlobalStoragesService::getAllStorages()
+ * @deprecated 8.2.0 use GlobalStoragesService::getStorages()
*/
public static function getSystemMountPoints() {
$mountPoints = [];
$service = self::$app->getContainer()->query('OCA\Files_External\Service\GlobalStoragesService');
- foreach ($service->getAllStorages() as $storage) {
+ foreach ($service->getStorages() as $storage) {
$mountPoints[] = self::prepareMountPointEntry($storage, false);
}
@@ -171,13 +171,13 @@ class OC_Mount_Config {
*
* @return array
*
- * @deprecated 8.2.0 use UserStoragesService::getAllStorages()
+ * @deprecated 8.2.0 use UserStoragesService::getStorages()
*/
public static function getPersonalMountPoints() {
$mountPoints = [];
$service = self::$app->getContainer()->query('OCA\Files_External\Service\UserStoragesService');
- foreach ($service->getAllStorages() as $storage) {
+ foreach ($service->getStorages() as $storage) {
$mountPoints[] = self::prepareMountPointEntry($storage, true);
}
diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php
index cb8c2f24caa..fb36e011655 100644
--- a/apps/files_external/lib/config/configadapter.php
+++ b/apps/files_external/lib/config/configadapter.php
@@ -133,7 +133,7 @@ class ConfigAdapter implements IMountProvider {
$mounts[$storage->getMountPoint()] = $mount;
}
- foreach ($this->userStoragesService->getAllStorages() as $storage) {
+ foreach ($this->userStoragesService->getStorages() as $storage) {
try {
$this->prepareStorageConfig($storage, $user);
$impl = $this->constructStorage($storage);
diff --git a/apps/files_external/lib/identifiertrait.php b/apps/files_external/lib/identifiertrait.php
index 139911580fc..7f36144e474 100644
--- a/apps/files_external/lib/identifiertrait.php
+++ b/apps/files_external/lib/identifiertrait.php
@@ -23,6 +23,7 @@ namespace OCA\Files_External\Lib;
/**
* Trait for objects requiring an identifier (and/or identifier aliases)
+ * Also supports deprecation to a different object, linking the objects
*/
trait IdentifierTrait {
@@ -32,6 +33,9 @@ trait IdentifierTrait {
/** @var string[] */
protected $identifierAliases = [];
+ /** @var IdentifierTrait */
+ protected $deprecateTo = null;
+
/**
* @return string
*/
@@ -65,4 +69,34 @@ trait IdentifierTrait {
return $this;
}
+ /**
+ * @return object|null
+ */
+ public function getDeprecateTo() {
+ return $this->deprecateTo;
+ }
+
+ /**
+ * @param object $destinationObject
+ * @return self
+ */
+ public function deprecateTo($destinationObject) {
+ $this->deprecateTo = $destinationObject;
+ return $this;
+ }
+
+ /**
+ * @return array
+ */
+ public function jsonSerializeIdentifier() {
+ $data = [
+ 'identifier' => $this->identifier,
+ 'identifierAliases' => $this->identifierAliases,
+ ];
+ if ($this->deprecateTo) {
+ $data['deprecateTo'] = $this->deprecateTo->getIdentifier();
+ }
+ return $data;
+ }
+
}
diff --git a/apps/files_external/lib/permissionstrait.php b/apps/files_external/lib/permissionstrait.php
deleted file mode 100644
index 8509a01e422..00000000000
--- a/apps/files_external/lib/permissionstrait.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-/**
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_External\Lib;
-
-use \OCA\Files_External\Service\BackendService;
-
-/**
- * Trait to implement backend and auth mechanism permissions
- *
- * For user type constants, see BackendService::USER_*
- * For permission constants, see BackendService::PERMISSION_*
- */
-trait PermissionsTrait {
-
- /** @var array [user type => permissions] */
- protected $permissions = [
- BackendService::USER_PERSONAL => BackendService::PERMISSION_DEFAULT,
- BackendService::USER_ADMIN => BackendService::PERMISSION_DEFAULT,
- ];
-
- /** @var array [user type => allowed permissions] */
- protected $allowedPermissions = [
- BackendService::USER_PERSONAL => BackendService::PERMISSION_DEFAULT,
- BackendService::USER_ADMIN => BackendService::PERMISSION_DEFAULT,
- ];
-
- /**
- * @param string $userType
- * @return int
- */
- public function getPermissions($userType) {
- if (isset($this->permissions[$userType])) {
- return $this->permissions[$userType];
- }
- return BackendService::PERMISSION_NONE;
- }
-
- /**
- * Check if the user type has permission
- *
- * @param string $userType
- * @param int $permission
- * @return bool
- */
- public function isPermitted($userType, $permission) {
- if ($this->getPermissions($userType) & $permission) {
- return true;
- }
- return false;
- }
-
- /**
- * @param string $userType
- * @param int $permissions
- * @return self
- */
- public function setPermissions($userType, $permissions) {
- $this->permissions[$userType] = $permissions;
- $this->allowedPermissions[$userType] =
- $this->getAllowedPermissions($userType) | $permissions;
- return $this;
- }
-
- /**
- * @param string $userType
- * @param int $permission
- * @return self
- */
- public function addPermission($userType, $permission) {
- return $this->setPermissions($userType,
- $this->getPermissions($userType) | $permission
- );
- }
-
- /**
- * @param string $userType
- * @param int $permission
- * @return self
- */
- public function removePermission($userType, $permission) {
- return $this->setPermissions($userType,
- $this->getPermissions($userType) & ~$permission
- );
- }
-
- /**
- * @param string $userType
- * @return int
- */
- public function getAllowedPermissions($userType) {
- if (isset($this->allowedPermissions[$userType])) {
- return $this->allowedPermissions[$userType];
- }
- return BackendService::PERMISSION_NONE;
- }
-
- /**
- * Check if the user type has an allowed permission
- *
- * @param string $userType
- * @param int $permission
- * @return bool
- */
- public function isAllowedPermitted($userType, $permission) {
- if ($this->getAllowedPermissions($userType) & $permission) {
- return true;
- }
- return false;
- }
-
- /**
- * @param string $userType
- * @param int $permissions
- * @return self
- */
- public function setAllowedPermissions($userType, $permissions) {
- $this->allowedPermissions[$userType] = $permissions;
- $this->permissions[$userType] =
- $this->getPermissions($userType) & $permissions;
- return $this;
- }
-
- /**
- * @param string $userType
- * @param int $permission
- * @return self
- */
- public function addAllowedPermission($userType, $permission) {
- return $this->setAllowedPermissions($userType,
- $this->getAllowedPermissions($userType) | $permission
- );
- }
-
- /**
- * @param string $userType
- * @param int $permission
- * @return self
- */
- public function removeAllowedPermission($userType, $permission) {
- return $this->setAllowedPermissions($userType,
- $this->getAllowedPermissions($userType) & ~$permission
- );
- }
-
-}
diff --git a/apps/files_external/lib/visibilitytrait.php b/apps/files_external/lib/visibilitytrait.php
new file mode 100644
index 00000000000..dfd2d323ca6
--- /dev/null
+++ b/apps/files_external/lib/visibilitytrait.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Lib;
+
+use \OCA\Files_External\Service\BackendService;
+
+/**
+ * Trait to implement visibility mechanics for a configuration class
+ *
+ * The standard visibility defines which users/groups can use or see the
+ * object. The allowed visibility defines the maximum visibility allowed to be
+ * set on the object. The standard visibility is often set dynamically by
+ * stored configuration parameters that can be modified by the administrator,
+ * while the allowed visibility is set directly by the object and cannot be
+ * modified by the administrator.
+ */
+trait VisibilityTrait {
+
+ /** @var int visibility */
+ protected $visibility = BackendService::VISIBILITY_DEFAULT;
+
+ /** @var int allowed visibilities */
+ protected $allowedVisibility = BackendService::VISIBILITY_DEFAULT;
+
+ /**
+ * @return int
+ */
+ public function getVisibility() {
+ return $this->visibility;
+ }
+
+ /**
+ * Check if the backend is visible for a user type
+ *
+ * @param int $visibility
+ * @return bool
+ */
+ public function isVisibleFor($visibility) {
+ if ($this->visibility & $visibility) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param int $visibility
+ * @return self
+ */
+ public function setVisibility($visibility) {
+ $this->visibility = $visibility;
+ $this->allowedVisibility |= $visibility;
+ return $this;
+ }
+
+ /**
+ * @param int $visibility
+ * @return self
+ */
+ public function addVisibility($visibility) {
+ return $this->setVisibility($this->visibility | $visibility);
+ }
+
+ /**
+ * @param int $visibility
+ * @return self
+ */
+ public function removeVisibility($visibility) {
+ return $this->setVisibility($this->visibility & ~$visibility);
+ }
+
+ /**
+ * @return int
+ */
+ public function getAllowedVisibility() {
+ return $this->allowedVisibility;
+ }
+
+ /**
+ * Check if the backend is allowed to be visible for a user type
+ *
+ * @param int $allowedVisibility
+ * @return bool
+ */
+ public function isAllowedVisibleFor($allowedVisibility) {
+ if ($this->allowedVisibility & $allowedVisibility) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param int $allowedVisibility
+ * @return self
+ */
+ public function setAllowedVisibility($allowedVisibility) {
+ $this->allowedVisibility = $allowedVisibility;
+ $this->visibility &= $allowedVisibility;
+ return $this;
+ }
+
+ /**
+ * @param int $allowedVisibility
+ * @return self
+ */
+ public function addAllowedVisibility($allowedVisibility) {
+ return $this->setAllowedVisibility($this->allowedVisibility | $allowedVisibility);
+ }
+
+ /**
+ * @param int $allowedVisibility
+ * @return self
+ */
+ public function removeAllowedVisibility($allowedVisibility) {
+ return $this->setAllowedVisibility($this->allowedVisibility & ~$allowedVisibility);
+ }
+
+}
diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php
index d47f983b357..f048d65540b 100644
--- a/apps/files_external/personal.php
+++ b/apps/files_external/personal.php
@@ -35,10 +35,10 @@ OCP\Util::addScript('files_external', 'settings');
OCP\Util::addStyle('files_external', 'settings');
$backends = array_filter($backendService->getAvailableBackends(), function($backend) {
- return $backend->isPermitted(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE);
+ return $backend->isVisibleFor(BackendService::VISIBILITY_PERSONAL);
});
$authMechanisms = array_filter($backendService->getAuthMechanisms(), function($authMechanism) {
- return $authMechanism->isPermitted(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE);
+ return $authMechanism->isVisibleFor(BackendService::VISIBILITY_PERSONAL);
});
foreach ($backends as $backend) {
if ($backend->getCustomJs()) {
@@ -54,7 +54,7 @@ foreach ($authMechanisms as $authMechanism) {
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
$tmpl->assign('isAdminPage', false);
-$tmpl->assign('storages', $userStoragesService->getAllStorages());
+$tmpl->assign('storages', $userStoragesService->getStorages());
$tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
$tmpl->assign('backends', $backends);
$tmpl->assign('authMechanisms', $authMechanisms);
diff --git a/apps/files_external/service/backendservice.php b/apps/files_external/service/backendservice.php
index 70cb9291660..1e90247b3e4 100644
--- a/apps/files_external/service/backendservice.php
+++ b/apps/files_external/service/backendservice.php
@@ -31,17 +31,13 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism;
*/
class BackendService {
- /** Permission constants for PermissionsTrait */
- const PERMISSION_NONE = 0;
- const PERMISSION_MOUNT = 1;
- const PERMISSION_CREATE = 2;
- const PERMISSION_MODIFY = 4;
+ /** Visibility constants for VisibilityTrait */
+ const VISIBILITY_NONE = 0;
+ const VISIBILITY_PERSONAL = 1;
+ const VISIBILITY_ADMIN = 2;
+ //const VISIBILITY_ALIENS = 4;
- const PERMISSION_DEFAULT = 7; // MOUNT | CREATE | MODIFY
-
- /** User contants */
- const USER_ADMIN = 'admin';
- const USER_PERSONAL = 'personal';
+ const VISIBILITY_DEFAULT = 3; // PERSONAL | ADMIN
/** Priority constants for PriorityTrait */
const PRIORITY_DEFAULT = 100;
@@ -85,7 +81,7 @@ class BackendService {
*/
public function registerBackend(Backend $backend) {
if (!$this->isAllowedUserBackend($backend)) {
- $backend->removePermission(self::USER_PERSONAL, self::PERMISSION_CREATE | self::PERMISSION_MOUNT);
+ $backend->removeVisibility(BackendService::VISIBILITY_PERSONAL);
}
foreach ($backend->getIdentifierAliases() as $alias) {
$this->backends[$alias] = $backend;
@@ -107,7 +103,7 @@ class BackendService {
*/
public function registerAuthMechanism(AuthMechanism $authMech) {
if (!$this->isAllowedAuthMechanism($authMech)) {
- $authMech->removePermission(self::USER_PERSONAL, self::PERMISSION_CREATE | self::PERMISSION_MOUNT);
+ $authMech->removeVisibility(BackendService::VISIBILITY_PERSONAL);
}
foreach ($authMech->getIdentifierAliases() as $alias) {
$this->authMechanisms[$alias] = $authMech;
diff --git a/apps/files_external/service/globalstoragesservice.php b/apps/files_external/service/globalstoragesservice.php
index 0e2d3f2b9c1..49ffea43d1b 100644
--- a/apps/files_external/service/globalstoragesservice.php
+++ b/apps/files_external/service/globalstoragesservice.php
@@ -210,4 +210,13 @@ class GlobalStoragesService extends StoragesService {
);
}
}
+
+ /**
+ * Get the visibility type for this controller, used in validation
+ *
+ * @return string BackendService::VISIBILITY_* constants
+ */
+ public function getVisibilityType() {
+ return BackendService::VISIBILITY_ADMIN;
+ }
}
diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php
index 703f277d84e..83a82de0bed 100644
--- a/apps/files_external/service/storagesservice.php
+++ b/apps/files_external/service/storagesservice.php
@@ -29,6 +29,8 @@ use \OC\Files\Filesystem;
use \OCA\Files_external\Lib\StorageConfig;
use \OCA\Files_external\NotFoundException;
use \OCA\Files_External\Service\BackendService;
+use \OCA\Files_External\Lib\Backend\Backend;
+use \OCA\Files_External\Lib\Auth\AuthMechanism;
/**
* Service class to manage external storages
@@ -331,7 +333,7 @@ abstract class StoragesService {
}
/**
- * Gets all storages
+ * Gets all storages, valid or not
*
* @return array array of storage configs
*/
@@ -340,6 +342,47 @@ abstract class StoragesService {
}
/**
+ * Gets all valid storages
+ *
+ * @return array
+ */
+ public function getStorages() {
+ return array_filter($this->getAllStorages(), [$this, 'validateStorage']);
+ }
+
+ /**
+ * Validate storage
+ * FIXME: De-duplicate with StoragesController::validate()
+ *
+ * @param StorageConfig $storage
+ * @return bool
+ */
+ protected function validateStorage(StorageConfig $storage) {
+ /** @var Backend */
+ $backend = $storage->getBackend();
+ /** @var AuthMechanism */
+ $authMechanism = $storage->getAuthMechanism();
+
+ if (!$backend->isVisibleFor($this->getVisibilityType())) {
+ // not permitted to use backend
+ return false;
+ }
+ if (!$authMechanism->isVisibleFor($this->getVisibilityType())) {
+ // not permitted to use auth mechanism
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Get the visibility type for this controller, used in validation
+ *
+ * @return string BackendService::VISIBILITY_* constants
+ */
+ abstract public function getVisibilityType();
+
+ /**
* Add new storage to the configuration
*
* @param array $newStorage storage attributes
diff --git a/apps/files_external/service/userglobalstoragesservice.php b/apps/files_external/service/userglobalstoragesservice.php
index b60473f131e..7c60bc6d497 100644
--- a/apps/files_external/service/userglobalstoragesservice.php
+++ b/apps/files_external/service/userglobalstoragesservice.php
@@ -117,7 +117,7 @@ class UserGlobalStoragesService extends GlobalStoragesService {
* @return StorageConfig[]
*/
public function getUniqueStorages() {
- $storages = $this->getAllStorages();
+ $storages = $this->getStorages();
$storagesByMountpoint = [];
foreach ($storages as $storage) {
diff --git a/apps/files_external/service/userstoragesservice.php b/apps/files_external/service/userstoragesservice.php
index c69b8d4f51e..6e3c327c09c 100644
--- a/apps/files_external/service/userstoragesservice.php
+++ b/apps/files_external/service/userstoragesservice.php
@@ -171,4 +171,13 @@ class UserStoragesService extends StoragesService {
$this->triggerHooks($newStorage, Filesystem::signal_create_mount);
}
}
+
+ /**
+ * Get the visibility type for this controller, used in validation
+ *
+ * @return string BackendService::VISIBILITY_* constants
+ */
+ public function getVisibilityType() {
+ return BackendService::VISIBILITY_PERSONAL;
+ }
}
diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php
index 840f1325fb5..f82ab035c1c 100644
--- a/apps/files_external/settings.php
+++ b/apps/files_external/settings.php
@@ -42,10 +42,10 @@ OCP\Util::addStyle('files_external', 'settings');
\OC_Util::addVendorStyle('select2/select2');
$backends = array_filter($backendService->getAvailableBackends(), function($backend) {
- return $backend->isPermitted(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE);
+ return $backend->isVisibleFor(BackendService::VISIBILITY_ADMIN);
});
$authMechanisms = array_filter($backendService->getAuthMechanisms(), function($authMechanism) {
- return $authMechanism->isPermitted(BackendService::USER_ADMIN, BackendService::PERMISSION_CREATE);
+ return $authMechanism->isVisibleFor(BackendService::VISIBILITY_ADMIN);
});
foreach ($backends as $backend) {
if ($backend->getCustomJs()) {
@@ -59,15 +59,13 @@ foreach ($authMechanisms as $authMechanism) {
}
$userBackends = array_filter($backendService->getAvailableBackends(), function($backend) {
- return $backend->isAllowedPermitted(
- BackendService::USER_PERSONAL, BackendService::PERMISSION_MOUNT
- );
+ return $backend->isAllowedVisibleFor(BackendService::VISIBILITY_PERSONAL);
});
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
$tmpl->assign('isAdminPage', true);
-$tmpl->assign('storages', $globalStoragesService->getAllStorages());
+$tmpl->assign('storages', $globalStoragesService->getStorages());
$tmpl->assign('backends', $backends);
$tmpl->assign('authMechanisms', $authMechanisms);
$tmpl->assign('userBackends', $userBackends);
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 7762ff60333..141994d0050 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -157,6 +157,7 @@
});
?>
<?php foreach ($sortedBackends as $backend): ?>
+ <?php if ($backend->getDeprecateTo()) continue; // ignore deprecated backends ?>
<option value="<?php p($backend->getIdentifier()); ?>"><?php p($backend->getText()); ?></option>
<?php endforeach; ?>
</select>
@@ -197,8 +198,12 @@
<p id="userMountingBackends"<?php if ($_['allowUserMounting'] != 'yes'): ?> class="hidden"<?php endif; ?>>
<?php p($l->t('Allow users to mount the following external storage')); ?><br />
<?php $i = 0; foreach ($_['userBackends'] as $backend): ?>
- <input type="checkbox" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" <?php if ($backend->isPermitted(BackendService::USER_PERSONAL, BackendService::PERMISSION_MOUNT)) print_unescaped(' checked="checked"'); ?> />
- <label for="allowUserMountingBackends<?php p($i); ?>"><?php p($backend->getText()); ?></label> <br />
+ <?php if ($deprecateTo = $backend->getDeprecateTo()): ?>
+ <input type="hidden" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" data-deprecate-to="<?php p($deprecateTo->getIdentifier()); ?>" />
+ <?php else: ?>
+ <input type="checkbox" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($backend->getIdentifier()); ?>" <?php if ($backend->isVisibleFor(BackendService::VISIBILITY_PERSONAL)) print_unescaped(' checked="checked"'); ?> />
+ <label for="allowUserMountingBackends<?php p($i); ?>"><?php p($backend->getText()); ?></label> <br />
+ <?php endif; ?>
<?php $i++; ?>
<?php endforeach; ?>
</p>
diff --git a/apps/files_external/tests/controller/globalstoragescontrollertest.php b/apps/files_external/tests/controller/globalstoragescontrollertest.php
index e1bfad8caf6..6b020198bd8 100644
--- a/apps/files_external/tests/controller/globalstoragescontrollertest.php
+++ b/apps/files_external/tests/controller/globalstoragescontrollertest.php
@@ -24,6 +24,7 @@ use \OCA\Files_external\Controller\GlobalStoragesController;
use \OCA\Files_external\Service\GlobalStoragesService;
use \OCP\AppFramework\Http;
use \OCA\Files_external\NotFoundException;
+use \OCA\Files_External\Service\BackendService;
class GlobalStoragesControllerTest extends StoragesControllerTest {
public function setUp() {
@@ -32,6 +33,9 @@ class GlobalStoragesControllerTest extends StoragesControllerTest {
->disableOriginalConstructor()
->getMock();
+ $this->service->method('getVisibilityType')
+ ->willReturn(BackendService::VISIBILITY_ADMIN);
+
$this->controller = new GlobalStoragesController(
'files_external',
$this->getMock('\OCP\IRequest'),
diff --git a/apps/files_external/tests/controller/storagescontrollertest.php b/apps/files_external/tests/controller/storagescontrollertest.php
index c43761f3bcb..5e1deb821f4 100644
--- a/apps/files_external/tests/controller/storagescontrollertest.php
+++ b/apps/files_external/tests/controller/storagescontrollertest.php
@@ -75,12 +75,12 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$authMech = $this->getAuthMechMock();
$authMech->method('validateStorage')
->willReturn(true);
- $authMech->method('isPermitted')
+ $authMech->method('isVisibleFor')
->willReturn(true);
$backend = $this->getBackendMock();
$backend->method('validateStorage')
->willReturn(true);
- $backend->method('isPermitted')
+ $backend->method('isVisibleFor')
->willReturn(true);
$storageConfig = new StorageConfig(1);
@@ -116,12 +116,12 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$authMech = $this->getAuthMechMock();
$authMech->method('validateStorage')
->willReturn(true);
- $authMech->method('isPermitted')
+ $authMech->method('isVisibleFor')
->willReturn(true);
$backend = $this->getBackendMock();
$backend->method('validateStorage')
->willReturn(true);
- $backend->method('isPermitted')
+ $backend->method('isVisibleFor')
->willReturn(true);
$storageConfig = new StorageConfig(1);
@@ -249,12 +249,12 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$authMech = $this->getAuthMechMock();
$authMech->method('validateStorage')
->willReturn(true);
- $authMech->method('isPermitted')
+ $authMech->method('isVisibleFor')
->willReturn(true);
$backend = $this->getBackendMock();
$backend->method('validateStorage')
->willReturn(true);
- $backend->method('isPermitted')
+ $backend->method('isVisibleFor')
->willReturn(true);
$storageConfig = new StorageConfig(255);
@@ -338,13 +338,13 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$backend = $this->getBackendMock();
$backend->method('validateStorage')
->willReturn($backendValidate);
- $backend->method('isPermitted')
+ $backend->method('isVisibleFor')
->willReturn(true);
$authMech = $this->getAuthMechMock();
$authMech->method('validateStorage')
->will($this->returnValue($authMechValidate));
- $authMech->method('isPermitted')
+ $authMech->method('isVisibleFor')
->willReturn(true);
$storageConfig = new StorageConfig();
diff --git a/apps/files_external/tests/controller/userstoragescontrollertest.php b/apps/files_external/tests/controller/userstoragescontrollertest.php
index b61174b0797..33ef274c87c 100644
--- a/apps/files_external/tests/controller/userstoragescontrollertest.php
+++ b/apps/files_external/tests/controller/userstoragescontrollertest.php
@@ -40,6 +40,9 @@ class UserStoragesControllerTest extends StoragesControllerTest {
->disableOriginalConstructor()
->getMock();
+ $this->service->method('getVisibilityType')
+ ->willReturn(BackendService::VISIBILITY_PERSONAL);
+
$this->controller = new UserStoragesController(
'files_external',
$this->getMock('\OCP\IRequest'),
@@ -49,21 +52,15 @@ class UserStoragesControllerTest extends StoragesControllerTest {
}
public function testAddOrUpdateStorageDisallowedBackend() {
- $backend1 = $this->getBackendMock();
- $backend1->expects($this->once())
- ->method('isPermitted')
- ->with(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE)
- ->willReturn(false);
- $backend2 = $this->getBackendMock();
- $backend2->expects($this->once())
- ->method('isPermitted')
- ->with(BackendService::USER_PERSONAL, BackendService::PERMISSION_MODIFY)
+ $backend = $this->getBackendMock();
+ $backend->method('isVisibleFor')
+ ->with(BackendService::VISIBILITY_PERSONAL)
->willReturn(false);
$authMech = $this->getAuthMechMock();
$storageConfig = new StorageConfig(1);
$storageConfig->setMountPoint('mount');
- $storageConfig->setBackend($backend1);
+ $storageConfig->setBackend($backend);
$storageConfig->setAuthMechanism($authMech);
$storageConfig->setBackendOptions([]);
@@ -88,8 +85,6 @@ class UserStoragesControllerTest extends StoragesControllerTest {
$this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus());
- $storageConfig->setBackend($backend2);
-
$response = $this->controller->update(
1,
'mount',
diff --git a/apps/files_external/tests/env/start-amazons3-ceph.sh b/apps/files_external/tests/env/start-amazons3-ceph.sh
index 5f274f10ca2..ad0fedba989 100755
--- a/apps/files_external/tests/env/start-amazons3-ceph.sh
+++ b/apps/files_external/tests/env/start-amazons3-ceph.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/start-ftp-morrisjobke.sh b/apps/files_external/tests/env/start-ftp-morrisjobke.sh
index a082e6195fb..14112d7f803 100755
--- a/apps/files_external/tests/env/start-ftp-morrisjobke.sh
+++ b/apps/files_external/tests/env/start-ftp-morrisjobke.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/start-sftp-atmoz.sh b/apps/files_external/tests/env/start-sftp-atmoz.sh
index 04b829add59..91eb5747c54 100755
--- a/apps/files_external/tests/env/start-sftp-atmoz.sh
+++ b/apps/files_external/tests/env/start-sftp-atmoz.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/start-smb-silvershell.sh b/apps/files_external/tests/env/start-smb-silvershell.sh
index afada44d4f7..c45807cc4c8 100755
--- a/apps/files_external/tests/env/start-smb-silvershell.sh
+++ b/apps/files_external/tests/env/start-smb-silvershell.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/start-smb-windows.sh b/apps/files_external/tests/env/start-smb-windows.sh
index a5a19ff1bcf..2143d7e7499 100755
--- a/apps/files_external/tests/env/start-smb-windows.sh
+++ b/apps/files_external/tests/env/start-smb-windows.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/start-webdav-ownCloud.sh b/apps/files_external/tests/env/start-webdav-ownCloud.sh
index d6b36c8d90c..6bf9142ee53 100755
--- a/apps/files_external/tests/env/start-webdav-ownCloud.sh
+++ b/apps/files_external/tests/env/start-webdav-ownCloud.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/stop-amazons3-ceph.sh b/apps/files_external/tests/env/stop-amazons3-ceph.sh
index 01b39b4c680..3f56a6f1e5d 100755
--- a/apps/files_external/tests/env/stop-amazons3-ceph.sh
+++ b/apps/files_external/tests/env/stop-amazons3-ceph.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/stop-ftp-morrisjobke.sh b/apps/files_external/tests/env/stop-ftp-morrisjobke.sh
index 899b9a53971..e30ec2e594a 100755
--- a/apps/files_external/tests/env/stop-ftp-morrisjobke.sh
+++ b/apps/files_external/tests/env/stop-ftp-morrisjobke.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/stop-sftp-atmoz.sh b/apps/files_external/tests/env/stop-sftp-atmoz.sh
index 64570cfd68d..0c2fd0b5bc6 100755
--- a/apps/files_external/tests/env/stop-sftp-atmoz.sh
+++ b/apps/files_external/tests/env/stop-sftp-atmoz.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/stop-smb-silvershell.sh b/apps/files_external/tests/env/stop-smb-silvershell.sh
index aae954284e9..40147b89106 100755
--- a/apps/files_external/tests/env/stop-smb-silvershell.sh
+++ b/apps/files_external/tests/env/stop-smb-silvershell.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/stop-smb-windows.sh b/apps/files_external/tests/env/stop-smb-windows.sh
index 4f89451ce11..39c49e2c505 100755
--- a/apps/files_external/tests/env/stop-smb-windows.sh
+++ b/apps/files_external/tests/env/stop-smb-windows.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/env/stop-webdav-ownCloud.sh b/apps/files_external/tests/env/stop-webdav-ownCloud.sh
index c87760a1052..8eaf1ba754f 100755
--- a/apps/files_external/tests/env/stop-webdav-ownCloud.sh
+++ b/apps/files_external/tests/env/stop-webdav-ownCloud.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/apps/files_external/tests/service/backendservicetest.php b/apps/files_external/tests/service/backendservicetest.php
index b37b5e9b466..414a9eee2ec 100644
--- a/apps/files_external/tests/service/backendservicetest.php
+++ b/apps/files_external/tests/service/backendservicetest.php
@@ -83,11 +83,11 @@ class BackendServiceTest extends \Test\TestCase {
$backendAllowed = $this->getBackendMock('\User\Mount\Allowed');
$backendAllowed->expects($this->never())
- ->method('removePermission');
+ ->method('removeVisibility');
$backendNotAllowed = $this->getBackendMock('\User\Mount\NotAllowed');
$backendNotAllowed->expects($this->once())
- ->method('removePermission')
- ->with(BackendService::USER_PERSONAL, BackendService::PERMISSION_CREATE | BackendService::PERMISSION_MOUNT);
+ ->method('removeVisibility')
+ ->with(BackendService::VISIBILITY_PERSONAL);
$backendAlias = $this->getMockBuilder('\OCA\Files_External\Lib\Backend\Backend')
->disableOriginalConstructor()
diff --git a/apps/files_external/tests/service/storagesservicetest.php b/apps/files_external/tests/service/storagesservicetest.php
index 28220c9bc2e..ddf52e6272e 100644
--- a/apps/files_external/tests/service/storagesservicetest.php
+++ b/apps/files_external/tests/service/storagesservicetest.php
@@ -305,6 +305,52 @@ abstract class StoragesServiceTest extends \Test\TestCase {
);
}
+ public function testGetStoragesBackendNotVisible() {
+ $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB');
+ $backend->expects($this->once())
+ ->method('isVisibleFor')
+ ->with($this->service->getVisibilityType())
+ ->willReturn(false);
+ $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism');
+ $authMechanism->method('isVisibleFor')
+ ->with($this->service->getVisibilityType())
+ ->willReturn(true);
+
+ $storage = new StorageConfig(255);
+ $storage->setMountPoint('mountpoint');
+ $storage->setBackend($backend);
+ $storage->setAuthMechanism($authMechanism);
+ $storage->setBackendOptions(['password' => 'testPassword']);
+
+ $newStorage = $this->service->addStorage($storage);
+
+ $this->assertCount(1, $this->service->getAllStorages());
+ $this->assertEmpty($this->service->getStorages());
+ }
+
+ public function testGetStoragesAuthMechanismNotVisible() {
+ $backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB');
+ $backend->method('isVisibleFor')
+ ->with($this->service->getVisibilityType())
+ ->willReturn(true);
+ $authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism');
+ $authMechanism->expects($this->once())
+ ->method('isVisibleFor')
+ ->with($this->service->getVisibilityType())
+ ->willReturn(false);
+
+ $storage = new StorageConfig(255);
+ $storage->setMountPoint('mountpoint');
+ $storage->setBackend($backend);
+ $storage->setAuthMechanism($authMechanism);
+ $storage->setBackendOptions(['password' => 'testPassword']);
+
+ $newStorage = $this->service->addStorage($storage);
+
+ $this->assertCount(1, $this->service->getAllStorages());
+ $this->assertEmpty($this->service->getStorages());
+ }
+
public static function createHookCallback($params) {
self::$hookCalls[] = array(
'signal' => Filesystem::signal_create_mount,
diff --git a/apps/files_external/tests/service/userglobalstoragesservicetest.php b/apps/files_external/tests/service/userglobalstoragesservicetest.php
index 867872f3683..b6dc952605d 100644
--- a/apps/files_external/tests/service/userglobalstoragesservicetest.php
+++ b/apps/files_external/tests/service/userglobalstoragesservicetest.php
@@ -209,7 +209,11 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest {
$expectedPrecedence
) {
$backend = $this->backendService->getBackend('identifier:\OCA\Files_External\Lib\Backend\SMB');
+ $backend->method('isVisibleFor')
+ ->willReturn(true);
$authMechanism = $this->backendService->getAuthMechanism('identifier:\Auth\Mechanism');
+ $authMechanism->method('isVisibleFor')
+ ->willReturn(true);
$storage1 = new StorageConfig();
$storage1->setMountPoint('mountpoint');
@@ -243,6 +247,16 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest {
}
}
+ public function testGetStoragesBackendNotVisible() {
+ // we don't test this here
+ $this->assertTrue(true);
+ }
+
+ public function testGetStoragesAuthMechanismNotVisible() {
+ // we don't test this here
+ $this->assertTrue(true);
+ }
+
public function testHooksAddStorage($a = null, $b = null, $c = null) {
// we don't test this here
$this->assertTrue(true);
diff --git a/apps/files_sharing/ajax/publicpreview.php b/apps/files_sharing/ajax/publicpreview.php
index 6ddd4786c2a..69894bb8da5 100644
--- a/apps/files_sharing/ajax/publicpreview.php
+++ b/apps/files_sharing/ajax/publicpreview.php
@@ -28,8 +28,8 @@ OCP\JSON::checkAppEnabled('files_sharing');
\OC_User::setIncognitoMode(true);
$file = array_key_exists('file', $_GET) ? (string) $_GET['file'] : '';
-$maxX = array_key_exists('x', $_GET) ? (int) $_GET['x'] : '36';
-$maxY = array_key_exists('y', $_GET) ? (int) $_GET['y'] : '36';
+$maxX = array_key_exists('x', $_GET) ? (int) $_GET['x'] : '32';
+$maxY = array_key_exists('y', $_GET) ? (int) $_GET['y'] : '32';
$scalingUp = array_key_exists('scalingup', $_GET) ? (bool) $_GET['scalingup'] : true;
$token = array_key_exists('t', $_GET) ? (string) $_GET['t'] : '';
$keepAspect = array_key_exists('a', $_GET) ? true : false;
diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php
index 9e324078dad..734c267020f 100644
--- a/apps/files_sharing/api/sharees.php
+++ b/apps/files_sharing/api/sharees.php
@@ -62,6 +62,9 @@ class Sharees {
/** @var bool */
protected $shareWithGroupOnly = false;
+ /** @var bool */
+ protected $shareeEnumeration = true;
+
/** @var int */
protected $offset = 0;
@@ -134,7 +137,7 @@ class Sharees {
}
}
- if (sizeof($users) < $this->limit) {
+ if (!$this->shareeEnumeration || sizeof($users) < $this->limit) {
$this->reachedEndFor[] = 'users';
}
@@ -176,6 +179,10 @@ class Sharees {
]);
}
}
+
+ if (!$this->shareeEnumeration) {
+ $this->result['users'] = [];
+ }
}
/**
@@ -187,7 +194,7 @@ class Sharees {
$groups = $this->groupManager->search($search, $this->limit, $this->offset);
$groups = array_map(function (IGroup $group) { return $group->getGID(); }, $groups);
- if (sizeof($groups) < $this->limit) {
+ if (!$this->shareeEnumeration || sizeof($groups) < $this->limit) {
$this->reachedEndFor[] = 'groups';
}
@@ -233,6 +240,10 @@ class Sharees {
]);
}
}
+
+ if (!$this->shareeEnumeration) {
+ $this->result['groups'] = [];
+ }
}
/**
@@ -273,6 +284,10 @@ class Sharees {
}
}
+ if (!$this->shareeEnumeration) {
+ $this->result['remotes'] = [];
+ }
+
if (!$foundRemoteById && substr_count($search, '@') >= 1 && substr_count($search, ' ') === 0 && $this->offset === 0) {
$this->result['exact']['remotes'][] = [
'label' => $search,
@@ -322,6 +337,7 @@ class Sharees {
}
$this->shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes';
+ $this->shareeEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes';
$this->limit = (int) $perPage;
$this->offset = $perPage * ($page - 1);
diff --git a/apps/files_sharing/css/authenticate.css b/apps/files_sharing/css/authenticate.css
index ac76d4c6870..43707c76100 100644
--- a/apps/files_sharing/css/authenticate.css
+++ b/apps/files_sharing/css/authenticate.css
@@ -11,7 +11,8 @@ input[type='submit'] {
#body-login input[type='submit'] {
position: absolute;
- top: 0px;
+ top: 0;
+ border: none;
}
fieldset > p {
diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css
index fe7a1947502..1745eba5846 100644
--- a/apps/files_sharing/css/sharetabview.css
+++ b/apps/files_sharing/css/sharetabview.css
@@ -73,5 +73,9 @@
}
.shareTabView .icon-loading-small {
- margin-left: -30px;
+ position: absolute;
+ display: inline-block;
+ z-index: 1;
+ background-color: white;
+ padding: 2px;
}
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 1993efe7d73..1c3d4b9ac32 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -90,8 +90,8 @@ OCA.Sharing.PublicApp = {
// dynamically load image previews
var token = $('#sharingToken').val();
var bottomMargin = 350;
- var previewWidth = Math.floor($(window).width() * window.devicePixelRatio);
- var previewHeight = Math.floor(($(window).height() - bottomMargin) * window.devicePixelRatio);
+ var previewWidth = Math.ceil($(window).width() * window.devicePixelRatio);
+ var previewHeight = Math.ceil(($(window).height() - bottomMargin) * window.devicePixelRatio);
previewHeight = Math.max(200, previewHeight);
var params = {
x: previewWidth,
@@ -159,9 +159,18 @@ OCA.Sharing.PublicApp = {
};
this.fileList.generatePreviewUrl = function (urlSpec) {
+ urlSpec = urlSpec || {};
+ if (!urlSpec.x) {
+ urlSpec.x = 32;
+ }
+ if (!urlSpec.y) {
+ urlSpec.y = 32;
+ }
+ urlSpec.x *= window.devicePixelRatio;
+ urlSpec.y *= window.devicePixelRatio;
+ urlSpec.x = Math.ceil(urlSpec.x);
+ urlSpec.y = Math.ceil(urlSpec.y);
urlSpec.t = $('#dirToken').val();
- urlSpec.y = Math.floor(36 * window.devicePixelRatio);
- urlSpec.x = Math.floor(36 * window.devicePixelRatio);
return OC.generateUrl('/apps/files_sharing/ajax/publicpreview.php?') + $.param(urlSpec);
};
@@ -293,15 +302,8 @@ $(document).ready(function () {
if (window.Files) {
// HACK: for oc-dialogs previews that depends on Files:
- Files.lazyLoadPreview = function (path, mime, ready, width, height, etag) {
- return App.fileList.lazyLoadPreview({
- path: path,
- mime: mime,
- callback: ready,
- width: width,
- height: height,
- etag: etag
- });
+ Files.generatePreviewUrl = function (urlSpec) {
+ return App.fileList.generatePreviewUrl(urlSpec);
};
}
});
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 5290dfbb7d1..30a803f3207 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -103,15 +103,24 @@
name: 'Share',
displayName: '',
mime: 'all',
- permissions: OC.PERMISSION_SHARE,
+ permissions: OC.PERMISSION_ALL,
icon: OC.imagePath('core', 'actions/share'),
type: OCA.Files.FileActions.TYPE_INLINE,
actionHandler: function(fileName) {
fileList.showDetailsView(fileName, 'shareTabView');
+ },
+ render: function(actionSpec, isDefault, context) {
+ var permissions = parseInt(context.$file.attr('data-permissions'), 10);
+ // if no share permissions but share owner exists, still show the link
+ if ((permissions & OC.PERMISSION_SHARE) !== 0 || context.$file.attr('data-share-owner')) {
+ return fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context);
+ }
+ // don't render anything
+ return null;
}
});
- var shareTab = new OCA.Sharing.ShareTabView('shareTabView');
+ var shareTab = new OCA.Sharing.ShareTabView('shareTabView', {order: -20});
// detect changes and change the matching list entry
shareTab.on('sharesChanged', function(shareModel) {
var fileInfoModel = shareModel.fileInfoModel;
@@ -157,26 +166,7 @@
// if the statuses are loaded already, use them for the icon
// (needed when scrolling to the next page)
if (hasUserShares || hasLinkShare || $tr.attr('data-share-recipients') || $tr.attr('data-share-owner')) {
- var permissions = $tr.data('permissions');
OC.Share.markFileAsShared($tr, true, hasLinkShare);
- if ((permissions & OC.PERMISSION_SHARE) === 0 && $tr.attr('data-share-owner')) {
- // if no share action exists because the admin disabled sharing for this user
- // we create a share notification action to inform the user about files
- // shared with him otherwise we just update the existing share action.
- // TODO: make this work like/with OC.Share.markFileAsShared()
- $tr.find('.fileactions .action-share-notification').remove();
- var shareNotification = '<a class="action action-share-notification permanent"' +
- ' data-action="Share-Notification" href="#" original-title="">' +
- ' <img class="svg" src="' + OC.imagePath('core', 'actions/share') + '"></img>';
- $tr.find('.fileactions').append(function() {
- var shareBy = escapeHTML($tr.attr('data-share-owner'));
- var $result = $(shareNotification + '<span> ' + shareBy + '</span></span>');
- $result.on('click', function() {
- return false;
- });
- return $result;
- });
- }
return true;
}
return false;
diff --git a/apps/files_sharing/l10n/ca.js b/apps/files_sharing/l10n/ca.js
index 403aaa87696..b295a3aa7dc 100644
--- a/apps/files_sharing/l10n/ca.js
+++ b/apps/files_sharing/l10n/ca.js
@@ -3,10 +3,12 @@ OC.L10N.register(
{
"Server to server sharing is not enabled on this server" : "La compartició entre servidors no està activada en aquest servidor",
"Invalid or untrusted SSL certificate" : "El certificat SSL és invàlid o no és fiable",
+ "Storage not valid" : "Emmagatzemament no valit",
"Couldn't add remote share" : "No s'ha pogut afegir una compartició remota",
"Shared with you" : "Us han compartit",
"Shared with others" : "Heu compartit",
"Shared by link" : "Compartit amb enllaç",
+ "No shared links" : "no hi ha enllaços compartits",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir la compartició remota {nom} des de {owner}@{remote}?",
"Remote share" : "Compartició remota",
"Remote share password" : "Contrasenya de compartició remota",
diff --git a/apps/files_sharing/l10n/ca.json b/apps/files_sharing/l10n/ca.json
index c0aa500d2a6..e5ce33561a5 100644
--- a/apps/files_sharing/l10n/ca.json
+++ b/apps/files_sharing/l10n/ca.json
@@ -1,10 +1,12 @@
{ "translations": {
"Server to server sharing is not enabled on this server" : "La compartició entre servidors no està activada en aquest servidor",
"Invalid or untrusted SSL certificate" : "El certificat SSL és invàlid o no és fiable",
+ "Storage not valid" : "Emmagatzemament no valit",
"Couldn't add remote share" : "No s'ha pogut afegir una compartició remota",
"Shared with you" : "Us han compartit",
"Shared with others" : "Heu compartit",
"Shared by link" : "Compartit amb enllaç",
+ "No shared links" : "no hi ha enllaços compartits",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir la compartició remota {nom} des de {owner}@{remote}?",
"Remote share" : "Compartició remota",
"Remote share password" : "Contrasenya de compartició remota",
diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js
index f6b43cf4fa3..be924134ae2 100644
--- a/apps/files_sharing/l10n/cs_CZ.js
+++ b/apps/files_sharing/l10n/cs_CZ.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ",
"You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s",
"You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s",
+ "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz",
"%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s",
"You shared %1$s via link" : "Sdílíte %1$s přes odkaz",
"Shares" : "Sdílení",
diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json
index f5822c627ae..a889bbc1235 100644
--- a/apps/files_sharing/l10n/cs_CZ.json
+++ b/apps/files_sharing/l10n/cs_CZ.json
@@ -36,6 +36,9 @@
"Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ",
"You shared %1$s with %2$s" : "Sdílíte %1$s s %2$s",
"You shared %1$s with group %2$s" : "Sdílíte %1$s se skupinou %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s nasdílel(a) %1$s s %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s nasdílel(a) %1$s se skupinou %3$s",
+ "%2$s shared %1$s via link" : "%2$s nasdílel(a) %1$s jako odkaz",
"%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s",
"You shared %1$s via link" : "Sdílíte %1$s přes odkaz",
"Shares" : "Sdílení",
diff --git a/apps/files_sharing/l10n/el.js b/apps/files_sharing/l10n/el.js
index 18ba9bd0d31..6f71bdc2832 100644
--- a/apps/files_sharing/l10n/el.js
+++ b/apps/files_sharing/l10n/el.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Shared with you" : "Διαμοιρασμένο με εσάς",
"Shared with others" : "Διαμοιρασμένο με άλλους",
"Shared by link" : "Διαμοιρασμένο μέσω συνδέσμου",
- "Nothing shared with you yet" : "Δεν έχει διαμοιραστεί κάτι με εσάς ακόμα",
+ "Nothing shared with you yet" : "Κανένα αρχείο δεν έχει διαμοιραστεί ακόμα με εσάς.",
"Files and folders others share with you will show up here" : "Τα αρχεία και οι φάκελοι που άλλοι διαμοιράζονται με εσάς θα εμφανιστούν εδώ",
"Nothing shared yet" : "Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής",
"Files and folders you share will show up here" : "Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανιστούν εδώ",
@@ -38,9 +38,13 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "Το κοινόχρηστο διαμοιρασμένο αρχείο %1$s ελήφθη",
"You shared %1$s with %2$s" : "Διαμοιραστήκατε το %1$s με %2$s",
"You shared %1$s with group %2$s" : "Διαμοιραστήκατε %1$s με την ομάδα %2$s",
+ "%2$s shared %1$s with %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με %3$s",
+ "%2$s shared %1$s with group %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με την ομάδα %3$s",
+ "%2$s shared %1$s via link" : "Ο %2$s διαμοιράστηκε το %1$s μέσω συνδέσμου",
"%2$s shared %1$s with you" : "Ο %2$s διαμοιράστηκε το %1$s με εσάς",
"You shared %1$s via link" : "Μοιραστήκατε το %1$s μέσω συνδέσμου",
"Shares" : "Κοινόχρηστοι φάκελοι",
+ "You received %2$s as a remote share from %1$s" : "Λάβατε το %2$s ως απομακρυσμένο διαμοιρασμό από %1$s",
"Accept" : "Αποδοχή",
"Decline" : "Απόρριψη",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s",
diff --git a/apps/files_sharing/l10n/el.json b/apps/files_sharing/l10n/el.json
index f8e42195d0d..c1bdc039f9d 100644
--- a/apps/files_sharing/l10n/el.json
+++ b/apps/files_sharing/l10n/el.json
@@ -8,7 +8,7 @@
"Shared with you" : "Διαμοιρασμένο με εσάς",
"Shared with others" : "Διαμοιρασμένο με άλλους",
"Shared by link" : "Διαμοιρασμένο μέσω συνδέσμου",
- "Nothing shared with you yet" : "Δεν έχει διαμοιραστεί κάτι με εσάς ακόμα",
+ "Nothing shared with you yet" : "Κανένα αρχείο δεν έχει διαμοιραστεί ακόμα με εσάς.",
"Files and folders others share with you will show up here" : "Τα αρχεία και οι φάκελοι που άλλοι διαμοιράζονται με εσάς θα εμφανιστούν εδώ",
"Nothing shared yet" : "Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής",
"Files and folders you share will show up here" : "Τα αρχεία και οι φάκελοι που διαμοιράζεστε θα εμφανιστούν εδώ",
@@ -36,9 +36,13 @@
"Public shared file %1$s was downloaded" : "Το κοινόχρηστο διαμοιρασμένο αρχείο %1$s ελήφθη",
"You shared %1$s with %2$s" : "Διαμοιραστήκατε το %1$s με %2$s",
"You shared %1$s with group %2$s" : "Διαμοιραστήκατε %1$s με την ομάδα %2$s",
+ "%2$s shared %1$s with %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με %3$s",
+ "%2$s shared %1$s with group %3$s" : "Ο %2$s διαμοιράστηκε το %1$s με την ομάδα %3$s",
+ "%2$s shared %1$s via link" : "Ο %2$s διαμοιράστηκε το %1$s μέσω συνδέσμου",
"%2$s shared %1$s with you" : "Ο %2$s διαμοιράστηκε το %1$s με εσάς",
"You shared %1$s via link" : "Μοιραστήκατε το %1$s μέσω συνδέσμου",
"Shares" : "Κοινόχρηστοι φάκελοι",
+ "You received %2$s as a remote share from %1$s" : "Λάβατε το %2$s ως απομακρυσμένο διαμοιρασμό από %1$s",
"Accept" : "Αποδοχή",
"Decline" : "Απόρριψη",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s",
diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js
index ca1e8c430db..037855d6d99 100644
--- a/apps/files_sharing/l10n/es.js
+++ b/apps/files_sharing/l10n/es.js
@@ -42,6 +42,7 @@ OC.L10N.register(
"You shared %1$s via link" : "Ha compartido %1$s vía enlace",
"Shares" : "Compartidos",
"Accept" : "Aceptar",
+ "Decline" : "Denegar",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud",
"This share is password-protected" : "Este elemento compartido está protegido por contraseña",
@@ -67,7 +68,7 @@ OC.L10N.register(
"Federated Cloud" : "Nube Federada",
"Your Federated Cloud ID:" : "Su ID Nube Federada:",
"Share it:" : "Compartir:",
- "Add to your website" : "Añadir a su Website",
+ "Add to your website" : "Añadir a su sitio web",
"Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud",
"HTML Code:" : "Código HTML:"
},
diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json
index 4b300e1227f..c0da82abdd6 100644
--- a/apps/files_sharing/l10n/es.json
+++ b/apps/files_sharing/l10n/es.json
@@ -40,6 +40,7 @@
"You shared %1$s via link" : "Ha compartido %1$s vía enlace",
"Shares" : "Compartidos",
"Accept" : "Aceptar",
+ "Decline" : "Denegar",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s",
"Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud",
"This share is password-protected" : "Este elemento compartido está protegido por contraseña",
@@ -65,7 +66,7 @@
"Federated Cloud" : "Nube Federada",
"Your Federated Cloud ID:" : "Su ID Nube Federada:",
"Share it:" : "Compartir:",
- "Add to your website" : "Añadir a su Website",
+ "Add to your website" : "Añadir a su sitio web",
"Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud",
"HTML Code:" : "Código HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index 3942d18de03..382bc1e69e5 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -38,9 +38,12 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "Le fichier public %1$s a été téléchargé",
"You shared %1$s with %2$s" : "Vous avez partagé %1$s avec %2$s",
"You shared %1$s with group %2$s" : "Vous avez partagé %1$s avec le groupe %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s partagé %1$s avec %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s partagé %1$s avec le groupe %3$s",
"%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous",
"You shared %1$s via link" : "Vous avez partagé %1$s par lien public",
"Shares" : "Partages",
+ "You received %2$s as a remote share from %1$s" : "Vous avez reçu %2$s en tant que partage distant par %1$s",
"Accept" : "Accepter",
"Decline" : "Refuser",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index 75b645ef259..7766b016f3b 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -36,9 +36,12 @@
"Public shared file %1$s was downloaded" : "Le fichier public %1$s a été téléchargé",
"You shared %1$s with %2$s" : "Vous avez partagé %1$s avec %2$s",
"You shared %1$s with group %2$s" : "Vous avez partagé %1$s avec le groupe %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s partagé %1$s avec %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s partagé %1$s avec le groupe %3$s",
"%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous",
"You shared %1$s via link" : "Vous avez partagé %1$s par lien public",
"Shares" : "Partages",
+ "You received %2$s as a remote share from %1$s" : "Vous avez reçu %2$s en tant que partage distant par %1$s",
"Accept" : "Accepter",
"Decline" : "Refuser",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js
index 3895a028be8..7b85e236b44 100644
--- a/apps/files_sharing/l10n/hu_HU.js
+++ b/apps/files_sharing/l10n/hu_HU.js
@@ -38,9 +38,13 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "Nyilvánosan megosztott fálj %1$s le lett töltve",
"You shared %1$s with %2$s" : "%1$s-t megosztottam ővele: %2$s",
"You shared %1$s with group %2$s" : "%1$s-t megosztottam ezzel a csoporttal: %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s megosztotta ezt: %1$s, ővele: %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s megosztotta ezt: %1$s, ezzel a csoporttal: %3$s",
+ "%2$s shared %1$s via link" : "%2$s megosztotta ezt: %1$s, hivatkozással",
"%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s",
"You shared %1$s via link" : "Megosztottam link segítségével: %1$s",
"Shares" : "Megosztások",
+ "You received %2$s as a remote share from %1$s" : "Kaptál egy távoli megosztást: %2$s, innen: %1$s",
"Accept" : "Elfogadás",
"Decline" : "Elutasítás",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json
index e9037d232b0..c749a5add97 100644
--- a/apps/files_sharing/l10n/hu_HU.json
+++ b/apps/files_sharing/l10n/hu_HU.json
@@ -36,9 +36,13 @@
"Public shared file %1$s was downloaded" : "Nyilvánosan megosztott fálj %1$s le lett töltve",
"You shared %1$s with %2$s" : "%1$s-t megosztottam ővele: %2$s",
"You shared %1$s with group %2$s" : "%1$s-t megosztottam ezzel a csoporttal: %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s megosztotta ezt: %1$s, ővele: %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s megosztotta ezt: %1$s, ezzel a csoporttal: %3$s",
+ "%2$s shared %1$s via link" : "%2$s megosztotta ezt: %1$s, hivatkozással",
"%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s",
"You shared %1$s via link" : "Megosztottam link segítségével: %1$s",
"Shares" : "Megosztások",
+ "You received %2$s as a remote share from %1$s" : "Kaptál egy távoli megosztást: %2$s, innen: %1$s",
"Accept" : "Elfogadás",
"Decline" : "Elutasítás",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
diff --git a/apps/files_sharing/l10n/id.js b/apps/files_sharing/l10n/id.js
index d39d9e763f1..4486cd80545 100644
--- a/apps/files_sharing/l10n/id.js
+++ b/apps/files_sharing/l10n/id.js
@@ -38,9 +38,13 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "Berkas berbagi publik %1$s telah diunduh",
"You shared %1$s with %2$s" : "Anda membagikan %1$s dengan %2$s",
"You shared %1$s with group %2$s" : "Anda membagikan %1$s dengan grup %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s berbagi %1$s kepada %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s berbagi %1$s kepada grup %3$s",
+ "%2$s shared %1$s via link" : "%2$s berbagi %1$s via tautan",
"%2$s shared %1$s with you" : "%2$s membagikan %1$s dengan Anda",
"You shared %1$s via link" : "Anda membagikan %1$s via tautan",
"Shares" : "Dibagikan",
+ "You received %2$s as a remote share from %1$s" : "Anda menerima %2$s sebagai berbagi remote dari %1$s",
"Accept" : "Terima",
"Decline" : "Tolak",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
diff --git a/apps/files_sharing/l10n/id.json b/apps/files_sharing/l10n/id.json
index 35b22b53346..f9805231bcd 100644
--- a/apps/files_sharing/l10n/id.json
+++ b/apps/files_sharing/l10n/id.json
@@ -36,9 +36,13 @@
"Public shared file %1$s was downloaded" : "Berkas berbagi publik %1$s telah diunduh",
"You shared %1$s with %2$s" : "Anda membagikan %1$s dengan %2$s",
"You shared %1$s with group %2$s" : "Anda membagikan %1$s dengan grup %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s berbagi %1$s kepada %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s berbagi %1$s kepada grup %3$s",
+ "%2$s shared %1$s via link" : "%2$s berbagi %1$s via tautan",
"%2$s shared %1$s with you" : "%2$s membagikan %1$s dengan Anda",
"You shared %1$s via link" : "Anda membagikan %1$s via tautan",
"Shares" : "Dibagikan",
+ "You received %2$s as a remote share from %1$s" : "Anda menerima %2$s sebagai berbagi remote dari %1$s",
"Accept" : "Terima",
"Decline" : "Tolak",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
diff --git a/apps/files_sharing/l10n/oc.js b/apps/files_sharing/l10n/oc.js
index 51378911814..b554192fafc 100644
--- a/apps/files_sharing/l10n/oc.js
+++ b/apps/files_sharing/l10n/oc.js
@@ -1,12 +1,78 @@
OC.L10N.register(
"files_sharing",
{
- "Cancel" : "Annula",
+ "Server to server sharing is not enabled on this server" : "Lo partiment de servidor a servidor es pas activat sus aqueste servidor",
+ "The mountpoint name contains invalid characters." : "Lo nom del punt de montatge conten de caractèrs invalids.",
+ "Invalid or untrusted SSL certificate" : "Certificat SSL invalid o pas fisable",
+ "Could not authenticate to remote share, password might be wrong" : "Impossible de s'autentificar al partiment distant : lo senhal es probablament incorrècte",
+ "Storage not valid" : "Supòrt d'emmagazinatge invalid",
+ "Couldn't add remote share" : "Impossible d'apondre lo partiment distant",
+ "Shared with you" : "Partejats amb vos",
+ "Shared with others" : "Partejats amb d'autres",
+ "Shared by link" : "Partejats per ligam",
+ "Nothing shared with you yet" : "Cap de fichièr es pas partejat amb vos pel moment",
+ "Files and folders others share with you will show up here" : "Los fichièrs e dorsièrs partejats amb vos apareisseràn aicí",
+ "Nothing shared yet" : "Res es pas partejat pel moment",
+ "Files and folders you share will show up here" : "Los fichièrs e dorsièrs que partejatz apareisseràn aicí",
+ "No shared links" : "Pas cap de partiment per ligam",
+ "Files and folders you share by link will show up here" : "Los fichièrs e dorsièrs que partejatz per ligam apareisseràn aicí",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Volètz apondre lo partiment distant {name} de {owner}@{remote} ?",
+ "Remote share" : "Partiment distant",
+ "Remote share password" : "Senhal del partiment distant",
+ "Cancel" : "Anullar",
+ "Add remote share" : "Apondre un partiment distant",
+ "You can upload into this folder" : "Podètz mandar dins aqueste dorsièr",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Cap d'installacion ownCloud (7 o superior) pas trobada sus {remote}",
+ "Invalid ownCloud url" : "URL ownCloud invalida",
+ "Shared by" : "Partejat per",
"Sharing" : "Partiment",
+ "A file or folder has been <strong>shared</strong>" : "Un fichièr o un repertòri es estat <strong>partejat</strong>",
+ "A file or folder was shared from <strong>another server</strong>" : "Un fichièr o un repertòri es estat partejat depuis <strong>un autre servidor</strong>",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Un fichièr o un repertòri partejat publicament es estat <strong>telecargat</strong>",
+ "You received a new remote share %2$s from %1$s" : "L'utilizaire %1$s a partejat la ressorsa distanta %2$s amb vos",
+ "You received a new remote share from %s" : "Avètz recebut un partiment distant de %s",
+ "%1$s accepted remote share %2$s" : "%1$s a acceptat lo partiment distant %2$s",
+ "%1$s declined remote share %2$s" : "%1$s a refusat lo partiment distant %2$s",
+ "%1$s unshared %2$s from you" : "%1$s a daissat de partejar %2$s amb vos",
+ "Public shared folder %1$s was downloaded" : "Lo dorsièr public %1$s es estat telecargat",
+ "Public shared file %1$s was downloaded" : "Lo fichièr public %1$s es estat telecargat",
+ "You shared %1$s with %2$s" : "Avètz partejat %1$s amb %2$s",
+ "You shared %1$s with group %2$s" : "Avètz partejat %1$s amb lo grop %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s partejat %1$s amb %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s partejat %1$s amb lo grop %3$s",
+ "%2$s shared %1$s with you" : "%2$s a partejat %1$s amb vos",
+ "You shared %1$s via link" : "Avètz partejat %1$s per ligam public",
+ "Shares" : "Partiments",
+ "You received %2$s as a remote share from %1$s" : "Avètz recebut %2$s en tant que partiment distant per %1$s",
+ "Accept" : "Acceptar",
+ "Decline" : "Refusar",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
+ "This share is password-protected" : "Aqueste partiment es protegit per un senhal",
+ "The password is wrong. Try again." : "Lo senhal es incorrècte. Ensajatz tornamai.",
"Password" : "Senhal",
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
"Name" : "Nom",
- "Download" : "Avalcarga",
- "Open documentation" : "Veire la documentacion"
+ "Share time" : "Data de partiment",
+ "Sorry, this link doesn’t seem to work anymore." : "O planhèm, mas sembla qu'aqueste ligam fonciona pas mai.",
+ "Reasons might be:" : "Las rasons pòdon èsser :",
+ "the item was removed" : "l'element es estat suprimit",
+ "the link expired" : "lo ligam a expirat",
+ "sharing is disabled" : "lo partiment es desactivat",
+ "For more info, please ask the person who sent this link." : "Per mai d'informacions, contactatz la persona qu'a mandat aqueste ligam.",
+ "Add to your ownCloud" : "Apondre a vòstre ownCloud",
+ "Download" : "Telecargar",
+ "Download %s" : "Telecargar %s",
+ "Direct link" : "Ligam dirècte",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Veire la documentacion",
+ "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors",
+ "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :",
+ "Share it:" : "Partejar :",
+ "Add to your website" : "Apondre a vòstre site web",
+ "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud",
+ "HTML Code:" : "Còde HTML :"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/oc.json b/apps/files_sharing/l10n/oc.json
index 1dc1272a31f..326d804a055 100644
--- a/apps/files_sharing/l10n/oc.json
+++ b/apps/files_sharing/l10n/oc.json
@@ -1,10 +1,76 @@
{ "translations": {
- "Cancel" : "Annula",
+ "Server to server sharing is not enabled on this server" : "Lo partiment de servidor a servidor es pas activat sus aqueste servidor",
+ "The mountpoint name contains invalid characters." : "Lo nom del punt de montatge conten de caractèrs invalids.",
+ "Invalid or untrusted SSL certificate" : "Certificat SSL invalid o pas fisable",
+ "Could not authenticate to remote share, password might be wrong" : "Impossible de s'autentificar al partiment distant : lo senhal es probablament incorrècte",
+ "Storage not valid" : "Supòrt d'emmagazinatge invalid",
+ "Couldn't add remote share" : "Impossible d'apondre lo partiment distant",
+ "Shared with you" : "Partejats amb vos",
+ "Shared with others" : "Partejats amb d'autres",
+ "Shared by link" : "Partejats per ligam",
+ "Nothing shared with you yet" : "Cap de fichièr es pas partejat amb vos pel moment",
+ "Files and folders others share with you will show up here" : "Los fichièrs e dorsièrs partejats amb vos apareisseràn aicí",
+ "Nothing shared yet" : "Res es pas partejat pel moment",
+ "Files and folders you share will show up here" : "Los fichièrs e dorsièrs que partejatz apareisseràn aicí",
+ "No shared links" : "Pas cap de partiment per ligam",
+ "Files and folders you share by link will show up here" : "Los fichièrs e dorsièrs que partejatz per ligam apareisseràn aicí",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Volètz apondre lo partiment distant {name} de {owner}@{remote} ?",
+ "Remote share" : "Partiment distant",
+ "Remote share password" : "Senhal del partiment distant",
+ "Cancel" : "Anullar",
+ "Add remote share" : "Apondre un partiment distant",
+ "You can upload into this folder" : "Podètz mandar dins aqueste dorsièr",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Cap d'installacion ownCloud (7 o superior) pas trobada sus {remote}",
+ "Invalid ownCloud url" : "URL ownCloud invalida",
+ "Shared by" : "Partejat per",
"Sharing" : "Partiment",
+ "A file or folder has been <strong>shared</strong>" : "Un fichièr o un repertòri es estat <strong>partejat</strong>",
+ "A file or folder was shared from <strong>another server</strong>" : "Un fichièr o un repertòri es estat partejat depuis <strong>un autre servidor</strong>",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Un fichièr o un repertòri partejat publicament es estat <strong>telecargat</strong>",
+ "You received a new remote share %2$s from %1$s" : "L'utilizaire %1$s a partejat la ressorsa distanta %2$s amb vos",
+ "You received a new remote share from %s" : "Avètz recebut un partiment distant de %s",
+ "%1$s accepted remote share %2$s" : "%1$s a acceptat lo partiment distant %2$s",
+ "%1$s declined remote share %2$s" : "%1$s a refusat lo partiment distant %2$s",
+ "%1$s unshared %2$s from you" : "%1$s a daissat de partejar %2$s amb vos",
+ "Public shared folder %1$s was downloaded" : "Lo dorsièr public %1$s es estat telecargat",
+ "Public shared file %1$s was downloaded" : "Lo fichièr public %1$s es estat telecargat",
+ "You shared %1$s with %2$s" : "Avètz partejat %1$s amb %2$s",
+ "You shared %1$s with group %2$s" : "Avètz partejat %1$s amb lo grop %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s partejat %1$s amb %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s partejat %1$s amb lo grop %3$s",
+ "%2$s shared %1$s with you" : "%2$s a partejat %1$s amb vos",
+ "You shared %1$s via link" : "Avètz partejat %1$s per ligam public",
+ "Shares" : "Partiments",
+ "You received %2$s as a remote share from %1$s" : "Avètz recebut %2$s en tant que partiment distant per %1$s",
+ "Accept" : "Acceptar",
+ "Decline" : "Refusar",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
+ "This share is password-protected" : "Aqueste partiment es protegit per un senhal",
+ "The password is wrong. Try again." : "Lo senhal es incorrècte. Ensajatz tornamai.",
"Password" : "Senhal",
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
"Name" : "Nom",
- "Download" : "Avalcarga",
- "Open documentation" : "Veire la documentacion"
+ "Share time" : "Data de partiment",
+ "Sorry, this link doesn’t seem to work anymore." : "O planhèm, mas sembla qu'aqueste ligam fonciona pas mai.",
+ "Reasons might be:" : "Las rasons pòdon èsser :",
+ "the item was removed" : "l'element es estat suprimit",
+ "the link expired" : "lo ligam a expirat",
+ "sharing is disabled" : "lo partiment es desactivat",
+ "For more info, please ask the person who sent this link." : "Per mai d'informacions, contactatz la persona qu'a mandat aqueste ligam.",
+ "Add to your ownCloud" : "Apondre a vòstre ownCloud",
+ "Download" : "Telecargar",
+ "Download %s" : "Telecargar %s",
+ "Direct link" : "Ligam dirècte",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Veire la documentacion",
+ "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors",
+ "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :",
+ "Share it:" : "Partejar :",
+ "Add to your website" : "Apondre a vòstre site web",
+ "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud",
+ "HTML Code:" : "Còde HTML :"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sk_SK.js b/apps/files_sharing/l10n/sk_SK.js
index 4d596987963..1f109b739e5 100644
--- a/apps/files_sharing/l10n/sk_SK.js
+++ b/apps/files_sharing/l10n/sk_SK.js
@@ -38,9 +38,13 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "Verejne zdieľaný súbor %1$s bol stiahnutý",
"You shared %1$s with %2$s" : "Bol zdieľaný %1$s s %2$s",
"You shared %1$s with group %2$s" : "Bol zdieľaný %1$s so skupinou %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s zdieľané %1$s s %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s zdieľané %1$s so skupinou %3$s",
+ "%2$s shared %1$s via link" : "%2$s zdieľané %1$s pomocou linky",
"%2$s shared %1$s with you" : "%2$s vám zdieľal %1$s",
"You shared %1$s via link" : "Zdieľate %1$s prostredníctvom odkazu",
"Shares" : "Zdieľanie",
+ "You received %2$s as a remote share from %1$s" : "Dostali ste %2$s, ako vzdialené zdieľanie od %1$s",
"Accept" : "Schváliť",
"Decline" : "Odmietnuť",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
diff --git a/apps/files_sharing/l10n/sk_SK.json b/apps/files_sharing/l10n/sk_SK.json
index e8468d1500e..dab3d4105c4 100644
--- a/apps/files_sharing/l10n/sk_SK.json
+++ b/apps/files_sharing/l10n/sk_SK.json
@@ -36,9 +36,13 @@
"Public shared file %1$s was downloaded" : "Verejne zdieľaný súbor %1$s bol stiahnutý",
"You shared %1$s with %2$s" : "Bol zdieľaný %1$s s %2$s",
"You shared %1$s with group %2$s" : "Bol zdieľaný %1$s so skupinou %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s zdieľané %1$s s %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s zdieľané %1$s so skupinou %3$s",
+ "%2$s shared %1$s via link" : "%2$s zdieľané %1$s pomocou linky",
"%2$s shared %1$s with you" : "%2$s vám zdieľal %1$s",
"You shared %1$s via link" : "Zdieľate %1$s prostredníctvom odkazu",
"Shares" : "Zdieľanie",
+ "You received %2$s as a remote share from %1$s" : "Dostali ste %2$s, ako vzdialené zdieľanie od %1$s",
"Accept" : "Schváliť",
"Decline" : "Odmietnuť",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
diff --git a/apps/files_sharing/l10n/th_TH.js b/apps/files_sharing/l10n/th_TH.js
index 07aa56dfe18..c5b644cf254 100644
--- a/apps/files_sharing/l10n/th_TH.js
+++ b/apps/files_sharing/l10n/th_TH.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "ไฟล์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด",
"You shared %1$s with %2$s" : "คุณแชร์ %1$s กับ %2$s",
"You shared %1$s with group %2$s" : "คุณแชร์ %1$s กับกลุ่ม %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s ได้แชร์ %1$s กับ %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s ได้แชร์ %1$s กับกลุ่ม %3$s",
+ "%2$s shared %1$s via link" : "%2$s ได้แชร์ %1$s ผ่านลิงค์",
"%2$s shared %1$s with you" : "%2$s ถูกแชร์ %1$s กับคุณ",
"You shared %1$s via link" : "คุณแชร์ %1$s ผ่านลิงค์",
"Shares" : "แชร์",
diff --git a/apps/files_sharing/l10n/th_TH.json b/apps/files_sharing/l10n/th_TH.json
index 3edd0d18ab1..4ff45e2734e 100644
--- a/apps/files_sharing/l10n/th_TH.json
+++ b/apps/files_sharing/l10n/th_TH.json
@@ -36,6 +36,9 @@
"Public shared file %1$s was downloaded" : "ไฟล์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด",
"You shared %1$s with %2$s" : "คุณแชร์ %1$s กับ %2$s",
"You shared %1$s with group %2$s" : "คุณแชร์ %1$s กับกลุ่ม %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s ได้แชร์ %1$s กับ %3$s",
+ "%2$s shared %1$s with group %3$s" : "%2$s ได้แชร์ %1$s กับกลุ่ม %3$s",
+ "%2$s shared %1$s via link" : "%2$s ได้แชร์ %1$s ผ่านลิงค์",
"%2$s shared %1$s with you" : "%2$s ถูกแชร์ %1$s กับคุณ",
"You shared %1$s via link" : "คุณแชร์ %1$s ผ่านลิงค์",
"Shares" : "แชร์",
diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php
index 1257e7a445c..63ac2e90b2a 100644
--- a/apps/files_sharing/lib/activity.php
+++ b/apps/files_sharing/lib/activity.php
@@ -58,6 +58,7 @@ class Activity implements IExtension {
const SUBJECT_RESHARED_GROUP_BY = 'reshared_group_by';
const SUBJECT_RESHARED_LINK_BY = 'reshared_link_by';
const SUBJECT_RESHARED_USER_BY = 'reshared_user_by';
+ const SUBJECT_SHARED_EMAIL = 'shared_with_email';
const SUBJECT_SHARED_WITH_BY = 'shared_with_by';
/** @var IFactory */
@@ -182,6 +183,8 @@ class Activity implements IExtension {
return (string) $l->t('%2$s shared %1$s with you', $params);
case self::SUBJECT_SHARED_LINK_SELF:
return (string) $l->t('You shared %1$s via link', $params);
+ case self::SUBJECT_SHARED_EMAIL:
+ return (string) $l->t('You shared %1$s with %2$s', $params);
}
}
@@ -227,6 +230,11 @@ class Activity implements IExtension {
1 => 'username',
2 => '',
];
+ case self::SUBJECT_SHARED_EMAIL:
+ return array(
+ 0 => 'file',
+ 1 => '',// 'email' is neither supported nor planned for now
+ );
case self::SUBJECT_SHARED_USER_SELF:
case self::SUBJECT_SHARED_WITH_BY:
diff --git a/apps/files_sharing/lib/capabilities.php b/apps/files_sharing/lib/capabilities.php
index b24eb8d61f0..c8ba1273281 100644
--- a/apps/files_sharing/lib/capabilities.php
+++ b/apps/files_sharing/lib/capabilities.php
@@ -45,28 +45,36 @@ class Capabilities implements ICapability {
public function getCapabilities() {
$res = [];
- $public = [];
- $public['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes';
- if ($public['enabled']) {
- $public['password'] = [];
- $public['password']['enforced'] = ($this->config->getAppValue('core', 'shareapi_enforce_links_password', 'no') === 'yes');
+ if ($this->config->getAppValue('core', 'shareapi_enabled', 'yes') !== 'yes') {
+ $res['api_enabled'] = false;
+ $res['public'] = ['enabled' => false];
+ $res['user'] = ['send_mail' => false];
+ $res['resharing'] = false;
+ } else {
+ $res['api_enabled'] = true;
- $public['expire_date'] = [];
- $public['expire_date']['enabled'] = $this->config->getAppValue('core', 'shareapi_default_expire_date', 'no') === 'yes';
- if ($public['expire_date']['enabled']) {
- $public['expire_date']['days'] = $this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7');
- $public['expire_date']['enforced'] = $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'no') === 'yes';
- }
+ $public = [];
+ $public['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes';
+ if ($public['enabled']) {
+ $public['password'] = [];
+ $public['password']['enforced'] = ($this->config->getAppValue('core', 'shareapi_enforce_links_password', 'no') === 'yes');
- $public['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no') === 'yes';
- $public['upload'] = $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes') === 'yes';
- }
- $res["public"] = $public;
+ $public['expire_date'] = [];
+ $public['expire_date']['enabled'] = $this->config->getAppValue('core', 'shareapi_default_expire_date', 'no') === 'yes';
+ if ($public['expire_date']['enabled']) {
+ $public['expire_date']['days'] = $this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7');
+ $public['expire_date']['enforced'] = $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'no') === 'yes';
+ }
- $res['user']['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no') === 'yes';
+ $public['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no') === 'yes';
+ $public['upload'] = $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes') === 'yes';
+ }
+ $res["public"] = $public;
- $res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes';
+ $res['user']['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no') === 'yes';
+ $res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes';
+ }
//Federated sharing
$res['federation'] = [
diff --git a/apps/files_sharing/lib/connector/publicauth.php b/apps/files_sharing/lib/connector/publicauth.php
index b1c269867f5..9d1bf391560 100644
--- a/apps/files_sharing/lib/connector/publicauth.php
+++ b/apps/files_sharing/lib/connector/publicauth.php
@@ -82,10 +82,13 @@ class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
}
return true;
+ } else if (\OC::$server->getSession()->exists('public_link_authenticated')
+ && \OC::$server->getSession()->get('public_link_authenticated') === $linkItem['id']) {
+ return true;
} else {
return false;
}
- } elseif ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_REMOTE) {
+ } else if ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_REMOTE) {
return true;
} else {
return false;
diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php
index ecf3ee853ee..28feb3110b4 100644
--- a/apps/files_sharing/lib/controllers/sharecontroller.php
+++ b/apps/files_sharing/lib/controllers/sharecontroller.php
@@ -46,6 +46,7 @@ use OCA\Files_Sharing\Helper;
use OCP\User;
use OCP\Util;
use OCA\Files_Sharing\Activity;
+use \OCP\Files\NotFoundException;
/**
* Class ShareController
@@ -148,6 +149,7 @@ class ShareController extends Controller {
* @param string $token
* @param string $path
* @return TemplateResponse|RedirectResponse
+ * @throws NotFoundException
*/
public function showShare($token, $path = '') {
\OC_User::setIncognitoMode(true);
@@ -171,7 +173,7 @@ class ShareController extends Controller {
$getPath = Filesystem::normalizePath($path);
$originalSharePath .= $path;
} else {
- throw new OCP\Files\NotFoundException();
+ throw new NotFoundException();
}
$file = basename($originalSharePath);
@@ -303,7 +305,7 @@ class ShareController extends Controller {
/**
* @param string $token
* @return string Resolved file path of the token
- * @throws \Exception In case share could not get properly resolved
+ * @throws NotFoundException In case share could not get properly resolved
*/
private function getPath($token) {
$linkItem = Share::getShareByToken($token, false);
@@ -312,7 +314,7 @@ class ShareController extends Controller {
$rootLinkItem = Share::resolveReShare($linkItem);
if (isset($rootLinkItem['uid_owner'])) {
if(!$this->userManager->userExists($rootLinkItem['uid_owner'])) {
- throw new \Exception('Owner of the share does not exist anymore');
+ throw new NotFoundException('Owner of the share does not exist anymore');
}
OC_Util::tearDownFS();
OC_Util::setupFS($rootLinkItem['uid_owner']);
@@ -324,6 +326,6 @@ class ShareController extends Controller {
}
}
- throw new \Exception('No file found belonging to file.');
+ throw new NotFoundException('No file found belonging to file.');
}
}
diff --git a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php
index 1c29b1da736..61dfd914d0b 100644
--- a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php
+++ b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php
@@ -27,6 +27,7 @@ use OCP\App\IAppManager;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Middleware;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\Files\NotFoundException;
use OCP\IConfig;
/**
@@ -58,22 +59,32 @@ class SharingCheckMiddleware extends Middleware {
/**
* Check if sharing is enabled before the controllers is executed
+ *
+ * @param \OCP\AppFramework\Controller $controller
+ * @param string $methodName
+ * @throws NotFoundException
*/
public function beforeController($controller, $methodName) {
if(!$this->isSharingEnabled()) {
- throw new \Exception('Sharing is disabled.');
+ throw new NotFoundException('Sharing is disabled.');
}
}
/**
- * Return 404 page in case of an exception
+ * Return 404 page in case of a not found exception
+ *
* @param \OCP\AppFramework\Controller $controller
* @param string $methodName
* @param \Exception $exception
- * @return TemplateResponse
+ * @return NotFoundResponse
+ * @throws \Exception
*/
- public function afterException($controller, $methodName, \Exception $exception){
- return new NotFoundResponse();
+ public function afterException($controller, $methodName, \Exception $exception) {
+ if(is_a($exception, '\OCP\Files\NotFoundException')) {
+ return new NotFoundResponse();
+ }
+
+ throw $exception;
}
/**
diff --git a/apps/files_sharing/lib/mountprovider.php b/apps/files_sharing/lib/mountprovider.php
index 14a79625993..458e7f2619b 100644
--- a/apps/files_sharing/lib/mountprovider.php
+++ b/apps/files_sharing/lib/mountprovider.php
@@ -69,12 +69,11 @@ class MountProvider implements IMountProvider {
// for updating etags for the share owner when we make changes to this share.
$ownerPropagator = $this->propagationManager->getChangePropagator($share['uid_owner']);
- // for updating our etags when changes are made to the share from the owners side (probably indirectly by us trough another share)
- $this->propagationManager->listenToOwnerChanges($share['uid_owner'], $user->getUID());
return new SharedMount(
'\OC\Files\Storage\Shared',
'/' . $user->getUID() . '/' . $share['file_target'],
array(
+ 'propagationManager' => $this->propagationManager,
'propagator' => $ownerPropagator,
'share' => $share,
'user' => $user->getUID()
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 1ac401f3cf8..27dd2f1e485 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -50,13 +50,34 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
*/
private $ownerView;
+ /**
+ * @var \OCA\Files_Sharing\Propagation\PropagationManager
+ */
+ private $propagationManager;
+
+ /**
+ * @var string
+ */
+ private $user;
+
+ private $initialized = false;
+
public function __construct($arguments) {
$this->share = $arguments['share'];
$this->ownerView = $arguments['ownerView'];
+ $this->propagationManager = $arguments['propagationManager'];
+ $this->user = $arguments['user'];
}
private function init() {
+ if ($this->initialized) {
+ return;
+ }
+ $this->initialized = true;
Filesystem::initMountPoints($this->share['uid_owner']);
+
+ // for updating our etags when changes are made to the share from the owners side (probably indirectly by us trough another share)
+ $this->propagationManager->listenToOwnerChanges($this->share['uid_owner'], $this->user);
}
/**
diff --git a/apps/files_sharing/publicwebdav.php b/apps/files_sharing/publicwebdav.php
index 773a15c888e..fbf9d22cf76 100644
--- a/apps/files_sharing/publicwebdav.php
+++ b/apps/files_sharing/publicwebdav.php
@@ -46,7 +46,8 @@ $serverFactory = new \OC\Connector\Sabre\ServerFactory(
$requestUri = \OC::$server->getRequest()->getRequestUri();
$server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function () use ($authBackend) {
- if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false) {
+ $isAjax = (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest');
+ if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false && !$isAjax) {
// this is what is thrown when trying to access a non-existing share
throw new \Sabre\DAV\Exception\NotAuthenticated();
}
diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php
index 5c5d5b0d309..91b8b1c7e66 100644
--- a/apps/files_sharing/tests/api/shareestest.php
+++ b/apps/files_sharing/tests/api/shareestest.php
@@ -110,16 +110,30 @@ class ShareesTest extends TestCase {
public function dataGetUsers() {
return [
- ['test', false, [], [], [], [], true, false],
- ['test', true, [], [], [], [], true, false],
+ ['test', false, true, [], [], [], [], true, false],
+ ['test', false, false, [], [], [], [], true, false],
+ ['test', true, true, [], [], [], [], true, false],
+ ['test', true, false, [], [], [], [], true, false],
[
- 'test', false, [], [],
+ 'test', false, true, [], [],
[
['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
], [], true, $this->getUserMock('test', 'Test')
],
[
- 'test', true, [], [],
+ 'test', false, false, [], [],
+ [
+ ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
+ ], [], true, $this->getUserMock('test', 'Test')
+ ],
+ [
+ 'test', true, true, [], [],
+ [
+ ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
+ ], [], true, $this->getUserMock('test', 'Test')
+ ],
+ [
+ 'test', true, false, [], [],
[
['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
], [], true, $this->getUserMock('test', 'Test')
@@ -127,6 +141,7 @@ class ShareesTest extends TestCase {
[
'test',
false,
+ true,
[],
[
$this->getUserMock('test1', 'Test One'),
@@ -141,6 +156,20 @@ class ShareesTest extends TestCase {
[
'test',
false,
+ false,
+ [],
+ [
+ $this->getUserMock('test1', 'Test One'),
+ ],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test',
+ false,
+ true,
[],
[
$this->getUserMock('test1', 'Test One'),
@@ -157,6 +186,21 @@ class ShareesTest extends TestCase {
[
'test',
false,
+ false,
+ [],
+ [
+ $this->getUserMock('test1', 'Test One'),
+ $this->getUserMock('test2', 'Test Two'),
+ ],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test',
+ false,
+ true,
[],
[
$this->getUserMock('test0', 'Test'),
@@ -175,6 +219,24 @@ class ShareesTest extends TestCase {
],
[
'test',
+ false,
+ false,
+ [],
+ [
+ $this->getUserMock('test0', 'Test'),
+ $this->getUserMock('test1', 'Test One'),
+ $this->getUserMock('test2', 'Test Two'),
+ ],
+ [
+ ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test0']],
+ ],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test',
+ true,
true,
['abc', 'xyz'],
[
@@ -191,6 +253,21 @@ class ShareesTest extends TestCase {
[
'test',
true,
+ false,
+ ['abc', 'xyz'],
+ [
+ ['abc', 'test', 2, 0, ['test1' => 'Test One']],
+ ['xyz', 'test', 2, 0, []],
+ ],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test',
+ true,
+ true,
['abc', 'xyz'],
[
['abc', 'test', 2, 0, [
@@ -213,6 +290,27 @@ class ShareesTest extends TestCase {
[
'test',
true,
+ false,
+ ['abc', 'xyz'],
+ [
+ ['abc', 'test', 2, 0, [
+ 'test1' => 'Test One',
+ 'test2' => 'Test Two',
+ ]],
+ ['xyz', 'test', 2, 0, [
+ 'test1' => 'Test One',
+ 'test2' => 'Test Two',
+ ]],
+ ],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test',
+ true,
+ true,
['abc', 'xyz'],
[
['abc', 'test', 2, 0, [
@@ -231,6 +329,26 @@ class ShareesTest extends TestCase {
false,
false,
],
+ [
+ 'test',
+ true,
+ false,
+ ['abc', 'xyz'],
+ [
+ ['abc', 'test', 2, 0, [
+ 'test' => 'Test One',
+ ]],
+ ['xyz', 'test', 2, 0, [
+ 'test2' => 'Test Two',
+ ]],
+ ],
+ [
+ ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']],
+ ],
+ [],
+ true,
+ false,
+ ],
];
}
@@ -239,6 +357,7 @@ class ShareesTest extends TestCase {
*
* @param string $searchTerm
* @param bool $shareWithGroupOnly
+ * @param bool $shareeEnumeration
* @param array $groupResponse
* @param array $userResponse
* @param array $exactExpected
@@ -246,10 +365,11 @@ class ShareesTest extends TestCase {
* @param bool $reachedEnd
* @param mixed $singleUser
*/
- public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd, $singleUser) {
+ public function testGetUsers($searchTerm, $shareWithGroupOnly, $shareeEnumeration, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd, $singleUser) {
$this->invokePrivate($this->sharees, 'limit', [2]);
$this->invokePrivate($this->sharees, 'offset', [0]);
$this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]);
+ $this->invokePrivate($this->sharees, 'shareeEnumeration', [$shareeEnumeration]);
$user = $this->getUserMock('admin', 'Administrator');
$this->session->expects($this->any())
@@ -290,9 +410,10 @@ class ShareesTest extends TestCase {
public function dataGetGroups() {
return [
- ['test', false, [], [], [], [], true, false],
+ ['test', false, true, [], [], [], [], true, false],
+ ['test', false, false, [], [], [], [], true, false],
[
- 'test', false,
+ 'test', false, true,
[$this->getGroupMock('test1')],
[],
[],
@@ -301,7 +422,16 @@ class ShareesTest extends TestCase {
false,
],
[
- 'test', false,
+ 'test', false, false,
+ [$this->getGroupMock('test1')],
+ [],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test', false, true,
[
$this->getGroupMock('test'),
$this->getGroupMock('test1'),
@@ -313,7 +443,19 @@ class ShareesTest extends TestCase {
false,
],
[
- 'test', false,
+ 'test', false, false,
+ [
+ $this->getGroupMock('test'),
+ $this->getGroupMock('test1'),
+ ],
+ [],
+ [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test', false, true,
[
$this->getGroupMock('test0'),
$this->getGroupMock('test1'),
@@ -328,7 +470,19 @@ class ShareesTest extends TestCase {
null,
],
[
- 'test', false,
+ 'test', false, false,
+ [
+ $this->getGroupMock('test0'),
+ $this->getGroupMock('test1'),
+ ],
+ [],
+ [],
+ [],
+ true,
+ null,
+ ],
+ [
+ 'test', false, true,
[
$this->getGroupMock('test0'),
$this->getGroupMock('test1'),
@@ -344,9 +498,24 @@ class ShareesTest extends TestCase {
false,
$this->getGroupMock('test'),
],
- ['test', true, [], [], [], [], true, false],
[
- 'test', true,
+ 'test', false, false,
+ [
+ $this->getGroupMock('test0'),
+ $this->getGroupMock('test1'),
+ ],
+ [],
+ [
+ ['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']],
+ ],
+ [],
+ true,
+ $this->getGroupMock('test'),
+ ],
+ ['test', true, true, [], [], [], [], true, false],
+ ['test', true, false, [], [], [], [], true, false],
+ [
+ 'test', true, true,
[
$this->getGroupMock('test1'),
$this->getGroupMock('test2'),
@@ -358,7 +527,19 @@ class ShareesTest extends TestCase {
false,
],
[
- 'test', true,
+ 'test', true, false,
+ [
+ $this->getGroupMock('test1'),
+ $this->getGroupMock('test2'),
+ ],
+ [$this->getGroupMock('test1')],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test', true, true,
[
$this->getGroupMock('test'),
$this->getGroupMock('test1'),
@@ -370,7 +551,19 @@ class ShareesTest extends TestCase {
false,
],
[
- 'test', true,
+ 'test', true, false,
+ [
+ $this->getGroupMock('test'),
+ $this->getGroupMock('test1'),
+ ],
+ [$this->getGroupMock('test')],
+ [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test', true, true,
[
$this->getGroupMock('test'),
$this->getGroupMock('test1'),
@@ -382,7 +575,19 @@ class ShareesTest extends TestCase {
false,
],
[
- 'test', true,
+ 'test', true, false,
+ [
+ $this->getGroupMock('test'),
+ $this->getGroupMock('test1'),
+ ],
+ [$this->getGroupMock('test1')],
+ [],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test', true, true,
[
$this->getGroupMock('test'),
$this->getGroupMock('test1'),
@@ -394,7 +599,19 @@ class ShareesTest extends TestCase {
false,
],
[
- 'test', true,
+ 'test', true, false,
+ [
+ $this->getGroupMock('test'),
+ $this->getGroupMock('test1'),
+ ],
+ [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')],
+ [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]],
+ [],
+ true,
+ false,
+ ],
+ [
+ 'test', true, true,
[
$this->getGroupMock('test0'),
$this->getGroupMock('test1'),
@@ -409,7 +626,19 @@ class ShareesTest extends TestCase {
null,
],
[
- 'test', true,
+ 'test', true, false,
+ [
+ $this->getGroupMock('test0'),
+ $this->getGroupMock('test1'),
+ ],
+ [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')],
+ [],
+ [],
+ true,
+ null,
+ ],
+ [
+ 'test', true, true,
[
$this->getGroupMock('test0'),
$this->getGroupMock('test1'),
@@ -425,6 +654,20 @@ class ShareesTest extends TestCase {
false,
$this->getGroupMock('test'),
],
+ [
+ 'test', true, false,
+ [
+ $this->getGroupMock('test0'),
+ $this->getGroupMock('test1'),
+ ],
+ [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')],
+ [
+ ['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']],
+ ],
+ [],
+ true,
+ $this->getGroupMock('test'),
+ ],
];
}
@@ -433,6 +676,7 @@ class ShareesTest extends TestCase {
*
* @param string $searchTerm
* @param bool $shareWithGroupOnly
+ * @param bool $shareeEnumeration
* @param array $groupResponse
* @param array $userGroupsResponse
* @param array $exactExpected
@@ -440,10 +684,11 @@ class ShareesTest extends TestCase {
* @param bool $reachedEnd
* @param mixed $singleGroup
*/
- public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd, $singleGroup) {
+ public function testGetGroups($searchTerm, $shareWithGroupOnly, $shareeEnumeration, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd, $singleGroup) {
$this->invokePrivate($this->sharees, 'limit', [2]);
$this->invokePrivate($this->sharees, 'offset', [0]);
$this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]);
+ $this->invokePrivate($this->sharees, 'shareeEnumeration', [$shareeEnumeration]);
$this->groupManager->expects($this->once())
->method('search')
@@ -480,10 +725,22 @@ class ShareesTest extends TestCase {
public function dataGetRemote() {
return [
- ['test', [], [], [], true],
+ ['test', [], true, [], [], true],
+ ['test', [], false, [], [], true],
+ [
+ 'test@remote',
+ [],
+ true,
+ [
+ ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']],
+ ],
+ [],
+ true,
+ ],
[
'test@remote',
[],
+ false,
[
['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']],
],
@@ -508,6 +765,7 @@ class ShareesTest extends TestCase {
],
],
],
+ true,
[],
[
['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']],
@@ -515,6 +773,29 @@ class ShareesTest extends TestCase {
true,
],
[
+ 'test',
+ [
+ [
+ 'FN' => 'User3 @ Localhost',
+ ],
+ [
+ 'FN' => 'User2 @ Localhost',
+ 'CLOUD' => [
+ ],
+ ],
+ [
+ 'FN' => 'User @ Localhost',
+ 'CLOUD' => [
+ 'username@localhost',
+ ],
+ ],
+ ],
+ false,
+ [],
+ [],
+ true,
+ ],
+ [
'test@remote',
[
[
@@ -532,6 +813,7 @@ class ShareesTest extends TestCase {
],
],
],
+ true,
[
['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']],
],
@@ -541,6 +823,31 @@ class ShareesTest extends TestCase {
true,
],
[
+ 'test@remote',
+ [
+ [
+ 'FN' => 'User3 @ Localhost',
+ ],
+ [
+ 'FN' => 'User2 @ Localhost',
+ 'CLOUD' => [
+ ],
+ ],
+ [
+ 'FN' => 'User @ Localhost',
+ 'CLOUD' => [
+ 'username@localhost',
+ ],
+ ],
+ ],
+ false,
+ [
+ ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']],
+ ],
+ [],
+ true,
+ ],
+ [
'username@localhost',
[
[
@@ -558,11 +865,36 @@ class ShareesTest extends TestCase {
],
],
],
+ true,
[
['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']],
],
+ [],
+ true,
+ ],
+ [
+ 'username@localhost',
[
+ [
+ 'FN' => 'User3 @ Localhost',
+ ],
+ [
+ 'FN' => 'User2 @ Localhost',
+ 'CLOUD' => [
+ ],
+ ],
+ [
+ 'FN' => 'User @ Localhost',
+ 'CLOUD' => [
+ 'username@localhost',
+ ],
+ ],
],
+ false,
+ [
+ ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']],
+ ],
+ [],
true,
],
];
@@ -573,11 +905,13 @@ class ShareesTest extends TestCase {
*
* @param string $searchTerm
* @param array $contacts
+ * @param bool $shareeEnumeration
* @param array $exactExpected
* @param array $expected
* @param bool $reachedEnd
*/
- public function testGetRemote($searchTerm, $contacts, $exactExpected, $expected, $reachedEnd) {
+ public function testGetRemote($searchTerm, $contacts, $shareeEnumeration, $exactExpected, $expected, $reachedEnd) {
+ $this->invokePrivate($this->sharees, 'shareeEnumeration', [$shareeEnumeration]);
$this->contactsManager->expects($this->any())
->method('search')
->with($searchTerm, ['CLOUD', 'FN'])
@@ -595,80 +929,84 @@ class ShareesTest extends TestCase {
$allTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE];
return [
- [[], '', true, '', null, $allTypes, 1, 200, false],
+ [[], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
// Test itemType
[[
'search' => '',
- ], '', true, '', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
[[
'search' => 'foobar',
- ], '', true, 'foobar', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, 'foobar', null, $allTypes, 1, 200, false, true],
[[
'search' => 0,
- ], '', true, '0', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, '0', null, $allTypes, 1, 200, false, true],
// Test itemType
[[
'itemType' => '',
- ], '', true, '', '', $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', '', $allTypes, 1, 200, false, true],
[[
'itemType' => 'folder',
- ], '', true, '', 'folder', $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', 'folder', $allTypes, 1, 200, false, true],
[[
'itemType' => 0,
- ], '', true, '', '0', $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', '0', $allTypes, 1, 200, false, true],
// Test shareType
[[
- ], '', true, '', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
[[
'shareType' => 0,
- ], '', true, '', null, [0], 1, 200, false],
+ ], '', 'yes', true, '', null, [0], 1, 200, false, true],
[[
'shareType' => '0',
- ], '', true, '', null, [0], 1, 200, false],
+ ], '', 'yes', true, '', null, [0], 1, 200, false, true],
[[
'shareType' => 1,
- ], '', true, '', null, [1], 1, 200, false],
+ ], '', 'yes', true, '', null, [1], 1, 200, false, true],
[[
'shareType' => 12,
- ], '', true, '', null, [], 1, 200, false],
+ ], '', 'yes', true, '', null, [], 1, 200, false, true],
[[
'shareType' => 'foobar',
- ], '', true, '', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
[[
'shareType' => [0, 1, 2],
- ], '', true, '', null, [0, 1], 1, 200, false],
+ ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true],
[[
'shareType' => [0, 1],
- ], '', true, '', null, [0, 1], 1, 200, false],
+ ], '', 'yes', true, '', null, [0, 1], 1, 200, false, true],
[[
'shareType' => $allTypes,
- ], '', true, '', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
[[
'shareType' => $allTypes,
- ], '', false, '', null, [0, 1], 1, 200, false],
+ ], '', 'yes', false, '', null, [0, 1], 1, 200, false, true],
// Test pagination
[[
'page' => 1,
- ], '', true, '', null, $allTypes, 1, 200, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 200, false, true],
[[
'page' => 10,
- ], '', true, '', null, $allTypes, 10, 200, false],
+ ], '', 'yes', true, '', null, $allTypes, 10, 200, false, true],
// Test perPage
[[
'perPage' => 1,
- ], '', true, '', null, $allTypes, 1, 1, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 1, false, true],
[[
'perPage' => 10,
- ], '', true, '', null, $allTypes, 1, 10, false],
+ ], '', 'yes', true, '', null, $allTypes, 1, 10, false, true],
// Test $shareWithGroupOnly setting
- [[], 'no', true, '', null, $allTypes, 1, 200, false],
- [[], 'yes', true, '', null, $allTypes, 1, 200, true],
+ [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ [[], 'yes', 'yes', true, '', null, $allTypes, 1, 200, true, true],
+
+ // Test $shareeEnumeration setting
+ [[], 'no', 'yes', true, '', null, $allTypes, 1, 200, false, true],
+ [[], 'no', 'no', true, '', null, $allTypes, 1, 200, false, false],
];
}
@@ -678,6 +1016,7 @@ class ShareesTest extends TestCase {
*
* @param array $getData
* @param string $apiSetting
+ * @param string $enumSetting
* @param bool $remoteSharingEnabled
* @param string $search
* @param string $itemType
@@ -685,18 +1024,22 @@ class ShareesTest extends TestCase {
* @param int $page
* @param int $perPage
* @param bool $shareWithGroupOnly
+ * @param bool $shareeEnumeration
*/
- public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly) {
+ public function testSearch($getData, $apiSetting, $enumSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly, $shareeEnumeration) {
$oldGet = $_GET;
$_GET = $getData;
$config = $this->getMockBuilder('OCP\IConfig')
->disableOriginalConstructor()
->getMock();
- $config->expects($this->once())
+ $config->expects($this->exactly(2))
->method('getAppValue')
- ->with('core', 'shareapi_only_share_with_group_members', 'no')
- ->willReturn($apiSetting);
+ ->with('core', $this->anything(), $this->anything())
+ ->willReturnMap([
+ ['core', 'shareapi_only_share_with_group_members', 'no', $apiSetting],
+ ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', $enumSetting],
+ ]);
$sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees')
->setConstructorArgs([
@@ -735,6 +1078,7 @@ class ShareesTest extends TestCase {
$this->assertInstanceOf('\OC_OCS_Result', $sharees->search());
$this->assertSame($shareWithGroupOnly, $this->invokePrivate($sharees, 'shareWithGroupOnly'));
+ $this->assertSame($shareeEnumeration, $this->invokePrivate($sharees, 'shareeEnumeration'));
$_GET = $oldGet;
}
diff --git a/apps/files_sharing/tests/capabilities.php b/apps/files_sharing/tests/capabilities.php
index f1a9626db9b..cff7bdf1fe8 100644
--- a/apps/files_sharing/tests/capabilities.php
+++ b/apps/files_sharing/tests/capabilities.php
@@ -56,8 +56,31 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
return $result;
}
+ public function testEnabledSharingAPI() {
+ $map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertTrue($result['api_enabled']);
+ $this->assertContains('public', $result);
+ $this->assertContains('user', $result);
+ $this->assertContains('resharing', $result);
+ }
+
+ public function testDisabledSharingAPI() {
+ $map = [
+ ['core', 'shareapi_enabled', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertFalse($result['api_enabled']);
+ $this->assertNotContains('public', $result);
+ $this->assertNotContains('user', $result);
+ $this->assertNotContains('resharing', $result);
+ }
+
public function testNoLinkSharing() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'no'],
];
$result = $this->getResults($map);
@@ -67,6 +90,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testOnlyLinkSharing() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
];
$result = $this->getResults($map);
@@ -76,6 +100,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkPassword() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_enforce_links_password', 'no', 'yes'],
];
@@ -87,6 +112,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkNoPassword() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_enforce_links_password', 'no', 'no'],
];
@@ -98,6 +124,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkNoExpireDate() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_default_expire_date', 'no', 'no'],
];
@@ -109,6 +136,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkExpireDate() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_default_expire_date', 'no', 'yes'],
['core', 'shareapi_expire_after_n_days', '7', '7'],
@@ -124,6 +152,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkExpireDateEnforced() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_default_expire_date', 'no', 'yes'],
['core', 'shareapi_enforce_expire_date', 'no', 'yes'],
@@ -136,6 +165,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkSendMail() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_allow_public_notification', 'no', 'yes'],
];
@@ -145,6 +175,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkNoSendMail() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_allow_public_notification', 'no', 'no'],
];
@@ -154,6 +185,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testUserSendMail() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_mail_notification', 'no', 'yes'],
];
$result = $this->getResults($map);
@@ -162,6 +194,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testUserNoSendMail() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_mail_notification', 'no', 'no'],
];
$result = $this->getResults($map);
@@ -170,6 +203,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testResharing() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_resharing', 'yes', 'yes'],
];
$result = $this->getResults($map);
@@ -178,6 +212,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testNoResharing() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_resharing', 'yes', 'no'],
];
$result = $this->getResults($map);
@@ -186,6 +221,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkPublicUpload() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_allow_public_upload', 'yes', 'yes'],
];
@@ -195,6 +231,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
public function testLinkNoPublicUpload() {
$map = [
+ ['core', 'shareapi_enabled', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_allow_public_upload', 'yes', 'no'],
];
diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js
index 96a96f1b814..fd8e36d71ad 100644
--- a/apps/files_sharing/tests/js/shareSpec.js
+++ b/apps/files_sharing/tests/js/shareSpec.js
@@ -179,7 +179,7 @@ describe('OCA.Sharing.Util tests', function() {
expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg');
expect($action.find('img').length).toEqual(1);
});
- it('shows static share text when file shared with user that has no share permission', function() {
+ it('shows share action when shared with user who has no share permission', function() {
var $action, $tr;
fileList.setFiles([{
id: 1,
@@ -193,14 +193,9 @@ describe('OCA.Sharing.Util tests', function() {
shareOwner: 'User One'
}]);
$tr = fileList.$el.find('tbody tr:first');
- expect($tr.find('.action-share').length).toEqual(0);
- $action = $tr.find('.action-share-notification');
- expect($action.find('>span').text().trim()).toEqual('User One');
- expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
- expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg');
- expect($action.find('img').length).toEqual(1);
+ expect($tr.find('.action-share').length).toEqual(1);
});
- it('do not show static share text when share exists but neither permission nor owner is available', function() {
+ it('do not show share action when share exists but neither permission nor owner is available', function() {
var $action, $tr;
fileList.setFiles([{
id: 1,
@@ -214,8 +209,6 @@ describe('OCA.Sharing.Util tests', function() {
}]);
$tr = fileList.$el.find('tbody tr:first');
expect($tr.find('.action-share').length).toEqual(0);
- $action = $tr.find('.action-share-notification');
- expect($action.length).toEqual(0);
});
});
describe('Share action', function() {
diff --git a/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php b/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php
index 58f4b841339..3171d45d331 100644
--- a/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php
+++ b/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php
@@ -23,7 +23,8 @@
*/
namespace OCA\Files_Sharing\Middleware;
-
+use OCP\AppFramework\Http\NotFoundResponse;
+use OCP\Files\NotFoundException;
/**
* @package OCA\Files_Sharing\Middleware\SharingCheckMiddleware
@@ -36,12 +37,16 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
private $appManager;
/** @var SharingCheckMiddleware */
private $sharingCheckMiddleware;
+ /** @var \OCP\AppFramework\Controller */
+ private $controllerMock;
protected function setUp() {
$this->config = $this->getMockBuilder('\OCP\IConfig')
->disableOriginalConstructor()->getMock();
$this->appManager = $this->getMockBuilder('\OCP\App\IAppManager')
->disableOriginalConstructor()->getMock();
+ $this->controllerMock = $this->getMockBuilder('\OCP\AppFramework\Controller')
+ ->disableOriginalConstructor()->getMock();
$this->sharingCheckMiddleware = new SharingCheckMiddleware('files_sharing', $this->config, $this->appManager);
}
@@ -116,4 +121,52 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
$this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled'));
}
+ public function testBeforeControllerWithSharingEnabled() {
+ $this->appManager
+ ->expects($this->once())
+ ->method('isEnabledForUser')
+ ->with('files_sharing')
+ ->will($this->returnValue(true));
+
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'shareapi_enabled', 'yes')
+ ->will($this->returnValue('yes'));
+
+ $this->config
+ ->expects($this->at(1))
+ ->method('getAppValue')
+ ->with('core', 'shareapi_allow_links', 'yes')
+ ->will($this->returnValue('yes'));
+
+ $this->sharingCheckMiddleware->beforeController($this->controllerMock, 'myMethod');
+ }
+
+ /**
+ * @expectedException \OCP\Files\NotFoundException
+ * @expectedExceptionMessage Sharing is disabled.
+ */
+ public function testBeforeControllerWithSharingDisabled() {
+ $this->appManager
+ ->expects($this->once())
+ ->method('isEnabledForUser')
+ ->with('files_sharing')
+ ->will($this->returnValue(false));
+
+ $this->sharingCheckMiddleware->beforeController($this->controllerMock, 'myMethod');
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage My Exception message
+ */
+ public function testAfterExceptionWithRegularException() {
+ $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new \Exception('My Exception message'));
+ }
+
+ public function testAfterExceptionWithNotFoundException() {
+ $this->assertEquals(new NotFoundResponse(), $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new NotFoundException('My Exception message')));
+ }
+
}
diff --git a/apps/files_trashbin/l10n/oc.js b/apps/files_trashbin/l10n/oc.js
index f8846950f59..390ccaea050 100644
--- a/apps/files_trashbin/l10n/oc.js
+++ b/apps/files_trashbin/l10n/oc.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Couldn't restore %s" : "Impossible de restablir %s",
"Deleted files" : "Fichièrs suprimits",
"Restore" : "Restablir",
+ "Delete" : "Suprimir",
"Delete permanently" : "Suprimir de faiçon definitiva",
"Error" : "Error",
"restored" : "restablit",
@@ -13,7 +14,6 @@ OC.L10N.register(
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
"Select all" : "Seleccionar tot",
"Name" : "Nom",
- "Deleted" : "Escafat",
- "Delete" : "Suprimir"
+ "Deleted" : "Escafat"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_trashbin/l10n/oc.json b/apps/files_trashbin/l10n/oc.json
index 60bb205efe2..e2add0b3cdb 100644
--- a/apps/files_trashbin/l10n/oc.json
+++ b/apps/files_trashbin/l10n/oc.json
@@ -3,6 +3,7 @@
"Couldn't restore %s" : "Impossible de restablir %s",
"Deleted files" : "Fichièrs suprimits",
"Restore" : "Restablir",
+ "Delete" : "Suprimir",
"Delete permanently" : "Suprimir de faiçon definitiva",
"Error" : "Error",
"restored" : "restablit",
@@ -11,7 +12,6 @@
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
"Select all" : "Seleccionar tot",
"Name" : "Nom",
- "Deleted" : "Escafat",
- "Delete" : "Suprimir"
+ "Deleted" : "Escafat"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index 2a9df94988d..840fd4fa146 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -908,6 +908,6 @@ class Trashbin {
* @return string
*/
public static function preview_icon($path) {
- return \OCP\Util::linkToRoute('core_ajax_trashbin_preview', array('x' => 36, 'y' => 36, 'file' => $path));
+ return \OCP\Util::linkToRoute('core_ajax_trashbin_preview', array('x' => 32, 'y' => 32, 'file' => $path));
}
}
diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php
index 0c0f955cf40..b5c1c622156 100644
--- a/apps/files_trashbin/templates/index.php
+++ b/apps/files_trashbin/templates/index.php
@@ -23,7 +23,7 @@
<tr>
<th id='headerName' class="hidden column-name">
<div id="headerName-container">
- <input type="checkbox" id="select_all_trash" class="select-all"/>
+ <input type="checkbox" id="select_all_trash" class="select-all checkbox"/>
<label for="select_all_trash">
<span class="hidden-visually"><?php p($l->t('Select all'))?></span>
</label>
diff --git a/apps/files_trashbin/tests/expiration.php b/apps/files_trashbin/tests/expiration.php
index b3c6fcd95af..76fb24aa4df 100644
--- a/apps/files_trashbin/tests/expiration.php
+++ b/apps/files_trashbin/tests/expiration.php
@@ -207,6 +207,7 @@ class Expiration_Test extends \PHPUnit_Framework_TestCase {
'setSystemValues',
'setSystemValue',
'getSystemValue',
+ 'getFilteredSystemValue',
'deleteSystemValue',
'getAppKeys',
'setAppValue',
diff --git a/apps/files_versions/js/filesplugin.js b/apps/files_versions/js/filesplugin.js
index 42075ce6462..a9457c522d6 100644
--- a/apps/files_versions/js/filesplugin.js
+++ b/apps/files_versions/js/filesplugin.js
@@ -25,7 +25,7 @@
return;
}
- fileList.registerTabView(new OCA.Versions.VersionsTabView('versionsTabView'));
+ fileList.registerTabView(new OCA.Versions.VersionsTabView('versionsTabView', {order: -10}));
}
};
})();
diff --git a/apps/files_versions/js/versionstabview.js b/apps/files_versions/js/versionstabview.js
index f6a6f037988..55f24868196 100644
--- a/apps/files_versions/js/versionstabview.js
+++ b/apps/files_versions/js/versionstabview.js
@@ -44,6 +44,7 @@
},
initialize: function() {
+ OCA.Files.DetailTabView.prototype.initialize.apply(this, arguments);
this.collection = new OCA.Versions.VersionCollection();
this.collection.on('request', this._onRequest, this);
this.collection.on('sync', this._onEndRequest, this);
@@ -188,6 +189,18 @@
this.$el.find('.has-tooltip').tooltip();
this.$versionsContainer = this.$el.find('ul.versions');
this.delegateEvents();
+ },
+
+ /**
+ * Returns true for files, false for folders.
+ *
+ * @return {bool} true for files, false for folders
+ */
+ canDisplay: function(fileInfo) {
+ if (!fileInfo) {
+ return false;
+ }
+ return !fileInfo.isDirectory();
}
});
diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php
index 6aa58c55e9b..bdf1811c5f9 100644
--- a/apps/files_versions/lib/storage.php
+++ b/apps/files_versions/lib/storage.php
@@ -315,6 +315,9 @@ class Storage {
if (self::copyFileContents($users_view, 'files_versions' . $filename . '.v' . $revision, 'files' . $filename)) {
$files_view->touch($file, $revision);
Storage::scheduleExpire($uid, $file);
+ \OC_Hook::emit('\OCP\Versions', 'rollback', array(
+ 'path' => $filename,
+ ));
return true;
} else if ($versionCreated) {
self::deleteVersion($users_view, $version);
diff --git a/apps/files_versions/tests/expirationtest.php b/apps/files_versions/tests/expirationtest.php
index 54024b85b78..11a4746c5e7 100644
--- a/apps/files_versions/tests/expirationtest.php
+++ b/apps/files_versions/tests/expirationtest.php
@@ -177,6 +177,7 @@ class Expiration_Test extends \Test\TestCase {
'setSystemValues',
'setSystemValue',
'getSystemValue',
+ 'getFilteredSystemValue',
'deleteSystemValue',
'getAppKeys',
'setAppValue',
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index da214ead60a..d4a85c8bffe 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -580,6 +580,35 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->doTestRestore();
}
+ /**
+ * @param string $hookName name of hook called
+ * @param string $params variable to recieve parameters provided by hook
+ */
+ private function connectMockHooks($hookName, &$params) {
+ if ($hookName === null) {
+ return;
+ }
+
+ $eventHandler = $this->getMockBuilder('\stdclass')
+ ->setMethods(['callback'])
+ ->getMock();
+
+ $eventHandler->expects($this->any())
+ ->method('callback')
+ ->will($this->returnCallback(
+ function($p) use (&$params) {
+ $params = $p;
+ }
+ ));
+
+ \OCP\Util::connectHook(
+ '\OCP\Versions',
+ $hookName,
+ $eventHandler,
+ 'callback'
+ );
+ }
+
private function doTestRestore() {
$filePath = self::TEST_VERSIONS_USER . '/files/sub/test.txt';
$this->rootView->file_put_contents($filePath, 'test file');
@@ -608,7 +637,15 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->assertEquals('test file', $this->rootView->file_get_contents($filePath));
$info1 = $this->rootView->getFileInfo($filePath);
+ $params = array();
+ $this->connectMockHooks('rollback', $params);
+
\OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2);
+ $expectedParams = array(
+ 'path' => '/sub/test.txt',
+ );
+
+ $this->assertEquals($expectedParams, $params);
$this->assertEquals('version2', $this->rootView->file_get_contents($filePath));
$info2 = $this->rootView->getFileInfo($filePath);
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index a5fc59d3b07..d2e69b4e12a 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -31,6 +31,7 @@ namespace OCA\user_ldap;
use OCA\user_ldap\lib\Access;
use OCA\user_ldap\lib\BackendUtility;
+use OCA\user_ldap\lib\user\User;
class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
protected $enabled = false;
@@ -195,7 +196,11 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
return array();
}
$seen[$DN] = 1;
- $groups = $this->access->readAttribute($DN, 'memberOf');
+ $user = $this->access->userManager->get($DN);
+ if(!$user instanceof User) {
+ return array();
+ }
+ $groups = $user->getMemberOfGroups();
if (!is_array($groups)) {
return array();
}
diff --git a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js
index b73d267d168..0316db5b61c 100644
--- a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js
+++ b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js
@@ -71,7 +71,8 @@ OCA = OCA || {};
],
'ldap_login_filter_mode'
);
- _.bindAll(this, 'onVerifyClick');
+ _.bindAll(this, 'onVerifyClick', 'onTestLoginnameChange');
+ this.managedItems.ldap_test_loginname.$element.keyup(this.onTestLoginnameChange);
this.managedItems.ldap_test_loginname.$relatedElements.click(this.onVerifyClick);
},
@@ -231,6 +232,16 @@ OCA = OCA || {};
} else {
this.configModel.requestWizard('ldap_test_loginname', {ldap_test_loginname: testLogin});
}
+ },
+
+ /**
+ * enables/disables the "Verify Settings" button, depending whether
+ * the corresponding text input has a value or not
+ */
+ onTestLoginnameChange: function() {
+ var loginName = this.managedItems.ldap_test_loginname.$element.val();
+ var beDisabled = !_.isString(loginName) || !loginName.trim();
+ this.managedItems.ldap_test_loginname.$relatedElements.prop('disabled', beDisabled);
}
});
diff --git a/apps/user_ldap/l10n/oc.js b/apps/user_ldap/l10n/oc.js
index 695647833cd..450e1403c8c 100644
--- a/apps/user_ldap/l10n/oc.js
+++ b/apps/user_ldap/l10n/oc.js
@@ -1,14 +1,158 @@
OC.L10N.register(
"user_ldap",
{
+ "Failed to clear the mappings." : "Error al moment de la supression de las associacions.",
+ "Failed to delete the server configuration" : "Fracàs de la supression de la configuracion del servidor",
+ "The configuration is invalid: anonymous bind is not allowed." : "La configuracion es pas valida : lo ligam anonim es pas autorizat.",
+ "The configuration is valid and the connection could be established!" : "La configuracion es valida e la connexion pòt èsser establida !",
+ "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuracion es valable, mas lo bind a fracassat. Verificatz los paramètres del servidor ainsi que vos identificants de connexion.",
+ "The configuration is invalid. Please have a look at the logs for further details." : "La configuracion es pas valable. Consultatz les logs per mai de detalhs.",
+ "No action specified" : "Aucune action especificada",
+ "No configuration specified" : "Aucune configuration especificada",
+ "No data specified" : "Aucune donada especificada",
+ " Could not set configuration %s" : "Impossible de especificar la configuracion %s",
+ "Action does not exist" : "L'action n'existe pas",
+ "The Base DN appears to be wrong" : "Lo DN de base es erroné",
+ "Configuration incorrect" : "Configuracion incorrecte",
+ "Configuration incomplete" : "Configuracion incomplète",
+ "Configuration OK" : "Configuracion OK",
+ "Select groups" : "Seleccionnez los gropes",
+ "Select object classes" : "Seleccionar les classes d'objècte",
+ "Please check the credentials, they seem to be wrong." : "Verificatz vos informations d'identification",
+ "Please specify the port, it could not be auto-detected." : "Veuillez especificar lo pòrt, il n'a pu èsser detectat automaticament",
+ "Base DN could not be auto-detected, please revise credentials, host and port." : "Lo DN de base n'a pu èsser detectat automaticament. Verificatz les informations d'identification, l'hôte e lo pòrt.",
+ "Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de base, veuillez lo especificar manualament",
+ "{nthServer}. Server" : "{nthServer}. Servidor",
+ "No object found in the given Base DN. Please revise." : "Aucun objècte trobat dins lo DN de base especificat. Veuillez lo verificar.",
+ "More than 1.000 directory entries available." : "I a plus de 1000 entradas de repertòri disponibles.",
+ " entries available within the provided Base DN" : "entradas disponibles dins lo DN de base especificat",
+ "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error es survenue. Verificatz lo DN de base, ainsi que los paramètres de connexion e les informations d'identification",
+ "Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?",
+ "Confirm Deletion" : "Confirmer la supression",
+ "Mappings cleared successfully!" : "Associations suprimidas amb succès !",
+ "Error while clearing the mappings." : "Error al moment de la supression des associations.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "Lo ligam anonim es pas autorizat. Mercé de provesir lo DN d'un utilizaire e un senhal.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "Error LDAP. La connexion anonyme al servidor n'est probablement pas acceptada.",
+ "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "La salvament a fracassat. Verificatz que la banca de donadas es opérationnelle. Rechargez avant de contunhar.",
+ "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Changer de mode activera las requèstas LDAP automatiques. Selon la taille de votre annuaire LDAP, cela pòt prendre del temps. Volètz toujours changer de mode ?",
+ "Mode switch" : "Changer de mode",
+ "Select attributes" : "Seleccionar los atributs",
+ "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilizaire introuvable. Verificatz los atributs de login e lo nom d'utilizaire. Filtre effectif (à copier-coller per valider en ligne de commande):<br/>",
+ "User found and settings verified." : "Utilizaire trobat e paramètres verificats.",
+ "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Paramètres verificats, mas seul lo premier utilizaire pourra se connecter. Utilizatz plutôt un filtre mens restrictif.",
+ "An unspecified error occurred. Please check the settings and the log." : "Una error desconeguda s'es produsida. Verificatz los paramètres e lo log.",
+ "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Lo filtre de recèrca es pas valide, probablement a cause de problèmas de syntaxe tels que des parenthèses manquantes. Veuillez lo corriger.",
+ "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Una error s'es produsida al moment de la connexion al LDAP / AD. Verificatz l'hôte, lo pòrt e les informations d'identification.",
+ "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La chaîne %uid es manquante. Aquesta chaîne es remplacée per l'identificant de connexion al moment des requèstas LDAP / AD.",
+ "Please provide a login name to test against" : "Veuillez indiquer un identificant de connexion amb lequel tester.",
+ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Los gropes son desactivats perque lo servidor LDAP / AD pren pas en carga memberOf.",
+ "_%s group found_::_%s groups found_" : ["%s grop trobat","%s gropes trobats"],
+ "_%s user found_::_%s users found_" : ["%s utilizaire trobat","%s utilizaires trobats"],
+ "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de detectar l'atribut que conten lo nom d'afichatge des utilizaires. Indicatz-lo vos-meteis dins los paramètres ldap avançats.",
+ "Could not find the desired feature" : "Impossible de trobar la foncion desirada",
+ "Invalid Host" : "Òste invalid",
"Server" : "Servidor",
- "Users" : "Usancièrs",
- "Groups" : "Grops",
+ "Users" : "Utilizaires",
+ "Login Attributes" : "Atributs de login",
+ "Groups" : "Gropes",
+ "Test Configuration" : "Testar la configuracion",
"Help" : "Ajuda",
+ "Groups meeting these criteria are available in %s:" : "Los gropes que respèctan aquestes critèris son disponibles dins %s :",
+ "Only these object classes:" : "Solament aquestas classes d'objèctes :",
+ "Only from these groups:" : "Solament dins aquestes gropes :",
+ "Search groups" : "Cercar dins los gropes",
+ "Available groups" : "Gropes disponibles",
+ "Selected groups" : "Gropes seleccionats",
+ "Edit LDAP Query" : "Modificar la requèsta LDAP",
+ "LDAP Filter:" : "Filtre LDAP :",
+ "The filter specifies which LDAP groups shall have access to the %s instance." : "Lo filtre spécifie quels gropes LDAP ont accès a l'instància %s.",
+ "Verify settings and count groups" : "Verificar los paramètres e compter los gropes",
+ "When logging in, %s will find the user based on the following attributes:" : "Au login, %s cercarà l'utilizaire sus base de ces attributs :",
+ "LDAP / AD Username:" : "Nom d'utilizaire LDAP / AD :",
+ "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Autorizar lo login amb lo nom d'utilizaire LDAP / AD (uid o samaccountname, la détection es automatique). ",
+ "LDAP / AD Email Address:" : "Adresse mail LDAP / AD :",
+ "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Autorizar lo login amb una adreça mail. Mail e mailPrimaryAddress son autorizats.",
+ "Other Attributes:" : "Autres attributs :",
+ "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit lo filtre a aplicar al moment d'una tentative de connexion. %%uid remplace lo nom d'utilizaire. Exemple : \"uid=%%uid\"",
+ "Test Loginname" : "Loginname de tèst",
+ "Verify settings" : "Testar los paramètres",
+ "1. Server" : "1. Servidor",
+ "%s. Server:" : "%s. Servidor :",
+ "Add a new and blank configuration" : "Apondre una novèla configuracion verge",
+ "Copy current configuration into new directory binding" : "Copiar la configuracion actuala cap a una novèla",
+ "Delete the current configuration" : "Suprimir la configuracion actuala",
"Host" : "Òste",
+ "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Podètz omettre lo protocòl, levat se avètz besonh de SSL. Dins aqueste cas, prefixatz amb ldaps://",
"Port" : "Pòrt",
+ "Detect Port" : "Detectar lo pòrt",
+ "User DN" : "DN Utilizaire",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilizaire client per lequel la liaison deu se faire, per exemple uid=agent,dc=example,dc=com. Per un accès anonyme, laisser lo DN e lo senhal vides.",
"Password" : "Senhal",
+ "For anonymous access, leave DN and Password empty." : "Per un accès anonyme, laisser lo DN utilizaire e lo senhal vides.",
+ "One Base DN per line" : "Un DN de base per linha",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Podètz especificar les DN de base de vos utilizaires e gropes via l'onglet Avançat",
+ "Detect Base DN" : "Detectar lo DN de base",
+ "Test Base DN" : "Testar lo DN de base",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Évite las requèstas LDAP automaticas. Mieux per las installacions de grande ampleur, mas demande des coneissenças en LDAP.",
+ "Manually enter LDAP filters (recommended for large directories)" : "Sasir los filtres LDAP manualament (recomandat per les annuaires de grande ampleur)",
+ "Limit %s access to users meeting these criteria:" : "Limiter l'accès a %s als utilizaires respectant ces critèris :",
+ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Les classes d'objèctes fréquentes per los utilizaires son : organizationalPerson, person, user e inetOrgPerson. Se sètz pas segur de la classe a utiliser, demandez a l'administrator de l'annuaire.",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "Lo filtre spécifie quels utilizaires LDAP auront accès a l'instància %s.",
+ "Verify settings and count users" : "Verificar los paramètres e compter los utilizaires",
+ "Saving" : "Enregistrament...",
+ "Back" : "Retorn",
"Continue" : "Contunhar",
- "Advanced" : "Avançat"
+ "LDAP" : "LDAP",
+ "Expert" : "Expèrt",
+ "Advanced" : "Avançat",
+ "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Avertissement :</b> Les applications user_ldap e user_webdavauth son incompatibles. Des dysfoncionaments pòdon survenir. Contactez vòstre administrator sistèma per qu'il en désactive une.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atencion :</b> Lo module php LDAP es pas installat, per conséquent aquesta extension ne pourra fonctionner. Contactatz vòstre administrator sistèma afin qu'il l'installe.",
+ "Connection Settings" : "Paramètres de connexion",
+ "Configuration Active" : "Configuracion active",
+ "When unchecked, this configuration will be skipped." : "Quand non cochée, la configuracion serà ignorada.",
+ "Backup (Replica) Host" : "Servidor de backup (replica)",
+ "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Fournir un servidor de backup opcional. Il deu s'agir d'una replica del servidor LDAP/AD principal.",
+ "Backup (Replica) Port" : "Pòrt del servidor de backup (replica)",
+ "Disable Main Server" : "Desactivar lo servidor principal",
+ "Only connect to the replica server." : "Se connecter unicament a la replica",
+ "Turn off SSL certificate validation." : "Desactivar la validacion des certificats SSL",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recomandat, a utiliser a des fins de tests unicament. Se la connexion ne fonctionne qu'amb aquesta option, importez lo certificat SSL del servidor LDAP dins lo servidor %s.",
+ "Cache Time-To-Live" : "Durada de vie de l'escondedor (TTL)",
+ "in seconds. A change empties the cache." : "en segondas. Tot cambiament vide l'escondedor.",
+ "Directory Settings" : "Paramètres del repertòri",
+ "User Display Name Field" : "Camp \"nom d'afichatge\" de l'utilizaire",
+ "The LDAP attribute to use to generate the user's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge de l'utilizaire.",
+ "Base User Tree" : "DN raiç de l'arbre utilizaires",
+ "One User Base DN per line" : "Un DN de base utilizaire per linha",
+ "User Search Attributes" : "Atributs de recèrca utilizaires",
+ "Optional; one attribute per line" : "Opcional, un atribut per linha",
+ "Group Display Name Field" : "Camp \"nom d'afichatge\" del grop",
+ "The LDAP attribute to use to generate the groups's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge del grop.",
+ "Base Group Tree" : "DN raiç de l'arbre gropes",
+ "One Group Base DN per line" : "Un DN de base grop per linha",
+ "Group Search Attributes" : "Atributs de recèrca des gropes",
+ "Group-Member association" : "Association grop-membre",
+ "Nested Groups" : "Gropes imbriqués",
+ "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se activat, los gropes contenant d'autres gropes son pris en charge (fonctionne unicament se l'atribut membre del grop conten des DNs).",
+ "Paging chunksize" : "Paging chunksize",
+ "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilizada per les recherches LDAP paginées qui pòdon retourner des résultats per lots coma una énumération d'utilizaires o de gropes. (Configurar a 0 per desactivar les recherches LDAP paginées)",
+ "Special Attributes" : "Atributs spéciaux",
+ "Quota Field" : "Camp del quota",
+ "Quota Default" : "Quota per defaut",
+ "in bytes" : "en octets",
+ "Email Field" : "Camp Email",
+ "User Home Folder Naming Rule" : "Règla de nommage del repertòri utilizaire",
+ "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide per user name (defaut). Podètz tanben especificar un atribut LDAP / AD.",
+ "Internal Username" : "Nom d'utilizaire 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." : "Per defaut lo nom d'utilizaire interne serà créé a partir de l'atribut UUID. Ceci permet d'assurer que lo nom d'utilizaire es unique e que les caractèrs ne nécessitent pas de conversion. Lo nom d'utilizaire interne deu contenir unicament les caractèrs seguents : [ a-zA-Z0-9_.@- ]. Les autres caractèrs son remplacés per lor correspondance ASCII o simplement omis. En cas de collision, un nombre es ajouté/incrémenté. Lo nom d'utilizaire interne es utilizat per identifier l'utilizaire al sein del sistèma. C'est tanben lo nom per defaut del repertòri utilizaire dins ownCloud. Il fait tanben partie de certains URL de services, per exemple per tous les services *DAV. Lo comportement per defaut pòt èsser modificat a l'aide de ce paramètre. Per obtenir un comportement similaire aux versions precedentas a ownCloud 5, saisir lo nom d'utilizaire a afichar dins lo camp seguent. Laisser a blanc per lo comportement per defaut. Les modifications prendront effet solament per les nouveaux (ajoutés) utilizaires LDAP.",
+ "Internal Username Attribute:" : "Nom d'utilizaire interne :",
+ "Override UUID detection" : "Passer outre la détection des UUID",
+ "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defaut, l'atribut UUID es automaticament detectat. Aqueste attribut es utilizat per identifier los utilizaires e gropes de façon fiable. Un nom d'utilizaire interne basé sus l'UUID serà automaticament créé, sauf s'il es especificat autrement çaisús. Podètz modificar ce comportement e définir l'atribut de votre choix. Vos cal alors vous assurer que l'atribut de votre choix pòt èsser recuperat per los utilizaires ainsi que per los gropes e qu'il soit unique. Laisser a blanc per lo comportement per defaut. Les modifications seront effectives unicament per les nouveaux (ajoutés) utilizaires e gropes LDAP.",
+ "UUID Attribute for Users:" : "Atribut UUID per les Utilizaires :",
+ "UUID Attribute for Groups:" : "Atribut UUID per los Gropes :",
+ "Username-LDAP User Mapping" : "Association Nom d'utilizaire-Utilizaire LDAP",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Les noms d'utilizaires son utilizats per lo stockage e l'assignation de (meta) donadas. Per identifier e reconéisser précisément los utilizaires, cada utilizaire LDAP aura un nom interne spécifique. Cela requerís l'associacion d'un nom d'utilizaire ownCloud a un nom d'utilizaire LDAP. Lo nom d'utilizaire créé es associat a l'atribut UUID de l'utilizaire LDAP. Per ailleurs, lo DN es mémorisé en cache per limiter les interactions LDAP mas il es pas utilizat per l'identification. Se lo DN es modificat, ces modifications seront retrobadas. Seul lo nom interne a ownCloud es utilizat al sein del produit. Suprimir les associations creara des orphelins e l'action affectera totas les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mas unicament sus des environaments de tests e d'expérimentations.",
+ "Clear Username-LDAP User Mapping" : "Suprimir l'associacion utilizaire interne-utilizaire LDAP",
+ "Clear Groupname-LDAP Group Mapping" : "Suprimir l'associacion nom de grop-grop LDAP"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/user_ldap/l10n/oc.json b/apps/user_ldap/l10n/oc.json
index dc6fb8b6270..e39a43a6594 100644
--- a/apps/user_ldap/l10n/oc.json
+++ b/apps/user_ldap/l10n/oc.json
@@ -1,12 +1,156 @@
{ "translations": {
+ "Failed to clear the mappings." : "Error al moment de la supression de las associacions.",
+ "Failed to delete the server configuration" : "Fracàs de la supression de la configuracion del servidor",
+ "The configuration is invalid: anonymous bind is not allowed." : "La configuracion es pas valida : lo ligam anonim es pas autorizat.",
+ "The configuration is valid and the connection could be established!" : "La configuracion es valida e la connexion pòt èsser establida !",
+ "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuracion es valable, mas lo bind a fracassat. Verificatz los paramètres del servidor ainsi que vos identificants de connexion.",
+ "The configuration is invalid. Please have a look at the logs for further details." : "La configuracion es pas valable. Consultatz les logs per mai de detalhs.",
+ "No action specified" : "Aucune action especificada",
+ "No configuration specified" : "Aucune configuration especificada",
+ "No data specified" : "Aucune donada especificada",
+ " Could not set configuration %s" : "Impossible de especificar la configuracion %s",
+ "Action does not exist" : "L'action n'existe pas",
+ "The Base DN appears to be wrong" : "Lo DN de base es erroné",
+ "Configuration incorrect" : "Configuracion incorrecte",
+ "Configuration incomplete" : "Configuracion incomplète",
+ "Configuration OK" : "Configuracion OK",
+ "Select groups" : "Seleccionnez los gropes",
+ "Select object classes" : "Seleccionar les classes d'objècte",
+ "Please check the credentials, they seem to be wrong." : "Verificatz vos informations d'identification",
+ "Please specify the port, it could not be auto-detected." : "Veuillez especificar lo pòrt, il n'a pu èsser detectat automaticament",
+ "Base DN could not be auto-detected, please revise credentials, host and port." : "Lo DN de base n'a pu èsser detectat automaticament. Verificatz les informations d'identification, l'hôte e lo pòrt.",
+ "Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de base, veuillez lo especificar manualament",
+ "{nthServer}. Server" : "{nthServer}. Servidor",
+ "No object found in the given Base DN. Please revise." : "Aucun objècte trobat dins lo DN de base especificat. Veuillez lo verificar.",
+ "More than 1.000 directory entries available." : "I a plus de 1000 entradas de repertòri disponibles.",
+ " entries available within the provided Base DN" : "entradas disponibles dins lo DN de base especificat",
+ "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error es survenue. Verificatz lo DN de base, ainsi que los paramètres de connexion e les informations d'identification",
+ "Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?",
+ "Confirm Deletion" : "Confirmer la supression",
+ "Mappings cleared successfully!" : "Associations suprimidas amb succès !",
+ "Error while clearing the mappings." : "Error al moment de la supression des associations.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "Lo ligam anonim es pas autorizat. Mercé de provesir lo DN d'un utilizaire e un senhal.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "Error LDAP. La connexion anonyme al servidor n'est probablement pas acceptada.",
+ "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "La salvament a fracassat. Verificatz que la banca de donadas es opérationnelle. Rechargez avant de contunhar.",
+ "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Changer de mode activera las requèstas LDAP automatiques. Selon la taille de votre annuaire LDAP, cela pòt prendre del temps. Volètz toujours changer de mode ?",
+ "Mode switch" : "Changer de mode",
+ "Select attributes" : "Seleccionar los atributs",
+ "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilizaire introuvable. Verificatz los atributs de login e lo nom d'utilizaire. Filtre effectif (à copier-coller per valider en ligne de commande):<br/>",
+ "User found and settings verified." : "Utilizaire trobat e paramètres verificats.",
+ "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Paramètres verificats, mas seul lo premier utilizaire pourra se connecter. Utilizatz plutôt un filtre mens restrictif.",
+ "An unspecified error occurred. Please check the settings and the log." : "Una error desconeguda s'es produsida. Verificatz los paramètres e lo log.",
+ "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Lo filtre de recèrca es pas valide, probablement a cause de problèmas de syntaxe tels que des parenthèses manquantes. Veuillez lo corriger.",
+ "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Una error s'es produsida al moment de la connexion al LDAP / AD. Verificatz l'hôte, lo pòrt e les informations d'identification.",
+ "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La chaîne %uid es manquante. Aquesta chaîne es remplacée per l'identificant de connexion al moment des requèstas LDAP / AD.",
+ "Please provide a login name to test against" : "Veuillez indiquer un identificant de connexion amb lequel tester.",
+ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Los gropes son desactivats perque lo servidor LDAP / AD pren pas en carga memberOf.",
+ "_%s group found_::_%s groups found_" : ["%s grop trobat","%s gropes trobats"],
+ "_%s user found_::_%s users found_" : ["%s utilizaire trobat","%s utilizaires trobats"],
+ "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de detectar l'atribut que conten lo nom d'afichatge des utilizaires. Indicatz-lo vos-meteis dins los paramètres ldap avançats.",
+ "Could not find the desired feature" : "Impossible de trobar la foncion desirada",
+ "Invalid Host" : "Òste invalid",
"Server" : "Servidor",
- "Users" : "Usancièrs",
- "Groups" : "Grops",
+ "Users" : "Utilizaires",
+ "Login Attributes" : "Atributs de login",
+ "Groups" : "Gropes",
+ "Test Configuration" : "Testar la configuracion",
"Help" : "Ajuda",
+ "Groups meeting these criteria are available in %s:" : "Los gropes que respèctan aquestes critèris son disponibles dins %s :",
+ "Only these object classes:" : "Solament aquestas classes d'objèctes :",
+ "Only from these groups:" : "Solament dins aquestes gropes :",
+ "Search groups" : "Cercar dins los gropes",
+ "Available groups" : "Gropes disponibles",
+ "Selected groups" : "Gropes seleccionats",
+ "Edit LDAP Query" : "Modificar la requèsta LDAP",
+ "LDAP Filter:" : "Filtre LDAP :",
+ "The filter specifies which LDAP groups shall have access to the %s instance." : "Lo filtre spécifie quels gropes LDAP ont accès a l'instància %s.",
+ "Verify settings and count groups" : "Verificar los paramètres e compter los gropes",
+ "When logging in, %s will find the user based on the following attributes:" : "Au login, %s cercarà l'utilizaire sus base de ces attributs :",
+ "LDAP / AD Username:" : "Nom d'utilizaire LDAP / AD :",
+ "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Autorizar lo login amb lo nom d'utilizaire LDAP / AD (uid o samaccountname, la détection es automatique). ",
+ "LDAP / AD Email Address:" : "Adresse mail LDAP / AD :",
+ "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Autorizar lo login amb una adreça mail. Mail e mailPrimaryAddress son autorizats.",
+ "Other Attributes:" : "Autres attributs :",
+ "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit lo filtre a aplicar al moment d'una tentative de connexion. %%uid remplace lo nom d'utilizaire. Exemple : \"uid=%%uid\"",
+ "Test Loginname" : "Loginname de tèst",
+ "Verify settings" : "Testar los paramètres",
+ "1. Server" : "1. Servidor",
+ "%s. Server:" : "%s. Servidor :",
+ "Add a new and blank configuration" : "Apondre una novèla configuracion verge",
+ "Copy current configuration into new directory binding" : "Copiar la configuracion actuala cap a una novèla",
+ "Delete the current configuration" : "Suprimir la configuracion actuala",
"Host" : "Òste",
+ "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Podètz omettre lo protocòl, levat se avètz besonh de SSL. Dins aqueste cas, prefixatz amb ldaps://",
"Port" : "Pòrt",
+ "Detect Port" : "Detectar lo pòrt",
+ "User DN" : "DN Utilizaire",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilizaire client per lequel la liaison deu se faire, per exemple uid=agent,dc=example,dc=com. Per un accès anonyme, laisser lo DN e lo senhal vides.",
"Password" : "Senhal",
+ "For anonymous access, leave DN and Password empty." : "Per un accès anonyme, laisser lo DN utilizaire e lo senhal vides.",
+ "One Base DN per line" : "Un DN de base per linha",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Podètz especificar les DN de base de vos utilizaires e gropes via l'onglet Avançat",
+ "Detect Base DN" : "Detectar lo DN de base",
+ "Test Base DN" : "Testar lo DN de base",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Évite las requèstas LDAP automaticas. Mieux per las installacions de grande ampleur, mas demande des coneissenças en LDAP.",
+ "Manually enter LDAP filters (recommended for large directories)" : "Sasir los filtres LDAP manualament (recomandat per les annuaires de grande ampleur)",
+ "Limit %s access to users meeting these criteria:" : "Limiter l'accès a %s als utilizaires respectant ces critèris :",
+ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Les classes d'objèctes fréquentes per los utilizaires son : organizationalPerson, person, user e inetOrgPerson. Se sètz pas segur de la classe a utiliser, demandez a l'administrator de l'annuaire.",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "Lo filtre spécifie quels utilizaires LDAP auront accès a l'instància %s.",
+ "Verify settings and count users" : "Verificar los paramètres e compter los utilizaires",
+ "Saving" : "Enregistrament...",
+ "Back" : "Retorn",
"Continue" : "Contunhar",
- "Advanced" : "Avançat"
+ "LDAP" : "LDAP",
+ "Expert" : "Expèrt",
+ "Advanced" : "Avançat",
+ "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Avertissement :</b> Les applications user_ldap e user_webdavauth son incompatibles. Des dysfoncionaments pòdon survenir. Contactez vòstre administrator sistèma per qu'il en désactive une.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atencion :</b> Lo module php LDAP es pas installat, per conséquent aquesta extension ne pourra fonctionner. Contactatz vòstre administrator sistèma afin qu'il l'installe.",
+ "Connection Settings" : "Paramètres de connexion",
+ "Configuration Active" : "Configuracion active",
+ "When unchecked, this configuration will be skipped." : "Quand non cochée, la configuracion serà ignorada.",
+ "Backup (Replica) Host" : "Servidor de backup (replica)",
+ "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Fournir un servidor de backup opcional. Il deu s'agir d'una replica del servidor LDAP/AD principal.",
+ "Backup (Replica) Port" : "Pòrt del servidor de backup (replica)",
+ "Disable Main Server" : "Desactivar lo servidor principal",
+ "Only connect to the replica server." : "Se connecter unicament a la replica",
+ "Turn off SSL certificate validation." : "Desactivar la validacion des certificats SSL",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recomandat, a utiliser a des fins de tests unicament. Se la connexion ne fonctionne qu'amb aquesta option, importez lo certificat SSL del servidor LDAP dins lo servidor %s.",
+ "Cache Time-To-Live" : "Durada de vie de l'escondedor (TTL)",
+ "in seconds. A change empties the cache." : "en segondas. Tot cambiament vide l'escondedor.",
+ "Directory Settings" : "Paramètres del repertòri",
+ "User Display Name Field" : "Camp \"nom d'afichatge\" de l'utilizaire",
+ "The LDAP attribute to use to generate the user's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge de l'utilizaire.",
+ "Base User Tree" : "DN raiç de l'arbre utilizaires",
+ "One User Base DN per line" : "Un DN de base utilizaire per linha",
+ "User Search Attributes" : "Atributs de recèrca utilizaires",
+ "Optional; one attribute per line" : "Opcional, un atribut per linha",
+ "Group Display Name Field" : "Camp \"nom d'afichatge\" del grop",
+ "The LDAP attribute to use to generate the groups's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge del grop.",
+ "Base Group Tree" : "DN raiç de l'arbre gropes",
+ "One Group Base DN per line" : "Un DN de base grop per linha",
+ "Group Search Attributes" : "Atributs de recèrca des gropes",
+ "Group-Member association" : "Association grop-membre",
+ "Nested Groups" : "Gropes imbriqués",
+ "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se activat, los gropes contenant d'autres gropes son pris en charge (fonctionne unicament se l'atribut membre del grop conten des DNs).",
+ "Paging chunksize" : "Paging chunksize",
+ "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilizada per les recherches LDAP paginées qui pòdon retourner des résultats per lots coma una énumération d'utilizaires o de gropes. (Configurar a 0 per desactivar les recherches LDAP paginées)",
+ "Special Attributes" : "Atributs spéciaux",
+ "Quota Field" : "Camp del quota",
+ "Quota Default" : "Quota per defaut",
+ "in bytes" : "en octets",
+ "Email Field" : "Camp Email",
+ "User Home Folder Naming Rule" : "Règla de nommage del repertòri utilizaire",
+ "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide per user name (defaut). Podètz tanben especificar un atribut LDAP / AD.",
+ "Internal Username" : "Nom d'utilizaire 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." : "Per defaut lo nom d'utilizaire interne serà créé a partir de l'atribut UUID. Ceci permet d'assurer que lo nom d'utilizaire es unique e que les caractèrs ne nécessitent pas de conversion. Lo nom d'utilizaire interne deu contenir unicament les caractèrs seguents : [ a-zA-Z0-9_.@- ]. Les autres caractèrs son remplacés per lor correspondance ASCII o simplement omis. En cas de collision, un nombre es ajouté/incrémenté. Lo nom d'utilizaire interne es utilizat per identifier l'utilizaire al sein del sistèma. C'est tanben lo nom per defaut del repertòri utilizaire dins ownCloud. Il fait tanben partie de certains URL de services, per exemple per tous les services *DAV. Lo comportement per defaut pòt èsser modificat a l'aide de ce paramètre. Per obtenir un comportement similaire aux versions precedentas a ownCloud 5, saisir lo nom d'utilizaire a afichar dins lo camp seguent. Laisser a blanc per lo comportement per defaut. Les modifications prendront effet solament per les nouveaux (ajoutés) utilizaires LDAP.",
+ "Internal Username Attribute:" : "Nom d'utilizaire interne :",
+ "Override UUID detection" : "Passer outre la détection des UUID",
+ "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defaut, l'atribut UUID es automaticament detectat. Aqueste attribut es utilizat per identifier los utilizaires e gropes de façon fiable. Un nom d'utilizaire interne basé sus l'UUID serà automaticament créé, sauf s'il es especificat autrement çaisús. Podètz modificar ce comportement e définir l'atribut de votre choix. Vos cal alors vous assurer que l'atribut de votre choix pòt èsser recuperat per los utilizaires ainsi que per los gropes e qu'il soit unique. Laisser a blanc per lo comportement per defaut. Les modifications seront effectives unicament per les nouveaux (ajoutés) utilizaires e gropes LDAP.",
+ "UUID Attribute for Users:" : "Atribut UUID per les Utilizaires :",
+ "UUID Attribute for Groups:" : "Atribut UUID per los Gropes :",
+ "Username-LDAP User Mapping" : "Association Nom d'utilizaire-Utilizaire LDAP",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Les noms d'utilizaires son utilizats per lo stockage e l'assignation de (meta) donadas. Per identifier e reconéisser précisément los utilizaires, cada utilizaire LDAP aura un nom interne spécifique. Cela requerís l'associacion d'un nom d'utilizaire ownCloud a un nom d'utilizaire LDAP. Lo nom d'utilizaire créé es associat a l'atribut UUID de l'utilizaire LDAP. Per ailleurs, lo DN es mémorisé en cache per limiter les interactions LDAP mas il es pas utilizat per l'identification. Se lo DN es modificat, ces modifications seront retrobadas. Seul lo nom interne a ownCloud es utilizat al sein del produit. Suprimir les associations creara des orphelins e l'action affectera totas les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mas unicament sus des environaments de tests e d'expérimentations.",
+ "Clear Username-LDAP User Mapping" : "Suprimir l'associacion utilizaire interne-utilizaire LDAP",
+ "Clear Groupname-LDAP Group Mapping" : "Suprimir l'associacion nom de grop-grop LDAP"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/user_ldap/l10n/zh_CN.js b/apps/user_ldap/l10n/zh_CN.js
index 15d0154921b..eae37fb3a19 100644
--- a/apps/user_ldap/l10n/zh_CN.js
+++ b/apps/user_ldap/l10n/zh_CN.js
@@ -3,9 +3,21 @@ OC.L10N.register(
{
"Failed to clear the mappings." : "清除映射失败。",
"Failed to delete the server configuration" : "未能删除服务器配置",
+ "The configuration is invalid: anonymous bind is not allowed." : "配置无效:不允许匿名绑定。",
"The configuration is valid and the connection could be established!" : "配置有效,能够建立连接!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "配置有效但绑定失败。请检查服务器设置和认证信息。",
+ "The configuration is invalid. Please have a look at the logs for further details." : "配置无效。更多细节请查看 ownCloud 日志。",
+ "No action specified" : "未指定操作",
+ "No configuration specified" : "未指定配置文件",
+ "No data specified" : "未指定数据",
+ " Could not set configuration %s" : " 无法设定配置文件 %s",
+ "Action does not exist" : "操作不存在",
+ "The Base DN appears to be wrong" : "Base DN似乎错了",
+ "Configuration incorrect" : "配置错误",
+ "Configuration incomplete" : "配置未完成",
+ "Configuration OK" : "配置完成",
"Select groups" : "选择分组",
+ "Could not detect Base DN, please enter it manually." : "无法探测Base DN,请手动输入。",
"Do you really want to delete the current Server Configuration?" : "您真的想要删除当前服务器配置吗?",
"Confirm Deletion" : "确认删除",
"Invalid Host" : "无效的主机",
diff --git a/apps/user_ldap/l10n/zh_CN.json b/apps/user_ldap/l10n/zh_CN.json
index 18c87aa6c6f..8234f24247d 100644
--- a/apps/user_ldap/l10n/zh_CN.json
+++ b/apps/user_ldap/l10n/zh_CN.json
@@ -1,9 +1,21 @@
{ "translations": {
"Failed to clear the mappings." : "清除映射失败。",
"Failed to delete the server configuration" : "未能删除服务器配置",
+ "The configuration is invalid: anonymous bind is not allowed." : "配置无效:不允许匿名绑定。",
"The configuration is valid and the connection could be established!" : "配置有效,能够建立连接!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "配置有效但绑定失败。请检查服务器设置和认证信息。",
+ "The configuration is invalid. Please have a look at the logs for further details." : "配置无效。更多细节请查看 ownCloud 日志。",
+ "No action specified" : "未指定操作",
+ "No configuration specified" : "未指定配置文件",
+ "No data specified" : "未指定数据",
+ " Could not set configuration %s" : " 无法设定配置文件 %s",
+ "Action does not exist" : "操作不存在",
+ "The Base DN appears to be wrong" : "Base DN似乎错了",
+ "Configuration incorrect" : "配置错误",
+ "Configuration incomplete" : "配置未完成",
+ "Configuration OK" : "配置完成",
"Select groups" : "选择分组",
+ "Could not detect Base DN, please enter it manually." : "无法探测Base DN,请手动输入。",
"Do you really want to delete the current Server Configuration?" : "您真的想要删除当前服务器配置吗?",
"Confirm Deletion" : "确认删除",
"Invalid Host" : "无效的主机",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index a2eb834b496..2a605a2a0f0 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -215,7 +215,9 @@ class Access extends LDAPUtility implements user\IUserTools {
$resemblingAttributes = array(
'dn',
'uniquemember',
- 'member'
+ 'member',
+ // memberOf is an "operational" attribute, without a definition in any RFC
+ 'memberof'
);
return in_array($attr, $resemblingAttributes);
}
@@ -537,6 +539,16 @@ class Access extends LDAPUtility implements user\IUserTools {
}
/**
+ * caches the user display name
+ * @param string $ocName the internal ownCloud username
+ * @param string|false $home the home directory path
+ */
+ public function cacheUserHome($ocName, $home) {
+ $cacheKey = 'getHome'.$ocName;
+ $this->connection->writeToCache($cacheKey, $home);
+ }
+
+ /**
* caches a user as existing
* @param string $ocName the internal ownCloud username
*/
@@ -656,7 +668,24 @@ class Access extends LDAPUtility implements user\IUserTools {
* @return array
*/
public function fetchListOfUsers($filter, $attr, $limit = null, $offset = null) {
- return $this->fetchList($this->searchUsers($filter, $attr, $limit, $offset), (count($attr) > 1));
+ $ldapRecords = $this->searchUsers($filter, $attr, $limit, $offset);
+ $this->batchApplyUserAttributes($ldapRecords);
+ return $this->fetchList($ldapRecords, (count($attr) > 1));
+ }
+
+ /**
+ * provided with an array of LDAP user records the method will fetch the
+ * user object and requests it to process the freshly fetched attributes and
+ * and their values
+ * @param array $ldapRecords
+ */
+ public function batchApplyUserAttributes(array $ldapRecords){
+ foreach($ldapRecords as $userRecord) {
+ $ocName = $this->dn2ocname($userRecord['dn'], $userRecord[$this->connection->ldapUserDisplayName]);
+ $this->cacheUserExists($ocName);
+ $user = $this->userManager->get($ocName);
+ $user->processAttributes($userRecord);
+ }
}
/**
diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php
index b70e057741f..86f0b8991d7 100644
--- a/apps/user_ldap/lib/user/manager.php
+++ b/apps/user_ldap/lib/user/manager.php
@@ -127,6 +127,43 @@ class Manager {
}
/**
+ * returns a list of attributes that will be processed further, e.g. quota,
+ * email, displayname, or others.
+ * @param bool $minimal - optional, set to true to skip attributes with big
+ * payload
+ * @return string[]
+ */
+ public function getAttributes($minimal = false) {
+ $attributes = array('dn', 'uid', 'samaccountname', 'memberof');
+ $possible = array(
+ $this->access->getConnection()->ldapQuotaAttribute,
+ $this->access->getConnection()->ldapEmailAttribute,
+ $this->access->getConnection()->ldapUserDisplayName,
+ );
+ foreach($possible as $attr) {
+ if(!is_null($attr)) {
+ $attributes[] = $attr;
+ }
+ }
+
+ $homeRule = $this->access->getConnection()->homeFolderNamingRule;
+ if(strpos($homeRule, 'attr:') === 0) {
+ $attributes[] = substr($homeRule, strlen('attr:'));
+ }
+
+ if(!$minimal) {
+ // attributes that are not really important but may come with big
+ // payload.
+ $attributes = array_merge($attributes, array(
+ 'jpegphoto',
+ 'thumbnailphoto'
+ ));
+ }
+
+ return $attributes;
+ }
+
+ /**
* Checks whether the specified user is marked as deleted
* @param string $id the ownCloud user name
* @return bool
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
index ac5d8f5a374..6498cdf913f 100644
--- a/apps/user_ldap/lib/user/user.php
+++ b/apps/user_ldap/lib/user/user.php
@@ -139,6 +139,69 @@ class User {
}
/**
+ * processes results from LDAP for attributes as returned by getAttributesToRead()
+ * @param array $ldapEntry the user entry as retrieved from LDAP
+ */
+ public function processAttributes($ldapEntry) {
+ $this->markRefreshTime();
+ //Quota
+ $attr = strtolower($this->connection->ldapQuotaAttribute);
+ if(isset($ldapEntry[$attr])) {
+ $this->updateQuota($ldapEntry[$attr]);
+ }
+ unset($attr);
+
+ //Email
+ $attr = strtolower($this->connection->ldapEmailAttribute);
+ if(isset($ldapEntry[$attr])) {
+ $this->updateEmail($ldapEntry[$attr]);
+ }
+ unset($attr);
+
+ //displayName
+ $attr = strtolower($this->connection->ldapUserDisplayName);
+ if(isset($ldapEntry[$attr])) {
+ $displayName = $ldapEntry[$attr];
+ if(!empty($displayName)) {
+ $this->storeDisplayName($displayName);
+ $this->access->cacheUserDisplayName($this->getUsername(), $displayName);
+ }
+ }
+ unset($attr);
+
+ // LDAP Username, needed for s2s sharing
+ if(isset($ldapEntry['uid'])) {
+ $this->storeLDAPUserName($ldapEntry['uid']);
+ } else if(isset($ldapEntry['samaccountname'])) {
+ $this->storeLDAPUserName($ldapEntry['samaccountname']);
+ }
+ //homePath
+ if(strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) {
+ $attr = strtolower(substr($this->connection->homeFolderNamingRule, strlen('attr:')));
+ if(isset($ldapEntry[$attr])) {
+ $this->access->cacheUserHome(
+ $this->getUsername(), $this->getHomePath($ldapEntry[$attr]));
+ }
+ }
+ //memberOf groups
+ $cacheKey = 'getMemberOf'.$this->getUsername();
+ $groups = false;
+ if(isset($ldapEntry['memberof'])) {
+ $groups = $ldapEntry['memberof'];
+ }
+ $this->connection->writeToCache($cacheKey, $groups);
+ //Avatar
+ $attrs = array('jpegphoto', 'thumbnailphoto');
+ foreach ($attrs as $attr) {
+ if(isset($ldapEntry[$attr])) {
+ $this->avatarImage = $ldapEntry[$attr];
+ $this->updateAvatar();
+ break;
+ }
+ }
+ }
+
+ /**
* @brief returns the LDAP DN of the user
* @return string
*/
@@ -155,6 +218,68 @@ class User {
}
/**
+ * returns the home directory of the user if specified by LDAP settings
+ * @param string $valueFromLDAP
+ * @return bool|string
+ * @throws \Exception
+ */
+ public function getHomePath($valueFromLDAP = null) {
+ $path = $valueFromLDAP;
+ $attr = null;
+
+ if( is_null($path)
+ && strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0
+ && $this->access->connection->homeFolderNamingRule !== 'attr:')
+ {
+ $attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:'));
+ $homedir = $this->access->readAttribute(
+ $this->access->username2dn($this->getUsername()), $attr);
+ if ($homedir && isset($homedir[0])) {
+ $path = $homedir[0];
+ }
+ }
+
+ if(!empty($path)) {
+ //if attribute's value is an absolute path take this, otherwise append it to data dir
+ //check for / at the beginning or pattern c:\ resp. c:/
+ if( '/' !== $path[0]
+ && !(3 < strlen($path) && ctype_alpha($path[0])
+ && $path[1] === ':' && ('\\' === $path[2] || '/' === $path[2]))
+ ) {
+ $path = $this->config->getSystemValue('datadirectory',
+ \OC::$SERVERROOT.'/data' ) . '/' . $path;
+ }
+ //we need it to store it in the DB as well in case a user gets
+ //deleted so we can clean up afterwards
+ $this->config->setUserValue(
+ $this->getUsername(), 'user_ldap', 'homePath', $path
+ );
+ return $path;
+ }
+
+ if( !is_null($attr)
+ && $this->config->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', true)
+ ) {
+ // a naming rule attribute is defined, but it doesn't exist for that LDAP user
+ throw new \Exception('Home dir attribute can\'t be read from LDAP for uid: ' . $this->getUsername());
+ }
+
+ //false will apply default behaviour as defined and done by OC_User
+ $this->config->setUserValue($this->getUsername(), 'user_ldap', 'homePath', '');
+ return false;
+ }
+
+ public function getMemberOfGroups() {
+ $cacheKey = 'getMemberOf'.$this->getUsername();
+ if($this->connection->isCached($cacheKey)) {
+ return $this->connection->getFromCache($cacheKey);
+ }
+ $groupDNs = $this->access->readAttribute($this->getDN(), 'memberOf');
+ $this->connection->writeToCache($cacheKey, $groupDNs);
+ return $groupDNs;
+ }
+
+ /**
* @brief reads the image from LDAP that shall be used as Avatar
* @return string data (provided by LDAP) | false
*/
@@ -189,7 +314,7 @@ class User {
* @brief marks the time when user features like email have been updated
* @return null
*/
- private function markRefreshTime() {
+ public function markRefreshTime() {
$this->config->setUserValue(
$this->uid, 'user_ldap', self::USER_PREFKEY_LASTREFRESH, time());
}
@@ -252,48 +377,52 @@ class User {
}
/**
- * @brief fetches the email from LDAP and stores it as ownCloud user value
+ * fetches the email from LDAP and stores it as ownCloud user value
+ * @param string $valueFromLDAP if known, to save an LDAP read request
* @return null
*/
- public function updateEmail() {
+ public function updateEmail($valueFromLDAP = null) {
if($this->wasRefreshed('email')) {
return;
}
-
- $email = null;
- $emailAttribute = $this->connection->ldapEmailAttribute;
- if(!empty($emailAttribute)) {
- $aEmail = $this->access->readAttribute($this->dn, $emailAttribute);
- if($aEmail && (count($aEmail) > 0)) {
- $email = $aEmail[0];
- }
- if(!is_null($email)) {
- $this->config->setUserValue(
- $this->uid, 'settings', 'email', $email);
+ $email = $valueFromLDAP;
+ if(is_null($valueFromLDAP)) {
+ $emailAttribute = $this->connection->ldapEmailAttribute;
+ if(!empty($emailAttribute)) {
+ $aEmail = $this->access->readAttribute($this->dn, $emailAttribute);
+ if(is_array($aEmail) && (count($aEmail) > 0)) {
+ $email = $aEmail[0];
+ }
}
}
+ if(!is_null($email)) {
+ $this->config->setUserValue(
+ $this->uid, 'settings', 'email', $email);
+ }
}
/**
- * @brief fetches the quota from LDAP and stores it as ownCloud user value
+ * fetches the quota from LDAP and stores it as ownCloud user value
+ * @param string $valueFromLDAP the quota attribute's value can be passed,
+ * to save the readAttribute request
* @return null
*/
- public function updateQuota() {
+ public function updateQuota($valueFromLDAP = null) {
if($this->wasRefreshed('quota')) {
return;
}
-
- $quota = null;
+ //can be null
$quotaDefault = $this->connection->ldapQuotaDefault;
- $quotaAttribute = $this->connection->ldapQuotaAttribute;
- if(!empty($quotaDefault)) {
- $quota = $quotaDefault;
- }
- if(!empty($quotaAttribute)) {
- $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute);
-
- if($aQuota && (count($aQuota) > 0)) {
- $quota = $aQuota[0];
+ $quota = !is_null($valueFromLDAP)
+ ? $valueFromLDAP
+ : $quotaDefault !== '' ? $quotaDefault : null;
+ if(is_null($valueFromLDAP)) {
+ $quotaAttribute = $this->connection->ldapQuotaAttribute;
+ if(!empty($quotaAttribute)) {
+ $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute);
+ if($aQuota && (count($aQuota) > 0)) {
+ $quota = $aQuota[0];
+ }
}
}
if(!is_null($quota)) {
diff --git a/apps/user_ldap/templates/part.wizard-loginfilter.php b/apps/user_ldap/templates/part.wizard-loginfilter.php
index 8d9fccf24b8..a13931d9327 100644
--- a/apps/user_ldap/templates/part.wizard-loginfilter.php
+++ b/apps/user_ldap/templates/part.wizard-loginfilter.php
@@ -52,7 +52,7 @@
placeholder="<?php p($l->t('Test Loginname'));?>"
class="ldapVerifyInput"
title="Attempts to receive a DN for the given loginname and the current login filter"/>
- <button class="ldapVerifyLoginName" name="ldapTestLoginSettings" type="button">
+ <button class="ldapVerifyLoginName" name="ldapTestLoginSettings" type="button" disabled="disabled">
<?php p($l->t('Verify settings'));?>
</button>
</p>
diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php
index c4cd2036461..cb6dbf0cd5d 100644
--- a/apps/user_ldap/tests/access.php
+++ b/apps/user_ldap/tests/access.php
@@ -29,7 +29,7 @@ use \OCA\user_ldap\lib\Connection;
use \OCA\user_ldap\lib\ILDAPWrapper;
class Test_Access extends \Test\TestCase {
- private function getConnecterAndLdapMock() {
+ private function getConnectorAndLdapMock() {
static $conMethods;
static $accMethods;
static $umMethods;
@@ -56,7 +56,7 @@ class Test_Access extends \Test\TestCase {
}
public function testEscapeFilterPartValidChars() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$input = 'okay';
@@ -64,7 +64,7 @@ class Test_Access extends \Test\TestCase {
}
public function testEscapeFilterPartEscapeWildcard() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$input = '*';
@@ -73,7 +73,7 @@ class Test_Access extends \Test\TestCase {
}
public function testEscapeFilterPartEscapeWildcard2() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$input = 'foo*bar';
@@ -83,7 +83,7 @@ class Test_Access extends \Test\TestCase {
/** @dataProvider convertSID2StrSuccessData */
public function testConvertSID2StrSuccess(array $sidArray, $sidExpected) {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$sidBinary = implode('', $sidArray);
@@ -118,7 +118,7 @@ class Test_Access extends \Test\TestCase {
}
public function testConvertSID2StrInputError() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$sidIllegal = 'foobar';
@@ -128,7 +128,7 @@ class Test_Access extends \Test\TestCase {
}
public function testGetDomainDNFromDNSuccess() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$inputDN = 'uid=zaphod,cn=foobar,dc=my,dc=server,dc=com';
@@ -143,7 +143,7 @@ class Test_Access extends \Test\TestCase {
}
public function testGetDomainDNFromDNError() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$inputDN = 'foobar';
@@ -178,7 +178,7 @@ class Test_Access extends \Test\TestCase {
}
public function testStringResemblesDN() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$access = new Access($con, $lw, $um);
$cases = $this->getResemblesDNInputData();
@@ -199,7 +199,7 @@ class Test_Access extends \Test\TestCase {
}
public function testStringResemblesDNLDAPmod() {
- list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
$lw = new \OCA\user_ldap\lib\LDAP();
$access = new Access($con, $lw, $um);
@@ -213,4 +213,85 @@ class Test_Access extends \Test\TestCase {
$this->assertSame($case['expectedResult'], $access->stringResemblesDN($case['input']));
}
}
+
+ public function testCacheUserHome() {
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
+ $access = new Access($con, $lw, $um);
+
+ $con->expects($this->once())
+ ->method('writeToCache');
+
+ $access->cacheUserHome('foobar', '/foobars/path');
+ }
+
+ public function testBatchApplyUserAttributes() {
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
+ $access = new Access($con, $lw, $um);
+ $mapperMock = $this->getMockBuilder('\OCA\User_LDAP\Mapping\UserMapping')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $userMock = $this->getMockBuilder('\OCA\user_ldap\lib\user\User')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $access->setUserMapper($mapperMock);
+
+ $data = array(
+ array(
+ 'dn' => 'foobar',
+ $con->ldapUserDisplayName => 'barfoo'
+ ),
+ array(
+ 'dn' => 'foo',
+ $con->ldapUserDisplayName => 'bar'
+ ),
+ array(
+ 'dn' => 'raboof',
+ $con->ldapUserDisplayName => 'oofrab'
+ )
+ );
+
+ $userMock->expects($this->exactly(count($data)))
+ ->method('processAttributes');
+
+ $um->expects($this->exactly(count($data)))
+ ->method('get')
+ ->will($this->returnValue($userMock));
+
+ $access->batchApplyUserAttributes($data);
+ }
+
+ public function dNAttributeProvider() {
+ // corresponds to Access::resemblesDN()
+ return array(
+ 'dn' => array('dn'),
+ 'uniqueMember' => array('uniquemember'),
+ 'member' => array('member'),
+ 'memberOf' => array('memberof')
+ );
+ }
+
+ /**
+ * @dataProvider dNAttributeProvider
+ */
+ public function testSanitizeDN($attribute) {
+ list($lw, $con, $um) = $this->getConnectorAndLdapMock();
+
+
+ $dnFromServer = 'cn=Mixed Cases,ou=Are Sufficient To,ou=Test,dc=example,dc=org';
+
+ $lw->expects($this->any())
+ ->method('isResource')
+ ->will($this->returnValue(true));
+
+ $lw->expects($this->any())
+ ->method('getAttributes')
+ ->will($this->returnValue(array(
+ $attribute => array('count' => 1, $dnFromServer)
+ )));
+
+ $access = new Access($con, $lw, $um);
+ $values = $access->readAttribute('uid=whoever,dc=example,dc=org', $attribute);
+ $this->assertSame($values[0], strtolower($dnFromServer));
+ }
}
diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php
index 805238e7d37..7007afd5162 100644
--- a/apps/user_ldap/tests/group_ldap.php
+++ b/apps/user_ldap/tests/group_ldap.php
@@ -53,6 +53,10 @@ class Test_Group_Ldap extends \Test\TestCase {
$accMethods,
array($connector, $lw, $um));
+ $access->expects($this->any())
+ ->method('getConnection')
+ ->will($this->returnValue($connector));
+
return $access;
}
@@ -391,7 +395,7 @@ class Test_Group_Ldap extends \Test\TestCase {
$access->connection->hasPrimaryGroups = false;
- $access->expects($this->once())
+ $access->expects($this->any())
->method('username2dn')
->will($this->returnValue($dn));
diff --git a/apps/user_ldap/tests/user/manager.php b/apps/user_ldap/tests/user/manager.php
index d659323fc7f..98e48638d8b 100644
--- a/apps/user_ldap/tests/user/manager.php
+++ b/apps/user_ldap/tests/user/manager.php
@@ -37,6 +37,16 @@ class Test_User_Manager extends \Test\TestCase {
$image = $this->getMock('\OCP\Image');
$dbc = $this->getMock('\OCP\IDBConnection');
+ $connection = new \OCA\user_ldap\lib\Connection(
+ $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper'),
+ '',
+ null
+ );
+
+ $access->expects($this->any())
+ ->method('getConnection')
+ ->will($this->returnValue($connection));
+
return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc);
}
@@ -206,4 +216,36 @@ class Test_User_Manager extends \Test\TestCase {
$this->assertNull($user);
}
+ public function testGetAttributesAll() {
+ list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc);
+ $manager->setLdapAccess($access);
+
+ $connection = $access->getConnection();
+ $connection->setConfiguration(array('ldapEmailAttribute' => 'mail'));
+
+ $attributes = $manager->getAttributes();
+
+ $this->assertTrue(in_array('dn', $attributes));
+ $this->assertTrue(in_array($access->getConnection()->ldapEmailAttribute, $attributes));
+ $this->assertTrue(in_array('jpegphoto', $attributes));
+ $this->assertTrue(in_array('thumbnailphoto', $attributes));
+ }
+
+ public function testGetAttributesMinimal() {
+ list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc);
+ $manager->setLdapAccess($access);
+
+ $attributes = $manager->getAttributes(true);
+
+ $this->assertTrue(in_array('dn', $attributes));
+ $this->assertTrue(!in_array('jpegphoto', $attributes));
+ $this->assertTrue(!in_array('thumbnailphoto', $attributes));
+ }
+
}
diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php
index 80baafcb250..1c41eb71ec2 100644
--- a/apps/user_ldap/tests/user/user.php
+++ b/apps/user_ldap/tests/user/user.php
@@ -221,7 +221,7 @@ class Test_User_User extends \Test\TestCase {
$connection->expects($this->at(0))
->method('__get')
->with($this->equalTo('ldapQuotaDefault'))
- ->will($this->returnValue('23 GB'));
+ ->will($this->returnValue('25 GB'));
$connection->expects($this->at(1))
->method('__get')
@@ -242,7 +242,7 @@ class Test_User_User extends \Test\TestCase {
->with($this->equalTo('alice'),
$this->equalTo('files'),
$this->equalTo('quota'),
- $this->equalTo('23 GB'))
+ $this->equalTo('25 GB'))
->will($this->returnValue(true));
$uid = 'alice';
@@ -278,14 +278,14 @@ class Test_User_User extends \Test\TestCase {
->method('readAttribute')
->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
$this->equalTo('myquota'))
- ->will($this->returnValue(array('23 GB')));
+ ->will($this->returnValue(array('27 GB')));
$config->expects($this->once())
->method('setUserValue')
->with($this->equalTo('alice'),
$this->equalTo('files'),
$this->equalTo('quota'),
- $this->equalTo('23 GB'))
+ $this->equalTo('27 GB'))
->will($this->returnValue(true));
$uid = 'alice';
@@ -679,4 +679,164 @@ class Test_User_User extends \Test\TestCase {
//photo is returned
$photo = $user->getAvatarImage();
}
+
+ public function testProcessAttributes() {
+ list(, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc);
+
+ $uid = 'alice';
+ $dn = 'uid=alice';
+
+ $requiredMethods = array(
+ 'markRefreshTime',
+ 'updateQuota',
+ 'updateEmail',
+ 'storeDisplayName',
+ 'storeLDAPUserName',
+ 'getHomePath',
+ 'updateAvatar'
+ );
+
+ $userMock = $this->getMockBuilder('OCA\user_ldap\lib\user\User')
+ ->setConstructorArgs(array($uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr))
+ ->setMethods($requiredMethods)
+ ->getMock();
+
+ $connection->setConfiguration(array(
+ 'homeFolderNamingRule' => 'homeDirectory'
+ ));
+
+ $connection->expects($this->any())
+ ->method('__get')
+ //->will($this->returnArgument(0));
+ ->will($this->returnCallback(function($name) {
+ if($name === 'homeFolderNamingRule') {
+ return 'attr:homeDirectory';
+ }
+ return $name;
+ }));
+
+ $record = array(
+ strtolower($connection->ldapQuotaAttribute) => array('4096'),
+ strtolower($connection->ldapEmailAttribute) => array('alice@wonderland.org'),
+ strtolower($connection->ldapUserDisplayName) => array('Aaaaalice'),
+ 'uid' => array($uid),
+ 'homedirectory' => array('Alice\'s Folder'),
+ 'memberof' => array('cn=groupOne', 'cn=groupTwo'),
+ 'jpegphoto' => array('here be an image')
+ );
+
+ foreach($requiredMethods as $method) {
+ $userMock->expects($this->once())
+ ->method($method);
+ }
+
+ $userMock->processAttributes($record);
+ }
+
+ public function emptyHomeFolderAttributeValueProvider() {
+ return array(
+ 'empty' => array(''),
+ 'prefixOnly' => array('attr:'),
+ );
+ }
+
+ /**
+ * @dataProvider emptyHomeFolderAttributeValueProvider
+ */
+ public function testGetHomePathNotConfigured($attributeValue) {
+ list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc);
+
+ $connection->expects($this->any())
+ ->method('__get')
+ ->with($this->equalTo('homeFolderNamingRule'))
+ ->will($this->returnValue($attributeValue));
+
+ $access->expects($this->never())
+ ->method('readAttribute');
+
+ $config->expects($this->never())
+ ->method('getAppValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $path = $user->getHomePath();
+ $this->assertSame($path, false);
+ }
+
+ public function testGetHomePathConfiguredNotAvailableAllowed() {
+ list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc);
+
+ $connection->expects($this->any())
+ ->method('__get')
+ ->with($this->equalTo('homeFolderNamingRule'))
+ ->will($this->returnValue('attr:foobar'));
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->will($this->returnValue(false));
+
+ // asks for "enforce_home_folder_naming_rule"
+ $config->expects($this->once())
+ ->method('getAppValue')
+ ->will($this->returnValue(false));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $path = $user->getHomePath();
+
+ $this->assertSame($path, false);
+ }
+
+ /**
+ * @expectedException \Exception
+ */
+ public function testGetHomePathConfiguredNotAvailableNotAllowed() {
+ list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc);
+
+ $connection->expects($this->any())
+ ->method('__get')
+ ->with($this->equalTo('homeFolderNamingRule'))
+ ->will($this->returnValue('attr:foobar'));
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->will($this->returnValue(false));
+
+ // asks for "enforce_home_folder_naming_rule"
+ $config->expects($this->once())
+ ->method('getAppValue')
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->getHomePath();
+ }
}
diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php
index 2b99e1c2dc8..69a76c0b7ac 100644
--- a/apps/user_ldap/tests/user_ldap.php
+++ b/apps/user_ldap/tests/user_ldap.php
@@ -34,6 +34,7 @@ use \OCA\user_ldap\lib\ILDAPWrapper;
class Test_User_Ldap_Direct extends \Test\TestCase {
protected $backend;
protected $access;
+ protected $configMock;
protected function setUp() {
parent::setUp();
@@ -61,8 +62,9 @@ class Test_User_Ldap_Direct extends \Test\TestCase {
$conMethods,
array($lw, null, null));
+ $this->configMock = $this->getMock('\OCP\IConfig');
$um = new \OCA\user_ldap\lib\user\Manager(
- $this->getMock('\OCP\IConfig'),
+ $this->configMock,
$this->getMock('\OCA\user_ldap\lib\FilesystemHelper'),
$this->getMock('\OCA\user_ldap\lib\LogWrapper'),
$this->getMock('\OCP\IAvatarManager'),
@@ -586,6 +588,13 @@ class Test_User_Ldap_Direct extends \Test\TestCase {
$backend = new UserLDAP($access, $config);
$this->prepareMockForUserExists($access);
+ $dataDir = \OC::$server->getConfig()->getSystemValue(
+ 'datadirectory', \OC::$SERVERROOT.'/data');
+
+ $this->configMock->expects($this->once())
+ ->method('getSystemValue')
+ ->will($this->returnValue($dataDir));
+
$access->connection->expects($this->any())
->method('__get')
->will($this->returnCallback(function($name) {
@@ -609,14 +618,9 @@ class Test_User_Ldap_Direct extends \Test\TestCase {
return false;
}
}));
- //datadir-relativ path
- $datadir = '/my/data/dir';
- $config->expects($this->once())
- ->method('getSystemValue')
- ->will($this->returnValue($datadir));
$result = $backend->getHome('ladyofshadows');
- $this->assertEquals($datadir.'/susannah/', $result);
+ $this->assertEquals($dataDir.'/susannah/', $result);
}
/**
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index 00cba718369..7304088ba95 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -98,9 +98,8 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
*/
public function getLDAPUserByLoginName($loginName) {
//find out dn of the user name
- $attrs = array($this->access->connection->ldapUserDisplayName, 'dn',
- 'uid', 'samaccountname');
- $users = $this->access->fetchUsersByLoginName($loginName, $attrs);
+ $attrs = $this->access->userManager->getAttributes();
+ $users = $this->access->fetchUsersByLoginName($loginName, $attrs, 1);
if(count($users) < 1) {
throw new \Exception('No user available for the given login name.');
}
@@ -137,16 +136,9 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
return false;
}
+ $this->access->cacheUserExists($user->getUsername());
+ $user->processAttributes($ldapRecord);
$user->markLogin();
- if(isset($ldapRecord[$this->access->connection->ldapUserDisplayName])) {
- $dpn = $ldapRecord[$this->access->connection->ldapUserDisplayName];
- $user->storeDisplayName($dpn);
- }
- if(isset($ldapRecord['uid'])) {
- $user->storeLDAPUserName($ldapRecord['uid']);
- } else if(isset($ldapRecord['samaccountname'])) {
- $user->storeLDAPUserName($ldapRecord['samaccountname']);
- }
return $user->getUsername();
}
@@ -188,7 +180,7 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
//do the search and translate results to owncloud names
$ldap_users = $this->access->fetchListOfUsers(
$filter,
- array($this->access->connection->ldapUserDisplayName, 'dn'),
+ $this->access->userManager->getAttributes(true),
$limit, $offset);
$ldap_users = $this->access->ownCloudUserNames($ldap_users);
\OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::DEBUG);
@@ -302,44 +294,12 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
if($this->access->connection->isCached($cacheKey)) {
return $this->access->connection->getFromCache($cacheKey);
}
- if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0 &&
- $this->access->connection->homeFolderNamingRule !== 'attr:') {
- $attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:'));
- $homedir = $this->access->readAttribute(
- $this->access->username2dn($uid), $attr);
- if($homedir && isset($homedir[0])) {
- $path = $homedir[0];
- //if attribute's value is an absolute path take this, otherwise append it to data dir
- //check for / at the beginning or pattern c:\ resp. c:/
- if(
- '/' === $path[0]
- || (3 < strlen($path) && ctype_alpha($path[0])
- && $path[1] === ':' && ('\\' === $path[2] || '/' === $path[2]))
- ) {
- $homedir = $path;
- } else {
- $homedir = $this->ocConfig->getSystemValue('datadirectory',
- \OC::$SERVERROOT.'/data' ) . '/' . $homedir[0];
- }
- $this->access->connection->writeToCache($cacheKey, $homedir);
- //we need it to store it in the DB as well in case a user gets
- //deleted so we can clean up afterwards
- $this->ocConfig->setUserValue(
- $uid, 'user_ldap', 'homePath', $homedir
- );
- //TODO: if home directory changes, the old one needs to be removed.
- return $homedir;
- }
- if($this->ocConfig->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', true)) {
- // a naming rule attribute is defined, but it doesn't exist for that LDAP user
- throw new \Exception('Home dir attribute can\'t be read from LDAP for uid: ' . $uid);
- }
- }
- //false will apply default behaviour as defined and done by OC_User
- $this->access->connection->writeToCache($cacheKey, false);
- $this->ocConfig->setUserValue($uid, 'user_ldap', 'homePath', '');
- return false;
+ $user = $this->access->userManager->get($uid);
+ $path = $user->getHomePath();
+ $this->access->cacheUserHome($uid, $path);
+
+ return $path;
}
/**
diff --git a/autotest-external.sh b/autotest-external.sh
index cb5a3dad503..b738669b48c 100755
--- a/autotest-external.sh
+++ b/autotest-external.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/autotest-js.sh b/autotest-js.sh
index 99cc09f9085..2d8552811cf 100755
--- a/autotest-js.sh
+++ b/autotest-js.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/autotest.sh b/autotest.sh
index cd36193cf6c..f69a9b34a48 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/build/integration/.gitignore b/build/integration/.gitignore
new file mode 100644
index 00000000000..18b981bf7ed
--- /dev/null
+++ b/build/integration/.gitignore
@@ -0,0 +1,3 @@
+vendor
+output
+composer.lock
diff --git a/build/integration/composer.json b/build/integration/composer.json
new file mode 100644
index 00000000000..98b2f294c7a
--- /dev/null
+++ b/build/integration/composer.json
@@ -0,0 +1,7 @@
+{
+ "require-dev": {
+ "phpunit/phpunit": "~4.6",
+ "guzzlehttp/guzzle": "~5.0",
+ "behat/behat": "2.4.*@stable"
+ }
+}
diff --git a/build/integration/config/behat.yml b/build/integration/config/behat.yml
new file mode 100644
index 00000000000..01ca0d18790
--- /dev/null
+++ b/build/integration/config/behat.yml
@@ -0,0 +1,17 @@
+default:
+ paths:
+ features: ../features
+ bootstrap: %behat.paths.features%/bootstrap
+
+ context:
+ parameters:
+ baseUrl: http://localhost:8080/ocs/
+ admin:
+ - admin
+ - admin
+
+ci:
+ formatter:
+ name: pretty,junit
+ parameters:
+ output_path: null,./output
diff --git a/build/integration/features/bootstrap/FeatureContext.php b/build/integration/features/bootstrap/FeatureContext.php
new file mode 100644
index 00000000000..b7a04e1ca76
--- /dev/null
+++ b/build/integration/features/bootstrap/FeatureContext.php
@@ -0,0 +1,142 @@
+<?php
+
+use Behat\Behat\Context\BehatContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+/**
+ * Features context.
+ */
+class FeatureContext extends BehatContext {
+
+ /** @var string */
+ private $baseUrl = '';
+
+ /** @var ResponseInterface */
+ private $response = null;
+
+ /** @var string */
+ private $currentUser = '';
+
+ /** @var int */
+ private $apiVersion = 1;
+
+ /**
+ * Initializes context.
+ * Every scenario gets it's own context object.
+ *
+ * @param array $parameters context parameters (set them up through behat.yml)
+ */
+ public function __construct(array $parameters) {
+
+ // Initialize your context here
+ $this->baseUrl = $parameters['baseUrl'];
+ $this->adminUser = $parameters['admin'];
+
+ // in case of ci deployment we take the server url from the environment
+ $testServerUrl = getenv('TEST_SERVER_URL');
+ if ($testServerUrl !== false) {
+ $this->baseUrl = $testServerUrl;
+ }
+ }
+
+ /**
+ * @When /^sending "([^"]*)" to "([^"]*)"$/
+ */
+ public function sendingTo($verb, $url) {
+ $this->sendingToWith($verb, $url, null);
+ }
+
+ /**
+ * @Then /^the status code should be "([^"]*)"$/
+ */
+ public function theStatusCodeShouldBe($statusCode) {
+ PHPUnit_Framework_Assert::assertEquals($statusCode, $this->response->getStatusCode());
+ }
+
+ /**
+ * @Given /^As an "([^"]*)"$/
+ */
+ public function asAn($user) {
+ $this->currentUser = $user;
+ }
+
+ /**
+ * @Given /^using api version "([^"]*)"$/
+ */
+ public function usingApiVersion($version) {
+ $this->apiVersion = $version;
+ }
+
+ /**
+ * @Given /^user "([^"]*)" exists$/
+ */
+ public function userExists($user) {
+ $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user";
+ $client = new Client();
+ $options = [];
+ if ($this->currentUser === 'admin') {
+ $options['auth'] = $this->adminUser;
+ }
+
+ $this->response = $client->get($fullUrl, $options);
+ PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+ }
+
+ /**
+ * @Given /^user "([^"]*)" does not exist$/
+ */
+ public function userDoesNotExist($user) {
+ try {
+ $this->userExists($user);
+ } catch (\GuzzleHttp\Exception\ClientException $ex) {
+ PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+ }
+ }
+
+ /**
+ * @When /^creating the user "([^"]*)r"$/
+ */
+ public function creatingTheUser($user) {
+ $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user";
+ $client = new Client();
+ $options = [];
+ if ($this->currentUser === 'admin') {
+ $options['auth'] = $this->adminUser;
+ }
+
+ $this->response = $client->post($fullUrl, [
+ 'form_params' => [
+ 'userid' => $user,
+ 'password' => '123456'
+ ]
+ ]);
+ PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+ }
+
+ /**
+ * @When /^sending "([^"]*)" to "([^"]*)" with$/
+ * @param \Behat\Gherkin\Node\TableNode|null $formData
+ */
+ public function sendingToWith($verb, $url, $body) {
+ $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url;
+ $client = new Client();
+ $options = [];
+ if ($this->currentUser === 'admin') {
+ $options['auth'] = $this->adminUser;
+ }
+ if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+ $fd = $body->getRowsHash();
+ $options['body'] = $fd;
+ }
+
+ try {
+ $this->response = $client->send($client->createRequest($verb, $fullUrl, $options));
+ } catch (\GuzzleHttp\Exception\ClientException $ex) {
+ $this->response = $ex->getResponse();
+ }
+ }
+
+}
diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature
new file mode 100644
index 00000000000..9e3d2df50bb
--- /dev/null
+++ b/build/integration/features/provisioning-v1.feature
@@ -0,0 +1,32 @@
+Feature: provisioning
+ Background:
+ Given using api version "1"
+
+ Scenario: Getting an not existing user
+ Given As an "admin"
+ When sending "GET" to "/cloud/users/test"
+ Then the status code should be "200"
+
+ Scenario: Listing all users
+ Given As an "admin"
+ When sending "GET" to "/cloud/users"
+ Then the status code should be "200"
+
+ Scenario: Create a user
+ Given As an "admin"
+ And user "brand-new-user" does not exist
+ When sending "POST" to "/cloud/users" with
+ | userid | brand-new-user |
+ | password | 123456 |
+
+ Then the status code should be "200"
+ And user "brand-new-user" exists
+
+
+ Scenario: Delete a user
+ Given As an "admin"
+ And user "brand-new-user" exists
+ When sending "POST" to "/cloud/users" with
+ | userid | brand-new-user |
+ Then the status code should be "200"
+ And user "brand-new-user" does not exist
diff --git a/build/integration/features/provisioning-v2.feature b/build/integration/features/provisioning-v2.feature
new file mode 100644
index 00000000000..72ceed5d6a5
--- /dev/null
+++ b/build/integration/features/provisioning-v2.feature
@@ -0,0 +1,9 @@
+Feature: provisioning
+ Background:
+ Given using api version "2"
+
+ Scenario: Getting an not existing user
+ Given As an "admin"
+ When sending "GET" to "/cloud/users/test"
+ Then the status code should be "404"
+
diff --git a/build/integration/run.sh b/build/integration/run.sh
new file mode 100755
index 00000000000..08f10b86c5f
--- /dev/null
+++ b/build/integration/run.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+composer install
+
+# TODO: avoid port collision on jenkins - use $EXECUTOR_NUMBER
+if [ -z "$EXECUTOR_NUMBER" ]; then
+ EXECUTOR_NUMBER=0
+fi
+PORT=$((8080 + $EXECUTOR_NUMBER))
+#PORT=8080
+echo $PORT
+php -S localhost:$PORT -t ../.. &
+PHPPID=$!
+echo $PHPPID
+
+export TEST_SERVER_URL="http://localhost:$PORT/ocs/"
+vendor/bin/behat --profile ci
+
+kill $PHPPID
diff --git a/buildjsdocs.sh b/buildjsdocs.sh
index ef18dc8c9a9..90562558f66 100755
--- a/buildjsdocs.sh
+++ b/buildjsdocs.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# ownCloud
#
diff --git a/config/config.sample.php b/config/config.sample.php
index 51529cdb0cc..cf4b25b0674 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -417,19 +417,21 @@ $CONFIG = array(
*
* Available values:
*
- * * ``auto`` default setting. keeps files and folders in the trash bin
- * for 30 days and automatically deletes anytime after that
- * if space is needed (note: files may not be deleted if space
- * is not needed).
- * * ``D, auto`` keeps files and folders in the trash bin for D+ days,
- * delete anytime if space needed (note: files may not be deleted
- * if space is not needed)
- * * ``auto, D`` delete all files in the trash bin that are older than D days
- * automatically, delete other files anytime if space needed
- * * ``D1, D2`` keep files and folders the in trash bin for at least D1 days
- * and delete when exceeds D2 days
- * * ``disabled`` trash bin auto clean disabled, files and folders will be
- * kept forever
+ * * ``auto``
+ * default setting. keeps files and folders in the trash bin for 30 days
+ * and automatically deletes anytime after that if space is needed (note:
+ * files may not be deleted if space is not needed).
+ * * ``D, auto``
+ * keeps files and folders in the trash bin for D+ days, delete anytime if
+ * space needed (note: files may not be deleted if space is not needed)
+ * * ``auto, D``
+ * delete all files in the trash bin that are older than D days
+ * automatically, delete other files anytime if space needed
+ * * ``D1, D2``
+ * keep files and folders the in trash bin for at least D1 days and
+ * delete when exceeds D2 days
+ * * ``disabled``
+ * trash bin auto clean disabled, files and folders will be kept forever
*/
'trashbin_retention_obligation' => 'auto',
@@ -448,19 +450,24 @@ $CONFIG = array(
* ownCloud 8.1 and before.
*
* Available values:
- * ``auto`` default setting. Automatically expire versions according to
- * expire rules. Please refer to Files_versions online documentation
- * for more info.
- * ``D, auto`` keep versions at least for D days, apply expire rules to all
- * versions that are older than D days
- * * ``auto, D`` delete all versions that are older than D days automatically,
- * delete other versions according to expire rules
- * * ``D1, D2`` keep versions for at least D1 days and delete when exceeds D2 days
- * ``disabled`` versions auto clean disabled, versions will be kept forever
+ *
+ * * ``auto``
+ * default setting. Automatically expire versions according to expire
+ * rules. Please refer to Files_versions online documentation for more
+ * info.
+ * * ``D, auto``
+ * keep versions at least for D days, apply expire rules to all versions
+ * that are older than D days
+ * * ``auto, D``
+ * delete all versions that are older than D days automatically, delete
+ * other versions according to expire rules
+ * * ``D1, D2``
+ * keep versions for at least D1 days and delete when exceeds D2 days
+ * * ``disabled``
+ * versions auto clean disabled, versions will be kept forever
*/
'versions_retention_obligation' => 'auto',
-
/**
* ownCloud Verifications
*
@@ -806,6 +813,21 @@ $CONFIG = array(
*/
'ldapUserCleanupInterval' => 51,
+/**
+ * Enforce the existence of the home folder naming rule for all users
+ *
+ * Following scenario:
+ * * a home folder naming rule is set in LDAP advanced settings
+ * * a user doesn't have the home folder naming rule attribute set
+ *
+ * If this is set to **true** (default) it will NOT fallback to the core's
+ * default naming rule of using the internal user ID as home folder name.
+ *
+ * If this is set to **false** it will fallback for the users without the
+ * attribute set to naming the home folder like the internal user ID.
+ *
+ */
+'enforce_home_folder_naming_rule' => true,
/**
* Maintenance
diff --git a/core/ajax/preview.php b/core/ajax/preview.php
index baa0ed4ec61..c8bc05453ed 100644
--- a/core/ajax/preview.php
+++ b/core/ajax/preview.php
@@ -26,8 +26,8 @@
\OC::$server->getSession()->close();
$file = array_key_exists('file', $_GET) ? (string)$_GET['file'] : '';
-$maxX = array_key_exists('x', $_GET) ? (int)$_GET['x'] : '36';
-$maxY = array_key_exists('y', $_GET) ? (int)$_GET['y'] : '36';
+$maxX = array_key_exists('x', $_GET) ? (int)$_GET['x'] : '32';
+$maxY = array_key_exists('y', $_GET) ? (int)$_GET['y'] : '32';
$scalingUp = array_key_exists('scalingup', $_GET) ? (bool)$_GET['scalingup'] : true;
$keepAspect = array_key_exists('a', $_GET) ? true : false;
$always = array_key_exists('forceIcon', $_GET) ? (bool)$_GET['forceIcon'] : true;
diff --git a/core/ajax/share.php b/core/ajax/share.php
index 69b84564ab1..50c99cb56b4 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -183,6 +183,37 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
$result = $mailNotification->sendLinkShareMail($to_address, $file, $link, $expiration);
if(empty($result)) {
+ // Get the token from the link
+ $linkParts = explode('/', $link);
+ $token = array_pop($linkParts);
+
+ // Get the share for the token
+ $share = \OCP\Share::getShareByToken($token, false);
+ if ($share !== false) {
+ $currentUser = \OC::$server->getUserSession()->getUser()->getUID();
+ $file = '/' . ltrim($file, '/');
+
+ // Check whether share belongs to the user and whether the file is the same
+ if ($share['file_target'] === $file && $share['uid_owner'] === $currentUser) {
+
+ // Get the path for the user
+ $view = new \OC\Files\View('/' . $currentUser . '/files');
+ $fileId = (int) $share['item_source'];
+ $path = $view->getPath((int) $share['item_source']);
+
+ if ($path !== null) {
+ $event = \OC::$server->getActivityManager()->generateEvent();
+ $event->setApp(\OCA\Files_Sharing\Activity::FILES_SHARING_APP)
+ ->setType(\OCA\Files_Sharing\Activity::TYPE_SHARED)
+ ->setAuthor($currentUser)
+ ->setAffectedUser($currentUser)
+ ->setObject('files', $fileId, $path)
+ ->setSubject(\OCA\Files_Sharing\Activity::SUBJECT_SHARED_EMAIL, [$path, $to_address]);
+ \OC::$server->getActivityManager()->publish($event);
+ }
+ }
+ }
+
\OCP\JSON::success();
} else {
$l = \OC::$server->getL10N('core');
@@ -379,6 +410,16 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
}
}
+ $sharingAutocompletion = \OC::$server->getConfig()
+ ->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes');
+
+ if ($sharingAutocompletion !== 'yes') {
+ $searchTerm = strtolower($_GET['search']);
+ $shareWith = array_filter($shareWith, function($user) use ($searchTerm) {
+ return strtolower($user['label']) === $searchTerm
+ || strtolower($user['value']['shareWith']) === $searchTerm;
+ });
+ }
$sorter = new \OC\Share\SearchResultSorter((string)$_GET['search'],
'label',
diff --git a/core/ajax/update.php b/core/ajax/update.php
index a693deeb9cf..ff18d2bc04b 100644
--- a/core/ajax/update.php
+++ b/core/ajax/update.php
@@ -88,6 +88,12 @@ if (OC::checkUpgrade(false)) {
$eventSource->close();
OC_Config::setValue('maintenance', false);
});
+ $updater->listen('\OC\Updater', 'setDebugLogLevel', function ($logLevel, $logLevelName) use($eventSource, $l) {
+ $eventSource->send('success', (string)$l->t('Set log level to debug - current level: "%s"', [ $logLevelName ]));
+ });
+ $updater->listen('\OC\Updater', 'resetLogLevel', function ($logLevel, $logLevelName) use($eventSource, $l) {
+ $eventSource->send('success', (string)$l->t('Reset log level to "%s"', [ $logLevelName ]));
+ });
try {
$updater->upgrade();
diff --git a/core/command/app/checkcode.php b/core/command/app/checkcode.php
index a4e7322460f..9f6e0729ce9 100644
--- a/core/command/app/checkcode.php
+++ b/core/command/app/checkcode.php
@@ -26,6 +26,8 @@ namespace OC\Core\Command\App;
use OC\App\CodeChecker\CodeChecker;
use OC\App\CodeChecker\EmptyCheck;
+use OC\App\CodeChecker\InfoChecker;
+use OC\App\InfoParser;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@@ -33,12 +35,21 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class CheckCode extends Command {
+
+ /** @var InfoParser */
+ private $infoParser;
+
protected $checkers = [
'private' => '\OC\App\CodeChecker\PrivateCheck',
'deprecation' => '\OC\App\CodeChecker\DeprecationCheck',
'strong-comparison' => '\OC\App\CodeChecker\StrongComparisonCheck',
];
+ public function __construct(InfoParser $infoParser) {
+ parent::__construct();
+ $this->infoParser = $infoParser;
+ }
+
protected function configure() {
$this
->setName('app:check-code')
@@ -54,6 +65,12 @@ class CheckCode extends Command {
InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
'enable the specified checker(s)',
[ 'private', 'deprecation', 'strong-comparison' ]
+ )
+ ->addOption(
+ '--skip-validate-info',
+ null,
+ InputOption::VALUE_NONE,
+ 'skips the info.xml/version check'
);
}
@@ -84,7 +101,7 @@ class CheckCode extends Command {
$output->writeln("<info>Analysing {$filename}</info>");
}
- // show error count if there are errros present or the verbosity is high
+ // show error count if there are errors present or the verbosity is high
if($count > 0 || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
$output->writeln(" {$count} errors");
}
@@ -98,6 +115,53 @@ class CheckCode extends Command {
}
});
$errors = $codeChecker->analyse($appId);
+
+ if(!$input->getOption('skip-validate-info')) {
+ $infoChecker = new InfoChecker($this->infoParser);
+
+ $infoChecker->listen('InfoChecker', 'mandatoryFieldMissing', function($key) use ($output) {
+ $output->writeln("<error>Mandatory field missing: $key</error>");
+ });
+
+ $infoChecker->listen('InfoChecker', 'deprecatedFieldFound', function($key, $value) use ($output) {
+ if($value === [] || is_null($value) || $value === '') {
+ $output->writeln("<info>Deprecated field available: $key</info>");
+ } else {
+ $output->writeln("<info>Deprecated field available: $key => $value</info>");
+ }
+ });
+
+ $infoChecker->listen('InfoChecker', 'differentVersions', function($versionFile, $infoXML) use ($output) {
+ $output->writeln("<error>Different versions provided (appinfo/version: $versionFile - appinfo/info.xml: $infoXML)</error>");
+ });
+
+ $infoChecker->listen('InfoChecker', 'sameVersions', function($path) use ($output) {
+ $output->writeln("<info>Version file isn't needed anymore and can be safely removed ($path)</info>");
+ });
+
+ $infoChecker->listen('InfoChecker', 'migrateVersion', function($version) use ($output) {
+ $output->writeln("<info>Migrate the app version to appinfo/info.xml (add <version>$version</version> to appinfo/info.xml and remove appinfo/version)</info>");
+ });
+
+ if(OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
+ $infoChecker->listen('InfoChecker', 'mandatoryFieldFound', function($key, $value) use ($output) {
+ $output->writeln("<info>Mandatory field available: $key => $value</info>");
+ });
+
+ $infoChecker->listen('InfoChecker', 'optionalFieldFound', function($key, $value) use ($output) {
+ $output->writeln("<info>Optional field available: $key => $value</info>");
+ });
+
+ $infoChecker->listen('InfoChecker', 'unusedFieldFound', function($key, $value) use ($output) {
+ $output->writeln("<info>Unused field available: $key => $value</info>");
+ });
+ }
+
+ $infoErrors = $infoChecker->analyse($appId);
+
+ $errors = array_merge($errors, $infoErrors);
+ }
+
if (empty($errors)) {
$output->writeln('<info>App is compliant - awesome job!</info>');
return 0;
diff --git a/core/command/config/listconfigs.php b/core/command/config/listconfigs.php
index 5796362f2fc..37aeb53c6f5 100644
--- a/core/command/config/listconfigs.php
+++ b/core/command/config/listconfigs.php
@@ -32,20 +32,6 @@ use Symfony\Component\Console\Output\OutputInterface;
class ListConfigs extends Base {
protected $defaultOutputFormat = self::OUTPUT_FORMAT_JSON_PRETTY;
- /** @var array */
- protected $sensitiveValues = [
- 'dbpassword' => true,
- 'dbuser' => true,
- 'mail_smtpname' => true,
- 'mail_smtppassword' => true,
- 'passwordsalt' => true,
- 'secret' => true,
- 'ldap_agent_password' => true,
- 'objectstore' => ['arguments' => ['password' => true]],
- ];
-
- const SENSITIVE_VALUE = '***REMOVED SENSITIVE VALUE***';
-
/** * @var SystemConfig */
protected $systemConfig;
@@ -127,10 +113,10 @@ class ListConfigs extends Base {
$configs = [];
foreach ($keys as $key) {
- $value = $this->systemConfig->getValue($key, serialize(null));
-
- if ($noSensitiveValues && isset($this->sensitiveValues[$key])) {
- $value = $this->removeSensitiveValue($this->sensitiveValues[$key], $value);
+ if ($noSensitiveValues) {
+ $value = $this->systemConfig->getFilteredValue($key, serialize(null));
+ } else {
+ $value = $this->systemConfig->getValue($key, serialize(null));
}
if ($value !== 'N;') {
@@ -140,25 +126,4 @@ class ListConfigs extends Base {
return $configs;
}
-
- /**
- * @param bool|array $keysToRemove
- * @param mixed $value
- * @return mixed
- */
- protected function removeSensitiveValue($keysToRemove, $value) {
- if ($keysToRemove === true) {
- return self::SENSITIVE_VALUE;
- }
-
- if (is_array($value)) {
- foreach ($keysToRemove as $keyToRemove => $valueToRemove) {
- if (isset($value[$keyToRemove])) {
- $value[$keyToRemove] = $this->removeSensitiveValue($valueToRemove, $value[$keyToRemove]);
- }
- }
- }
-
- return $value;
- }
}
diff --git a/core/command/upgrade.php b/core/command/upgrade.php
index 44e0b66c17c..fa160d9a1c0 100644
--- a/core/command/upgrade.php
+++ b/core/command/upgrade.php
@@ -177,6 +177,12 @@ class Upgrade extends Command {
$updater->listen('\OC\Updater', 'failure', function ($message) use($output, $self) {
$output->writeln("<error>$message</error>");
});
+ $updater->listen('\OC\Updater', 'setDebugLogLevel', function ($logLevel, $logLevelName) use($output) {
+ $output->writeln("<info>Set log level to debug - current level: '$logLevelName'</info>");
+ });
+ $updater->listen('\OC\Updater', 'resetLogLevel', function ($logLevel, $logLevelName) use($output) {
+ $output->writeln("<info>Reset log level to '$logLevelName'</info>");
+ });
if(OutputInterface::VERBOSITY_NORMAL < $output->getVerbosity()) {
$updater->listen('\OC\Updater', 'repairInfo', function ($message) use($output) {
diff --git a/core/css/apps.css b/core/css/apps.css
index 6dd7e63bb69..3122a2b48a1 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -308,6 +308,13 @@
-o-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75));
}
+.ie8 .bubble {
+ border: 1px solid #eee;
+ margin-top: 18px;
+}
+.ie8 .bubble:after {
+ display: none;
+}
/* miraculous border arrow stuff */
.bubble:after,
#app-navigation .app-navigation-entry-menu:after {
@@ -417,7 +424,6 @@
position: relative;
height: 100%;
overflow-y: auto;
- -webkit-overflow-scrolling: touch;
}
#app-content-wrapper {
diff --git a/core/css/fixes.css b/core/css/fixes.css
index 7ef44ba6909..54852eb9beb 100644
--- a/core/css/fixes.css
+++ b/core/css/fixes.css
@@ -38,6 +38,10 @@ select {
background-image: url('../img/actions/settings.png');
}
+/* IE8 needs PNG image for header logo */
+.ie8 #header .logo {
+ background-image: url(../img/logo-icon-175px.png);
+}
/* IE8 needs background to be set to same color to make transparency look good. */
.lte9 #body-login form input[type="text"] {
@@ -51,6 +55,15 @@ select {
border-bottom: 1px solid lightgrey;
background-color: white; /* don't change background on hover */
}
+.ie8 #body-login input[type="submit"] {
+ padding: 10px 5px;
+ margin-top: 3px;
+}
+/* for whatever unexplained reason */
+.ie8 #password {
+ width: 271px !important;
+ min-width: auto !important;
+}
/* disable opacity of info text on gradient
since we cannot set a good backround color to use the filter&background hack as with the input labels */
diff --git a/core/css/mobile.css b/core/css/mobile.css
index 29507a0faa9..e8ed33933b7 100644
--- a/core/css/mobile.css
+++ b/core/css/mobile.css
@@ -45,6 +45,10 @@
width: 80% !important;
}
+/* fix name autocomplete not showing on mobile */
+.ui-autocomplete {
+ z-index: 1000 !important;
+}
/* fix error display on smaller screens */
.error-wide {
diff --git a/core/css/styles.css b/core/css/styles.css
index aefc0ff755a..d952a33c24a 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -158,7 +158,9 @@ textarea:hover, textarea:focus, textarea:active {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
opacity: 1;
}
-input[type="checkbox"] {
+
+/* ie8 doesn't support :checked */
+html:not(.ie8) input[type="checkbox"].checkbox {
margin:0;
padding:0;
height:auto;
@@ -166,7 +168,7 @@ input[type="checkbox"] {
display: none;
}
-input[type="checkbox"] + label:before {
+html:not(.ie8) input[type="checkbox"].checkbox + label:before {
content: "";
display: inline-block;
@@ -174,27 +176,27 @@ input[type="checkbox"] + label:before {
width: 20px;
vertical-align: middle;
- background: url('../img/actions/checkbox.svg') left center no-repeat;
+ background: url('../img/actions/checkbox.svg') left top no-repeat;
opacity: 0.7;
}
-input[type="checkbox"]:disabled +label:before { opacity: .6; }
+html:not(.ie8) input[type="checkbox"].checkbox:disabled +label:before { opacity: .6; }
-input[type="checkbox"].u-left +label:before { float: left; }
+html:not(.ie8) input[type="checkbox"].checkbox.u-left +label:before { float: left; }
-input[type="checkbox"].white + label:before {
+html:not(.ie8) input[type="checkbox"].checkbox--white + label:before {
background-image: url('../img/actions/checkbox-white.svg');
}
-input[type="checkbox"]:checked + label:before {
+html:not(.ie8) input[type="checkbox"].checkbox:checked + label:before {
background-image: url('../img/actions/checkbox-checked.svg');
}
-input[type="checkbox"].white:checked + label:before {
+html:not(.ie8) input[type="checkbox"].checkbox--white:checked + label:before {
background-image: url('../img/actions/checkbox-checked-white.svg');
}
-input[type="checkbox"]:hover+label:before, input[type="checkbox"]:focus+label:before {
+html:not(.ie8) input[type="checkbox"].checkbox:hover+label:before, input[type="checkbox"]:focus+label:before {
color:#111 !important;
}
diff --git a/core/img/actions/close.png b/core/img/actions/close.png
index ece33258e56..66e3c26cc65 100644
--- a/core/img/actions/close.png
+++ b/core/img/actions/close.png
Binary files differ
diff --git a/core/img/actions/close.svg b/core/img/actions/close.svg
index 4471dbc6301..e060da3f8bb 100644
--- a/core/img/actions/close.svg
+++ b/core/img/actions/close.svg
@@ -1,3 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <path d="M12.95,11.536,11.536,12.95,8,9.4142,4.4645,12.95,3.0503,11.536,6.5858,8,3.0503,4.4644,4.4645,3.0502,8,6.5858,11.516,3.0311,12.95,4.4644,9.4143,8z" fill="#000"/>
+ <defs>
+ <filter id="a" style="color-interpolation-filters:sRGB" height="1.5994" width="1.6006" y="-.29971" x="-.30029">
+ <feGaussianBlur stdDeviation="1.2386625"/>
+ </filter>
+ </defs>
+ <path d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z" filter="url(#a)" stroke="#fff" stroke-width="2" fill="#fff"/>
+ <path d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z"/>
</svg>
diff --git a/core/img/actions/upload.png b/core/img/actions/upload.png
index a6969c23fa6..8955ed96412 100644
--- a/core/img/actions/upload.png
+++ b/core/img/actions/upload.png
Binary files differ
diff --git a/core/img/actions/upload.svg b/core/img/actions/upload.svg
index 80231797c96..bf1c08cd488 100644
--- a/core/img/actions/upload.svg
+++ b/core/img/actions/upload.svg
@@ -1,4 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <path d="M10,12,6,12,6,6,2,6,8,0,14,6,10,6z"/>
- <path fill="#000" d="m0,11,0,5,16,0,0-5-2,0,0,3-12,0,0-3z"/>
+ <path d="m8 1-6 6h4v4h4v-4h4zm-6 12v2h12v-2z"/>
</svg>
diff --git a/core/img/actions/view-close.png b/core/img/actions/view-close.png
index c21f6ee30e7..0874381a576 100644
--- a/core/img/actions/view-close.png
+++ b/core/img/actions/view-close.png
Binary files differ
diff --git a/core/img/actions/view-close.svg b/core/img/actions/view-close.svg
index 89d1fab88dd..2b91e382eb1 100644
--- a/core/img/actions/view-close.svg
+++ b/core/img/actions/view-close.svg
@@ -1,3 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <path fill="#FFF" d="m23.071,6.1013,2.8278,2.8278-7.0713,7.0717,7.071,7.0704-2.8279,2.8283-7.0714-7.0704l-7.0713,7.071-2.8282-2.828,7.0705-7.071-7.1084-7.0316,2.8665-2.8679,7.0709,7.0705z"/>
+ <defs>
+ <filter id="a" style="color-interpolation-filters:sRGB" height="1.5997" width="1.6003" y="-.29984" x="-.30016">
+ <feGaussianBlur stdDeviation="2.2386623"/>
+ </filter>
+ </defs>
+ <path d="m24.955 23.538-1.414 1.414-7.536-7.5358-7.5355 7.5358-1.4142-1.414 7.5355-7.536-7.5355-7.5356 1.4142-1.4142 7.5355 7.5356 7.516-7.5547 1.434 1.4333-7.5357 7.5356z" filter="url(#a)" stroke="#000" stroke-width="2"/>
+ <path d="m24.955 23.538-1.414 1.414-7.536-7.5358-7.5355 7.5358-1.4142-1.414 7.5355-7.536-7.5355-7.5356 1.4142-1.4142 7.5355 7.5356 7.516-7.5547 1.434 1.4333-7.5357 7.5356z" fill="#fff"/>
</svg>
diff --git a/core/img/actions/view-next.png b/core/img/actions/view-next.png
index 8a23452e083..d8c749bec9b 100644
--- a/core/img/actions/view-next.png
+++ b/core/img/actions/view-next.png
Binary files differ
diff --git a/core/img/actions/view-next.svg b/core/img/actions/view-next.svg
index 07c95b73ff0..4b719842efd 100644
--- a/core/img/actions/view-next.svg
+++ b/core/img/actions/view-next.svg
@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <g transform="translate(0 -1020.4)">
- <path d="m9 1024.4 2-2 14 14-14 14-2-2 10-12z" fill="#fff"/>
- </g>
+ <defs>
+ <filter id="a" style="color-interpolation-filters:sRGB" height="1.4477" width="1.8073" y="-.22386" x="-.40365">
+ <feGaussianBlur stdDeviation="2.4158278"/>
+ </filter>
+ </defs>
+ <path d="m10.414 28.952-1.414-1.414 11.535-11.536-11.535-11.536 1.414-1.4138 12.95 12.95z" filter="url(#a)" stroke="#000" stroke-width="2"/>
+ <path d="m10.414 28.952-1.414-1.414 11.535-11.536-11.535-11.536 1.414-1.4138 12.95 12.95z" fill="#fff"/>
</svg>
diff --git a/core/img/actions/view-pause.png b/core/img/actions/view-pause.png
index 1de1fb4654b..87a18128ade 100644
--- a/core/img/actions/view-pause.png
+++ b/core/img/actions/view-pause.png
Binary files differ
diff --git a/core/img/actions/view-pause.svg b/core/img/actions/view-pause.svg
index f5fdc030479..e9ff43be0bf 100644
--- a/core/img/actions/view-pause.svg
+++ b/core/img/actions/view-pause.svg
@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <g transform="translate(0 -1020.4)">
- <path d="m6 1026.4v20h8v-20h-8zm12 0v20h8v-20h-8z" fill="#fff"/>
+ <defs>
+ <filter id="a" style="color-interpolation-filters:sRGB" height="1.6" width="1.6" y="-.3" x="-.3">
+ <feGaussianBlur stdDeviation="2.5"/>
+ </filter>
+ </defs>
+ <g transform="matrix(.9 0 0 .9 1.6 -916.76)" filter="url(#a)" stroke="#000" stroke-width="2.2222">
+ <path d="m6 1026.4v20h8v-20h-8zm12 0v20h8v-20h-8z" stroke="#000" stroke-width="2.2222"/>
+ </g>
+ <g transform="matrix(.9 0 0 .9 1.6 -916.76)">
+ <path fill="#fff" d="m6 1026.4v20h8v-20h-8zm12 0v20h8v-20h-8z"/>
</g>
</svg>
diff --git a/core/img/actions/view-play.png b/core/img/actions/view-play.png
index c506815c0cf..b07c6de3cfd 100644
--- a/core/img/actions/view-play.png
+++ b/core/img/actions/view-play.png
Binary files differ
diff --git a/core/img/actions/view-play.svg b/core/img/actions/view-play.svg
index d9fa355371c..e617e29cb01 100644
--- a/core/img/actions/view-play.svg
+++ b/core/img/actions/view-play.svg
@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <g transform="translate(0 -1020.4)">
- <path d="m4 1024.4 24 12-24 12z" fill="#fff"/>
+ <defs>
+ <filter id="a" style="color-interpolation-filters:sRGB" height="1.6" width="1.6" y="-.3" x="-.3">
+ <feGaussianBlur stdDeviation="3"/>
+ </filter>
+ </defs>
+ <g transform="matrix(.83333 0 0 .83333 2.6667 -847.67)" filter="url(#a)" stroke="#000" stroke-width="2.4">
+ <path d="m4 1024.4 24 12-24 12z" stroke="#000" stroke-width="2.4"/>
+ </g>
+ <g transform="matrix(.83333 0 0 .83333 2.6667 -847.67)">
+ <path fill="#fff" d="m4 1024.4 24 12-24 12z"/>
</g>
</svg>
diff --git a/core/img/actions/view-previous.png b/core/img/actions/view-previous.png
index 79dcb2301df..f601ec2ba44 100644
--- a/core/img/actions/view-previous.png
+++ b/core/img/actions/view-previous.png
Binary files differ
diff --git a/core/img/actions/view-previous.svg b/core/img/actions/view-previous.svg
index 68a31c04433..8a5013aad40 100644
--- a/core/img/actions/view-previous.svg
+++ b/core/img/actions/view-previous.svg
@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
- <g transform="translate(0 -1020.4)">
- <path d="m23 1024.4-2-2-14 14 14 14 2-2-10-12z" fill="#fff"/>
- </g>
+ <defs>
+ <filter id="a" style="color-interpolation-filters:sRGB" height="1.4477" width="1.8073" y="-.22386" x="-.40365">
+ <feGaussianBlur stdDeviation="2.4158278"/>
+ </filter>
+ </defs>
+ <path d="m10.414 28.952-1.414-1.414 11.535-11.536-11.535-11.536 1.414-1.4138 12.95 12.95z" transform="matrix(-1 0 0 1 32.364 0)" filter="url(#a)" stroke="#000" stroke-width="2"/>
+ <path d="m21.95 28.952 1.414-1.414-11.536-11.536 11.536-11.536-1.414-1.4138-12.95 12.95z" fill="#fff"/>
</svg>
diff --git a/core/img/filetypes/application-pdf.png b/core/img/filetypes/application-pdf.png
index 4029f8aead1..c215094eaa7 100644
--- a/core/img/filetypes/application-pdf.png
+++ b/core/img/filetypes/application-pdf.png
Binary files differ
diff --git a/core/img/filetypes/application.png b/core/img/filetypes/application.png
index 9be7361d1b6..d9db3b9114c 100644
--- a/core/img/filetypes/application.png
+++ b/core/img/filetypes/application.png
Binary files differ
diff --git a/core/img/filetypes/audio.png b/core/img/filetypes/audio.png
index 4eb8ab78e3f..3d52756341a 100644
--- a/core/img/filetypes/audio.png
+++ b/core/img/filetypes/audio.png
Binary files differ
diff --git a/core/img/filetypes/file.png b/core/img/filetypes/file.png
index 3bd7463cfc9..74add13f276 100644
--- a/core/img/filetypes/file.png
+++ b/core/img/filetypes/file.png
Binary files differ
diff --git a/core/img/filetypes/folder-drag-accept.png b/core/img/filetypes/folder-drag-accept.png
index 80ab53b72b9..1124a02982f 100644
--- a/core/img/filetypes/folder-drag-accept.png
+++ b/core/img/filetypes/folder-drag-accept.png
Binary files differ
diff --git a/core/img/filetypes/folder-external.png b/core/img/filetypes/folder-external.png
index 5262d72e627..dd8343d245a 100644
--- a/core/img/filetypes/folder-external.png
+++ b/core/img/filetypes/folder-external.png
Binary files differ
diff --git a/core/img/filetypes/folder-public.png b/core/img/filetypes/folder-public.png
index 17c3ee2a8d9..3da67f85f79 100644
--- a/core/img/filetypes/folder-public.png
+++ b/core/img/filetypes/folder-public.png
Binary files differ
diff --git a/core/img/filetypes/folder-shared.png b/core/img/filetypes/folder-shared.png
index be5e59cbf28..d24e1d7af4e 100644
--- a/core/img/filetypes/folder-shared.png
+++ b/core/img/filetypes/folder-shared.png
Binary files differ
diff --git a/core/img/filetypes/folder-starred.png b/core/img/filetypes/folder-starred.png
index b083a9d2d11..4b847bf69ea 100644
--- a/core/img/filetypes/folder-starred.png
+++ b/core/img/filetypes/folder-starred.png
Binary files differ
diff --git a/core/img/filetypes/folder.png b/core/img/filetypes/folder.png
index 1dbb1154100..e811e9cdfdc 100644
--- a/core/img/filetypes/folder.png
+++ b/core/img/filetypes/folder.png
Binary files differ
diff --git a/core/img/filetypes/image.png b/core/img/filetypes/image.png
index 0feaecf2830..8ff5e6c119f 100644
--- a/core/img/filetypes/image.png
+++ b/core/img/filetypes/image.png
Binary files differ
diff --git a/core/img/filetypes/package-x-generic.png b/core/img/filetypes/package-x-generic.png
index 287a1f18869..68117e0d070 100644
--- a/core/img/filetypes/package-x-generic.png
+++ b/core/img/filetypes/package-x-generic.png
Binary files differ
diff --git a/core/img/filetypes/text-calendar.png b/core/img/filetypes/text-calendar.png
index ff3ced62531..f21c3a9951d 100644
--- a/core/img/filetypes/text-calendar.png
+++ b/core/img/filetypes/text-calendar.png
Binary files differ
diff --git a/core/img/filetypes/text-code.png b/core/img/filetypes/text-code.png
index 5505102f60e..69744e499e6 100644
--- a/core/img/filetypes/text-code.png
+++ b/core/img/filetypes/text-code.png
Binary files differ
diff --git a/core/img/filetypes/text-vcard.png b/core/img/filetypes/text-vcard.png
index 77ac138fe1c..087eadaabd1 100644
--- a/core/img/filetypes/text-vcard.png
+++ b/core/img/filetypes/text-vcard.png
Binary files differ
diff --git a/core/img/filetypes/text.png b/core/img/filetypes/text.png
index 5fca7cb69d7..d6bec70cf43 100644
--- a/core/img/filetypes/text.png
+++ b/core/img/filetypes/text.png
Binary files differ
diff --git a/core/img/filetypes/video.png b/core/img/filetypes/video.png
index 308e81cca83..7cc1ecdc46a 100644
--- a/core/img/filetypes/video.png
+++ b/core/img/filetypes/video.png
Binary files differ
diff --git a/core/img/filetypes/x-office-document.png b/core/img/filetypes/x-office-document.png
index d9c5b890583..3bc2f08d1f9 100644
--- a/core/img/filetypes/x-office-document.png
+++ b/core/img/filetypes/x-office-document.png
Binary files differ
diff --git a/core/img/filetypes/x-office-presentation.png b/core/img/filetypes/x-office-presentation.png
index 5b3733b7121..644fb852009 100644
--- a/core/img/filetypes/x-office-presentation.png
+++ b/core/img/filetypes/x-office-presentation.png
Binary files differ
diff --git a/core/img/filetypes/x-office-spreadsheet.png b/core/img/filetypes/x-office-spreadsheet.png
index 5a20026ebdd..8f79c32fe01 100644
--- a/core/img/filetypes/x-office-spreadsheet.png
+++ b/core/img/filetypes/x-office-spreadsheet.png
Binary files differ
diff --git a/core/img/image-optimization.sh b/core/img/image-optimization.sh
index e6374c419b2..3fad080dc79 100755
--- a/core/img/image-optimization.sh
+++ b/core/img/image-optimization.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
function recursive_optimize_images() {
cd $1;
diff --git a/core/img/logo-icon-175px.png b/core/img/logo-icon-175px.png
new file mode 100644
index 00000000000..67e76498670
--- /dev/null
+++ b/core/img/logo-icon-175px.png
Binary files differ
diff --git a/core/js/js.js b/core/js/js.js
index b5971bfc579..e40141ac617 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1597,6 +1597,46 @@ OC.Util = {
},
/**
+ * Fix image scaling for IE8, since background-size is not supported.
+ *
+ * This scales the image to the element's actual size, the URL is
+ * taken from the "background-image" CSS attribute.
+ *
+ * @param {Object} $el image element
+ */
+ scaleFixForIE8: function($el) {
+ if (!this.isIE8()) {
+ return;
+ }
+ var self = this;
+ $($el).each(function() {
+ var url = $(this).css('background-image');
+ var r = url.match(/url\(['"]?([^'")]*)['"]?\)/);
+ if (!r) {
+ return;
+ }
+ url = r[1];
+ url = self.replaceSVGIcon(url);
+ // TODO: escape
+ url = url.replace(/'/g, '%27');
+ $(this).css({
+ 'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + url + '\', sizingMethod=\'scale\')',
+ 'background-image': ''
+ });
+ });
+ return $el;
+ },
+
+ /**
+ * Returns whether this is IE8
+ *
+ * @return {bool} true if this is IE8, false otherwise
+ */
+ isIE8: function() {
+ return $('html').hasClass('ie8');
+ },
+
+ /**
* Remove the time component from a given date
*
* @param {Date} date date
@@ -1773,9 +1813,7 @@ OC.Util.History = {
params = OC.parseQueryString(this._decodeQuery(query));
}
// else read from query attributes
- if (!params) {
- params = OC.parseQueryString(this._decodeQuery(location.search));
- }
+ params = _.extend(params || {}, OC.parseQueryString(this._decodeQuery(location.search)));
return params || {};
},
diff --git a/core/js/multiselect.js b/core/js/multiselect.js
index 41dc68ac051..6d5c54ac0f5 100644
--- a/core/js/multiselect.js
+++ b/core/js/multiselect.js
@@ -109,6 +109,9 @@
var id='ms'+multiSelectId+'-option-'+item;
var input=$('<input type="' + inputType + '"/>');
input.attr('id',id);
+ if(inputType === 'checkbox') {
+ input.addClass('checkbox');
+ }
if(settings.singleSelect) {
input.attr('name', 'ms'+multiSelectId+'-option');
}
diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js
index 719ac8587a4..c38250c79c6 100644
--- a/core/js/oc-dialogs.js
+++ b/core/js/oc-dialogs.js
@@ -342,11 +342,12 @@ var OCdialogs = {
var crop = function(img) {
var canvas = document.createElement('canvas'),
- width = img.width,
- height = img.height,
- x, y, size;
+ targetSize = 96,
+ width = img.width,
+ height = img.height,
+ x, y, size;
- // calculate the width and height, constraining the proportions
+ // Calculate the width and height, constraining the proportions
if (width > height) {
y = 0;
x = (width - height) / 2;
@@ -356,14 +357,90 @@ var OCdialogs = {
}
size = Math.min(width, height);
- // resize the canvas and draw the image data into it
- canvas.width = 64;
- canvas.height = 64;
+ // Set canvas size to the cropped area
+ canvas.width = size;
+ canvas.height = size;
var ctx = canvas.getContext("2d");
- ctx.drawImage(img, x, y, size, size, 0, 0, 64, 64);
+ ctx.drawImage(img, x, y, size, size, 0, 0, size, size);
+
+ // Resize the canvas to match the destination (right size uses 96px)
+ resampleHermite(canvas, size, size, targetSize, targetSize);
+
return canvas.toDataURL("image/png", 0.7);
};
+ /**
+ * Fast image resize/resample using Hermite filter with JavaScript.
+ *
+ * @author: ViliusL
+ *
+ * @param {*} canvas
+ * @param {number} W
+ * @param {number} H
+ * @param {number} W2
+ * @param {number} H2
+ */
+ var resampleHermite = function (canvas, W, H, W2, H2) {
+ W2 = Math.round(W2);
+ H2 = Math.round(H2);
+ var img = canvas.getContext("2d").getImageData(0, 0, W, H);
+ var img2 = canvas.getContext("2d").getImageData(0, 0, W2, H2);
+ var data = img.data;
+ var data2 = img2.data;
+ var ratio_w = W / W2;
+ var ratio_h = H / H2;
+ var ratio_w_half = Math.ceil(ratio_w / 2);
+ var ratio_h_half = Math.ceil(ratio_h / 2);
+
+ for (var j = 0; j < H2; j++) {
+ for (var i = 0; i < W2; i++) {
+ var x2 = (i + j * W2) * 4;
+ var weight = 0;
+ var weights = 0;
+ var weights_alpha = 0;
+ var gx_r = 0;
+ var gx_g = 0;
+ var gx_b = 0;
+ var gx_a = 0;
+ var center_y = (j + 0.5) * ratio_h;
+ for (var yy = Math.floor(j * ratio_h); yy < (j + 1) * ratio_h; yy++) {
+ var dy = Math.abs(center_y - (yy + 0.5)) / ratio_h_half;
+ var center_x = (i + 0.5) * ratio_w;
+ var w0 = dy * dy; //pre-calc part of w
+ for (var xx = Math.floor(i * ratio_w); xx < (i + 1) * ratio_w; xx++) {
+ var dx = Math.abs(center_x - (xx + 0.5)) / ratio_w_half;
+ var w = Math.sqrt(w0 + dx * dx);
+ if (w >= -1 && w <= 1) {
+ //hermite filter
+ weight = 2 * w * w * w - 3 * w * w + 1;
+ if (weight > 0) {
+ dx = 4 * (xx + yy * W);
+ //alpha
+ gx_a += weight * data[dx + 3];
+ weights_alpha += weight;
+ //colors
+ if (data[dx + 3] < 255)
+ weight = weight * data[dx + 3] / 250;
+ gx_r += weight * data[dx];
+ gx_g += weight * data[dx + 1];
+ gx_b += weight * data[dx + 2];
+ weights += weight;
+ }
+ }
+ }
+ }
+ data2[x2] = gx_r / weights;
+ data2[x2 + 1] = gx_g / weights;
+ data2[x2 + 2] = gx_b / weights;
+ data2[x2 + 3] = gx_a / weights_alpha;
+ }
+ }
+ canvas.getContext("2d").clearRect(0, 0, Math.max(W, W2), Math.max(H, H2));
+ canvas.width = W2;
+ canvas.height = H2;
+ canvas.getContext("2d").putImageData(img2, 0, 0);
+ };
+
var addConflict = function($conflicts, original, replacement) {
var $conflict = $conflicts.find('.template').clone().removeClass('template').addClass('conflict');
@@ -388,9 +465,9 @@ var OCdialogs = {
c: original.etag,
forceIcon: 0
};
- var previewpath = OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
+ var previewpath = Files.generatePreviewUrl(urlSpec);
// Escaping single quotes
- previewpath = previewpath.replace(/'/g, "%27")
+ previewpath = previewpath.replace(/'/g, "%27");
$originalDiv.find('.icon').css({"background-image": "url('" + previewpath + "')"});
getCroppedPreview(replacement).then(
function(path){
diff --git a/core/js/sharedialogexpirationview.js b/core/js/sharedialogexpirationview.js
index 3fba4b135d9..fab48f5e6bc 100644
--- a/core/js/sharedialogexpirationview.js
+++ b/core/js/sharedialogexpirationview.js
@@ -19,7 +19,7 @@
// in the LinkShareView to ease reusing it in future. Then,
// modifications (getting rid of IDs) are still necessary.
'{{#if isLinkShare}}' +
- '<input type="checkbox" name="expirationCheckbox" class="expirationCheckbox" id="expirationCheckbox" value="1" ' +
+ '<input type="checkbox" name="expirationCheckbox" class="expirationCheckbox checkbox" id="expirationCheckbox" value="1" ' +
'{{#if isExpirationSet}}checked="checked"{{/if}} {{#if disableCheckbox}}disabled="disabled"{{/if}} />' +
'<label for="expirationCheckbox">{{setExpirationLabel}}</label>' +
'<div class="expirationDateContainer {{#unless isExpirationSet}}hidden{{/unless}}">' +
diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js
index ab591b9c6e8..3d8fb461461 100644
--- a/core/js/sharedialoglinkshareview.js
+++ b/core/js/sharedialoglinkshareview.js
@@ -16,12 +16,12 @@
var TEMPLATE =
'{{#if shareAllowed}}' +
'<span class="icon-loading-small hidden"></span>' +
- '<input type="checkbox" name="linkCheckbox" id="linkCheckbox" value="1" {{#if isLinkShare}}checked="checked"{{/if}} /><label for="linkCheckbox">{{linkShareLabel}}</label>' +
+ '<input type="checkbox" name="linkCheckbox" id="linkCheckbox" class="checkbox" value="1" {{#if isLinkShare}}checked="checked"{{/if}} /><label for="linkCheckbox">{{linkShareLabel}}</label>' +
'<br />' +
'<label for="linkText" class="hidden-visually">{{urlLabel}}</label>' +
'<input id="linkText" {{#unless isLinkShare}}class="hidden"{{/unless}} type="text" readonly="readonly" value="{{shareLinkURL}}" />' +
' {{#if showPasswordCheckBox}}' +
- '<input type="checkbox" name="showPassword" id="showPassword" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" /><label for="showPassword">{{enablePasswordLabel}}</label>' +
+ '<input type="checkbox" name="showPassword" id="showPassword" class="checkbox" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" /><label for="showPassword">{{enablePasswordLabel}}</label>' +
' {{/if}}' +
'<div id="linkPass" {{#unless isPasswordSet}}class="hidden"{{/unless}}>' +
' <label for="linkPassText" class="hidden-visually">{{passwordLabel}}</label>' +
@@ -31,7 +31,7 @@
' {{#if publicUpload}}' +
'<div id="allowPublicUploadWrapper">' +
' <span class="icon-loading-small hidden"></span>' +
- ' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload" {{{publicUploadChecked}}} />' +
+ ' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload" class="checkbox" {{{publicUploadChecked}}} />' +
'<label for="sharingDialogAllowPublicUpload">{{publicUploadLabel}}</label>' +
'</div>' +
' {{/if}}' +
@@ -144,17 +144,33 @@
},
onPasswordEntered: function() {
- var password = this.$el.find('#linkPassText').val();
+ var self = this;
+ var $loading = this.$el.find('#linkPass .icon-loading-small');
+ if (!$loading.hasClass('hidden')) {
+ // still in process
+ return;
+ }
+ var $input = this.$el.find('#linkPassText');
+ $input.removeClass('error');
+ var password = $input.val();
if(password === '') {
return;
}
- this.$el.find('#linkPass .icon-loading-small')
+ $loading
.removeClass('hidden')
.addClass('inlineblock');
this.model.setPassword(password);
- this.model.saveLinkShare();
+ this.model.saveLinkShare({}, {
+ error: function(model, msg) {
+ $loading.removeClass('inlineblock').addClass('hidden');
+ $input.addClass('error');
+ $input.attr('title', msg);
+ $input.tooltip({placement: 'bottom', trigger: 'manual'});
+ $input.tooltip('show');
+ }
+ });
},
onAllowPublicUploadChange: function() {
diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js
index d2c45bb08b1..c29716b3e56 100644
--- a/core/js/sharedialogshareelistview.js
+++ b/core/js/sharedialogshareelistview.js
@@ -21,36 +21,36 @@
' {{/if}}' +
' {{#unless isCollection}}' +
' <li data-share-type="{{shareType}}" data-share-with="{{shareWith}}" title="{{shareWith}}">' +
- ' <a href="#" class="unshare"><img class="svg" alt="{{unshareLabel}}" title="{{unshareLabel}}" src="{{unshareImage}}" /></a>' +
+ ' <a href="#" class="unshare"><span class="icon-loading-small hidden"></span><img class="svg" alt="{{unshareLabel}}" title="{{unshareLabel}}" src="{{unshareImage}}" /></a>' +
' {{#if avatarEnabled}}' +
' <div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' +
' {{/if}}' +
' <span class="username">{{shareWithDisplayName}}</span>' +
' {{#if mailPublicNotificationEnabled}} {{#unless isRemoteShare}}' +
- ' <input id="mail-{{shareWith}}" type="checkbox" name="mailNotification" class="mailNotification" {{#if wasMailSent}}checked="checked"{{/if}} />' +
+ ' <input id="mail-{{shareWith}}" type="checkbox" name="mailNotification" class="mailNotification checkbox" {{#if wasMailSent}}checked="checked"{{/if}} />' +
' <label for="mail-{{shareWith}}">{{notifyByMailLabel}}</label>' +
' {{/unless}} {{/if}}' +
' {{#if isResharingAllowed}} {{#if sharePermissionPossible}} {{#unless isRemoteShare}}' +
- ' <input id="canShare-{{shareWith}}" type="checkbox" name="share" class="permissions" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' +
+ ' <input id="canShare-{{shareWith}}" type="checkbox" name="share" class="permissions checkbox" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' +
' <label for="canShare-{{shareWith}}">{{canShareLabel}}</label>' +
' {{/unless}} {{/if}} {{/if}}' +
' {{#if editPermissionPossible}}' +
- ' <input id="canEdit-{{shareWith}}" type="checkbox" name="edit" class="permissions" {{#if hasEditPermission}}checked="checked"{{/if}} />' +
+ ' <input id="canEdit-{{shareWith}}" type="checkbox" name="edit" class="permissions checkbox" {{#if hasEditPermission}}checked="checked"{{/if}} />' +
' <label for="canEdit-{{shareWith}}">{{canEditLabel}}</label>' +
' {{/if}}' +
' {{#unless isRemoteShare}}' +
' <a href="#" class="showCruds"><img class="svg" alt="{{crudsLabel}}" src="{{triangleSImage}}"/></a>' +
' <div class="cruds hidden">' +
' {{#if createPermissionPossible}}' +
- ' <input id="canCreate-{{shareWith}}" type="checkbox" name="create" class="permissions" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>' +
+ ' <input id="canCreate-{{shareWith}}" type="checkbox" name="create" class="permissions checkbox" {{#if hasCreatePermission}}checked="checked"{{/if}} data-permissions="{{createPermission}}"/>' +
' <label for="canCreate-{{shareWith}}">{{createPermissionLabel}}</label>' +
' {{/if}}' +
' {{#if updatePermissionPossible}}' +
- ' <input id="canUpdate-{{shareWith}}" type="checkbox" name="update" class="permissions" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>' +
+ ' <input id="canUpdate-{{shareWith}}" type="checkbox" name="update" class="permissions checkbox" {{#if hasUpdatePermission}}checked="checked"{{/if}} data-permissions="{{updatePermission}}"/>' +
' <label for="canUpdate-{{shareWith}}">{{updatePermissionLabel}}</label>' +
' {{/if}}' +
' {{#if deletePermissionPossible}} {{#unless isRemoteShare}}' +
- ' <input id="canDelete-{{shareWith}}" type="checkbox" name="delete" class="permissions" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' +
+ ' <input id="canDelete-{{shareWith}}" type="checkbox" name="delete" class="permissions checkbox" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' +
' <label for="canDelete-{{shareWith}}">{{deletePermissionLabel}}</label>' +
' {{/unless}} {{/if}}' +
' </div>' +
@@ -244,12 +244,14 @@
onUnshare: function(event) {
var $element = $(event.target);
+ console.log($element);
- if($element.hasClass('icon-loading-small')) {
+ var $loading = $element.siblings('.icon-loading-small').eq(0);
+ if(!$loading.hasClass('hidden')) {
// in process
return;
}
- $element.empty().addClass('icon-loading-small');
+ $loading.removeClass('hidden');
var $li = $element.closest('li');
var shareType = $li.data('share-type');
diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js
index 57743118f28..ee31ed33132 100644
--- a/core/js/sharedialogview.js
+++ b/core/js/sharedialogview.js
@@ -14,7 +14,7 @@
}
var TEMPLATE_BASE =
- '<div class="resharerInfoView"></div>' +
+ '<div class="resharerInfoView subView"></div>' +
'{{#if isSharingAllowed}}' +
'<label for="shareWith" class="hidden-visually">{{shareLabel}}</label>' +
'<div class="oneline">' +
@@ -23,10 +23,10 @@
'{{{remoteShareInfo}}}' +
'</div>' +
'{{/if}}' +
- '<div class="shareeListView"></div>' +
- '<div class="linkShareView"></div>' +
- '<div class="expirationView"></div>'
- ;
+ '<div class="shareeListView subView"></div>' +
+ '<div class="linkShareView subView"></div>' +
+ '<div class="expirationView subView"></div>' +
+ '<div class="loading hidden" style="height: 50px"></div>';
var TEMPLATE_REMOTE_SHARE_INFO =
'<a target="_blank" class="icon-info svg shareWithRemoteInfo hasTooltip" href="{{docLink}}" ' +
@@ -87,6 +87,9 @@
view.render();
});
+ this.model.on('request', this._onRequest, this);
+ this.model.on('sync', this._onEndRequest, this);
+
var subViewOptions = {
model: this.model,
configModel: this.configModel
@@ -161,6 +164,24 @@
this.model.addShare(s.item.value);
},
+ _toggleLoading: function(state) {
+ this._loading = state;
+ this.$el.find('.subView').toggleClass('hidden', state);
+ this.$el.find('.loading').toggleClass('hidden', !state);
+ },
+
+ _onRequest: function() {
+ // only show the loading spinner for the first request (for now)
+ if (!this._loadingOnce) {
+ this._toggleLoading(true);
+ this._loadingOnce = true;
+ }
+ },
+
+ _onEndRequest: function() {
+ this._toggleLoading(false);
+ },
+
render: function() {
var baseTemplate = this._getTemplate('base', TEMPLATE_BASE);
diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js
index 3ed10afd149..328d291b778 100644
--- a/core/js/shareitemmodel.js
+++ b/core/js/shareitemmodel.js
@@ -50,7 +50,7 @@
* @property {string} token
* @property {string} share_with
* @property {string} share_with_displayname
- * @property {string} share_mail_send
+ * @property {string} mail_send
* @property {OC.Share.Types.Collection|undefined} collection
* @property {Date} expiration optional?
* @property {number} stime optional?
@@ -64,6 +64,15 @@
*/
/**
+ * These properties are sometimes returned by the server as strings instead
+ * of integers, so we need to convert them accordingly...
+ */
+ var SHARE_RESPONSE_INT_PROPS = [
+ 'id', 'file_parent', 'mail_send', 'file_source', 'item_source', 'permissions',
+ 'storage', 'share_type', 'parent', 'stime'
+ ];
+
+ /**
* @class OCA.Share.ShareItemModel
* @classdesc
*
@@ -288,8 +297,7 @@
* @returns {boolean}
*/
hasUserShares: function() {
- var shares = this.get('shares');
- return _.isArray(shares) && shares.length > 0;
+ return this.getSharesWithCurrentItem().length > 0;
},
/**
@@ -399,6 +407,20 @@
},
/**
+ * Returns all share entries that only apply to the current item
+ * (file/folder)
+ *
+ * @return {Array.<OC.Share.Types.ShareInfo>}
+ */
+ getSharesWithCurrentItem: function() {
+ var shares = this.get('shares') || [];
+ var fileId = this.fileInfoModel.get('id');
+ return _.filter(shares, function(share) {
+ return share.item_source === fileId;
+ });
+ },
+
+ /**
* @param shareIndex
* @returns {string}
*/
@@ -462,7 +484,7 @@
if(!_.isObject(share)) {
throw "Unknown Share";
}
- return share.share_mail_send === '1';
+ return share.mail_send === 1;
},
/**
@@ -602,7 +624,9 @@
fetch: function() {
var model = this;
+ this.trigger('request', this);
OC.Share.loadItem(this.get('itemType'), this.get('itemSource'), function(data) {
+ model.trigger('sync', 'GET', this);
model.set(model.parse(data));
});
},
@@ -673,7 +697,19 @@
}
/** @type {OC.Share.Types.ShareInfo[]} **/
- var shares = _.toArray(data.shares);
+ var shares = _.map(data.shares, function(share) {
+ // properly parse some values because sometimes the server
+ // returns integers as string...
+ var i;
+ for (i = 0; i < SHARE_RESPONSE_INT_PROPS.length; i++) {
+ var prop = SHARE_RESPONSE_INT_PROPS[i];
+ if (!_.isUndefined(share[prop])) {
+ share[prop] = parseInt(share[prop], 10);
+ }
+ }
+ return share;
+ });
+
this._legacyFillCurrentShares(shares);
var linkShare = { isLinkShare: false };
diff --git a/core/js/tests/specs/shareitemmodelSpec.js b/core/js/tests/specs/shareitemmodelSpec.js
index c1d820052e2..b4403e28475 100644
--- a/core/js/tests/specs/shareitemmodelSpec.js
+++ b/core/js/tests/specs/shareitemmodelSpec.js
@@ -169,7 +169,7 @@ describe('OC.Share.ShareItemModel', function() {
/* jshint camelcase: false */
shares: [{
displayname_owner: 'root',
- expiration: 1111,
+ expiration: '2015-10-12 00:00:00',
file_source: 123,
file_target: '/folder',
id: 20,
@@ -187,7 +187,7 @@ describe('OC.Share.ShareItemModel', function() {
uid_owner: 'root'
}, {
displayname_owner: 'root',
- expiration: 2222,
+ expiration: '2015-10-15 00:00:00',
file_source: 456,
file_target: '/file_in_folder.txt',
id: 21,
@@ -249,10 +249,7 @@ describe('OC.Share.ShareItemModel', function() {
it('allows owner to share their own share when they are also the recipient', function() {
OC.currentUser = 'user1';
loadItemStub.yields({
- reshare: {
- permissions: OC.PERMISSION_READ,
- uid_owner: 'user1'
- },
+ reshare: {},
shares: []
});
@@ -261,6 +258,108 @@ describe('OC.Share.ShareItemModel', function() {
// sharing still allowed
expect(model.get('permissions') & OC.PERMISSION_SHARE).toEqual(OC.PERMISSION_SHARE);
});
+ it('properly parses integer values when the server is in the mood of returning ints as string', function() {
+ loadItemStub.yields({
+ reshare: {},
+ shares: [{
+ displayname_owner: 'root',
+ expiration: '2015-10-12 00:00:00',
+ file_source: '123',
+ file_target: '/folder',
+ id: '20',
+ item_source: '123',
+ item_type: 'file',
+ mail_send: '0',
+ parent: '999',
+ path: '/folder',
+ permissions: '' + OC.PERMISSION_READ,
+ share_type: '' + OC.Share.SHARE_TYPE_USER,
+ share_with: 'user1',
+ stime: '1403884258',
+ storage: '1',
+ token: 'tehtoken',
+ uid_owner: 'root'
+ }]
+ });
+
+ model.fetch();
+
+ var shares = model.get('shares');
+ expect(shares.length).toEqual(1);
+
+ var share = shares[0];
+ expect(share.id).toEqual(20);
+ expect(share.file_source).toEqual(123);
+ expect(share.file_target).toEqual('/folder');
+ expect(share.item_source).toEqual(123);
+ expect(share.item_type).toEqual('file');
+ expect(share.displayname_owner).toEqual('root');
+ expect(share.mail_send).toEqual(0);
+ expect(share.parent).toEqual(999);
+ expect(share.path).toEqual('/folder');
+ expect(share.permissions).toEqual(OC.PERMISSION_READ);
+ expect(share.share_type).toEqual(OC.Share.SHARE_TYPE_USER);
+ expect(share.share_with).toEqual('user1');
+ expect(share.stime).toEqual(1403884258);
+ expect(share.expiration).toEqual('2015-10-12 00:00:00');
+ });
+ });
+ describe('hasUserShares', function() {
+ it('returns false when no user shares exist', function() {
+ loadItemStub.yields({
+ reshare: {},
+ shares: []
+ });
+
+ model.fetch();
+
+ expect(model.hasUserShares()).toEqual(false);
+ });
+ it('returns true when user shares exist on the current item', function() {
+ loadItemStub.yields({
+ reshare: {},
+ shares: [{
+ id: 1,
+ share_type: OC.Share.SHARE_TYPE_USER,
+ share_with: 'user1',
+ item_source: '123'
+ }]
+ });
+
+ model.fetch();
+
+ expect(model.hasUserShares()).toEqual(true);
+ });
+ it('returns true when group shares exist on the current item', function() {
+ loadItemStub.yields({
+ reshare: {},
+ shares: [{
+ id: 1,
+ share_type: OC.Share.SHARE_TYPE_GROUP,
+ share_with: 'group1',
+ item_source: '123'
+ }]
+ });
+
+ model.fetch();
+
+ expect(model.hasUserShares()).toEqual(true);
+ });
+ it('returns false when share exist on parent item', function() {
+ loadItemStub.yields({
+ reshare: {},
+ shares: [{
+ id: 1,
+ share_type: OC.Share.SHARE_TYPE_GROUP,
+ share_with: 'group1',
+ item_source: '111'
+ }]
+ });
+
+ model.fetch();
+
+ expect(model.hasUserShares()).toEqual(false);
+ });
});
describe('Util', function() {
diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js
index dd8610428f2..f5ddc0f5b2d 100644
--- a/core/l10n/bg_BG.js
+++ b/core/l10n/bg_BG.js
@@ -152,7 +152,6 @@ OC.L10N.register(
"New Password" : "Нова Парола",
"Reset password" : "Възстановяване на паролата",
"Searching other places" : "Търсене в други места",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат от търсене в други места","{count} резултати от търсене в други места"],
"Personal" : "Лични",
"Users" : "Потребители",
"Apps" : "Приложения",
diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json
index 91a9704f7ef..b20cbe83466 100644
--- a/core/l10n/bg_BG.json
+++ b/core/l10n/bg_BG.json
@@ -150,7 +150,6 @@
"New Password" : "Нова Парола",
"Reset password" : "Възстановяване на паролата",
"Searching other places" : "Търсене в други места",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат от търсене в други места","{count} резултати от търсене в други места"],
"Personal" : "Лични",
"Users" : "Потребители",
"Apps" : "Приложения",
diff --git a/core/l10n/ca.js b/core/l10n/ca.js
index 4fdce762dc5..1efc17de4ba 100644
--- a/core/l10n/ca.js
+++ b/core/l10n/ca.js
@@ -177,8 +177,6 @@ OC.L10N.register(
"New Password" : "Contrasenya nova",
"Reset password" : "Reinicialitza la contrasenya",
"Searching other places" : "Buscant altres ubicacions",
- "No search results in other places" : "No hi ha resultats de cerques a altres llocs",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat de cerca en altres ubicacions","{count} resultats de cerca en altres ubicacions"],
"Personal" : "Personal",
"Users" : "Usuaris",
"Apps" : "Aplicacions",
diff --git a/core/l10n/ca.json b/core/l10n/ca.json
index 4d147db52f4..409ff636604 100644
--- a/core/l10n/ca.json
+++ b/core/l10n/ca.json
@@ -175,8 +175,6 @@
"New Password" : "Contrasenya nova",
"Reset password" : "Reinicialitza la contrasenya",
"Searching other places" : "Buscant altres ubicacions",
- "No search results in other places" : "No hi ha resultats de cerques a altres llocs",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat de cerca en altres ubicacions","{count} resultats de cerca en altres ubicacions"],
"Personal" : "Personal",
"Users" : "Usuaris",
"Apps" : "Aplicacions",
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index ac1d9631c53..6661318154b 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -150,6 +150,7 @@ OC.L10N.register(
"Share with users or groups …" : "Sdílet s uživateli nebo skupinami",
"Share with users, groups or remote users …" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli",
"Warning" : "Varování",
+ "Error while sending notification" : "Chyba při odesílání upozornění",
"The object type is not specified." : "Není určen typ objektu.",
"Enter new" : "Zadat nový",
"Delete" : "Smazat",
@@ -179,8 +180,7 @@ OC.L10N.register(
"New Password" : "Nové heslo",
"Reset password" : "Obnovit heslo",
"Searching other places" : "Prohledávání ostatních umístění",
- "No search results in other places" : "Žádné nálezy v ostatních umístěních",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} nález v ostatních umístěních","{count} nálezy v ostatních umístěních","{count} nálezů v ostatních umístěních"],
+ "No search results in other folders" : "V ostatních adresářích nebylo nic nalezeno",
"Personal" : "Osobní",
"Users" : "Uživatelé",
"Apps" : "Aplikace",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index 78c0e61d0b8..bb7e050231c 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -148,6 +148,7 @@
"Share with users or groups …" : "Sdílet s uživateli nebo skupinami",
"Share with users, groups or remote users …" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli",
"Warning" : "Varování",
+ "Error while sending notification" : "Chyba při odesílání upozornění",
"The object type is not specified." : "Není určen typ objektu.",
"Enter new" : "Zadat nový",
"Delete" : "Smazat",
@@ -177,8 +178,7 @@
"New Password" : "Nové heslo",
"Reset password" : "Obnovit heslo",
"Searching other places" : "Prohledávání ostatních umístění",
- "No search results in other places" : "Žádné nálezy v ostatních umístěních",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} nález v ostatních umístěních","{count} nálezy v ostatních umístěních","{count} nálezů v ostatních umístěních"],
+ "No search results in other folders" : "V ostatních adresářích nebylo nic nalezeno",
"Personal" : "Osobní",
"Users" : "Uživatelé",
"Apps" : "Aplikace",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index 5461275fb8e..4e689973872 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -182,8 +182,8 @@ OC.L10N.register(
"New Password" : "Ny adgangskode",
"Reset password" : "Nulstil kodeord",
"Searching other places" : "Søger på andre steder",
- "No search results in other places" : "Ingen søgeresultater fra andre steder",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søgeresultat fra andre steder","{count} søgeresultater fra andre steder"],
+ "No search results in other folders" : "Søgning gav ingen resultater in andre mapper",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søgeresultat fundet i andre mapper","{count} søgeresultater fundet i andre mapper"],
"Personal" : "Personligt",
"Users" : "Brugere",
"Apps" : "Apps",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index adf9fb314d5..639f387af15 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -180,8 +180,8 @@
"New Password" : "Ny adgangskode",
"Reset password" : "Nulstil kodeord",
"Searching other places" : "Søger på andre steder",
- "No search results in other places" : "Ingen søgeresultater fra andre steder",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søgeresultat fra andre steder","{count} søgeresultater fra andre steder"],
+ "No search results in other folders" : "Søgning gav ingen resultater in andre mapper",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søgeresultat fundet i andre mapper","{count} søgeresultater fundet i andre mapper"],
"Personal" : "Personligt",
"Users" : "Brugere",
"Apps" : "Apps",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 3b307547244..1ae859bef7e 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -169,8 +169,6 @@ OC.L10N.register(
"New Password" : "Neues Passwort",
"Reset password" : "Passwort zurücksetzen",
"Searching other places" : "Andere Orte durchsuchen",
- "No search results in other places" : "Keine Suchergebnisse an anderen Orten",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"],
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Apps" : "Apps",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 4784f7f1979..21af9345710 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -167,8 +167,6 @@
"New Password" : "Neues Passwort",
"Reset password" : "Passwort zurücksetzen",
"Searching other places" : "Andere Orte durchsuchen",
- "No search results in other places" : "Keine Suchergebnisse an anderen Orten",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"],
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Apps" : "Apps",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index 369936d0c92..6c689263cab 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -177,8 +177,6 @@ OC.L10N.register(
"New Password" : "Neues Passwort",
"Reset password" : "Passwort zurücksetzen",
"Searching other places" : "Andere Orte durchsuchen",
- "No search results in other places" : "Keine Suchergebnisse an anderen Orten",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"],
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Apps" : "Apps",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index 8f0d3fa8465..0b4b703f753 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -175,8 +175,6 @@
"New Password" : "Neues Passwort",
"Reset password" : "Passwort zurücksetzen",
"Searching other places" : "Andere Orte durchsuchen",
- "No search results in other places" : "Keine Suchergebnisse an anderen Orten",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Suchergebnis in den anderen Orten","{count} Suchergebnisse in den anderen Orten"],
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Apps" : "Apps",
diff --git a/core/l10n/el.js b/core/l10n/el.js
index 3b739d06b52..79f6725e776 100644
--- a/core/l10n/el.js
+++ b/core/l10n/el.js
@@ -145,12 +145,14 @@ OC.L10N.register(
"change" : "αλλαγή",
"delete" : "διαγραφή",
"access control" : "έλεγχος πρόσβασης",
+ "Share details could not be loaded for this item." : "Αδυναμία φόρτωσης λεπτομερειών διαμοιρασμού για αυτό το αντικείμενο.",
"An error occured. Please try again" : "Ένα σφάλμα προέκυψε. Παρακαλώ προσπαθήστε ξανά",
"Share" : "Διαμοιρασμός",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud",
"Share with users or groups …" : "Διαμοιρασμός με χρήστες ή ομάδες ...",
"Share with users, groups or remote users …" : "Διαμοιρασμός με χρήστες, ομάδες ή απομακρυσμένους χρήστες ...",
"Warning" : "Προειδοποίηση",
+ "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης",
"The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.",
"Enter new" : "Εισαγωγή νέου",
"Delete" : "Διαγραφή",
@@ -180,8 +182,8 @@ OC.L10N.register(
"New Password" : "Νέος Κωδικός",
"Reset password" : "Επαναφορά συνθηματικού",
"Searching other places" : "Έρευνα σε άλλα σημεία.",
- "No search results in other places" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλες τοποθεσίες",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} αποτελέσματα έρευνας σε άλλα σημεία","{count} αποτελέσματα έρευνας σε άλλα σημεία"],
+ "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} αποτέλεσμα αναζήτησης σε άλλο φάκελο","{count} αποτελέσματα αναζήτησης σε άλλους φακέλους"],
"Personal" : "Προσωπικά",
"Users" : "Χρήστες",
"Apps" : "Εφαρμογές",
diff --git a/core/l10n/el.json b/core/l10n/el.json
index 9900d8f568c..3fb2fbae8a5 100644
--- a/core/l10n/el.json
+++ b/core/l10n/el.json
@@ -143,12 +143,14 @@
"change" : "αλλαγή",
"delete" : "διαγραφή",
"access control" : "έλεγχος πρόσβασης",
+ "Share details could not be loaded for this item." : "Αδυναμία φόρτωσης λεπτομερειών διαμοιρασμού για αυτό το αντικείμενο.",
"An error occured. Please try again" : "Ένα σφάλμα προέκυψε. Παρακαλώ προσπαθήστε ξανά",
"Share" : "Διαμοιρασμός",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud",
"Share with users or groups …" : "Διαμοιρασμός με χρήστες ή ομάδες ...",
"Share with users, groups or remote users …" : "Διαμοιρασμός με χρήστες, ομάδες ή απομακρυσμένους χρήστες ...",
"Warning" : "Προειδοποίηση",
+ "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης",
"The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.",
"Enter new" : "Εισαγωγή νέου",
"Delete" : "Διαγραφή",
@@ -178,8 +180,8 @@
"New Password" : "Νέος Κωδικός",
"Reset password" : "Επαναφορά συνθηματικού",
"Searching other places" : "Έρευνα σε άλλα σημεία.",
- "No search results in other places" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλες τοποθεσίες",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} αποτελέσματα έρευνας σε άλλα σημεία","{count} αποτελέσματα έρευνας σε άλλα σημεία"],
+ "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} αποτέλεσμα αναζήτησης σε άλλο φάκελο","{count} αποτελέσματα αναζήτησης σε άλλους φακέλους"],
"Personal" : "Προσωπικά",
"Users" : "Χρήστες",
"Apps" : "Εφαρμογές",
diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js
index ced4272c1d8..7303eb2584a 100644
--- a/core/l10n/en_GB.js
+++ b/core/l10n/en_GB.js
@@ -162,8 +162,6 @@ OC.L10N.register(
"New Password" : "New Password",
"Reset password" : "Reset password",
"Searching other places" : "Searching other places",
- "No search results in other places" : "No search results in other places",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} search result in other places","{count} search results in other places"],
"Personal" : "Personal",
"Users" : "Users",
"Apps" : "Apps",
diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json
index 7bea74e4359..f2a5cf6e5ba 100644
--- a/core/l10n/en_GB.json
+++ b/core/l10n/en_GB.json
@@ -160,8 +160,6 @@
"New Password" : "New Password",
"Reset password" : "Reset password",
"Searching other places" : "Searching other places",
- "No search results in other places" : "No search results in other places",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} search result in other places","{count} search results in other places"],
"Personal" : "Personal",
"Users" : "Users",
"Apps" : "Apps",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index ea606905e7d..a35f8464325 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -145,12 +145,14 @@ OC.L10N.register(
"change" : "cambio",
"delete" : "eliminar",
"access control" : "control de acceso",
+ "Share details could not be loaded for this item." : "No se han podido cargar los detalles de compartición para este elemento.",
"An error occured. Please try again" : "Un error ocurrió. Por favor reinténtelo nuevamente.",
"Share" : "Compartir",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud",
"Share with users or groups …" : "Compartir con usuarios o grupos ...",
"Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...",
"Warning" : "Precaución",
+ "Error while sending notification" : "Error mientras se enviaba la notificación",
"The object type is not specified." : "El tipo de objeto no está especificado.",
"Enter new" : "Ingresar nueva",
"Delete" : "Eliminar",
@@ -180,8 +182,7 @@ OC.L10N.register(
"New Password" : "Contraseña nueva",
"Reset password" : "Restablecer contraseña",
"Searching other places" : "Buscando en otros lugares",
- "No search results in other places" : "Sin resultados de búsqueda en otros sitios",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de búsqueda en otros lugares","{count} resultados de búsqueda en otros lugares"],
+ "No search results in other folders" : "Ningún resultado de búsqueda en otras carpetas",
"Personal" : "Personal",
"Users" : "Usuarios",
"Apps" : "Aplicaciones",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index ec5b80a3e82..2a1d8b79a28 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -143,12 +143,14 @@
"change" : "cambio",
"delete" : "eliminar",
"access control" : "control de acceso",
+ "Share details could not be loaded for this item." : "No se han podido cargar los detalles de compartición para este elemento.",
"An error occured. Please try again" : "Un error ocurrió. Por favor reinténtelo nuevamente.",
"Share" : "Compartir",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud",
"Share with users or groups …" : "Compartir con usuarios o grupos ...",
"Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...",
"Warning" : "Precaución",
+ "Error while sending notification" : "Error mientras se enviaba la notificación",
"The object type is not specified." : "El tipo de objeto no está especificado.",
"Enter new" : "Ingresar nueva",
"Delete" : "Eliminar",
@@ -178,8 +180,7 @@
"New Password" : "Contraseña nueva",
"Reset password" : "Restablecer contraseña",
"Searching other places" : "Buscando en otros lugares",
- "No search results in other places" : "Sin resultados de búsqueda en otros sitios",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de búsqueda en otros lugares","{count} resultados de búsqueda en otros lugares"],
+ "No search results in other folders" : "Ningún resultado de búsqueda en otras carpetas",
"Personal" : "Personal",
"Users" : "Usuarios",
"Apps" : "Aplicaciones",
diff --git a/core/l10n/et_EE.js b/core/l10n/et_EE.js
index 1c49deff6ca..18840c05923 100644
--- a/core/l10n/et_EE.js
+++ b/core/l10n/et_EE.js
@@ -165,8 +165,6 @@ OC.L10N.register(
"New Password" : "Uus parool",
"Reset password" : "Nulli parool",
"Searching other places" : "Otsi teistest kohtadest",
- "No search results in other places" : "Teistest kohtadest otsimine ei andnud tulemusi",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} otsingutulemus teistest kohtadest","{count} otsingutulemust teistest kohtadest"],
"Personal" : "Isiklik",
"Users" : "Kasutajad",
"Apps" : "Rakendused",
diff --git a/core/l10n/et_EE.json b/core/l10n/et_EE.json
index 9e11b84d86e..e11a103480c 100644
--- a/core/l10n/et_EE.json
+++ b/core/l10n/et_EE.json
@@ -163,8 +163,6 @@
"New Password" : "Uus parool",
"Reset password" : "Nulli parool",
"Searching other places" : "Otsi teistest kohtadest",
- "No search results in other places" : "Teistest kohtadest otsimine ei andnud tulemusi",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} otsingutulemus teistest kohtadest","{count} otsingutulemust teistest kohtadest"],
"Personal" : "Isiklik",
"Users" : "Kasutajad",
"Apps" : "Rakendused",
diff --git a/core/l10n/eu.js b/core/l10n/eu.js
index a0d4650a4ae..baed46b43a9 100644
--- a/core/l10n/eu.js
+++ b/core/l10n/eu.js
@@ -145,7 +145,6 @@ OC.L10N.register(
"New Password" : "Pasahitz Berria",
"Reset password" : "Berrezarri pasahitza",
"Searching other places" : "Beste lekuak bilatzen",
- "_{count} search result in other places_::_{count} search results in other places_" : ["Bilaketa emaitza {count} beste lekuetan","{count} emaitza lortu dira beste lekuetan"],
"Personal" : "Pertsonala",
"Users" : "Erabiltzaileak",
"Apps" : "Aplikazioak",
diff --git a/core/l10n/eu.json b/core/l10n/eu.json
index e4ccdd8584c..62f2d1ad502 100644
--- a/core/l10n/eu.json
+++ b/core/l10n/eu.json
@@ -143,7 +143,6 @@
"New Password" : "Pasahitz Berria",
"Reset password" : "Berrezarri pasahitza",
"Searching other places" : "Beste lekuak bilatzen",
- "_{count} search result in other places_::_{count} search results in other places_" : ["Bilaketa emaitza {count} beste lekuetan","{count} emaitza lortu dira beste lekuetan"],
"Personal" : "Pertsonala",
"Users" : "Erabiltzaileak",
"Apps" : "Aplikazioak",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index 826305c9b5a..a2ea55857c7 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -182,8 +182,8 @@ OC.L10N.register(
"New Password" : "Uusi salasana",
"Reset password" : "Palauta salasana",
"Searching other places" : "Etsitään muista paikoista",
- "No search results in other places" : "Ei hakutuloksia muista paikoista",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hakutulos muualla","{count} hakutulosta muualla"],
+ "No search results in other folders" : "Ei hakutuloksia muissa kansioissa",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hakutulos muussa kansiossa","{count} hakutulosta muissa kansioissa"],
"Personal" : "Henkilökohtainen",
"Users" : "Käyttäjät",
"Apps" : "Sovellukset",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index c8a37ae2ef1..4d74b0dd393 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -180,8 +180,8 @@
"New Password" : "Uusi salasana",
"Reset password" : "Palauta salasana",
"Searching other places" : "Etsitään muista paikoista",
- "No search results in other places" : "Ei hakutuloksia muista paikoista",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hakutulos muualla","{count} hakutulosta muualla"],
+ "No search results in other folders" : "Ei hakutuloksia muissa kansioissa",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hakutulos muussa kansiossa","{count} hakutulosta muissa kansioissa"],
"Personal" : "Henkilökohtainen",
"Users" : "Käyttäjät",
"Apps" : "Sovellukset",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index 3335924e5e1..1ab890bc421 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -145,12 +145,14 @@ OC.L10N.register(
"change" : "modification",
"delete" : "supprimer",
"access control" : "contrôle d'accès",
+ "Share details could not be loaded for this item." : "Les informations de partage n'ont pu être chargées pour cet élément.",
"An error occured. Please try again" : "Une erreur est survenue. Merci de réessayer",
"Share" : "Partager",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud",
"Share with users or groups …" : "Partager avec des utilisateurs ou groupes...",
"Share with users, groups or remote users …" : "Partager avec des utilisateurs, groupes, ou utilisateurs distants",
"Warning" : "Attention",
+ "Error while sending notification" : "Erreur lors de l'envoi de la notification",
"The object type is not specified." : "Le type d'objet n'est pas spécifié.",
"Enter new" : "Saisir un nouveau",
"Delete" : "Supprimer",
@@ -180,8 +182,6 @@ OC.L10N.register(
"New Password" : "Nouveau mot de passe",
"Reset password" : "Réinitialiser le mot de passe",
"Searching other places" : "Recherche en cours dans d'autres emplacements",
- "No search results in other places" : "Aucun résultat dans d'autres emplacements",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} résultat dans d'autres emplacements","{count} résultats dans d'autres emplacements"],
"Personal" : "Personnel",
"Users" : "Utilisateurs",
"Apps" : "Applications",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index 225146cfb73..d56e5545a04 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -143,12 +143,14 @@
"change" : "modification",
"delete" : "supprimer",
"access control" : "contrôle d'accès",
+ "Share details could not be loaded for this item." : "Les informations de partage n'ont pu être chargées pour cet élément.",
"An error occured. Please try again" : "Une erreur est survenue. Merci de réessayer",
"Share" : "Partager",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud",
"Share with users or groups …" : "Partager avec des utilisateurs ou groupes...",
"Share with users, groups or remote users …" : "Partager avec des utilisateurs, groupes, ou utilisateurs distants",
"Warning" : "Attention",
+ "Error while sending notification" : "Erreur lors de l'envoi de la notification",
"The object type is not specified." : "Le type d'objet n'est pas spécifié.",
"Enter new" : "Saisir un nouveau",
"Delete" : "Supprimer",
@@ -178,8 +180,6 @@
"New Password" : "Nouveau mot de passe",
"Reset password" : "Réinitialiser le mot de passe",
"Searching other places" : "Recherche en cours dans d'autres emplacements",
- "No search results in other places" : "Aucun résultat dans d'autres emplacements",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} résultat dans d'autres emplacements","{count} résultats dans d'autres emplacements"],
"Personal" : "Personnel",
"Users" : "Utilisateurs",
"Apps" : "Applications",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index 8cff0f073d6..a2a93323a84 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -175,8 +175,6 @@ OC.L10N.register(
"New Password" : "Novo contrasinal",
"Reset password" : "Restabelecer o contrasinal",
"Searching other places" : "Buscando noutros lugares",
- "No search results in other places" : "Sen resultados na busca noutros lugares",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado na busca noutros lugares","{count} resultados na busca noutros lugares"],
"Personal" : "Persoal",
"Users" : "Usuarios",
"Apps" : "Aplicacións",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index 9ce7bf5c34b..a0e5980563c 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -173,8 +173,6 @@
"New Password" : "Novo contrasinal",
"Reset password" : "Restabelecer o contrasinal",
"Searching other places" : "Buscando noutros lugares",
- "No search results in other places" : "Sen resultados na busca noutros lugares",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado na busca noutros lugares","{count} resultados na busca noutros lugares"],
"Personal" : "Persoal",
"Users" : "Usuarios",
"Apps" : "Aplicacións",
diff --git a/core/l10n/hr.js b/core/l10n/hr.js
index f891532b283..28891885e96 100644
--- a/core/l10n/hr.js
+++ b/core/l10n/hr.js
@@ -145,7 +145,6 @@ OC.L10N.register(
"New Password" : "Nova lozinka",
"Reset password" : "Resetirajte lozinku",
"Searching other places" : "Pretraživanje drugih lokacija",
- "_{count} search result in other places_::_{count} search results in other places_" : ["Pronađen {count} rezultat na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama"],
"Personal" : "Osobno",
"Users" : "Korisnici",
"Apps" : "Aplikacije",
diff --git a/core/l10n/hr.json b/core/l10n/hr.json
index 3b4404dacb5..eb234559d2e 100644
--- a/core/l10n/hr.json
+++ b/core/l10n/hr.json
@@ -143,7 +143,6 @@
"New Password" : "Nova lozinka",
"Reset password" : "Resetirajte lozinku",
"Searching other places" : "Pretraživanje drugih lokacija",
- "_{count} search result in other places_::_{count} search results in other places_" : ["Pronađen {count} rezultat na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama","Pronađeno {count} rezultata na drugim lokacijama"],
"Personal" : "Osobno",
"Users" : "Korisnici",
"Apps" : "Aplikacije",
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index 3f2a73d0c99..91859d31998 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -150,6 +150,7 @@ OC.L10N.register(
"Share with users or groups …" : "Megosztás felhasználókkal vagy csoportokkal ...",
"Share with users, groups or remote users …" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal ...",
"Warning" : "Figyelmeztetés",
+ "Error while sending notification" : "Hiba történt az értesítő küldése közben",
"The object type is not specified." : "Az objektum típusa nincs megadva.",
"Enter new" : "Új beírása",
"Delete" : "Törlés",
@@ -179,8 +180,6 @@ OC.L10N.register(
"New Password" : "Új jelszó",
"Reset password" : "Jelszó-visszaállítás",
"Searching other places" : "Keresés más helyeken",
- "No search results in other places" : "Nem talált semmit más helyeken.",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} keresési eredmény más helyeken","{count} keresési eredmény más helyeken"],
"Personal" : "Személyes",
"Users" : "Felhasználók",
"Apps" : "Alkalmazások",
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index 0f5376c947a..48bd6dc8f92 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -148,6 +148,7 @@
"Share with users or groups …" : "Megosztás felhasználókkal vagy csoportokkal ...",
"Share with users, groups or remote users …" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal ...",
"Warning" : "Figyelmeztetés",
+ "Error while sending notification" : "Hiba történt az értesítő küldése közben",
"The object type is not specified." : "Az objektum típusa nincs megadva.",
"Enter new" : "Új beírása",
"Delete" : "Törlés",
@@ -177,8 +178,6 @@
"New Password" : "Új jelszó",
"Reset password" : "Jelszó-visszaállítás",
"Searching other places" : "Keresés más helyeken",
- "No search results in other places" : "Nem talált semmit más helyeken.",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} keresési eredmény más helyeken","{count} keresési eredmény más helyeken"],
"Personal" : "Személyes",
"Users" : "Felhasználók",
"Apps" : "Alkalmazások",
diff --git a/core/l10n/id.js b/core/l10n/id.js
index c722b4a7b7e..cb922fc1a25 100644
--- a/core/l10n/id.js
+++ b/core/l10n/id.js
@@ -145,12 +145,14 @@ OC.L10N.register(
"change" : "ubah",
"delete" : "hapus",
"access control" : "kontrol akses",
+ "Share details could not be loaded for this item." : "Rincian berbagi tidak dapat dimuat untuk item ini.",
"An error occured. Please try again" : "Terjadi masalah. Mohon coba kembali",
"Share" : "Bagikan",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud",
"Share with users or groups …" : "Bagikan dengan pengguna atau grup ...",
"Share with users, groups or remote users …" : "Bagikan dengan pengguna, grup atau pengguna remote ...",
"Warning" : "Peringatan",
+ "Error while sending notification" : "Kesalahan ketika mengirim notifikasi",
"The object type is not specified." : "Tipe objek tidak ditentukan.",
"Enter new" : "Masukkan baru",
"Delete" : "Hapus",
@@ -180,8 +182,6 @@ OC.L10N.register(
"New Password" : "Sandi Baru",
"Reset password" : "Setel ulang sandi",
"Searching other places" : "Mencari tempat lainnya",
- "No search results in other places" : "Tidak ada hasil pencarian di tempat lain",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hasil pencarian di tempat lain"],
"Personal" : "Pribadi",
"Users" : "Pengguna",
"Apps" : "Aplikasi",
diff --git a/core/l10n/id.json b/core/l10n/id.json
index ecc2c2b0f6e..4e05c85b22c 100644
--- a/core/l10n/id.json
+++ b/core/l10n/id.json
@@ -143,12 +143,14 @@
"change" : "ubah",
"delete" : "hapus",
"access control" : "kontrol akses",
+ "Share details could not be loaded for this item." : "Rincian berbagi tidak dapat dimuat untuk item ini.",
"An error occured. Please try again" : "Terjadi masalah. Mohon coba kembali",
"Share" : "Bagikan",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud",
"Share with users or groups …" : "Bagikan dengan pengguna atau grup ...",
"Share with users, groups or remote users …" : "Bagikan dengan pengguna, grup atau pengguna remote ...",
"Warning" : "Peringatan",
+ "Error while sending notification" : "Kesalahan ketika mengirim notifikasi",
"The object type is not specified." : "Tipe objek tidak ditentukan.",
"Enter new" : "Masukkan baru",
"Delete" : "Hapus",
@@ -178,8 +180,6 @@
"New Password" : "Sandi Baru",
"Reset password" : "Setel ulang sandi",
"Searching other places" : "Mencari tempat lainnya",
- "No search results in other places" : "Tidak ada hasil pencarian di tempat lain",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} hasil pencarian di tempat lain"],
"Personal" : "Pribadi",
"Users" : "Pengguna",
"Apps" : "Aplikasi",
diff --git a/core/l10n/is.js b/core/l10n/is.js
index 5dcb543b1e4..12027856d2d 100644
--- a/core/l10n/is.js
+++ b/core/l10n/is.js
@@ -145,12 +145,14 @@ OC.L10N.register(
"change" : "breyta",
"delete" : "eyða",
"access control" : "aðgangsstýring",
+ "Share details could not be loaded for this item." : "Ekki tókst að finna sameiginlegar upplýsingar.",
"An error occured. Please try again" : "Villa kom upp. Vinsamlegast reyndu aftur",
"Share" : "Deila",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólk í öðrum ownClouds með skipuninni username@example.com/owncloud",
"Share with users or groups …" : "Deila með notendum eða hópum ...",
"Share with users, groups or remote users …" : "Deila með notendum, hópa eða ytri notendum ...",
"Warning" : "Aðvörun",
+ "Error while sending notification" : "Villa við að senda tilkynningu",
"The object type is not specified." : "Tegund ekki tilgreind",
"Enter new" : "Sláðu inn nýtt",
"Delete" : "Eyða",
@@ -180,8 +182,6 @@ OC.L10N.register(
"New Password" : "Nýtt Lykilorð",
"Reset password" : "Endursetja lykilorð",
"Searching other places" : "Leitað á öðrum stöðum",
- "No search results in other places" : "Engar leitarniðurstöður á öðrum stöðum",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Leitarniðurstaða á öðrum stöðum","{count} Leitarniðurstöður á öðrum stöðum"],
"Personal" : "Um mig",
"Users" : "Notendur",
"Apps" : "Forrit",
diff --git a/core/l10n/is.json b/core/l10n/is.json
index f1238959ebf..fe7dd9fd64a 100644
--- a/core/l10n/is.json
+++ b/core/l10n/is.json
@@ -143,12 +143,14 @@
"change" : "breyta",
"delete" : "eyða",
"access control" : "aðgangsstýring",
+ "Share details could not be loaded for this item." : "Ekki tókst að finna sameiginlegar upplýsingar.",
"An error occured. Please try again" : "Villa kom upp. Vinsamlegast reyndu aftur",
"Share" : "Deila",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólk í öðrum ownClouds með skipuninni username@example.com/owncloud",
"Share with users or groups …" : "Deila með notendum eða hópum ...",
"Share with users, groups or remote users …" : "Deila með notendum, hópa eða ytri notendum ...",
"Warning" : "Aðvörun",
+ "Error while sending notification" : "Villa við að senda tilkynningu",
"The object type is not specified." : "Tegund ekki tilgreind",
"Enter new" : "Sláðu inn nýtt",
"Delete" : "Eyða",
@@ -178,8 +180,6 @@
"New Password" : "Nýtt Lykilorð",
"Reset password" : "Endursetja lykilorð",
"Searching other places" : "Leitað á öðrum stöðum",
- "No search results in other places" : "Engar leitarniðurstöður á öðrum stöðum",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} Leitarniðurstaða á öðrum stöðum","{count} Leitarniðurstöður á öðrum stöðum"],
"Personal" : "Um mig",
"Users" : "Notendur",
"Apps" : "Forrit",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 48fdf0e9b0c..b031dfe9ab5 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -182,8 +182,8 @@ OC.L10N.register(
"New Password" : "Nuova password",
"Reset password" : "Ripristina la password",
"Searching other places" : "Ricerca in altre posizioni",
- "No search results in other places" : "Nessun risultato di ricerca in altre posizioni",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} risultato di ricerca in altre posizioni","{count} risultati di ricerca in altre posizioni"],
+ "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} risultato di ricerca in altre cartelle","{count} risultati di ricerca in altre cartelle"],
"Personal" : "Personale",
"Users" : "Utenti",
"Apps" : "Applicazioni",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index bedb6b8aa66..380c31b8ecb 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -180,8 +180,8 @@
"New Password" : "Nuova password",
"Reset password" : "Ripristina la password",
"Searching other places" : "Ricerca in altre posizioni",
- "No search results in other places" : "Nessun risultato di ricerca in altre posizioni",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} risultato di ricerca in altre posizioni","{count} risultati di ricerca in altre posizioni"],
+ "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} risultato di ricerca in altre cartelle","{count} risultati di ricerca in altre cartelle"],
"Personal" : "Personale",
"Users" : "Utenti",
"Apps" : "Applicazioni",
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index 53bfc2ebc65..295e0142814 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -177,8 +177,6 @@ OC.L10N.register(
"New Password" : "新しいパスワード",
"Reset password" : "パスワードをリセット",
"Searching other places" : "他の場所の検索",
- "No search results in other places" : "その他の場所の検索結果はありません",
- "_{count} search result in other places_::_{count} search results in other places_" : ["その他の場所 の検索件数 {count}"],
"Personal" : "個人",
"Users" : "ユーザー",
"Apps" : "アプリ",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index a0591f119f9..20b86544225 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -175,8 +175,6 @@
"New Password" : "新しいパスワード",
"Reset password" : "パスワードをリセット",
"Searching other places" : "他の場所の検索",
- "No search results in other places" : "その他の場所の検索結果はありません",
- "_{count} search result in other places_::_{count} search results in other places_" : ["その他の場所 の検索件数 {count}"],
"Personal" : "個人",
"Users" : "ユーザー",
"Apps" : "アプリ",
diff --git a/core/l10n/ko.js b/core/l10n/ko.js
index c6ebf5e502f..28f79d1bb79 100644
--- a/core/l10n/ko.js
+++ b/core/l10n/ko.js
@@ -180,8 +180,6 @@ OC.L10N.register(
"New Password" : "새 암호",
"Reset password" : "암호 재설정",
"Searching other places" : "다른 장소 찾는 중",
- "No search results in other places" : "다른 장소의 검색 결과 없음",
- "_{count} search result in other places_::_{count} search results in other places_" : ["다른 장소 검색 결과 {count}개"],
"Personal" : "개인",
"Users" : "사용자",
"Apps" : "앱",
diff --git a/core/l10n/ko.json b/core/l10n/ko.json
index 5bbb99e89dd..adf31bb5a9d 100644
--- a/core/l10n/ko.json
+++ b/core/l10n/ko.json
@@ -178,8 +178,6 @@
"New Password" : "새 암호",
"Reset password" : "암호 재설정",
"Searching other places" : "다른 장소 찾는 중",
- "No search results in other places" : "다른 장소의 검색 결과 없음",
- "_{count} search result in other places_::_{count} search results in other places_" : ["다른 장소 검색 결과 {count}개"],
"Personal" : "개인",
"Users" : "사용자",
"Apps" : "앱",
diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js
index 13f133dbaf4..dc22e3f3030 100644
--- a/core/l10n/nb_NO.js
+++ b/core/l10n/nb_NO.js
@@ -182,8 +182,6 @@ OC.L10N.register(
"New Password" : "Nytt passord",
"Reset password" : "Tilbakestill passord",
"Searching other places" : "Søker andre steder",
- "No search results in other places" : "Ingen søkeresultater på andre steder",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søkeresultat fra andre steder","{count} søkeresultater fra andre steder"],
"Personal" : "Personlig",
"Users" : "Brukere",
"Apps" : "Apper",
diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json
index beb7a53e57b..0f6363831b7 100644
--- a/core/l10n/nb_NO.json
+++ b/core/l10n/nb_NO.json
@@ -180,8 +180,6 @@
"New Password" : "Nytt passord",
"Reset password" : "Tilbakestill passord",
"Searching other places" : "Søker andre steder",
- "No search results in other places" : "Ingen søkeresultater på andre steder",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} søkeresultat fra andre steder","{count} søkeresultater fra andre steder"],
"Personal" : "Personlig",
"Users" : "Brukere",
"Apps" : "Apper",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index 0b12185cae4..a18d79596b5 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -182,8 +182,8 @@ OC.L10N.register(
"New Password" : "Nieuw wachtwoord",
"Reset password" : "Reset wachtwoord",
"Searching other places" : "Zoeken op andere plaatsen",
- "No search results in other places" : "Geen zoekresultaten op andere plaatsen",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} zoekresultaat op andere plaatsen","{count} zoekresultaten op andere plaatsen"],
+ "No search results in other folders" : "Geen zoekresultaten in andere mappen",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} zoekresultaat in een andere map","{count} zoekresultaten in andere mappen"],
"Personal" : "Persoonlijk",
"Users" : "Gebruikers",
"Apps" : "Apps",
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index 7a9765d8c3a..fc221886e41 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -180,8 +180,8 @@
"New Password" : "Nieuw wachtwoord",
"Reset password" : "Reset wachtwoord",
"Searching other places" : "Zoeken op andere plaatsen",
- "No search results in other places" : "Geen zoekresultaten op andere plaatsen",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} zoekresultaat op andere plaatsen","{count} zoekresultaten op andere plaatsen"],
+ "No search results in other folders" : "Geen zoekresultaten in andere mappen",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} zoekresultaat in een andere map","{count} zoekresultaten in andere mappen"],
"Personal" : "Persoonlijk",
"Users" : "Gebruikers",
"Apps" : "Apps",
diff --git a/core/l10n/oc.js b/core/l10n/oc.js
index 07cd7897afd..ae8bbf09986 100644
--- a/core/l10n/oc.js
+++ b/core/l10n/oc.js
@@ -162,7 +162,6 @@ OC.L10N.register(
"New Password" : "Senhal novèl",
"Reset password" : "Reïnicializar lo senhal",
"Searching other places" : "Recèrca en cors dins d'autres emplaçaments",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat dins d'autres emplaçaments","{count} resultats dins d'autres emplaçaments"],
"Personal" : "Personal",
"Users" : "Utilizaires",
"Apps" : "Aplicacions",
diff --git a/core/l10n/oc.json b/core/l10n/oc.json
index a67f4970175..7f5aaaff4e1 100644
--- a/core/l10n/oc.json
+++ b/core/l10n/oc.json
@@ -160,7 +160,6 @@
"New Password" : "Senhal novèl",
"Reset password" : "Reïnicializar lo senhal",
"Searching other places" : "Recèrca en cors dins d'autres emplaçaments",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultat dins d'autres emplaçaments","{count} resultats dins d'autres emplaçaments"],
"Personal" : "Personal",
"Users" : "Utilizaires",
"Apps" : "Aplicacions",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index ca6b56ae0a1..e61218e465e 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -182,8 +182,8 @@ OC.L10N.register(
"New Password" : "Nova Senha",
"Reset password" : "Redefinir senha",
"Searching other places" : "Pesquisando em outros lugares",
- "No search results in other places" : "Nenhum resultado de pesquisa em outros lugares",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultados da pesquisa em outros lugares","{count} resultados da pesquisa em outros lugares"],
+ "No search results in other folders" : "Nenhum resultado de pesquisa em outras pastas",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado da pesquisa em outras pastas","{count} resultados da pesquisa em outras pastas"],
"Personal" : "Pessoal",
"Users" : "Usuários",
"Apps" : "Aplicações",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index 7441ad571eb..b11ed053b63 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -180,8 +180,8 @@
"New Password" : "Nova Senha",
"Reset password" : "Redefinir senha",
"Searching other places" : "Pesquisando em outros lugares",
- "No search results in other places" : "Nenhum resultado de pesquisa em outros lugares",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultados da pesquisa em outros lugares","{count} resultados da pesquisa em outros lugares"],
+ "No search results in other folders" : "Nenhum resultado de pesquisa em outras pastas",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado da pesquisa em outras pastas","{count} resultados da pesquisa em outras pastas"],
"Personal" : "Pessoal",
"Users" : "Usuários",
"Apps" : "Aplicações",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 0db31437384..c47731d17fa 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -178,8 +178,6 @@ OC.L10N.register(
"New Password" : "Nova palavra-passe",
"Reset password" : "Repor palavra-passe",
"Searching other places" : "A pesquisar noutros lugares",
- "No search results in other places" : "Nenhuns resultados em outros locais",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de pesquisa noutros lugares","{count} resultados de pesquisa noutros lugares"],
"Personal" : "Pessoal",
"Users" : "Utilizadores",
"Apps" : "Apps",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index 64b67ce8856..fdafd1c3c01 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -176,8 +176,6 @@
"New Password" : "Nova palavra-passe",
"Reset password" : "Repor palavra-passe",
"Searching other places" : "A pesquisar noutros lugares",
- "No search results in other places" : "Nenhuns resultados em outros locais",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} resultado de pesquisa noutros lugares","{count} resultados de pesquisa noutros lugares"],
"Personal" : "Pessoal",
"Users" : "Utilizadores",
"Apps" : "Apps",
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 40019986dcc..a5159a8d9a2 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -170,8 +170,6 @@ OC.L10N.register(
"New Password" : "Новый пароль",
"Reset password" : "Сбросить пароль",
"Searching other places" : "Идет поиск в других местах",
- "No search results in other places" : "В других местах ничего не найдено",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат поиска в других местах","{count} результата поиска в других местах","{count} результатов поиска в других местах","{count} результатов поиска в других местах"],
"Personal" : "Личное",
"Users" : "Пользователи",
"Apps" : "Приложения",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index 25c4313bd17..8be25ffe06d 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -168,8 +168,6 @@
"New Password" : "Новый пароль",
"Reset password" : "Сбросить пароль",
"Searching other places" : "Идет поиск в других местах",
- "No search results in other places" : "В других местах ничего не найдено",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат поиска в других местах","{count} результата поиска в других местах","{count} результатов поиска в других местах","{count} результатов поиска в других местах"],
"Personal" : "Личное",
"Users" : "Пользователи",
"Apps" : "Приложения",
diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js
index 075694831e2..2d0305196bc 100644
--- a/core/l10n/sk_SK.js
+++ b/core/l10n/sk_SK.js
@@ -166,8 +166,6 @@ OC.L10N.register(
"New Password" : "Nové heslo",
"Reset password" : "Obnovenie hesla",
"Searching other places" : "Prehľadanie ostatných umiestnení",
- "No search results in other places" : "Žiadne výsledky z prehľadávania v ostatných umiestneniach",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} výsledok v ostatných umiestneniach","{count} výsledky v ostatných umiestneniach","{count} výsledkov v ostatných umiestneniach"],
"Personal" : "Osobné",
"Users" : "Používatelia",
"Apps" : "Aplikácie",
diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json
index c9ab6cfacc3..14205e73457 100644
--- a/core/l10n/sk_SK.json
+++ b/core/l10n/sk_SK.json
@@ -164,8 +164,6 @@
"New Password" : "Nové heslo",
"Reset password" : "Obnovenie hesla",
"Searching other places" : "Prehľadanie ostatných umiestnení",
- "No search results in other places" : "Žiadne výsledky z prehľadávania v ostatných umiestneniach",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} výsledok v ostatných umiestneniach","{count} výsledky v ostatných umiestneniach","{count} výsledkov v ostatných umiestneniach"],
"Personal" : "Osobné",
"Users" : "Používatelia",
"Apps" : "Aplikácie",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 820b32ad61e..7676beecc5b 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -165,8 +165,6 @@ OC.L10N.register(
"New Password" : "Нова лозинка",
"Reset password" : "Ресетуј лозинку",
"Searching other places" : "Претражујем остала места",
- "No search results in other places" : "Нема резултата претраге на другим местима",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат претраге на осталим местима","{count} резултата претраге на осталим местима","{count} резултата претраге на осталим местима"],
"Personal" : "Лично",
"Users" : "Корисници",
"Apps" : "Апликације",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index 2607a8ba79b..f06c58773bb 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -163,8 +163,6 @@
"New Password" : "Нова лозинка",
"Reset password" : "Ресетуј лозинку",
"Searching other places" : "Претражујем остала места",
- "No search results in other places" : "Нема резултата претраге на другим местима",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} резултат претраге на осталим местима","{count} резултата претраге на осталим местима","{count} резултата претраге на осталим местима"],
"Personal" : "Лично",
"Users" : "Корисници",
"Apps" : "Апликације",
diff --git a/core/l10n/sv.js b/core/l10n/sv.js
index e2d5edf3f5d..8ef863b4a59 100644
--- a/core/l10n/sv.js
+++ b/core/l10n/sv.js
@@ -145,7 +145,6 @@ OC.L10N.register(
"New password" : "Nytt lösenord",
"New Password" : "Nytt lösenord",
"Reset password" : "Återställ lösenordet",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} sökresultat på andra platser","{count} sökresultat på andra platser"],
"Personal" : "Personligt",
"Users" : "Användare",
"Apps" : "Program",
diff --git a/core/l10n/sv.json b/core/l10n/sv.json
index c25a4afc5e7..5e425406a42 100644
--- a/core/l10n/sv.json
+++ b/core/l10n/sv.json
@@ -143,7 +143,6 @@
"New password" : "Nytt lösenord",
"New Password" : "Nytt lösenord",
"Reset password" : "Återställ lösenordet",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} sökresultat på andra platser","{count} sökresultat på andra platser"],
"Personal" : "Personligt",
"Users" : "Användare",
"Apps" : "Program",
diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js
index 3ed34bc336d..a7398d8eaef 100644
--- a/core/l10n/th_TH.js
+++ b/core/l10n/th_TH.js
@@ -182,8 +182,8 @@ OC.L10N.register(
"New Password" : "รหัสผ่านใหม่",
"Reset password" : "เปลี่ยนรหัสผ่านใหม่",
"Searching other places" : "กำลังค้นหาสถานที่อื่นๆ",
- "No search results in other places" : "ไม่มีผลการค้นหาในสถานที่อื่นๆ",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} ผลการค้นหาในสถานที่อื่นๆ"],
+ "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["ค้นหาพบ {count} ผลลัพธ์ในโฟลเดอร์อื่นๆ"],
"Personal" : "ส่วนตัว",
"Users" : "ผู้ใช้งาน",
"Apps" : "แอปฯ",
diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json
index ecf02c36b4b..9ff015ea8b9 100644
--- a/core/l10n/th_TH.json
+++ b/core/l10n/th_TH.json
@@ -180,8 +180,8 @@
"New Password" : "รหัสผ่านใหม่",
"Reset password" : "เปลี่ยนรหัสผ่านใหม่",
"Searching other places" : "กำลังค้นหาสถานที่อื่นๆ",
- "No search results in other places" : "ไม่มีผลการค้นหาในสถานที่อื่นๆ",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} ผลการค้นหาในสถานที่อื่นๆ"],
+ "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["ค้นหาพบ {count} ผลลัพธ์ในโฟลเดอร์อื่นๆ"],
"Personal" : "ส่วนตัว",
"Users" : "ผู้ใช้งาน",
"Apps" : "แอปฯ",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index 075c7470f4e..b0dcc1953ba 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -180,8 +180,6 @@ OC.L10N.register(
"New Password" : "Yeni Parola",
"Reset password" : "Parolayı sıfırla",
"Searching other places" : "Diğer konumlarda aranıyor",
- "No search results in other places" : "Diğer konumlarda arama sonucu yok",
- "_{count} search result in other places_::_{count} search results in other places_" : ["Diğer konumlarda {count} arama sonucu","Diğer konumlarda {count} arama sonucu"],
"Personal" : "Kişisel",
"Users" : "Kullanıcılar",
"Apps" : "Uygulamalar",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index 9aa0942c957..30d443795ec 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -178,8 +178,6 @@
"New Password" : "Yeni Parola",
"Reset password" : "Parolayı sıfırla",
"Searching other places" : "Diğer konumlarda aranıyor",
- "No search results in other places" : "Diğer konumlarda arama sonucu yok",
- "_{count} search result in other places_::_{count} search results in other places_" : ["Diğer konumlarda {count} arama sonucu","Diğer konumlarda {count} arama sonucu"],
"Personal" : "Kişisel",
"Users" : "Kullanıcılar",
"Apps" : "Uygulamalar",
diff --git a/core/l10n/uk.js b/core/l10n/uk.js
index f5c6ad86d9e..09952d200f7 100644
--- a/core/l10n/uk.js
+++ b/core/l10n/uk.js
@@ -2,8 +2,10 @@ OC.L10N.register(
"core",
{
"Couldn't send mail to following users: %s " : "Неможливо надіслати листа наступним користувачам: %s ",
+ "Preparing update" : "Підготовка до оновлення",
"Turned on maintenance mode" : "Увімкнено режим технічного обслуговування",
"Turned off maintenance mode" : "Вимкнено режим технічного обслуговування",
+ "Maintenance mode is kept active" : "Режим обслуговування залишається активним",
"Updated database" : "Базу даних оновлено",
"Checked database schema update" : "Перевірено оновлення схеми бази даних",
"Checked database schema update for apps" : "Перевірено оновлення схеми бази даних для додатків",
@@ -11,6 +13,9 @@ OC.L10N.register(
"Repair warning: " : "Попередження відновлення:",
"Repair error: " : "Помилка відновлення:",
"Following incompatible apps have been disabled: %s" : "Наступні несумісні додатки були вимкнені: %s",
+ "Following apps have been disabled: %s" : "Наступні додатки були вимкнені: %s",
+ "Already up to date" : "Актуально",
+ "File is too big" : "Файл занадто великий",
"Invalid file provided" : "Надано невірний файл",
"No image or file provided" : "Зображення або файлу не надано",
"Unknown filetype" : "Невідомий тип файлу",
@@ -26,13 +31,20 @@ OC.L10N.register(
"Thursday" : "Четвер",
"Friday" : "П'ятниця",
"Saturday" : "Субота",
- "Sun." : "Нед.",
+ "Sun." : "Нд.",
"Mon." : "Пн.",
"Tue." : "Вт.",
"Wed." : "Ср.",
"Thu." : "Чт.",
"Fri." : "Пт.",
"Sat." : "Сб.",
+ "Su" : "Нд.",
+ "Mo" : "Пн.",
+ "Tu" : "Вт.",
+ "We" : "Ср.",
+ "Th" : "Чт.",
+ "Fr" : "Пт.",
+ "Sa" : "Сб.",
"January" : "Січень",
"February" : "Лютий",
"March" : "Березень",
@@ -92,6 +104,7 @@ OC.L10N.register(
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Кеш пам'яті не налаштований. Задля покращення продуктивності, будь ласка, налаштуйте memcache, якщо є можливість. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom не доступний для читання PHP, що вкрай небажано з міркувань безпеки. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.",
+ "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версія PHP ({version}) більше <a href=\"{phpLink}\">не підтримується</a>. Ми рекомендуємо вам оновити версію PHP щоб отримати кращу продуктивність та оновлення безпеки.",
"Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не налаштований як \"{expected}\". Це потенційний ризик для безпеки чи приватності і ми радимо виправити це налаштування.",
"Shared" : "Опубліковано",
@@ -135,6 +148,7 @@ OC.L10N.register(
"Share with users or groups …" : "Поширити серед користувачів або груп ...",
"Share with users, groups or remote users …" : "Поширити серед локальних чи віддалених користувачів або груп ...",
"Warning" : "Попередження",
+ "Error while sending notification" : "Помилка при надсиланні повідомлення",
"The object type is not specified." : "Не визначено тип об'єкту.",
"Enter new" : "Введіть новий",
"Delete" : "Видалити",
@@ -152,8 +166,10 @@ OC.L10N.register(
"Updating {productName} to version {version}, this may take a while." : "Оновлення {productName} до версії {version}, це може займати деякий час.",
"Please reload the page." : "Будь ласка, перезавантажте сторінку.",
"The update was unsuccessful. " : "Оновлення завершилось невдачею.",
+ "The update was successful. There were warnings." : "Оновлення виконалось успішно, але були попередження.",
"The update was successful. Redirecting you to ownCloud now." : "Оновлення виконалось успішно. Перенаправляємо вас на ownCloud.",
"Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним",
+ "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів",
"Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.",
"Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.",
"%s password reset" : "%s скидання паролю",
@@ -162,7 +178,8 @@ OC.L10N.register(
"New Password" : "Новий пароль",
"Reset password" : "Скинути пароль",
"Searching other places" : "Йде пошук в інших місцях",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат пошуку в інших місцях","{count} результатів пошуку в інших місцях","{count} результати пошуку в інших місцях"],
+ "No search results in other folders" : "В інших теках нічого не знайдено",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат пошуку в інших теках","{count} результатів пошуку в інших теках","{count} результатів пошуку в інших теках"],
"Personal" : "Особисте",
"Users" : "Користувачі",
"Apps" : "Додатки",
@@ -227,6 +244,7 @@ OC.L10N.register(
"An internal error occured." : "Виникла внутрішня помилка.",
"Please try again or contact your administrator." : "Будь ласка, спробуйте ще раз або зверніться до адміністратора.",
"Log in" : "Увійти",
+ "Wrong password. Reset it?" : "Невірний пароль. Скинути його?",
"remember" : "запам'ятати",
"Alternative Logins" : "Альтернативні імена користувача",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Агов,<br><br>просто повідомляємо вам, що %s поділився »%s« з вами.<br><a href=\"%s\">Перегляньте!</a><br><br>",
@@ -238,6 +256,10 @@ OC.L10N.register(
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Будь ласка, зверніться до адміністратора. Якщо ви є адміністратором цього серверу, ви можете налаштувати опцію \"trusted_domain\" в конфігураційному файлі config/config.php. Приклад конфігурації знаходиться в файлі config/config.sample.php.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Залежно від конфігурації Ви як адміністратор можете додати цей домен у список довірених, використовуйте кнопку нижче.",
"Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений домен",
+ "App update required" : "Додаток потребує оновлення",
+ "%s will be updated to version %s" : "%s буде оновлено до версії %s",
+ "These apps will be updated:" : "Ці додатки будуть оновлені:",
+ "These incompatible apps will be disabled:" : "Ці несумісні додатки будуть вимкнені:",
"The theme %s has been disabled." : "Тему %s було вимкнено.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продовженням переконайтеся, що ви зробили резервну копію бази даних, каталогу конфігурації та каталогу з даними.",
"Start update" : "Почати оновлення",
diff --git a/core/l10n/uk.json b/core/l10n/uk.json
index 1c12acf311e..c46e55138bf 100644
--- a/core/l10n/uk.json
+++ b/core/l10n/uk.json
@@ -1,7 +1,9 @@
{ "translations": {
"Couldn't send mail to following users: %s " : "Неможливо надіслати листа наступним користувачам: %s ",
+ "Preparing update" : "Підготовка до оновлення",
"Turned on maintenance mode" : "Увімкнено режим технічного обслуговування",
"Turned off maintenance mode" : "Вимкнено режим технічного обслуговування",
+ "Maintenance mode is kept active" : "Режим обслуговування залишається активним",
"Updated database" : "Базу даних оновлено",
"Checked database schema update" : "Перевірено оновлення схеми бази даних",
"Checked database schema update for apps" : "Перевірено оновлення схеми бази даних для додатків",
@@ -9,6 +11,9 @@
"Repair warning: " : "Попередження відновлення:",
"Repair error: " : "Помилка відновлення:",
"Following incompatible apps have been disabled: %s" : "Наступні несумісні додатки були вимкнені: %s",
+ "Following apps have been disabled: %s" : "Наступні додатки були вимкнені: %s",
+ "Already up to date" : "Актуально",
+ "File is too big" : "Файл занадто великий",
"Invalid file provided" : "Надано невірний файл",
"No image or file provided" : "Зображення або файлу не надано",
"Unknown filetype" : "Невідомий тип файлу",
@@ -24,13 +29,20 @@
"Thursday" : "Четвер",
"Friday" : "П'ятниця",
"Saturday" : "Субота",
- "Sun." : "Нед.",
+ "Sun." : "Нд.",
"Mon." : "Пн.",
"Tue." : "Вт.",
"Wed." : "Ср.",
"Thu." : "Чт.",
"Fri." : "Пт.",
"Sat." : "Сб.",
+ "Su" : "Нд.",
+ "Mo" : "Пн.",
+ "Tu" : "Вт.",
+ "We" : "Ср.",
+ "Th" : "Чт.",
+ "Fr" : "Пт.",
+ "Sa" : "Сб.",
"January" : "Січень",
"February" : "Лютий",
"March" : "Березень",
@@ -90,6 +102,7 @@
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Кеш пам'яті не налаштований. Задля покращення продуктивності, будь ласка, налаштуйте memcache, якщо є можливість. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "/dev/urandom не доступний для читання PHP, що вкрай небажано з міркувань безпеки. Додаткову інформацію шукайте у нашій <a href=\"{docLink}\">документації</a>.",
+ "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версія PHP ({version}) більше <a href=\"{phpLink}\">не підтримується</a>. Ми рекомендуємо вам оновити версію PHP щоб отримати кращу продуктивність та оновлення безпеки.",
"Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не налаштований як \"{expected}\". Це потенційний ризик для безпеки чи приватності і ми радимо виправити це налаштування.",
"Shared" : "Опубліковано",
@@ -133,6 +146,7 @@
"Share with users or groups …" : "Поширити серед користувачів або груп ...",
"Share with users, groups or remote users …" : "Поширити серед локальних чи віддалених користувачів або груп ...",
"Warning" : "Попередження",
+ "Error while sending notification" : "Помилка при надсиланні повідомлення",
"The object type is not specified." : "Не визначено тип об'єкту.",
"Enter new" : "Введіть новий",
"Delete" : "Видалити",
@@ -150,8 +164,10 @@
"Updating {productName} to version {version}, this may take a while." : "Оновлення {productName} до версії {version}, це може займати деякий час.",
"Please reload the page." : "Будь ласка, перезавантажте сторінку.",
"The update was unsuccessful. " : "Оновлення завершилось невдачею.",
+ "The update was successful. There were warnings." : "Оновлення виконалось успішно, але були попередження.",
"The update was successful. Redirecting you to ownCloud now." : "Оновлення виконалось успішно. Перенаправляємо вас на ownCloud.",
"Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним",
+ "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів",
"Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.",
"Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.",
"%s password reset" : "%s скидання паролю",
@@ -160,7 +176,8 @@
"New Password" : "Новий пароль",
"Reset password" : "Скинути пароль",
"Searching other places" : "Йде пошук в інших місцях",
- "_{count} search result in other places_::_{count} search results in other places_" : ["{count} результат пошуку в інших місцях","{count} результатів пошуку в інших місцях","{count} результати пошуку в інших місцях"],
+ "No search results in other folders" : "В інших теках нічого не знайдено",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат пошуку в інших теках","{count} результатів пошуку в інших теках","{count} результатів пошуку в інших теках"],
"Personal" : "Особисте",
"Users" : "Користувачі",
"Apps" : "Додатки",
@@ -225,6 +242,7 @@
"An internal error occured." : "Виникла внутрішня помилка.",
"Please try again or contact your administrator." : "Будь ласка, спробуйте ще раз або зверніться до адміністратора.",
"Log in" : "Увійти",
+ "Wrong password. Reset it?" : "Невірний пароль. Скинути його?",
"remember" : "запам'ятати",
"Alternative Logins" : "Альтернативні імена користувача",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Агов,<br><br>просто повідомляємо вам, що %s поділився »%s« з вами.<br><a href=\"%s\">Перегляньте!</a><br><br>",
@@ -236,6 +254,10 @@
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Будь ласка, зверніться до адміністратора. Якщо ви є адміністратором цього серверу, ви можете налаштувати опцію \"trusted_domain\" в конфігураційному файлі config/config.php. Приклад конфігурації знаходиться в файлі config/config.sample.php.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Залежно від конфігурації Ви як адміністратор можете додати цей домен у список довірених, використовуйте кнопку нижче.",
"Add \"%s\" as trusted domain" : "Додати \"%s\" як довірений домен",
+ "App update required" : "Додаток потребує оновлення",
+ "%s will be updated to version %s" : "%s буде оновлено до версії %s",
+ "These apps will be updated:" : "Ці додатки будуть оновлені:",
+ "These incompatible apps will be disabled:" : "Ці несумісні додатки будуть вимкнені:",
"The theme %s has been disabled." : "Тему %s було вимкнено.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Перед продовженням переконайтеся, що ви зробили резервну копію бази даних, каталогу конфігурації та каталогу з даними.",
"Start update" : "Почати оновлення",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index 8b4a199c02c..ab377c9eb06 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -180,8 +180,6 @@ OC.L10N.register(
"New Password" : "新密码",
"Reset password" : "重置密码",
"Searching other places" : "搜索其他地方",
- "No search results in other places" : "在其他地方没有搜索结果",
- "_{count} search result in other places_::_{count} search results in other places_" : ["在其他地方有 {count} 个搜索结果"],
"Personal" : "个人",
"Users" : "用户",
"Apps" : "应用",
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index 23d3fc19366..d16c744d51f 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -178,8 +178,6 @@
"New Password" : "新密码",
"Reset password" : "重置密码",
"Searching other places" : "搜索其他地方",
- "No search results in other places" : "在其他地方没有搜索结果",
- "_{count} search result in other places_::_{count} search results in other places_" : ["在其他地方有 {count} 个搜索结果"],
"Personal" : "个人",
"Users" : "用户",
"Apps" : "应用",
diff --git a/core/register_command.php b/core/register_command.php
index 114e115c491..878542f72c9 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -28,7 +28,8 @@
/** @var $application Symfony\Component\Console\Application */
$application->add(new OC\Core\Command\Status);
$application->add(new OC\Core\Command\Check(\OC::$server->getConfig()));
-$application->add(new OC\Core\Command\App\CheckCode());
+$infoParser = new \OC\App\InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator());
+$application->add(new OC\Core\Command\App\CheckCode($infoParser));
$application->add(new OC\Core\Command\L10n\CreateJs());
if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
diff --git a/core/search/js/search.js b/core/search/js/search.js
index bc67eb0e154..4e83a070170 100644
--- a/core/search/js/search.js
+++ b/core/search/js/search.js
@@ -217,10 +217,10 @@
$status.addClass('emptycontent').removeClass('status');
$status.html('');
$status.append('<div class="icon-search"></div>');
- $status.append('<h2>' + t('core', 'No search results in other places') + '</h2>');
+ $status.append('<h2>' + t('core', 'No search results in other folders') + '</h2>');
} else {
$status.removeClass('emptycontent').addClass('status');
- $status.text(n('core', '{count} search result in other places', '{count} search results in other places', count, {count:count}));
+ $status.text(n('core', '{count} search result in another folder', '{count} search results in other folders', count, {count:count}));
}
}
function renderCurrent() {
diff --git a/core/shipped.json b/core/shipped.json
index 7993b61569c..ffa4ee9c738 100644
--- a/core/shipped.json
+++ b/core/shipped.json
@@ -3,11 +3,11 @@
"shippedApps": [
"activity",
"admin_audit",
+ "encryption",
"enterprise_key",
"external",
"files",
"files_antivirus",
- "encryption",
"files_external",
"files_ldap_home",
"files_locking",
@@ -21,6 +21,7 @@
"firewall",
"firstrunwizard",
"gallery",
+ "notifications",
"objectstore",
"provisioning_api",
"sharepoint",
@@ -29,7 +30,6 @@
"user_external",
"user_ldap",
"user_shibboleth",
- "user_webdavauth",
"windows_network_drive"
]
}
diff --git a/core/templates/login.php b/core/templates/login.php
index 2057b1034d0..6751d92f656 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -55,7 +55,7 @@ script('core', [
autocomplete="on" autocapitalize="off" autocorrect="off" required>
<label for="password" class="infield"><?php p($l->t('Password')); ?></label>
<img class="svg" id="password-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt=""/>
- <input type="submit" id="submit" class="login primary icon-confirm" title="<?php p($l->t('Log in')); ?>" value="" disabled="disabled"/>
+ <input type="submit" id="submit" class="login primary icon-confirm svg" title="<?php p($l->t('Log in')); ?>" value="" disabled="disabled"/>
</p>
<?php if (isset($_['invalidpassword']) && ($_['invalidpassword'])): ?>
@@ -65,7 +65,7 @@ script('core', [
<?php endif; ?>
<?php if ($_['rememberLoginAllowed'] === true) : ?>
<div class="remember-login-container">
- <input type="checkbox" name="remember_login" value="1" id="remember_login" class="white">
+ <input type="checkbox" name="remember_login" value="1" id="remember_login" class="checkbox checkbox--white">
<label for="remember_login"><?php p($l->t('remember')); ?></label>
</div>
<?php endif; ?>
diff --git a/l10n/.tx/config b/l10n/.tx/config
index 875e1324dbc..a91a236641e 100644
--- a/l10n/.tx/config
+++ b/l10n/.tx/config
@@ -62,9 +62,3 @@ source_file = templates/user_ldap.pot
source_lang = en
type = PO
-[owncloud.user_webdavauth]
-file_filter = <lang>/user_webdavauth.po
-source_file = templates/user_webdavauth.pot
-source_lang = en
-type = PO
-
diff --git a/l10n/rm-old.sh b/l10n/rm-old.sh
index 30e4509db25..e5e1348014b 100644
--- a/l10n/rm-old.sh
+++ b/l10n/rm-old.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
lang=(ach ady af_ZA ak am_ET ar ast az bal be bg_BG bn_BD bn_IN bs ca cs_CZ cy_GB da de de_AT de_DE el en_GB en@pirate eo es es_AR es_CL es_MX et_EE eu fa fi_FI fil fr fy_NL gl gu he hi hr hu_HU hy ia id io is it ja jv ka_GE km kn ko ku_IQ la lb lo lt_LT lv mg mk ml ml_IN mn mr ms_MY mt_MT my_MM nb_NO nds ne nl nn_NO nqo oc or_IN pa pl pt_BR pt_PT ro ru si_LK sk_SK sl sq sr sr@latin su sv sw_KE ta_IN ta_LK te tg_TJ th_TH tl_PH tr tzl tzm ug uk ur_PK uz vi yo zh_CN zh_HK zh_TW)
diff --git a/lib/base.php b/lib/base.php
index 3624a3fbaf9..889801f9653 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -237,7 +237,7 @@ class OC {
// Check if config is writable
$configFileWritable = is_writable($configFilePath);
if (!$configFileWritable && !OC_Helper::isReadOnlyConfigEnabled()
- || !$configFileWritable && \OCP\Util::needUpgrade()) {
+ || !$configFileWritable && self::checkUpgrade(false)) {
if (self::$CLI) {
echo $l->t('Cannot write into "config" directory!')."\n";
echo $l->t('This can usually be fixed by giving the webserver write access to the config directory')."\n";
@@ -376,63 +376,6 @@ class OC {
$tmpl->printPage();
}
- public static function initTemplateEngine() {
- // Add the stuff we need always
- // following logic will import all vendor libraries that are
- // specified in core/js/core.json
- $fileContent = file_get_contents(OC::$SERVERROOT . '/core/js/core.json');
- if($fileContent !== false) {
- $coreDependencies = json_decode($fileContent, true);
- foreach($coreDependencies['vendor'] as $vendorLibrary) {
- // remove trailing ".js" as addVendorScript will append it
- OC_Util::addVendorScript(
- substr($vendorLibrary, 0, strlen($vendorLibrary) - 3));
- }
- } else {
- throw new \Exception('Cannot read core/js/core.json');
- }
-
- OC_Util::addScript("placeholders");
- OC_Util::addScript("compatibility");
- OC_Util::addScript("jquery.ocdialog");
- OC_Util::addScript("oc-dialogs");
- OC_Util::addScript("js");
- OC_Util::addScript("l10n");
- OC_Util::addTranslations("core");
- OC_Util::addScript("octemplate");
- OC_Util::addScript("eventsource");
- OC_Util::addScript("config");
- OC_Util::addScript('search', 'search');
- OC_Util::addScript("oc-requesttoken");
- OC_Util::addScript("apps");
- OC_Util::addScript('mimetype');
- OC_Util::addScript('mimetypelist');
- OC_Util::addVendorScript('snapjs/dist/latest/snap');
- OC_Util::addVendorScript('core', 'backbone/backbone');
- OC_Util::addScript('oc-backbone');
-
- // avatars
- if (\OC::$server->getSystemConfig()->getValue('enable_avatars', true) === true) {
- \OC_Util::addScript('placeholder');
- \OC_Util::addVendorScript('blueimp-md5/js/md5');
- \OC_Util::addScript('jquery.avatar');
- \OC_Util::addScript('avatar');
- }
-
- OC_Util::addStyle("styles");
- OC_Util::addStyle("header");
- OC_Util::addStyle("mobile");
- OC_Util::addStyle("icons");
- OC_Util::addStyle("fonts");
- OC_Util::addStyle("apps");
- OC_Util::addStyle("fixes");
- OC_Util::addStyle("multiselect");
- OC_Util::addVendorStyle('jquery-ui/themes/base/jquery-ui');
- OC_Util::addStyle('jquery-ui-fixes');
- OC_Util::addStyle("tooltip");
- OC_Util::addStyle("jquery.ocdialog");
- }
-
public static function initSession() {
// prevents javascript from accessing php session cookies
ini_set('session.cookie_httponly', true);
@@ -611,7 +554,6 @@ class OC {
self::initSession();
}
\OC::$server->getEventLogger()->end('init_session');
- self::initTemplateEngine();
self::checkConfig();
self::checkInstalled();
@@ -673,7 +615,7 @@ class OC {
self::registerFilesystemHooks();
if ($systemConfig->getValue('enable_previews', true)) {
self::registerPreviewHooks();
- }
+ }
self::registerShareHooks();
self::registerLogRotate();
self::registerLocalAddressBook();
@@ -686,12 +628,6 @@ class OC {
$lockProvider = \OC::$server->getLockingProvider();
register_shutdown_function(array($lockProvider, 'releaseAll'));
- if ($systemConfig->getValue('installed', false) && !self::checkUpgrade(false)) {
- if (\OC::$server->getConfig()->getAppValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') {
- OC_Util::addScript('backgroundjobs');
- }
- }
-
// Check whether the sample configuration has been copied
if($systemConfig->getValue('copied_sample_config', false)) {
$l = \OC::$server->getL10N('lib');
@@ -742,7 +678,7 @@ class OC {
*/
public static function registerCacheHooks() {
//don't try to do this before we are properly setup
- if (\OC::$server->getSystemConfig()->getValue('installed', false) && !\OCP\Util::needUpgrade()) {
+ if (\OC::$server->getSystemConfig()->getValue('installed', false) && !self::checkUpgrade(false)) {
// NOTE: This will be replaced to use OCP
$userSession = self::$server->getUserSession();
@@ -778,7 +714,7 @@ class OC {
*/
public static function registerLogRotate() {
$systemConfig = \OC::$server->getSystemConfig();
- if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !\OCP\Util::needUpgrade()) {
+ if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) {
//don't try to do this before we are properly setup
//use custom logfile path if defined, otherwise use default of owncloud.log in data directory
\OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/owncloud.log'));
@@ -803,8 +739,9 @@ class OC {
OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete');
OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete');
OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files');
- OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete');
+ OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions');
OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
+ OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions');
}
/**
@@ -870,8 +807,7 @@ class OC {
// Load minimum set of apps
if (!self::checkUpgrade(false)
- && !$systemConfig->getValue('maintenance', false)
- && !\OCP\Util::needUpgrade()) {
+ && !$systemConfig->getValue('maintenance', false)) {
// For logged-in users: Load everything
if(OC_User::isLoggedIn()) {
OC_App::loadApps();
@@ -884,7 +820,7 @@ class OC {
if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) {
try {
- if (!$systemConfig->getValue('maintenance', false) && !\OCP\Util::needUpgrade()) {
+ if (!$systemConfig->getValue('maintenance', false) && !self::checkUpgrade(false)) {
OC_App::loadApps(array('filesystem', 'logging'));
OC_App::loadApps();
}
diff --git a/lib/l10n/af_ZA.js b/lib/l10n/af_ZA.js
index 05dad16ea68..fbd3c49ad44 100644
--- a/lib/l10n/af_ZA.js
+++ b/lib/l10n/af_ZA.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"today" : "vandag",
"seconds ago" : "sekondes gelede",
"web services under your control" : "webdienste onder jou beheer",
- "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate."
+ "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate.",
+ "Apps" : "Toepassings"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/af_ZA.json b/lib/l10n/af_ZA.json
index dcf24d58fd6..a17cac172e7 100644
--- a/lib/l10n/af_ZA.json
+++ b/lib/l10n/af_ZA.json
@@ -8,6 +8,7 @@
"today" : "vandag",
"seconds ago" : "sekondes gelede",
"web services under your control" : "webdienste onder jou beheer",
- "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate."
+ "For the best results, please consider using a GNU/Linux server instead." : "Oorweeg die gebruik van 'n GNU/Linux bediener vir die beste resultate.",
+ "Apps" : "Toepassings"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js
index 9ec243672e1..e4cc5ca2131 100644
--- a/lib/l10n/ar.js
+++ b/lib/l10n/ar.js
@@ -37,6 +37,7 @@ OC.L10N.register(
"Set an admin password." : "اعداد كلمة مرور للمدير",
"%s shared »%s« with you" : "%s شارك »%s« معك",
"Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"",
+ "Apps" : "التطبيقات",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
"A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة"
},
diff --git a/lib/l10n/ar.json b/lib/l10n/ar.json
index 06d47dc255a..2e6a83fd969 100644
--- a/lib/l10n/ar.json
+++ b/lib/l10n/ar.json
@@ -35,6 +35,7 @@
"Set an admin password." : "اعداد كلمة مرور للمدير",
"%s shared »%s« with you" : "%s شارك »%s« معك",
"Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"",
+ "Apps" : "التطبيقات",
"A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح",
"A valid password must be provided" : "يجب ادخال كلمة مرور صحيحة"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
diff --git a/lib/l10n/ast.js b/lib/l10n/ast.js
index 3fb120b255b..0cb8e5b8cea 100644
--- a/lib/l10n/ast.js
+++ b/lib/l10n/ast.js
@@ -82,6 +82,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartir %s falló porque'l motor compartíu pa %s podría nun atopar el so orixe",
"Sharing %s failed, because the file could not be found in the file cache" : "Compartir %s falló, yá que'l ficheru nun pudo atopase na caché de ficheru",
"Could not find category \"%s\"" : "Nun pudo alcontrase la estaya \"%s.\"",
+ "Apps" : "Aplicaciones",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Namái tan permitíos los siguientes caráuteres nun nome d'usuariu: \"a-z\", \"A-Z\", \"0-9\", y \"_.@-\"",
"A valid username must be provided" : "Tien d'apurrise un nome d'usuariu válidu",
"A valid password must be provided" : "Tien d'apurrise una contraseña válida",
diff --git a/lib/l10n/ast.json b/lib/l10n/ast.json
index f51d08ad731..f0337d043ed 100644
--- a/lib/l10n/ast.json
+++ b/lib/l10n/ast.json
@@ -80,6 +80,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartir %s falló porque'l motor compartíu pa %s podría nun atopar el so orixe",
"Sharing %s failed, because the file could not be found in the file cache" : "Compartir %s falló, yá que'l ficheru nun pudo atopase na caché de ficheru",
"Could not find category \"%s\"" : "Nun pudo alcontrase la estaya \"%s.\"",
+ "Apps" : "Aplicaciones",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Namái tan permitíos los siguientes caráuteres nun nome d'usuariu: \"a-z\", \"A-Z\", \"0-9\", y \"_.@-\"",
"A valid username must be provided" : "Tien d'apurrise un nome d'usuariu válidu",
"A valid password must be provided" : "Tien d'apurrise una contraseña válida",
diff --git a/lib/l10n/bg_BG.js b/lib/l10n/bg_BG.js
index a02d35061ef..2130ba8dec3 100644
--- a/lib/l10n/bg_BG.js
+++ b/lib/l10n/bg_BG.js
@@ -92,6 +92,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.",
"Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.",
"Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".",
+ "Apps" : "Приложения",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само следните символи са разрешени в потребителското име: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\".",
"A valid username must be provided" : "Валидно потребителско име трябва да бъде зададено.",
"A valid password must be provided" : "Валидна парола трябва да бъде зададена.",
diff --git a/lib/l10n/bg_BG.json b/lib/l10n/bg_BG.json
index 3b9b899e53f..3567c069218 100644
--- a/lib/l10n/bg_BG.json
+++ b/lib/l10n/bg_BG.json
@@ -90,6 +90,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.",
"Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.",
"Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".",
+ "Apps" : "Приложения",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само следните символи са разрешени в потребителското име: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\".",
"A valid username must be provided" : "Валидно потребителско име трябва да бъде зададено.",
"A valid password must be provided" : "Валидна парола трябва да бъде зададена.",
diff --git a/lib/l10n/bn_BD.js b/lib/l10n/bn_BD.js
index 3ebf53a2240..f9a899ba5df 100644
--- a/lib/l10n/bn_BD.js
+++ b/lib/l10n/bn_BD.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Unknown user" : "অপরিচিত ব্যবহারকারী",
"%s shared »%s« with you" : "%s আপনার সাথে »%s« ভাগাভাগি করেছে",
"Sharing %s failed, because the file does not exist" : "%s ভাগাভাগি ব্যার্থ, কারণ ফাইলটি নেই",
- "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা"
+ "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা",
+ "Apps" : "অ্যাপ"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/bn_BD.json b/lib/l10n/bn_BD.json
index 47e4311939a..2c384053014 100644
--- a/lib/l10n/bn_BD.json
+++ b/lib/l10n/bn_BD.json
@@ -31,6 +31,7 @@
"Unknown user" : "অপরিচিত ব্যবহারকারী",
"%s shared »%s« with you" : "%s আপনার সাথে »%s« ভাগাভাগি করেছে",
"Sharing %s failed, because the file does not exist" : "%s ভাগাভাগি ব্যার্থ, কারণ ফাইলটি নেই",
- "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা"
+ "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা",
+ "Apps" : "অ্যাপ"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/bs.js b/lib/l10n/bs.js
index 004d5cd2aac..b4fccf12d5d 100644
--- a/lib/l10n/bs.js
+++ b/lib/l10n/bs.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Authentication error" : "Grešna autentifikacije",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s na ovoj platformi neće raditi kako treba. Korištenje na vlastiti rizik!",
"For the best results, please consider using a GNU/Linux server instead." : "Umjesto toga, za najbolje rezultate, molimo razmislite o mogućnosti korištenje GNU/Linux servera.",
+ "Apps" : "Aplikacije",
"A valid username must be provided" : "Nužno je navesti valjano korisničko ime",
"A valid password must be provided" : "Nužno je navesti valjanu lozinku",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Uzrok tome je vjerojatno neki ubrzivač predmemorisanja kao što je Zend OPcache ili eAccelerator."
diff --git a/lib/l10n/bs.json b/lib/l10n/bs.json
index f4da9911f97..e9514de8275 100644
--- a/lib/l10n/bs.json
+++ b/lib/l10n/bs.json
@@ -9,6 +9,7 @@
"Authentication error" : "Grešna autentifikacije",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s na ovoj platformi neće raditi kako treba. Korištenje na vlastiti rizik!",
"For the best results, please consider using a GNU/Linux server instead." : "Umjesto toga, za najbolje rezultate, molimo razmislite o mogućnosti korištenje GNU/Linux servera.",
+ "Apps" : "Aplikacije",
"A valid username must be provided" : "Nužno je navesti valjano korisničko ime",
"A valid password must be provided" : "Nužno je navesti valjanu lozinku",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Uzrok tome je vjerojatno neki ubrzivač predmemorisanja kao što je Zend OPcache ili eAccelerator."
diff --git a/lib/l10n/ca.js b/lib/l10n/ca.js
index 1a2b29e088b..30e011b3036 100644
--- a/lib/l10n/ca.js
+++ b/lib/l10n/ca.js
@@ -80,6 +80,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Ha fallat en compartir %s, perquè el rerefons de compartir per %s no pot trobar la seva font",
"Sharing %s failed, because the file could not be found in the file cache" : "Ha fallat en compartir %s, perquè el fitxer no s'ha trobat en el fitxer cau",
"Could not find category \"%s\"" : "No s'ha trobat la categoria \"%s\"",
+ "Apps" : "Aplicacions",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Només els caràcters següents estan permesos en el nom d'usuari: \"a-z\", \"A-Z\", \"0-9\" i \"_.@-\"",
"A valid username must be provided" : "Heu de facilitar un nom d'usuari vàlid",
"A valid password must be provided" : "Heu de facilitar una contrasenya vàlida",
diff --git a/lib/l10n/ca.json b/lib/l10n/ca.json
index 2fac46f86a0..3cfbae48e43 100644
--- a/lib/l10n/ca.json
+++ b/lib/l10n/ca.json
@@ -78,6 +78,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Ha fallat en compartir %s, perquè el rerefons de compartir per %s no pot trobar la seva font",
"Sharing %s failed, because the file could not be found in the file cache" : "Ha fallat en compartir %s, perquè el fitxer no s'ha trobat en el fitxer cau",
"Could not find category \"%s\"" : "No s'ha trobat la categoria \"%s\"",
+ "Apps" : "Aplicacions",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Només els caràcters següents estan permesos en el nom d'usuari: \"a-z\", \"A-Z\", \"0-9\" i \"_.@-\"",
"A valid username must be provided" : "Heu de facilitar un nom d'usuari vàlid",
"A valid password must be provided" : "Heu de facilitar una contrasenya vàlida",
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index 65ff43b4f23..344e36688c2 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sdílení položky %s selhalo, protože úložiště sdílení %s nenalezla zdroj",
"Sharing %s failed, because the file could not be found in the file cache" : "Sdílení položky %s selhalo, protože soubor nebyl nalezen ve vyrovnávací paměti",
"Could not find category \"%s\"" : "Nelze nalézt kategorii \"%s\"",
+ "Apps" : "Aplikace",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Pouze následující znaky jsou povoleny v uživatelském jménu: \"a-z\", \"A-Z\", \"0-9\" a \"_.@-\"",
"A valid username must be provided" : "Musíte zadat platné uživatelské jméno",
"A valid password must be provided" : "Musíte zadat platné heslo",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index 501210dd0f8..949bb0aa2f6 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sdílení položky %s selhalo, protože úložiště sdílení %s nenalezla zdroj",
"Sharing %s failed, because the file could not be found in the file cache" : "Sdílení položky %s selhalo, protože soubor nebyl nalezen ve vyrovnávací paměti",
"Could not find category \"%s\"" : "Nelze nalézt kategorii \"%s\"",
+ "Apps" : "Aplikace",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Pouze následující znaky jsou povoleny v uživatelském jménu: \"a-z\", \"A-Z\", \"0-9\" a \"_.@-\"",
"A valid username must be provided" : "Musíte zadat platné uživatelské jméno",
"A valid password must be provided" : "Musíte zadat platné heslo",
diff --git a/lib/l10n/cy_GB.js b/lib/l10n/cy_GB.js
index 851e37b43ae..fde170d5994 100644
--- a/lib/l10n/cy_GB.js
+++ b/lib/l10n/cy_GB.js
@@ -25,6 +25,7 @@ OC.L10N.register(
"PostgreSQL username and/or password not valid" : "Enw a/neu gyfrinair PostgreSQL annilys",
"Set an admin username." : "Creu enw defnyddiwr i'r gweinyddwr.",
"Set an admin password." : "Gosod cyfrinair y gweinyddwr.",
- "Could not find category \"%s\"" : "Methu canfod categori \"%s\""
+ "Could not find category \"%s\"" : "Methu canfod categori \"%s\"",
+ "Apps" : "Pecynnau"
},
"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/lib/l10n/cy_GB.json b/lib/l10n/cy_GB.json
index 2088b3c2f9d..48422c82c56 100644
--- a/lib/l10n/cy_GB.json
+++ b/lib/l10n/cy_GB.json
@@ -23,6 +23,7 @@
"PostgreSQL username and/or password not valid" : "Enw a/neu gyfrinair PostgreSQL annilys",
"Set an admin username." : "Creu enw defnyddiwr i'r gweinyddwr.",
"Set an admin password." : "Gosod cyfrinair y gweinyddwr.",
- "Could not find category \"%s\"" : "Methu canfod categori \"%s\""
+ "Could not find category \"%s\"" : "Methu canfod categori \"%s\"",
+ "Apps" : "Pecynnau"
},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
} \ No newline at end of file
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index 285e9ac55d1..147006e1a19 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling af %s mislykkedes, fordi back-enden ikke kunne finde kilden til %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Deling af %s mislykkedes, fordi filen ikke kunne findes i fil-cachen",
"Could not find category \"%s\"" : "Kunne ikke finde kategorien \"%s\"",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Det er kun tilladt at benytte følgene karakterer i et brugernavn \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Et gyldigt brugernavn skal angives",
"A valid password must be provided" : "En gyldig adgangskode skal angives",
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index 1b9ed304596..46d4c446945 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling af %s mislykkedes, fordi back-enden ikke kunne finde kilden til %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Deling af %s mislykkedes, fordi filen ikke kunne findes i fil-cachen",
"Could not find category \"%s\"" : "Kunne ikke finde kategorien \"%s\"",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Det er kun tilladt at benytte følgene karakterer i et brugernavn \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Et gyldigt brugernavn skal angives",
"A valid password must be provided" : "En gyldig adgangskode skal angives",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index f4341e53b4d..9bb0ecab0ca 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte",
"Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte",
"Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 18dbd51317e..eccfbe94469 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -108,6 +108,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte",
"Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte",
"Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index 9eda034348f..41e20324a15 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte",
"Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte",
"Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 9a9b4341a56..fa64ef0f144 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -108,6 +108,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Freigabe von %s fehlgeschlagen, da das Freigabe-Backend für %s nicht in dieser Quelle gefunden werden konnte",
"Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte",
"Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“ und „_.@-“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
diff --git a/lib/l10n/el.js b/lib/l10n/el.js
index ee9ad8efd42..bfe49afdcc4 100644
--- a/lib/l10n/el.js
+++ b/lib/l10n/el.js
@@ -109,6 +109,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν ήταν δυνατό να εντοπίσει την πηγή το σύστημα διαμοιρασμού για το %s ",
"Sharing %s failed, because the file could not be found in the file cache" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση αρχείων",
"Could not find category \"%s\"" : "Αδυναμία εύρεσης κατηγορίας \"%s\"",
+ "Apps" : "Εφαρμογές",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Μόνο οι παρακάτων χαρακτήρες επιτρέπονται σε ένα όνομα χρήστη: \"a-z\", \"A-Z\", \"0-9\" και \"_.@-\"",
"A valid username must be provided" : "Πρέπει να δοθεί έγκυρο όνομα χρήστη",
"A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό",
diff --git a/lib/l10n/el.json b/lib/l10n/el.json
index d0235598f7e..1a9f884d322 100644
--- a/lib/l10n/el.json
+++ b/lib/l10n/el.json
@@ -107,6 +107,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν ήταν δυνατό να εντοπίσει την πηγή το σύστημα διαμοιρασμού για το %s ",
"Sharing %s failed, because the file could not be found in the file cache" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση αρχείων",
"Could not find category \"%s\"" : "Αδυναμία εύρεσης κατηγορίας \"%s\"",
+ "Apps" : "Εφαρμογές",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Μόνο οι παρακάτων χαρακτήρες επιτρέπονται σε ένα όνομα χρήστη: \"a-z\", \"A-Z\", \"0-9\" και \"_.@-\"",
"A valid username must be provided" : "Πρέπει να δοθεί έγκυρο όνομα χρήστη",
"A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό",
diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js
index 0e252700f5a..c6f2c724a69 100644
--- a/lib/l10n/en_GB.js
+++ b/lib/l10n/en_GB.js
@@ -106,6 +106,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sharing %s failed, because the sharing backend for %s could not find its source",
"Sharing %s failed, because the file could not be found in the file cache" : "Sharing %s failed, because the file could not be found in the file cache",
"Could not find category \"%s\"" : "Could not find category \"%s\"",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "A valid username must be provided",
"A valid password must be provided" : "A valid password must be provided",
diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json
index 9c57df59762..0d26da686f5 100644
--- a/lib/l10n/en_GB.json
+++ b/lib/l10n/en_GB.json
@@ -104,6 +104,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Sharing %s failed, because the sharing backend for %s could not find its source",
"Sharing %s failed, because the file could not be found in the file cache" : "Sharing %s failed, because the file could not be found in the file cache",
"Could not find category \"%s\"" : "Could not find category \"%s\"",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "A valid username must be provided",
"A valid password must be provided" : "A valid password must be provided",
diff --git a/lib/l10n/eo.js b/lib/l10n/eo.js
index df94b174599..08c656fc70a 100644
--- a/lib/l10n/eo.js
+++ b/lib/l10n/eo.js
@@ -58,6 +58,7 @@ OC.L10N.register(
"Sharing %s failed, because the user %s is the original sharer" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s estas la origina kunhaviginto",
"Sharing %s failed, because resharing is not allowed" : "Kunhavigo de %s malsukcesis, ĉar rekunhavigo ne permesatas",
"Could not find category \"%s\"" : "Ne troviĝis kategorio “%s”",
+ "Apps" : "Aplikaĵoj",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Nur la jenaj signoj permesatas en uzantonomo: «a-z», «A-Z», «0-9» kaj «_.@-»",
"A valid username must be provided" : "Valida uzantonomo devas proviziĝi",
"A valid password must be provided" : "Valida pasvorto devas proviziĝi",
diff --git a/lib/l10n/eo.json b/lib/l10n/eo.json
index 8140c421d57..c43e3c7f8fd 100644
--- a/lib/l10n/eo.json
+++ b/lib/l10n/eo.json
@@ -56,6 +56,7 @@
"Sharing %s failed, because the user %s is the original sharer" : "Kunhavigo de %s malsukcesis, ĉar la uzanto %s estas la origina kunhaviginto",
"Sharing %s failed, because resharing is not allowed" : "Kunhavigo de %s malsukcesis, ĉar rekunhavigo ne permesatas",
"Could not find category \"%s\"" : "Ne troviĝis kategorio “%s”",
+ "Apps" : "Aplikaĵoj",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Nur la jenaj signoj permesatas en uzantonomo: «a-z», «A-Z», «0-9» kaj «_.@-»",
"A valid username must be provided" : "Valida uzantonomo devas proviziĝi",
"A valid password must be provided" : "Valida pasvorto devas proviziĝi",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 3f1d751fc1e..21360d673f4 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Se ha fallado al compartir %s porque el motor compartido para %s podría no encontrar su origen",
"Sharing %s failed, because the file could not be found in the file cache" : "Se ha fallado al compartir %s, ya que el archivo no pudo ser encontrado en el cache de archivo",
"Could not find category \"%s\"" : "No puede encontrar la categoría \"%s\"",
+ "Apps" : "Aplicaciones",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo los siguientes caracteres están permitidos en un nombre de usuario: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido",
"A valid password must be provided" : "Se debe proporcionar una contraseña válida",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 75b8060b819..185b178baa8 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Se ha fallado al compartir %s porque el motor compartido para %s podría no encontrar su origen",
"Sharing %s failed, because the file could not be found in the file cache" : "Se ha fallado al compartir %s, ya que el archivo no pudo ser encontrado en el cache de archivo",
"Could not find category \"%s\"" : "No puede encontrar la categoría \"%s\"",
+ "Apps" : "Aplicaciones",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo los siguientes caracteres están permitidos en un nombre de usuario: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido",
"A valid password must be provided" : "Se debe proporcionar una contraseña válida",
diff --git a/lib/l10n/es_AR.js b/lib/l10n/es_AR.js
index 572933980cb..58c5f473851 100644
--- a/lib/l10n/es_AR.js
+++ b/lib/l10n/es_AR.js
@@ -46,6 +46,7 @@ OC.L10N.register(
"Set an admin password." : "Configurar una contraseña de administrador.",
"%s shared »%s« with you" : "%s compartió \"%s\" con vos",
"Could not find category \"%s\"" : "No fue posible encontrar la categoría \"%s\"",
+ "Apps" : "Apps",
"A valid username must be provided" : "Debe ingresar un nombre de usuario válido",
"A valid password must be provided" : "Debe ingresar una contraseña válida"
},
diff --git a/lib/l10n/es_AR.json b/lib/l10n/es_AR.json
index 9a459d7117d..605aecb1ab1 100644
--- a/lib/l10n/es_AR.json
+++ b/lib/l10n/es_AR.json
@@ -44,6 +44,7 @@
"Set an admin password." : "Configurar una contraseña de administrador.",
"%s shared »%s« with you" : "%s compartió \"%s\" con vos",
"Could not find category \"%s\"" : "No fue posible encontrar la categoría \"%s\"",
+ "Apps" : "Apps",
"A valid username must be provided" : "Debe ingresar un nombre de usuario válido",
"A valid password must be provided" : "Debe ingresar una contraseña válida"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/lib/l10n/es_MX.js b/lib/l10n/es_MX.js
index 253b5fce3ab..b9cbf96c7af 100644
--- a/lib/l10n/es_MX.js
+++ b/lib/l10n/es_MX.js
@@ -52,6 +52,7 @@ OC.L10N.register(
"Set an admin password." : "Configurar la contraseña del administrador.",
"%s shared »%s« with you" : "%s ha compartido »%s« contigo",
"Could not find category \"%s\"" : "No puede encontrar la categoria \"%s\"",
+ "Apps" : "Aplicaciones",
"A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido",
"A valid password must be provided" : "Se debe proporcionar una contraseña válida"
},
diff --git a/lib/l10n/es_MX.json b/lib/l10n/es_MX.json
index 0bd876d2e70..53db7b10151 100644
--- a/lib/l10n/es_MX.json
+++ b/lib/l10n/es_MX.json
@@ -50,6 +50,7 @@
"Set an admin password." : "Configurar la contraseña del administrador.",
"%s shared »%s« with you" : "%s ha compartido »%s« contigo",
"Could not find category \"%s\"" : "No puede encontrar la categoria \"%s\"",
+ "Apps" : "Aplicaciones",
"A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido",
"A valid password must be provided" : "Se debe proporcionar una contraseña válida"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js
index 9ab86b3a415..c821776dfe9 100644
--- a/lib/l10n/et_EE.js
+++ b/lib/l10n/et_EE.js
@@ -93,6 +93,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s jagamine ebaõnnestus, kuna jagamise tagarakend ei suutnud leida %s jaoks lähteallikat",
"Sharing %s failed, because the file could not be found in the file cache" : "%s jagamine ebaõnnestus, kuna faili ei suudetud leida failide puhvrist",
"Could not find category \"%s\"" : "Ei leia kategooriat \"%s\"",
+ "Apps" : "Rakendused",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kasutajanimes on lubatud ainult järgnevad tähemärgid: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"",
"A valid username must be provided" : "Sisesta nõuetele vastav kasutajatunnus",
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json
index acbb36fe431..9ab7cd7e2ac 100644
--- a/lib/l10n/et_EE.json
+++ b/lib/l10n/et_EE.json
@@ -91,6 +91,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s jagamine ebaõnnestus, kuna jagamise tagarakend ei suutnud leida %s jaoks lähteallikat",
"Sharing %s failed, because the file could not be found in the file cache" : "%s jagamine ebaõnnestus, kuna faili ei suudetud leida failide puhvrist",
"Could not find category \"%s\"" : "Ei leia kategooriat \"%s\"",
+ "Apps" : "Rakendused",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kasutajanimes on lubatud ainult järgnevad tähemärgid: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"",
"A valid username must be provided" : "Sisesta nõuetele vastav kasutajatunnus",
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index 6bf5d8f0315..b15c4796026 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -94,6 +94,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s elkarbanatzeak huts egin du, %sren elkarbanaketa motorrak bere iturria aurkitu ezin duelako",
"Sharing %s failed, because the file could not be found in the file cache" : "%s elkarbanatzeak huts egin du, fitxategia katxean aurkitu ez delako",
"Could not find category \"%s\"" : "Ezin da \"%s\" kategoria aurkitu",
+ "Apps" : "Aplikazioak",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bakarrik hurrengo karaketerak onartzen dira erabiltzaile izenean: \"a-z\", \"A-Z\", \"0-9\", eta \"_.@-\"",
"A valid username must be provided" : "Baliozko erabiltzaile izena eman behar da",
"A valid password must be provided" : "Baliozko pasahitza eman behar da",
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index 2f9c4033615..a95d3d5cdcf 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -92,6 +92,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s elkarbanatzeak huts egin du, %sren elkarbanaketa motorrak bere iturria aurkitu ezin duelako",
"Sharing %s failed, because the file could not be found in the file cache" : "%s elkarbanatzeak huts egin du, fitxategia katxean aurkitu ez delako",
"Could not find category \"%s\"" : "Ezin da \"%s\" kategoria aurkitu",
+ "Apps" : "Aplikazioak",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bakarrik hurrengo karaketerak onartzen dira erabiltzaile izenean: \"a-z\", \"A-Z\", \"0-9\", eta \"_.@-\"",
"A valid username must be provided" : "Baliozko erabiltzaile izena eman behar da",
"A valid password must be provided" : "Baliozko pasahitza eman behar da",
diff --git a/lib/l10n/fa.js b/lib/l10n/fa.js
index 8e3a0c6071f..70e368549d5 100644
--- a/lib/l10n/fa.js
+++ b/lib/l10n/fa.js
@@ -33,6 +33,7 @@ OC.L10N.register(
"Set an admin password." : "یک رمزعبور برای مدیر تنظیم نمایید.",
"%s shared »%s« with you" : "%s به اشتراک گذاشته شده است »%s« توسط شما",
"Could not find category \"%s\"" : "دسته بندی %s یافت نشد",
+ "Apps" : " برنامه ها",
"A valid username must be provided" : "نام کاربری صحیح باید وارد شود",
"A valid password must be provided" : "رمز عبور صحیح باید وارد شود"
},
diff --git a/lib/l10n/fa.json b/lib/l10n/fa.json
index f434f6517af..45ed8d33832 100644
--- a/lib/l10n/fa.json
+++ b/lib/l10n/fa.json
@@ -31,6 +31,7 @@
"Set an admin password." : "یک رمزعبور برای مدیر تنظیم نمایید.",
"%s shared »%s« with you" : "%s به اشتراک گذاشته شده است »%s« توسط شما",
"Could not find category \"%s\"" : "دسته بندی %s یافت نشد",
+ "Apps" : " برنامه ها",
"A valid username must be provided" : "نام کاربری صحیح باید وارد شود",
"A valid password must be provided" : "رمز عبور صحیح باید وارد شود"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js
index 6960162e0ab..58f52023cf0 100644
--- a/lib/l10n/fi_FI.js
+++ b/lib/l10n/fi_FI.js
@@ -97,6 +97,7 @@ OC.L10N.register(
"Sharing %s failed, because resharing is not allowed" : "Kohteen %s jakaminen epäonnistui, koska jakaminen uudelleen ei ole sallittu",
"Sharing %s failed, because the file could not be found in the file cache" : "Kohteen %s jakaminen epäonnistui, koska tiedostoa ei löytynyt tiedostovälimuistista",
"Could not find category \"%s\"" : "Luokkaa \"%s\" ei löytynyt",
+ "Apps" : "Sovellukset",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Vain seuraavat merkit ovat sallittuja käyttäjätunnuksessa: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"",
"A valid username must be provided" : "Anna kelvollinen käyttäjätunnus",
"A valid password must be provided" : "Anna kelvollinen salasana",
diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json
index 7d23189b358..be0eed2a4ba 100644
--- a/lib/l10n/fi_FI.json
+++ b/lib/l10n/fi_FI.json
@@ -95,6 +95,7 @@
"Sharing %s failed, because resharing is not allowed" : "Kohteen %s jakaminen epäonnistui, koska jakaminen uudelleen ei ole sallittu",
"Sharing %s failed, because the file could not be found in the file cache" : "Kohteen %s jakaminen epäonnistui, koska tiedostoa ei löytynyt tiedostovälimuistista",
"Could not find category \"%s\"" : "Luokkaa \"%s\" ei löytynyt",
+ "Apps" : "Sovellukset",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Vain seuraavat merkit ovat sallittuja käyttäjätunnuksessa: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-\"",
"A valid username must be provided" : "Anna kelvollinen käyttäjätunnus",
"A valid password must be provided" : "Anna kelvollinen salasana",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index d0abd693e0c..a4692c268b4 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -111,6 +111,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Le partage de %s a échoué car la source n'a pas été trouvée pour le partage %s.",
"Sharing %s failed, because the file could not be found in the file cache" : "Le partage de %s a échoué car le fichier n'a pas été trouvé dans les fichiers mis en cache.",
"Could not find category \"%s\"" : "Impossible de trouver la catégorie \"%s\"",
+ "Apps" : "Applications",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", et \"_.@-\"",
"A valid username must be provided" : "Un nom d'utilisateur valide doit être saisi",
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index d0a90797df9..5ee807080cf 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -109,6 +109,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Le partage de %s a échoué car la source n'a pas été trouvée pour le partage %s.",
"Sharing %s failed, because the file could not be found in the file cache" : "Le partage de %s a échoué car le fichier n'a pas été trouvé dans les fichiers mis en cache.",
"Could not find category \"%s\"" : "Impossible de trouver la catégorie \"%s\"",
+ "Apps" : "Applications",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", et \"_.@-\"",
"A valid username must be provided" : "Un nom d'utilisateur valide doit être saisi",
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js
index bc2afd3f6e5..d3b8952a47b 100644
--- a/lib/l10n/gl.js
+++ b/lib/l10n/gl.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Fallou a compartición de %s, a infraestrutura de compartición para %s non foi quen de atopar a orixe",
"Sharing %s failed, because the file could not be found in the file cache" : "Fallou a compartición de %s, non foi posíbel atopar o ficheiro na caché de ficheiros",
"Could not find category \"%s\"" : "Non foi posíbel atopar a categoría «%s»",
+ "Apps" : "Aplicacións",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Só se permiten os seguintes caracteres no nome de usuario: «a-z», «A-Z», «0-9», e «_.@-»",
"A valid username must be provided" : "Debe fornecer un nome de usuario",
"A valid password must be provided" : "Debe fornecer un contrasinal",
diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json
index 9607f9fad18..f88b07d3671 100644
--- a/lib/l10n/gl.json
+++ b/lib/l10n/gl.json
@@ -108,6 +108,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Fallou a compartición de %s, a infraestrutura de compartición para %s non foi quen de atopar a orixe",
"Sharing %s failed, because the file could not be found in the file cache" : "Fallou a compartición de %s, non foi posíbel atopar o ficheiro na caché de ficheiros",
"Could not find category \"%s\"" : "Non foi posíbel atopar a categoría «%s»",
+ "Apps" : "Aplicacións",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Só se permiten os seguintes caracteres no nome de usuario: «a-z», «A-Z», «0-9», e «_.@-»",
"A valid username must be provided" : "Debe fornecer un nome de usuario",
"A valid password must be provided" : "Debe fornecer un contrasinal",
diff --git a/lib/l10n/he.js b/lib/l10n/he.js
index 33a67415541..66acae5b804 100644
--- a/lib/l10n/he.js
+++ b/lib/l10n/he.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Token expired. Please reload page." : "פג תוקף. נא לטעון שוב את הדף.",
"%s shared »%s« with you" : "%s שיתף/שיתפה איתך את »%s«",
"Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“",
+ "Apps" : "יישומים",
"A valid username must be provided" : "יש לספק שם משתמש תקני",
"A valid password must be provided" : "יש לספק ססמה תקנית"
},
diff --git a/lib/l10n/he.json b/lib/l10n/he.json
index a66c1f252c8..55df638cb11 100644
--- a/lib/l10n/he.json
+++ b/lib/l10n/he.json
@@ -14,6 +14,7 @@
"Token expired. Please reload page." : "פג תוקף. נא לטעון שוב את הדף.",
"%s shared »%s« with you" : "%s שיתף/שיתפה איתך את »%s«",
"Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“",
+ "Apps" : "יישומים",
"A valid username must be provided" : "יש לספק שם משתמש תקני",
"A valid password must be provided" : "יש לספק ססמה תקנית"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/lib/l10n/hi.js b/lib/l10n/hi.js
index fced66d581c..78defefb3b2 100644
--- a/lib/l10n/hi.js
+++ b/lib/l10n/hi.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Help" : "सहयोग",
"Personal" : "यक्तिगत",
- "Users" : "उपयोगकर्ता"
+ "Users" : "उपयोगकर्ता",
+ "Apps" : "Apps"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/hi.json b/lib/l10n/hi.json
index 8a77c13a367..90409d07975 100644
--- a/lib/l10n/hi.json
+++ b/lib/l10n/hi.json
@@ -1,6 +1,7 @@
{ "translations": {
"Help" : "सहयोग",
"Personal" : "यक्तिगत",
- "Users" : "उपयोगकर्ता"
+ "Users" : "उपयोगकर्ता",
+ "Apps" : "Apps"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/hr.js b/lib/l10n/hr.js
index 16ac6ff2821..6c012a8502b 100644
--- a/lib/l10n/hr.js
+++ b/lib/l10n/hr.js
@@ -87,6 +87,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Dijeljenje %s nije uspjelo jer pozadina za %s nije mogla pronaći svoj izvor",
"Sharing %s failed, because the file could not be found in the file cache" : "Dijeljenje %s nije uspjelo jer u predmemoriji datoteke datoteka nije nađena.",
"Could not find category \"%s\"" : "Kategorija \"%s\" nije nađena",
+ "Apps" : "Aplikacije",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Samo su sljedeći znakovi dopušteni u korisničkom imenu: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Nužno je navesti ispravno korisničko ime",
"A valid password must be provided" : "Nužno je navesti ispravnu lozinku",
diff --git a/lib/l10n/hr.json b/lib/l10n/hr.json
index 291e59261ba..50935c14742 100644
--- a/lib/l10n/hr.json
+++ b/lib/l10n/hr.json
@@ -85,6 +85,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Dijeljenje %s nije uspjelo jer pozadina za %s nije mogla pronaći svoj izvor",
"Sharing %s failed, because the file could not be found in the file cache" : "Dijeljenje %s nije uspjelo jer u predmemoriji datoteke datoteka nije nađena.",
"Could not find category \"%s\"" : "Kategorija \"%s\" nije nađena",
+ "Apps" : "Aplikacije",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Samo su sljedeći znakovi dopušteni u korisničkom imenu: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Nužno je navesti ispravno korisničko ime",
"A valid password must be provided" : "Nužno je navesti ispravnu lozinku",
diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js
index e7287ccd5a1..9835654f736 100644
--- a/lib/l10n/hu_HU.js
+++ b/lib/l10n/hu_HU.js
@@ -95,6 +95,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s megosztása nem sikerült, mert %s megosztási alrendszere nem találja",
"Sharing %s failed, because the file could not be found in the file cache" : "%s megosztása nem sikerült, mert a fájl nem található a gyorsítótárban",
"Could not find category \"%s\"" : "Ez a kategória nem található: \"%s\"",
+ "Apps" : "Alkalmazások",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "A felhasználónévben csak a következő karakterek fordulhatnak elő: \"a-z\", \"A-Z\", \"0-9\", és \"_.@-\"",
"A valid username must be provided" : "Érvényes felhasználónevet kell megadnia",
"A valid password must be provided" : "Érvényes jelszót kell megadnia",
diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json
index 8620c13e2ac..a01979d295e 100644
--- a/lib/l10n/hu_HU.json
+++ b/lib/l10n/hu_HU.json
@@ -93,6 +93,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s megosztása nem sikerült, mert %s megosztási alrendszere nem találja",
"Sharing %s failed, because the file could not be found in the file cache" : "%s megosztása nem sikerült, mert a fájl nem található a gyorsítótárban",
"Could not find category \"%s\"" : "Ez a kategória nem található: \"%s\"",
+ "Apps" : "Alkalmazások",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "A felhasználónévben csak a következő karakterek fordulhatnak elő: \"a-z\", \"A-Z\", \"0-9\", és \"_.@-\"",
"A valid username must be provided" : "Érvényes felhasználónevet kell megadnia",
"A valid password must be provided" : "Érvényes jelszót kell megadnia",
diff --git a/lib/l10n/ia.js b/lib/l10n/ia.js
index f24e9b44828..d251c690053 100644
--- a/lib/l10n/ia.js
+++ b/lib/l10n/ia.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"last year" : "ultime anno",
"seconds ago" : "secundas passate",
"web services under your control" : "servicios web sub tu controlo",
- "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux."
+ "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux.",
+ "Apps" : "Applicationes"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/ia.json b/lib/l10n/ia.json
index 21b6e68af21..e642869a055 100644
--- a/lib/l10n/ia.json
+++ b/lib/l10n/ia.json
@@ -11,6 +11,7 @@
"last year" : "ultime anno",
"seconds ago" : "secundas passate",
"web services under your control" : "servicios web sub tu controlo",
- "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux."
+ "For the best results, please consider using a GNU/Linux server instead." : "Pro le exitos melior, pro favor tu considera usar in loco un servitor GNU/Linux.",
+ "Apps" : "Applicationes"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/id.js b/lib/l10n/id.js
index 0de6a4124fb..7298ed8d13c 100644
--- a/lib/l10n/id.js
+++ b/lib/l10n/id.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Berbagi %s gagal, karena backend berbagi untuk %s tidak menemukan sumbernya",
"Sharing %s failed, because the file could not be found in the file cache" : "Gagal berbagi %s, karena berkas tidak ditemukan di berkas cache",
"Could not find category \"%s\"" : "Tidak menemukan kategori \"%s\"",
+ "Apps" : "Aplikasi",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Hanya karakter berikut yang diizinkan dalam nama pengguna: \"a-z\", \"A-Z\", \"0-9\", dan \"_.@-\"",
"A valid username must be provided" : "Tuliskan nama pengguna yang valid",
"A valid password must be provided" : "Tuliskan sandi yang valid",
diff --git a/lib/l10n/id.json b/lib/l10n/id.json
index e1b3a9f93b0..b44f23d776d 100644
--- a/lib/l10n/id.json
+++ b/lib/l10n/id.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Berbagi %s gagal, karena backend berbagi untuk %s tidak menemukan sumbernya",
"Sharing %s failed, because the file could not be found in the file cache" : "Gagal berbagi %s, karena berkas tidak ditemukan di berkas cache",
"Could not find category \"%s\"" : "Tidak menemukan kategori \"%s\"",
+ "Apps" : "Aplikasi",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Hanya karakter berikut yang diizinkan dalam nama pengguna: \"a-z\", \"A-Z\", \"0-9\", dan \"_.@-\"",
"A valid username must be provided" : "Tuliskan nama pengguna yang valid",
"A valid password must be provided" : "Tuliskan sandi yang valid",
diff --git a/lib/l10n/is.js b/lib/l10n/is.js
index 7661ee829fb..d2c3602e070 100644
--- a/lib/l10n/is.js
+++ b/lib/l10n/is.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Application is not enabled" : "Forrit ekki virkt",
"Authentication error" : "Villa við auðkenningu",
"Token expired. Please reload page." : "Auðkenning útrunnin. Vinsamlegast skráðu þig aftur inn.",
- "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\""
+ "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\"",
+ "Apps" : "Forrit"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/lib/l10n/is.json b/lib/l10n/is.json
index 81fec382eb3..100409a868b 100644
--- a/lib/l10n/is.json
+++ b/lib/l10n/is.json
@@ -14,6 +14,7 @@
"Application is not enabled" : "Forrit ekki virkt",
"Authentication error" : "Villa við auðkenningu",
"Token expired. Please reload page." : "Auðkenning útrunnin. Vinsamlegast skráðu þig aftur inn.",
- "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\""
+ "Could not find category \"%s\"" : "Fann ekki flokkinn \"%s\"",
+ "Apps" : "Forrit"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index d0cf725013b..229c210b604 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Condivisione di %s non riuscita, poiché il motore di condivisione per %s non riesce a trovare la sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "Condivisione di %s non riuscita, poiché il file non è stato trovato nella cache",
"Could not find category \"%s\"" : "Impossibile trovare la categoria \"%s\"",
+ "Apps" : "Applicazioni",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo i seguenti caratteri sono ammessi in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"",
"A valid username must be provided" : "Deve essere fornito un nome utente valido",
"A valid password must be provided" : "Deve essere fornita una password valida",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 81038c0e425..3e8a489b6a4 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Condivisione di %s non riuscita, poiché il motore di condivisione per %s non riesce a trovare la sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "Condivisione di %s non riuscita, poiché il file non è stato trovato nella cache",
"Could not find category \"%s\"" : "Impossibile trovare la categoria \"%s\"",
+ "Apps" : "Applicazioni",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Solo i seguenti caratteri sono ammessi in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"",
"A valid username must be provided" : "Deve essere fornito un nome utente valido",
"A valid password must be provided" : "Deve essere fornita una password valida",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index 20ad385491c..9154d1fbc4a 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s の共有に失敗しました。%s のバックエンド共有に必要なソースが見つかりませんでした。",
"Sharing %s failed, because the file could not be found in the file cache" : "%s の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。",
"Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした",
+ "Apps" : "アプリ",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "有効なユーザー名を指定する必要があります",
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index 0bb7269a52e..f88b11ad17e 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -108,6 +108,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s の共有に失敗しました。%s のバックエンド共有に必要なソースが見つかりませんでした。",
"Sharing %s failed, because the file could not be found in the file cache" : "%s の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。",
"Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした",
+ "Apps" : "アプリ",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "有効なユーザー名を指定する必要があります",
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
diff --git a/lib/l10n/ka_GE.js b/lib/l10n/ka_GE.js
index 1259cf83dbb..17833d8e0e3 100644
--- a/lib/l10n/ka_GE.js
+++ b/lib/l10n/ka_GE.js
@@ -26,6 +26,7 @@ OC.L10N.register(
"Set an admin username." : "დააყენეთ ადმინისტრატორის სახელი.",
"Set an admin password." : "დააყენეთ ადმინისტრატორის პაროლი.",
"Could not find category \"%s\"" : "\"%s\" კატეგორიის მოძებნა ვერ მოხერხდა",
+ "Apps" : "აპლიკაციები",
"A valid username must be provided" : "უნდა მიუთითოთ არსებული მომხმარებლის სახელი",
"A valid password must be provided" : "უნდა მიუთითოთ არსებული პაროლი"
},
diff --git a/lib/l10n/ka_GE.json b/lib/l10n/ka_GE.json
index d32642f460b..3a776d12a8c 100644
--- a/lib/l10n/ka_GE.json
+++ b/lib/l10n/ka_GE.json
@@ -24,6 +24,7 @@
"Set an admin username." : "დააყენეთ ადმინისტრატორის სახელი.",
"Set an admin password." : "დააყენეთ ადმინისტრატორის პაროლი.",
"Could not find category \"%s\"" : "\"%s\" კატეგორიის მოძებნა ვერ მოხერხდა",
+ "Apps" : "აპლიკაციები",
"A valid username must be provided" : "უნდა მიუთითოთ არსებული მომხმარებლის სახელი",
"A valid password must be provided" : "უნდა მიუთითოთ არსებული პაროლი"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/lib/l10n/km.js b/lib/l10n/km.js
index ad68233cf62..f6ba8acf62e 100644
--- a/lib/l10n/km.js
+++ b/lib/l10n/km.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Set an admin username." : "កំណត់​ឈ្មោះ​អ្នក​គ្រប់គ្រង។",
"Set an admin password." : "កំណត់​ពាក្យ​សម្ងាត់​អ្នក​គ្រប់គ្រង។",
"Could not find category \"%s\"" : "រក​មិន​ឃើញ​ចំណាត់​ក្រុម \"%s\"",
+ "Apps" : "កម្មវិធី",
"A valid username must be provided" : "ត្រូវ​ផ្ដល់​ឈ្មោះ​អ្នក​ប្រើ​ឲ្យ​បាន​ត្រឹម​ត្រូវ",
"A valid password must be provided" : "ត្រូវ​ផ្ដល់​ពាក្យ​សម្ងាត់​ឲ្យ​បាន​ត្រឹម​ត្រូវ"
},
diff --git a/lib/l10n/km.json b/lib/l10n/km.json
index 9133d012c1e..b5cbf81af33 100644
--- a/lib/l10n/km.json
+++ b/lib/l10n/km.json
@@ -29,6 +29,7 @@
"Set an admin username." : "កំណត់​ឈ្មោះ​អ្នក​គ្រប់គ្រង។",
"Set an admin password." : "កំណត់​ពាក្យ​សម្ងាត់​អ្នក​គ្រប់គ្រង។",
"Could not find category \"%s\"" : "រក​មិន​ឃើញ​ចំណាត់​ក្រុម \"%s\"",
+ "Apps" : "កម្មវិធី",
"A valid username must be provided" : "ត្រូវ​ផ្ដល់​ឈ្មោះ​អ្នក​ប្រើ​ឲ្យ​បាន​ត្រឹម​ត្រូវ",
"A valid password must be provided" : "ត្រូវ​ផ្ដល់​ពាក្យ​សម្ងាត់​ឲ្យ​បាន​ត្រឹម​ត្រូវ"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/lib/l10n/kn.js b/lib/l10n/kn.js
index 45814e840b7..52e00891931 100644
--- a/lib/l10n/kn.js
+++ b/lib/l10n/kn.js
@@ -9,6 +9,7 @@ OC.L10N.register(
"Unknown filetype" : "ಅಪರಿಚಿತ ಕಡತ ಮಾದರಿ",
"Invalid image" : "ಅಸಾಮರ್ಥ್ಯ ಚಿತ್ರ",
"Authentication error" : "ದೃಢೀಕರಣ ದೋಷ",
+ "Apps" : "ಕಾರ್ಯಕ್ರಮಗಳು",
"A valid username must be provided" : "ಮಾನ್ಯ ಬಳಕೆದಾರ ಹೆಸರು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ",
"A valid password must be provided" : "ಸರಿಯಾದ ಬಳಕೆದಾರ ಗುಪ್ತಪದ ಒದಗಿಸಬೇಕಾಗಿದೆ"
},
diff --git a/lib/l10n/kn.json b/lib/l10n/kn.json
index b7e51f7911b..9260fa8731b 100644
--- a/lib/l10n/kn.json
+++ b/lib/l10n/kn.json
@@ -7,6 +7,7 @@
"Unknown filetype" : "ಅಪರಿಚಿತ ಕಡತ ಮಾದರಿ",
"Invalid image" : "ಅಸಾಮರ್ಥ್ಯ ಚಿತ್ರ",
"Authentication error" : "ದೃಢೀಕರಣ ದೋಷ",
+ "Apps" : "ಕಾರ್ಯಕ್ರಮಗಳು",
"A valid username must be provided" : "ಮಾನ್ಯ ಬಳಕೆದಾರ ಹೆಸರು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ",
"A valid password must be provided" : "ಸರಿಯಾದ ಬಳಕೆದಾರ ಗುಪ್ತಪದ ಒದಗಿಸಬೇಕಾಗಿದೆ"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js
index bb143bdd527..f67ca37b5e0 100644
--- a/lib/l10n/ko.js
+++ b/lib/l10n/ko.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s을(를) 공유할 수 없습니다. %s의 공유 백엔드에서 원본 파일을 찾을 수 없습니다",
"Sharing %s failed, because the file could not be found in the file cache" : "%s을(를) 공유할 수 없습니다. 파일 캐시에서 찾을 수 없습니다",
"Could not find category \"%s\"" : "분류 \"%s\"을(를) 찾을 수 없습니다.",
+ "Apps" : "앱",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "사용자 이름에는 다음과 같은 문자만 사용할 수 있습니다: \"a-z\", \"A-Z\", \"0-9\", \"_.@-\"",
"A valid username must be provided" : "올바른 사용자 이름을 입력해야 합니다",
"A valid password must be provided" : "올바른 암호를 입력해야 합니다",
diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json
index 8fea07402ca..bf8069bf2d3 100644
--- a/lib/l10n/ko.json
+++ b/lib/l10n/ko.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s을(를) 공유할 수 없습니다. %s의 공유 백엔드에서 원본 파일을 찾을 수 없습니다",
"Sharing %s failed, because the file could not be found in the file cache" : "%s을(를) 공유할 수 없습니다. 파일 캐시에서 찾을 수 없습니다",
"Could not find category \"%s\"" : "분류 \"%s\"을(를) 찾을 수 없습니다.",
+ "Apps" : "앱",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "사용자 이름에는 다음과 같은 문자만 사용할 수 있습니다: \"a-z\", \"A-Z\", \"0-9\", \"_.@-\"",
"A valid username must be provided" : "올바른 사용자 이름을 입력해야 합니다",
"A valid password must be provided" : "올바른 암호를 입력해야 합니다",
diff --git a/lib/l10n/ku_IQ.js b/lib/l10n/ku_IQ.js
index b4c0566c13f..74bda86a316 100644
--- a/lib/l10n/ku_IQ.js
+++ b/lib/l10n/ku_IQ.js
@@ -4,6 +4,7 @@ OC.L10N.register(
"Help" : "یارمەتی",
"Users" : "به‌كارهێنه‌ر",
"Admin" : "به‌ڕێوه‌به‌ری سه‌ره‌كی",
- "web services under your control" : "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه"
+ "web services under your control" : "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه",
+ "Apps" : "به‌رنامه‌كان"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/ku_IQ.json b/lib/l10n/ku_IQ.json
index 119c33253f5..456018c1e54 100644
--- a/lib/l10n/ku_IQ.json
+++ b/lib/l10n/ku_IQ.json
@@ -2,6 +2,7 @@
"Help" : "یارمەتی",
"Users" : "به‌كارهێنه‌ر",
"Admin" : "به‌ڕێوه‌به‌ری سه‌ره‌كی",
- "web services under your control" : "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه"
+ "web services under your control" : "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه",
+ "Apps" : "به‌رنامه‌كان"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/lb.js b/lib/l10n/lb.js
index 0c884f98eea..3d7ae1a5aff 100644
--- a/lib/l10n/lb.js
+++ b/lib/l10n/lb.js
@@ -24,6 +24,7 @@ OC.L10N.register(
"web services under your control" : "Web-Servicer ënnert denger Kontroll",
"Authentication error" : "Authentifikatioun's Fehler",
"%s shared »%s« with you" : "Den/D' %s huet »%s« mat dir gedeelt",
+ "Apps" : "Applikatiounen",
"Data directory (%s) is invalid" : "Daten-Dossier (%s) ass ongëlteg"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/lb.json b/lib/l10n/lb.json
index 08057c7de24..8cd223acd9b 100644
--- a/lib/l10n/lb.json
+++ b/lib/l10n/lb.json
@@ -22,6 +22,7 @@
"web services under your control" : "Web-Servicer ënnert denger Kontroll",
"Authentication error" : "Authentifikatioun's Fehler",
"%s shared »%s« with you" : "Den/D' %s huet »%s« mat dir gedeelt",
+ "Apps" : "Applikatiounen",
"Data directory (%s) is invalid" : "Daten-Dossier (%s) ass ongëlteg"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/lt_LT.js b/lib/l10n/lt_LT.js
index e37141e9bef..47c5e4adba5 100644
--- a/lib/l10n/lt_LT.js
+++ b/lib/l10n/lt_LT.js
@@ -46,6 +46,7 @@ OC.L10N.register(
"Set an admin password." : "Nustatyti administratoriaus slaptažodį.",
"%s shared »%s« with you" : "%s pasidalino »%s« su tavimi",
"Could not find category \"%s\"" : "Nepavyko rasti kategorijos „%s“",
+ "Apps" : "Programos",
"A valid username must be provided" : "Vartotojo vardas turi būti tinkamas",
"A valid password must be provided" : "Slaptažodis turi būti tinkamas"
},
diff --git a/lib/l10n/lt_LT.json b/lib/l10n/lt_LT.json
index c823af258cd..ab7eabe5d22 100644
--- a/lib/l10n/lt_LT.json
+++ b/lib/l10n/lt_LT.json
@@ -44,6 +44,7 @@
"Set an admin password." : "Nustatyti administratoriaus slaptažodį.",
"%s shared »%s« with you" : "%s pasidalino »%s« su tavimi",
"Could not find category \"%s\"" : "Nepavyko rasti kategorijos „%s“",
+ "Apps" : "Programos",
"A valid username must be provided" : "Vartotojo vardas turi būti tinkamas",
"A valid password must be provided" : "Slaptažodis turi būti tinkamas"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
diff --git a/lib/l10n/lv.js b/lib/l10n/lv.js
index 5505d0cd7cc..df984f830a8 100644
--- a/lib/l10n/lv.js
+++ b/lib/l10n/lv.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Set an admin password." : "Iestatiet administratora paroli.",
"%s shared »%s« with you" : "%s kopīgots »%s« ar jums",
"Could not find category \"%s\"" : "Nevarēja atrast kategoriju “%s”",
+ "Apps" : "Lietotnes",
"A valid username must be provided" : "Jānorāda derīgs lietotājvārds",
"A valid password must be provided" : "Jānorāda derīga parole",
"The username is already being used" : "Šāds lietotājvārds jau tiek izmantots"
diff --git a/lib/l10n/lv.json b/lib/l10n/lv.json
index 13b38a73a2c..0e0f2b072f1 100644
--- a/lib/l10n/lv.json
+++ b/lib/l10n/lv.json
@@ -29,6 +29,7 @@
"Set an admin password." : "Iestatiet administratora paroli.",
"%s shared »%s« with you" : "%s kopīgots »%s« ar jums",
"Could not find category \"%s\"" : "Nevarēja atrast kategoriju “%s”",
+ "Apps" : "Lietotnes",
"A valid username must be provided" : "Jānorāda derīgs lietotājvārds",
"A valid password must be provided" : "Jānorāda derīga parole",
"The username is already being used" : "Šāds lietotājvārds jau tiek izmantots"
diff --git a/lib/l10n/mk.js b/lib/l10n/mk.js
index 197a25c2172..881388b4eac 100644
--- a/lib/l10n/mk.js
+++ b/lib/l10n/mk.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Set an admin password." : "Постави администраторска лозинка.",
"%s shared »%s« with you" : "%s споделено »%s« со вас",
"Could not find category \"%s\"" : "Не можам да најдам категорија „%s“",
+ "Apps" : "Аппликации",
"A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ",
"A valid password must be provided" : "Мора да се обезбеди валидна лозинка",
"The username is already being used" : "Корисничкото име е веќе во употреба"
diff --git a/lib/l10n/mk.json b/lib/l10n/mk.json
index 2b396044a21..7dbfab7f01f 100644
--- a/lib/l10n/mk.json
+++ b/lib/l10n/mk.json
@@ -27,6 +27,7 @@
"Set an admin password." : "Постави администраторска лозинка.",
"%s shared »%s« with you" : "%s споделено »%s« со вас",
"Could not find category \"%s\"" : "Не можам да најдам категорија „%s“",
+ "Apps" : "Аппликации",
"A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ",
"A valid password must be provided" : "Мора да се обезбеди валидна лозинка",
"The username is already being used" : "Корисничкото име е веќе во употреба"
diff --git a/lib/l10n/ms_MY.js b/lib/l10n/ms_MY.js
index e6a3fbb1edc..8f73b0f78ab 100644
--- a/lib/l10n/ms_MY.js
+++ b/lib/l10n/ms_MY.js
@@ -6,6 +6,7 @@ OC.L10N.register(
"Users" : "Pengguna",
"Admin" : "Admin",
"web services under your control" : "Perkhidmatan web di bawah kawalan anda",
- "Authentication error" : "Ralat pengesahan"
+ "Authentication error" : "Ralat pengesahan",
+ "Apps" : "Aplikasi"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/ms_MY.json b/lib/l10n/ms_MY.json
index 6abf66423ee..f0c3fc7f936 100644
--- a/lib/l10n/ms_MY.json
+++ b/lib/l10n/ms_MY.json
@@ -4,6 +4,7 @@
"Users" : "Pengguna",
"Admin" : "Admin",
"web services under your control" : "Perkhidmatan web di bawah kawalan anda",
- "Authentication error" : "Ralat pengesahan"
+ "Authentication error" : "Ralat pengesahan",
+ "Apps" : "Aplikasi"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/my_MM.js b/lib/l10n/my_MM.js
index b20399c6d56..02dbac8d038 100644
--- a/lib/l10n/my_MM.js
+++ b/lib/l10n/my_MM.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"seconds ago" : "စက္ကန့်အနည်းငယ်က",
"web services under your control" : "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services",
"Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်",
- "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ"
+ "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ",
+ "Apps" : "Apps"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/my_MM.json b/lib/l10n/my_MM.json
index 0a4d0370a36..c04d1b0f0a6 100644
--- a/lib/l10n/my_MM.json
+++ b/lib/l10n/my_MM.json
@@ -9,6 +9,7 @@
"seconds ago" : "စက္ကန့်အနည်းငယ်က",
"web services under your control" : "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services",
"Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်",
- "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ"
+ "Could not find category \"%s\"" : "\"%s\"ခေါင်းစဉ်ကို ရှာမတွေ့ပါ",
+ "Apps" : "Apps"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js
index af629c5ef34..e8d2de3c1cf 100644
--- a/lib/l10n/nb_NO.js
+++ b/lib/l10n/nb_NO.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling av %s feilet, fordi delings-serveren for %s ikke kunne finne kilden",
"Sharing %s failed, because the file could not be found in the file cache" : "Deling av %s feilet, fordi filen ikke ble funnet i fil-mellomlageret",
"Could not find category \"%s\"" : "Kunne ikke finne kategori \"%s\"",
+ "Apps" : "Apper",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bare disse tegnene tillates i et brukernavn: \"a-z\", \"A-Z\", \"0-9\" og \"_.@-\"",
"A valid username must be provided" : "Oppgi et gyldig brukernavn",
"A valid password must be provided" : "Oppgi et gyldig passord",
diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json
index 29f9e7f1365..2edd6a933ea 100644
--- a/lib/l10n/nb_NO.json
+++ b/lib/l10n/nb_NO.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Deling av %s feilet, fordi delings-serveren for %s ikke kunne finne kilden",
"Sharing %s failed, because the file could not be found in the file cache" : "Deling av %s feilet, fordi filen ikke ble funnet i fil-mellomlageret",
"Could not find category \"%s\"" : "Kunne ikke finne kategori \"%s\"",
+ "Apps" : "Apper",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Bare disse tegnene tillates i et brukernavn: \"a-z\", \"A-Z\", \"0-9\" og \"_.@-\"",
"A valid username must be provided" : "Oppgi et gyldig brukernavn",
"A valid password must be provided" : "Oppgi et gyldig passord",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index 5abae786d34..eee35c9ca6c 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Delen van %s is mislukt, omdat de share-backend voor %s de bron niet kon vinden",
"Sharing %s failed, because the file could not be found in the file cache" : "Delen van %s is mislukt, omdat het bestand niet in de bestandscache kon worden gevonden",
"Could not find category \"%s\"" : "Kon categorie \"%s\" niet vinden",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven",
"A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 4e4eaf8b52a..be3e0fe73bd 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Delen van %s is mislukt, omdat de share-backend voor %s de bron niet kon vinden",
"Sharing %s failed, because the file could not be found in the file cache" : "Delen van %s is mislukt, omdat het bestand niet in de bestandscache kon worden gevonden",
"Could not find category \"%s\"" : "Kon categorie \"%s\" niet vinden",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven",
"A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven",
diff --git a/lib/l10n/nn_NO.js b/lib/l10n/nn_NO.js
index 9761935c435..c0675f2574a 100644
--- a/lib/l10n/nn_NO.js
+++ b/lib/l10n/nn_NO.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"web services under your control" : "Vev tjenester under din kontroll",
"Authentication error" : "Feil i autentisering",
"%s shared »%s« with you" : "%s delte «%s» med deg",
+ "Apps" : "Program",
"A valid username must be provided" : "Du må oppgje eit gyldig brukarnamn",
"A valid password must be provided" : "Du må oppgje eit gyldig passord"
},
diff --git a/lib/l10n/nn_NO.json b/lib/l10n/nn_NO.json
index f1186cb1056..52b7dd52041 100644
--- a/lib/l10n/nn_NO.json
+++ b/lib/l10n/nn_NO.json
@@ -13,6 +13,7 @@
"web services under your control" : "Vev tjenester under din kontroll",
"Authentication error" : "Feil i autentisering",
"%s shared »%s« with you" : "%s delte «%s» med deg",
+ "Apps" : "Program",
"A valid username must be provided" : "Du må oppgje eit gyldig brukarnamn",
"A valid password must be provided" : "Du må oppgje eit gyldig passord"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/lib/l10n/oc.js b/lib/l10n/oc.js
index 871b25ebfe5..2e6bfe56fe6 100644
--- a/lib/l10n/oc.js
+++ b/lib/l10n/oc.js
@@ -13,7 +13,9 @@ OC.L10N.register(
"last year" : "an passat",
"seconds ago" : "segonda a",
"web services under your control" : "Services web jos ton contraròtle",
+ "File name contains at least one invalid character" : "Lo nom de fichièr conten al mens un caractèr invalid",
"Authentication error" : "Error d'autentificacion",
+ "Apps" : "Aplicacions",
"A valid username must be provided" : "Un nom d'utilizaire valid deu èsser picat",
"A valid password must be provided" : "Un senhal valid deu èsser picat",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La rason es probablament l'utilizacion d'un escondedor / accelerador tal coma Zend OPcache o eAccelerator."
diff --git a/lib/l10n/oc.json b/lib/l10n/oc.json
index b892cf9c38a..3ac8367f556 100644
--- a/lib/l10n/oc.json
+++ b/lib/l10n/oc.json
@@ -11,7 +11,9 @@
"last year" : "an passat",
"seconds ago" : "segonda a",
"web services under your control" : "Services web jos ton contraròtle",
+ "File name contains at least one invalid character" : "Lo nom de fichièr conten al mens un caractèr invalid",
"Authentication error" : "Error d'autentificacion",
+ "Apps" : "Aplicacions",
"A valid username must be provided" : "Un nom d'utilizaire valid deu èsser picat",
"A valid password must be provided" : "Un senhal valid deu èsser picat",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La rason es probablament l'utilizacion d'un escondedor / accelerador tal coma Zend OPcache o eAccelerator."
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index 611a0b4c6f1..9eff16519e2 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła",
"Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików",
"Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"",
+ "Apps" : "Aplikacje",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "W nazwach użytkowników dozwolone są wyłącznie następujące znaki: \"a-z\", \"A-Z\", \"0-9\", oraz \"_.@-\"",
"A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika",
"A valid password must be provided" : "Należy podać prawidłowe hasło",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index 2e96f414a66..a9db4e4f50c 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -89,6 +89,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła",
"Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików",
"Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"",
+ "Apps" : "Aplikacje",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "W nazwach użytkowników dozwolone są wyłącznie następujące znaki: \"a-z\", \"A-Z\", \"0-9\", oraz \"_.@-\"",
"A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika",
"A valid password must be provided" : "Należy podać prawidłowe hasło",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 402a7cbc51a..5289b4f8002 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartilhamento %s falhou, porque a infra-estrutura de compartilhamento para %s não conseguiu encontrar a sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "Compartilhamento %s falhou, porque o arquivo não pôde ser encontrado no cache de arquivos",
"Could not find category \"%s\"" : "Impossível localizar categoria \"%s\"",
+ "Apps" : "Aplicações",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Somente os seguintes caracteres são permitidos no nome do usuário: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"",
"A valid username must be provided" : "Forneça um nome de usuário válido",
"A valid password must be provided" : "Forneça uma senha válida",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 255272b8cb8..62a6d86b09e 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartilhamento %s falhou, porque a infra-estrutura de compartilhamento para %s não conseguiu encontrar a sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "Compartilhamento %s falhou, porque o arquivo não pôde ser encontrado no cache de arquivos",
"Could not find category \"%s\"" : "Impossível localizar categoria \"%s\"",
+ "Apps" : "Aplicações",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Somente os seguintes caracteres são permitidos no nome do usuário: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"",
"A valid username must be provided" : "Forneça um nome de usuário válido",
"A valid password must be provided" : "Forneça uma senha válida",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index 0f0e116128c..8c54fc8c055 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -107,6 +107,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros",
"Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"",
"A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido",
"A valid password must be provided" : "Uma password válida deve ser fornecida",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index 9c00021b599..4afe9ab3130 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -105,6 +105,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte",
"Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros",
"Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"",
+ "Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"",
"A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido",
"A valid password must be provided" : "Uma password válida deve ser fornecida",
diff --git a/lib/l10n/ro.js b/lib/l10n/ro.js
index ba7d11cdfb1..1c4b407a4ca 100644
--- a/lib/l10n/ro.js
+++ b/lib/l10n/ro.js
@@ -41,6 +41,7 @@ OC.L10N.register(
"You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"Share type %s is not valid for %s" : "Tipul partajării %s nu este valid pentru %s",
"Could not find category \"%s\"" : "Cloud nu a gasit categoria \"%s\"",
+ "Apps" : "Aplicații",
"A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid",
"A valid password must be provided" : "Trebuie să furnizaţi o parolă validă",
"The username is already being used" : "Numele de utilizator este deja folosit",
diff --git a/lib/l10n/ro.json b/lib/l10n/ro.json
index 8e85455c50c..bafd2a85598 100644
--- a/lib/l10n/ro.json
+++ b/lib/l10n/ro.json
@@ -39,6 +39,7 @@
"You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"Share type %s is not valid for %s" : "Tipul partajării %s nu este valid pentru %s",
"Could not find category \"%s\"" : "Cloud nu a gasit categoria \"%s\"",
+ "Apps" : "Aplicații",
"A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid",
"A valid password must be provided" : "Trebuie să furnizaţi o parolă validă",
"The username is already being used" : "Numele de utilizator este deja folosit",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 16331c5cd76..215bd4f0ebb 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Не удалось поделиться %s, бэкенд общего доступа не нашел путь до %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Не удалось поделиться %s, элемент не найден в файловом кеше.",
"Could not find category \"%s\"" : "Категория \"%s\" не найдена",
+ "Apps" : "Приложения",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Только следующие символы допускаются в имени пользователя: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\"",
"A valid username must be provided" : "Укажите правильное имя пользователя",
"A valid password must be provided" : "Укажите правильный пароль",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index c295748adab..a0120518dfa 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -108,6 +108,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Не удалось поделиться %s, бэкенд общего доступа не нашел путь до %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Не удалось поделиться %s, элемент не найден в файловом кеше.",
"Could not find category \"%s\"" : "Категория \"%s\" не найдена",
+ "Apps" : "Приложения",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Только следующие символы допускаются в имени пользователя: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\"",
"A valid username must be provided" : "Укажите правильное имя пользователя",
"A valid password must be provided" : "Укажите правильный пароль",
diff --git a/lib/l10n/si_LK.js b/lib/l10n/si_LK.js
index abdce2df7c4..09ee34c2e5d 100644
--- a/lib/l10n/si_LK.js
+++ b/lib/l10n/si_LK.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"web services under your control" : "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්",
"Application is not enabled" : "යෙදුම සක්‍රිය කර නොමැත",
"Authentication error" : "සත්‍යාපන දෝෂයක්",
- "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න"
+ "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න",
+ "Apps" : "යෙදුම්"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/si_LK.json b/lib/l10n/si_LK.json
index 5a201d40e95..d34a5216d8f 100644
--- a/lib/l10n/si_LK.json
+++ b/lib/l10n/si_LK.json
@@ -11,6 +11,7 @@
"web services under your control" : "ඔබට පාලනය කළ හැකි වෙබ් සේවාවන්",
"Application is not enabled" : "යෙදුම සක්‍රිය කර නොමැත",
"Authentication error" : "සත්‍යාපන දෝෂයක්",
- "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න"
+ "Token expired. Please reload page." : "ටෝකනය කල් ඉකුත් වී ඇත. පිටුව නැවුම් කරන්න",
+ "Apps" : "යෙදුම්"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js
index 49fabed436f..394379a0659 100644
--- a/lib/l10n/sk_SK.js
+++ b/lib/l10n/sk_SK.js
@@ -16,11 +16,14 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
"ownCloud %s or higher is required." : "Požadovaná verzia ownCloudu %s alebo vyššia.",
+ "ownCloud %s or lower is required." : "Požadovaná verzia ownCloudu %s alebo nižšia.",
"Help" : "Pomoc",
"Personal" : "Osobné",
"Users" : "Používatelia",
"Admin" : "Administrátor",
"Recommended" : "Odporúčané",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie je kompatibilná s touto verziou ownCloudu.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s",
"No app name specified" : "Nešpecifikované meno aplikácie",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
@@ -35,12 +38,18 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"],
"seconds ago" : "pred sekundami",
"web services under your control" : "webové služby pod Vašou kontrolou",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.",
"Empty filename is not allowed" : "Prázdny názov súboru nie je povolený",
+ "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.",
+ "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.",
+ "File name is a reserved word" : "Názov súboru je rezervované slovo.",
"File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.",
"File name is too long" : "Meno súboru je veľmi dlhé.",
+ "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr",
"Can't read file" : "Nemožno čítať súbor.",
"App directory already exists" : "Aplikačný priečinok už existuje",
"Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s",
+ "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s",
"No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie",
"No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"",
"No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru",
@@ -82,6 +91,7 @@ OC.L10N.register(
"Sharing %s failed, because the user %s does not exist" : "Zdieľanie %s zlyhalo, pretože používateľ %s neexistuje",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Zdieľanie %s zlyhalo, pretože používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s",
"Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Zdieľanie %s zlyhalo, položka je už zdieľaná s používateľom %s",
"Sharing %s failed, because the group %s does not exist" : "Zdieľanie %s zlyhalo, pretože skupina %s neexistuje",
"Sharing %s failed, because %s is not a member of the group %s" : "Zdieľanie %s zlyhalo, pretože %s nie je členom skupiny %s",
"You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené",
@@ -92,6 +102,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nie je možné nastaviť dátum konca platnosti. Zdieľania nemôžu skončiť neskôr ako %s po zdieľaní.",
"Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri zdieľaní je čas expirácie vyžadovaný.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend zdieľania %s musí implementovať rozhranie OCP\\Share_Backend",
"Sharing backend %s not found" : "Backend zdieľania %s nebol nájdený",
"Sharing backend for %s not found" : "Backend zdieľania pre %s nebol nájdený",
@@ -101,12 +112,14 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Zdieľanie %s zlyhalo, backend zdieľania nenašiel zdrojový %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Zdieľanie %s zlyhalo, pretože súbor sa nenašiel vo vyrovnávacej pamäti súborov",
"Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"",
+ "Apps" : "Aplikácie",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V mene používateľa sú povolené len nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.",
"Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná",
+ "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Beh ownCloud servera na platforme Microsoft Windows nie je podporovaný. Navrhujeme použitie Linux server na virtuálnom počítači, pokiaľ nie je k dispozícii priamo server. Linux distribúcie a tiež aj ľahko použiteľné obrazy (image) virtuálnych počítačov nájdete na <a href=\"%s\">%s</a>. Pár tipov pre migráciu existujúcich inštalácii na Linux a migračné skripty nájdete v <a href=\"%s\">našej dokumentácii</a>.",
"Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
"Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.",
@@ -119,6 +132,9 @@ OC.L10N.register(
"PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.",
"PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.",
"Adjusting this setting in php.ini will make ownCloud run again" : "Zmenou tejto voľby v php.ini znovu uvediete váš ownCloud do prevádzky",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Oprava problému spočíva v nastavení <code>mbstring.func_overload</code> na <code>0</code> vo vašom php.ini",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?",
"Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.",
@@ -128,6 +144,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Prosím, uistite sa, že máte PostgreSQL >= 9 alebo sa pozrite do protokolu, kde nájdete podrobnejšie informácie o chybe",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.",
"Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom",
+ "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta",
+ "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii",
"Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".",
"Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“."
diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json
index 4eea36cda2f..180d3683d61 100644
--- a/lib/l10n/sk_SK.json
+++ b/lib/l10n/sk_SK.json
@@ -14,11 +14,14 @@
"Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
"ownCloud %s or higher is required." : "Požadovaná verzia ownCloudu %s alebo vyššia.",
+ "ownCloud %s or lower is required." : "Požadovaná verzia ownCloudu %s alebo nižšia.",
"Help" : "Pomoc",
"Personal" : "Osobné",
"Users" : "Používatelia",
"Admin" : "Administrátor",
"Recommended" : "Odporúčané",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie je kompatibilná s touto verziou ownCloudu.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s",
"No app name specified" : "Nešpecifikované meno aplikácie",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
@@ -33,12 +36,18 @@
"_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"],
"seconds ago" : "pred sekundami",
"web services under your control" : "webové služby pod Vašou kontrolou",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.",
"Empty filename is not allowed" : "Prázdny názov súboru nie je povolený",
+ "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.",
+ "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.",
+ "File name is a reserved word" : "Názov súboru je rezervované slovo.",
"File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.",
"File name is too long" : "Meno súboru je veľmi dlhé.",
+ "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr",
"Can't read file" : "Nemožno čítať súbor.",
"App directory already exists" : "Aplikačný priečinok už existuje",
"Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s",
+ "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s",
"No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie",
"No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"",
"No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru",
@@ -80,6 +89,7 @@
"Sharing %s failed, because the user %s does not exist" : "Zdieľanie %s zlyhalo, pretože používateľ %s neexistuje",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Zdieľanie %s zlyhalo, pretože používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s",
"Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Zdieľanie %s zlyhalo, položka je už zdieľaná s používateľom %s",
"Sharing %s failed, because the group %s does not exist" : "Zdieľanie %s zlyhalo, pretože skupina %s neexistuje",
"Sharing %s failed, because %s is not a member of the group %s" : "Zdieľanie %s zlyhalo, pretože %s nie je členom skupiny %s",
"You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené",
@@ -90,6 +100,7 @@
"Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nie je možné nastaviť dátum konca platnosti. Zdieľania nemôžu skončiť neskôr ako %s po zdieľaní.",
"Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri zdieľaní je čas expirácie vyžadovaný.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend zdieľania %s musí implementovať rozhranie OCP\\Share_Backend",
"Sharing backend %s not found" : "Backend zdieľania %s nebol nájdený",
"Sharing backend for %s not found" : "Backend zdieľania pre %s nebol nájdený",
@@ -99,12 +110,14 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Zdieľanie %s zlyhalo, backend zdieľania nenašiel zdrojový %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Zdieľanie %s zlyhalo, pretože súbor sa nenašiel vo vyrovnávacej pamäti súborov",
"Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"",
+ "Apps" : "Aplikácie",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V mene používateľa sú povolené len nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.",
"Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná",
+ "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Beh ownCloud servera na platforme Microsoft Windows nie je podporovaný. Navrhujeme použitie Linux server na virtuálnom počítači, pokiaľ nie je k dispozícii priamo server. Linux distribúcie a tiež aj ľahko použiteľné obrazy (image) virtuálnych počítačov nájdete na <a href=\"%s\">%s</a>. Pár tipov pre migráciu existujúcich inštalácii na Linux a migračné skripty nájdete v <a href=\"%s\">našej dokumentácii</a>.",
"Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
"Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.",
@@ -117,6 +130,9 @@
"PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.",
"PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.",
"Adjusting this setting in php.ini will make ownCloud run again" : "Zmenou tejto voľby v php.ini znovu uvediete váš ownCloud do prevádzky",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Oprava problému spočíva v nastavení <code>mbstring.func_overload</code> na <code>0</code> vo vašom php.ini",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?",
"Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.",
@@ -126,6 +142,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Prosím, uistite sa, že máte PostgreSQL >= 9 alebo sa pozrite do protokolu, kde nájdete podrobnejšie informácie o chybe",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.",
"Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom",
+ "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta",
+ "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii",
"Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".",
"Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“."
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index 48df48d71c6..3cf4e005765 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Nastavljanje souporabe %s je spodletelo, ker ozadnji program %s ne upravlja z viri.",
"Sharing %s failed, because the file could not be found in the file cache" : "Nastavljanje souporabe %s je spodletelo, ker v predpomnilniku zahtevana datoteka ne obstaja.",
"Could not find category \"%s\"" : "Kategorije \"%s\" ni mogoče najti.",
+ "Apps" : "Programi",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V uporabniškem imenu je dovoljeno uporabiti le znake: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Navedeno mora biti veljavno uporabniško ime",
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index 8507e1194d9..58d9199aaf8 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -98,6 +98,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Nastavljanje souporabe %s je spodletelo, ker ozadnji program %s ne upravlja z viri.",
"Sharing %s failed, because the file could not be found in the file cache" : "Nastavljanje souporabe %s je spodletelo, ker v predpomnilniku zahtevana datoteka ne obstaja.",
"Could not find category \"%s\"" : "Kategorije \"%s\" ni mogoče najti.",
+ "Apps" : "Programi",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "V uporabniškem imenu je dovoljeno uporabiti le znake: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "Navedeno mora biti veljavno uporabniško ime",
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js
index fbf1b58beee..80db3f87c50 100644
--- a/lib/l10n/sq.js
+++ b/lib/l10n/sq.js
@@ -32,6 +32,7 @@ OC.L10N.register(
"Set an admin password." : "Cakto kodin e administratorit.",
"%s shared »%s« with you" : "%s ndau »%s« me ju",
"Could not find category \"%s\"" : "Kategoria \"%s\" nuk u gjet",
+ "Apps" : "App",
"A valid username must be provided" : "Duhet të jepni një emër të vlefshëm përdoruesi",
"A valid password must be provided" : "Duhet të jepni një fjalëkalim te vlefshëm"
},
diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json
index b0a23493d40..1fc2cb01c58 100644
--- a/lib/l10n/sq.json
+++ b/lib/l10n/sq.json
@@ -30,6 +30,7 @@
"Set an admin password." : "Cakto kodin e administratorit.",
"%s shared »%s« with you" : "%s ndau »%s« me ju",
"Could not find category \"%s\"" : "Kategoria \"%s\" nuk u gjet",
+ "Apps" : "App",
"A valid username must be provided" : "Duhet të jepni një emër të vlefshëm përdoruesi",
"A valid password must be provided" : "Duhet të jepni një fjalëkalim te vlefshëm"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index 286856622c7..670a705364c 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -110,6 +110,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Дељење %s није успело зато што позадина дељења за %s није могла да нађе извор",
"Sharing %s failed, because the file could not be found in the file cache" : "Дељење %s није успело зато што фајл није нађен у кешу фајлова",
"Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.",
+ "Apps" : "Апликације",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“",
"A valid username must be provided" : "Морате унети исправно корисничко име",
"A valid password must be provided" : "Морате унети исправну лозинку",
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index 2e76f5e9000..8b4bcf3ab04 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -108,6 +108,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Дељење %s није успело зато што позадина дељења за %s није могла да нађе извор",
"Sharing %s failed, because the file could not be found in the file cache" : "Дељење %s није успело зато што фајл није нађен у кешу фајлова",
"Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.",
+ "Apps" : "Апликације",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“",
"A valid username must be provided" : "Морате унети исправно корисничко име",
"A valid password must be provided" : "Морате унети исправну лозинку",
diff --git a/lib/l10n/sr@latin.js b/lib/l10n/sr@latin.js
index e677404bf23..a8c4c261a09 100644
--- a/lib/l10n/sr@latin.js
+++ b/lib/l10n/sr@latin.js
@@ -14,6 +14,7 @@ OC.L10N.register(
"seconds ago" : "Pre par sekundi",
"Authentication error" : "Greška pri autentifikaciji",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s neće raditi kako treba na ovoj platformi. Koristite na sopstvenu odgovornost.",
- "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera."
+ "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera.",
+ "Apps" : "Programi"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/sr@latin.json b/lib/l10n/sr@latin.json
index 3e2d9659ef5..a85ebf5d92c 100644
--- a/lib/l10n/sr@latin.json
+++ b/lib/l10n/sr@latin.json
@@ -12,6 +12,7 @@
"seconds ago" : "Pre par sekundi",
"Authentication error" : "Greška pri autentifikaciji",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s neće raditi kako treba na ovoj platformi. Koristite na sopstvenu odgovornost.",
- "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera."
+ "For the best results, please consider using a GNU/Linux server instead." : "Za najbolje rezultate uzmite u obzir korišćenje GNU/Linux servera.",
+ "Apps" : "Programi"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
index c3b2d0655df..930f19c0d7e 100644
--- a/lib/l10n/sv.js
+++ b/lib/l10n/sv.js
@@ -93,6 +93,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa",
"Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen",
"Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"",
+ "Apps" : "Program",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Endast följande tecken är tillåtna i ett användarnamn: \"az\", \"AZ\", \"0-9\", och \"_ @ -.\"",
"A valid username must be provided" : "Ett giltigt användarnamn måste anges",
"A valid password must be provided" : "Ett giltigt lösenord måste anges",
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
index 5b53e335a79..6748c72487d 100644
--- a/lib/l10n/sv.json
+++ b/lib/l10n/sv.json
@@ -91,6 +91,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa",
"Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen",
"Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"",
+ "Apps" : "Program",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Endast följande tecken är tillåtna i ett användarnamn: \"az\", \"AZ\", \"0-9\", och \"_ @ -.\"",
"A valid username must be provided" : "Ett giltigt användarnamn måste anges",
"A valid password must be provided" : "Ett giltigt lösenord måste anges",
diff --git a/lib/l10n/ta_LK.js b/lib/l10n/ta_LK.js
index e318c7b9f67..2cbe4d00305 100644
--- a/lib/l10n/ta_LK.js
+++ b/lib/l10n/ta_LK.js
@@ -14,6 +14,7 @@ OC.L10N.register(
"Application is not enabled" : "செயலி இயலுமைப்படுத்தப்படவில்லை",
"Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு",
"Token expired. Please reload page." : "அடையாளவில்லை காலாவதியாகிவிட்டது. தயவுசெய்து பக்கத்தை மீள் ஏற்றுக.",
- "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை"
+ "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை",
+ "Apps" : "செயலிகள்"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/ta_LK.json b/lib/l10n/ta_LK.json
index 70bd5c7f965..25e06c38de8 100644
--- a/lib/l10n/ta_LK.json
+++ b/lib/l10n/ta_LK.json
@@ -12,6 +12,7 @@
"Application is not enabled" : "செயலி இயலுமைப்படுத்தப்படவில்லை",
"Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு",
"Token expired. Please reload page." : "அடையாளவில்லை காலாவதியாகிவிட்டது. தயவுசெய்து பக்கத்தை மீள் ஏற்றுக.",
- "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை"
+ "Could not find category \"%s\"" : "பிரிவு \"%s\" ஐ கண்டுப்பிடிக்க முடியவில்லை",
+ "Apps" : "செயலிகள்"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js
index 6092f348cb5..c5168588a99 100644
--- a/lib/l10n/th_TH.js
+++ b/lib/l10n/th_TH.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "การแชร์ %s ล้มเหลวเพราะการแชร์แบ็กเอนด์สำหรับ %s ไม่สามารถหาแหล่งที่มา",
"Sharing %s failed, because the file could not be found in the file cache" : "การแชร์ %s ล้มเหลวเพราะไม่พบไฟล์ในแคชไฟล์",
"Could not find category \"%s\"" : "ไม่พบหมวดหมู่ \"%s\"",
+ "Apps" : "แอปฯ",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ตัวอักษรที่อนุญาตให้ใช้ในชื่อผู้ใช้: \"a-z\", \"A-Z\", \"0-9\" และ \"_.@-\"",
"A valid username must be provided" : "จะต้องระบุชื่อผู้ใช้ที่ถูกต้อง",
"A valid password must be provided" : "รหัสผ่านที่ถูกต้องจะต้องให้",
diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json
index a872236a70d..55563b4fc16 100644
--- a/lib/l10n/th_TH.json
+++ b/lib/l10n/th_TH.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "การแชร์ %s ล้มเหลวเพราะการแชร์แบ็กเอนด์สำหรับ %s ไม่สามารถหาแหล่งที่มา",
"Sharing %s failed, because the file could not be found in the file cache" : "การแชร์ %s ล้มเหลวเพราะไม่พบไฟล์ในแคชไฟล์",
"Could not find category \"%s\"" : "ไม่พบหมวดหมู่ \"%s\"",
+ "Apps" : "แอปฯ",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "ตัวอักษรที่อนุญาตให้ใช้ในชื่อผู้ใช้: \"a-z\", \"A-Z\", \"0-9\" และ \"_.@-\"",
"A valid username must be provided" : "จะต้องระบุชื่อผู้ใช้ที่ถูกต้อง",
"A valid password must be provided" : "รหัสผ่านที่ถูกต้องจะต้องให้",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index 93f2908a69f..69f35cc33cc 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -112,6 +112,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s paylaşımı, %s için arka ucun kaynağını bulamamasından dolayı başarısız oldu",
"Sharing %s failed, because the file could not be found in the file cache" : "%s paylaşımı, dosyanın dosya önbelleğinde bulunamamasınndan dolayı başarısız oldu",
"Could not find category \"%s\"" : "\"%s\" kategorisi bulunamadı",
+ "Apps" : "Uygulamalar",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kullanıcı adında sadece bu karakterlere izin verilmektedir: \"a-z\", \"A-Z\", \"0-9\", ve \"_.@-\"",
"A valid username must be provided" : "Geçerli bir kullanıcı adı mutlaka sağlanmalı",
"A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index bb3cd291e64..24980e4d58f 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -110,6 +110,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s paylaşımı, %s için arka ucun kaynağını bulamamasından dolayı başarısız oldu",
"Sharing %s failed, because the file could not be found in the file cache" : "%s paylaşımı, dosyanın dosya önbelleğinde bulunamamasınndan dolayı başarısız oldu",
"Could not find category \"%s\"" : "\"%s\" kategorisi bulunamadı",
+ "Apps" : "Uygulamalar",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Kullanıcı adında sadece bu karakterlere izin verilmektedir: \"a-z\", \"A-Z\", \"0-9\", ve \"_.@-\"",
"A valid username must be provided" : "Geçerli bir kullanıcı adı mutlaka sağlanmalı",
"A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı",
diff --git a/lib/l10n/ug.js b/lib/l10n/ug.js
index aaa90377419..f497ed3fbb9 100644
--- a/lib/l10n/ug.js
+++ b/lib/l10n/ug.js
@@ -7,6 +7,7 @@ OC.L10N.register(
"today" : "بۈگۈن",
"yesterday" : "تۈنۈگۈن",
"Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى",
+ "Apps" : "ئەپلەر",
"A valid username must be provided" : "چوقۇم ئىناۋەتلىك ئىشلەتكۈچى ئىسمىدىن بىرنى تەمىنلەش كېرەك",
"A valid password must be provided" : "چوقۇم ئىناۋەتلىك ئىم تەمىنلەش كېرەك"
},
diff --git a/lib/l10n/ug.json b/lib/l10n/ug.json
index 4521f615d62..b847810b2c4 100644
--- a/lib/l10n/ug.json
+++ b/lib/l10n/ug.json
@@ -5,6 +5,7 @@
"today" : "بۈگۈن",
"yesterday" : "تۈنۈگۈن",
"Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى",
+ "Apps" : "ئەپلەر",
"A valid username must be provided" : "چوقۇم ئىناۋەتلىك ئىشلەتكۈچى ئىسمىدىن بىرنى تەمىنلەش كېرەك",
"A valid password must be provided" : "چوقۇم ئىناۋەتلىك ئىم تەمىنلەش كېرەك"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 7c90934c71f..3da12b1391f 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -103,6 +103,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Не вдалося поділитися %s, backend загального доступу не знайшов шлях до %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Не вдалося поділитися %s, елемент не знайдено у файловому кеші.",
"Could not find category \"%s\"" : "Не вдалося знайти категорію \"%s\"",
+ "Apps" : "Додатки",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Тільки такі символи допускаються в імені користувача: \"az\", \"AZ\", \"0-9\", і \"_.@ -\"",
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index f0ca3a30641..7b2ca8deef4 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -101,6 +101,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Не вдалося поділитися %s, backend загального доступу не знайшов шлях до %s",
"Sharing %s failed, because the file could not be found in the file cache" : "Не вдалося поділитися %s, елемент не знайдено у файловому кеші.",
"Could not find category \"%s\"" : "Не вдалося знайти категорію \"%s\"",
+ "Apps" : "Додатки",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Тільки такі символи допускаються в імені користувача: \"az\", \"AZ\", \"0-9\", і \"_.@ -\"",
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
diff --git a/lib/l10n/ur_PK.js b/lib/l10n/ur_PK.js
index ab5a44ff204..ddf4e058521 100644
--- a/lib/l10n/ur_PK.js
+++ b/lib/l10n/ur_PK.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"last month" : "پچھلے مہنیے",
"last year" : "پچھلے سال",
"seconds ago" : "سیکنڈز پہلے",
- "web services under your control" : "آپ کے اختیار میں ویب سروسیز"
+ "web services under your control" : "آپ کے اختیار میں ویب سروسیز",
+ "Apps" : "ایپز"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/ur_PK.json b/lib/l10n/ur_PK.json
index f81ea27ae01..424c62aed86 100644
--- a/lib/l10n/ur_PK.json
+++ b/lib/l10n/ur_PK.json
@@ -10,6 +10,7 @@
"last month" : "پچھلے مہنیے",
"last year" : "پچھلے سال",
"seconds ago" : "سیکنڈز پہلے",
- "web services under your control" : "آپ کے اختیار میں ویب سروسیز"
+ "web services under your control" : "آپ کے اختیار میں ویب سروسیز",
+ "Apps" : "ایپز"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/vi.js b/lib/l10n/vi.js
index e467f4383c4..7f53b88bade 100644
--- a/lib/l10n/vi.js
+++ b/lib/l10n/vi.js
@@ -22,6 +22,7 @@ OC.L10N.register(
"Authentication error" : "Lỗi xác thực",
"Token expired. Please reload page." : "Mã Token đã hết hạn. Hãy tải lại trang.",
"%s shared »%s« with you" : "%s đã chia sẻ »%s« với bạn",
- "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\""
+ "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\"",
+ "Apps" : "Ứng dụng"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/vi.json b/lib/l10n/vi.json
index f3dd43a290a..bcff243c440 100644
--- a/lib/l10n/vi.json
+++ b/lib/l10n/vi.json
@@ -20,6 +20,7 @@
"Authentication error" : "Lỗi xác thực",
"Token expired. Please reload page." : "Mã Token đã hết hạn. Hãy tải lại trang.",
"%s shared »%s« with you" : "%s đã chia sẻ »%s« với bạn",
- "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\""
+ "Could not find category \"%s\"" : "không thể tìm thấy mục \"%s\"",
+ "Apps" : "Ứng dụng"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
index 4e4ad0478c1..cd684b3446d 100644
--- a/lib/l10n/zh_CN.js
+++ b/lib/l10n/zh_CN.js
@@ -73,6 +73,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败,因为 %s 使用的共享后端未找到它的来源",
"Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败,因为未在文件缓存中找到文件。",
"Could not find category \"%s\"" : "无法找到分类 \"%s\"",
+ "Apps" : "应用",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "用户名只允许使用以下字符:“a-z”,“A-Z”,“0-9”,和“_.@-”",
"A valid username must be provided" : "必须提供合法的用户名",
"A valid password must be provided" : "必须提供合法的密码",
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
index 097f7d4d54a..1d2736d701d 100644
--- a/lib/l10n/zh_CN.json
+++ b/lib/l10n/zh_CN.json
@@ -71,6 +71,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败,因为 %s 使用的共享后端未找到它的来源",
"Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败,因为未在文件缓存中找到文件。",
"Could not find category \"%s\"" : "无法找到分类 \"%s\"",
+ "Apps" : "应用",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "用户名只允许使用以下字符:“a-z”,“A-Z”,“0-9”,和“_.@-”",
"A valid username must be provided" : "必须提供合法的用户名",
"A valid password must be provided" : "必须提供合法的密码",
diff --git a/lib/l10n/zh_HK.js b/lib/l10n/zh_HK.js
index f1a4857e44d..be7b201b756 100644
--- a/lib/l10n/zh_HK.js
+++ b/lib/l10n/zh_HK.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"last year" : "上年",
"_%n hour ago_::_%n hours ago_" : ["%n 小時前"],
"_%n minute ago_::_%n minutes ago_" : ["%n 分鐘前"],
- "seconds ago" : "秒前"
+ "seconds ago" : "秒前",
+ "Apps" : "軟件"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_HK.json b/lib/l10n/zh_HK.json
index e355ca30a41..dbd3df86703 100644
--- a/lib/l10n/zh_HK.json
+++ b/lib/l10n/zh_HK.json
@@ -11,6 +11,7 @@
"last year" : "上年",
"_%n hour ago_::_%n hours ago_" : ["%n 小時前"],
"_%n minute ago_::_%n minutes ago_" : ["%n 分鐘前"],
- "seconds ago" : "秒前"
+ "seconds ago" : "秒前",
+ "Apps" : "軟件"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index 3e761604d77..b1f6ec4ee4e 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -82,6 +82,7 @@ OC.L10N.register(
"Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失敗,因為 %s 的分享後端找不到它的來源",
"Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失敗,因為在快取中找不到該檔案",
"Could not find category \"%s\"" : "找不到分類:\"%s\"",
+ "Apps" : "應用程式",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-\"",
"A valid username must be provided" : "必須提供一個有效的用戶名",
"A valid password must be provided" : "一定要提供一個有效的密碼",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index 2e0de903735..856dbef916e 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -80,6 +80,7 @@
"Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失敗,因為 %s 的分享後端找不到它的來源",
"Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失敗,因為在快取中找不到該檔案",
"Could not find category \"%s\"" : "找不到分類:\"%s\"",
+ "Apps" : "應用程式",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-\"",
"A valid username must be provided" : "必須提供一個有效的用戶名",
"A valid password must be provided" : "一定要提供一個有效的密碼",
diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php
index 63cc92601bb..7c2037e8048 100644
--- a/lib/private/allconfig.php
+++ b/lib/private/allconfig.php
@@ -119,6 +119,17 @@ class AllConfig implements \OCP\IConfig {
}
/**
+ * Looks up a system wide defined value and filters out sensitive data
+ *
+ * @param string $key the key of the value, under which it was saved
+ * @param mixed $default the default value to be returned if the value isn't set
+ * @return mixed the value or $default
+ */
+ public function getFilteredSystemValue($key, $default = '') {
+ return $this->systemConfig->getFilteredValue($key, $default);
+ }
+
+ /**
* Delete a system wide defined value
*
* @param string $key the key of the value, under which it was saved
diff --git a/lib/private/app.php b/lib/private/app.php
index 6c9f7615228..5122a4964d4 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -411,7 +411,7 @@ class OC_App {
/**
* Returns the Settings Navigation
*
- * @return string
+ * @return string[]
*
* This function returns an array containing all settings pages added. The
* entries are sorted by the key 'order' ascending.
@@ -837,7 +837,7 @@ class OC_App {
$info['active'] = $active;
- if (isset($info['shipped']) and ($info['shipped'] == 'true')) {
+ if (self::isShipped($app)) {
$info['internal'] = true;
$info['level'] = self::officialApp;
$info['removable'] = false;
diff --git a/lib/private/app/codechecker/infochecker.php b/lib/private/app/codechecker/infochecker.php
new file mode 100644
index 00000000000..91580bde07d
--- /dev/null
+++ b/lib/private/app/codechecker/infochecker.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\App\CodeChecker;
+
+use OC\App\InfoParser;
+use OC\Hooks\BasicEmitter;
+
+class InfoChecker extends BasicEmitter {
+
+ /** @var InfoParser */
+ private $infoParser;
+
+ private $mandatoryFields = [
+ 'author',
+ 'description',
+ 'id',
+ 'licence',
+ 'name',
+ ];
+ private $optionalFields = [
+ 'bugs',
+ 'category',
+ 'default_enable',
+ 'dependencies',
+ 'documentation',
+ 'namespace',
+ 'ocsid',
+ 'public',
+ 'remote',
+ 'repository',
+ 'require',
+ 'requiremin',
+ 'types',
+ 'version',
+ 'website',
+ ];
+ private $deprecatedFields = [
+ 'info',
+ 'shipped',
+ 'standalone',
+ ];
+
+ public function __construct(InfoParser $infoParser) {
+ $this->infoParser = $infoParser;
+ }
+
+ /**
+ * @param string $appId
+ * @return array
+ */
+ public function analyse($appId) {
+ $appPath = \OC_App::getAppPath($appId);
+ if ($appPath === false) {
+ throw new \RuntimeException("No app with given id <$appId> known.");
+ }
+
+ $errors = [];
+
+ $info = $this->infoParser->parse($appPath . '/appinfo/info.xml');
+
+ foreach ($info as $key => $value) {
+ if(is_array($value)) {
+ $value = json_encode($value);
+ }
+ if (in_array($key, $this->mandatoryFields)) {
+ $this->emit('InfoChecker', 'mandatoryFieldFound', [$key, $value]);
+ continue;
+ }
+
+ if (in_array($key, $this->optionalFields)) {
+ $this->emit('InfoChecker', 'optionalFieldFound', [$key, $value]);
+ continue;
+ }
+
+ if (in_array($key, $this->deprecatedFields)) {
+ // skip empty arrays - empty arrays for remote and public are always added
+ if($value === '[]' && in_array($key, ['public', 'remote', 'info'])) {
+ continue;
+ }
+ $this->emit('InfoChecker', 'deprecatedFieldFound', [$key, $value]);
+ continue;
+ }
+
+ $this->emit('InfoChecker', 'unusedFieldFound', [$key, $value]);
+ }
+
+ foreach ($this->mandatoryFields as $key) {
+ if(!isset($info[$key])) {
+ $this->emit('InfoChecker', 'mandatoryFieldMissing', [$key]);
+ $errors[] = [
+ 'type' => 'mandatoryFieldMissing',
+ 'field' => $key,
+ ];
+ }
+ }
+
+ $versionFile = $appPath . '/appinfo/version';
+ if (is_file($versionFile)) {
+ $version = trim(file_get_contents($versionFile));
+ if(isset($info['version'])) {
+ if($info['version'] !== $version) {
+ $this->emit('InfoChecker', 'differentVersions',
+ [$version, $info['version']]);
+ $errors[] = [
+ 'type' => 'differentVersions',
+ 'message' => 'appinfo/version: ' . $version .
+ ' - appinfo/info.xml: ' . $info['version'],
+ ];
+ } else {
+ $this->emit('InfoChecker', 'sameVersions', [$versionFile]);
+ }
+ } else {
+ $this->emit('InfoChecker', 'migrateVersion', [$version]);
+ }
+ } else {
+ if(!isset($info['version'])) {
+ $this->emit('InfoChecker', 'mandatoryFieldMissing', ['version']);
+ $errors[] = [
+ 'type' => 'mandatoryFieldMissing',
+ 'field' => 'version',
+ ];
+ }
+ }
+
+ return $errors;
+ }
+}
diff --git a/lib/private/assetic/separatorfilter.php b/lib/private/assetic/separatorfilter.php
deleted file mode 100644
index ee6d5c11c20..00000000000
--- a/lib/private/assetic/separatorfilter.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Assetic;
-
-use Assetic\Filter\FilterInterface;
-use Assetic\Asset\AssetInterface;
-
-/**
- * Inserts a separator between assets to prevent merge failures
- * e.g. missing semicolon at the end of a JS file
- */
-class SeparatorFilter implements FilterInterface
-{
- /**
- * @var string
- */
- private $separator;
-
- /**
- * Constructor.
- *
- * @param string $separator Separator to use between assets
- */
- public function __construct($separator = ';')
- {
- $this->separator = $separator;
- }
-
- public function filterLoad(AssetInterface $asset)
- {
- }
-
- public function filterDump(AssetInterface $asset)
- {
- $asset->setContent($asset->getContent() . $this->separator);
- }
-}
diff --git a/lib/private/connector/sabre/listenerplugin.php b/lib/private/connector/sabre/listenerplugin.php
index d0d40f4dc86..ec628add28b 100644
--- a/lib/private/connector/sabre/listenerplugin.php
+++ b/lib/private/connector/sabre/listenerplugin.php
@@ -21,6 +21,9 @@
namespace OC\Connector\Sabre;
+use OCP\AppFramework\Http;
+use OCP\SabrePluginEvent;
+use OCP\SabrePluginException;
use Sabre\DAV\ServerPlugin;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -49,9 +52,16 @@ class ListenerPlugin extends ServerPlugin {
* in case the system is in maintenance mode.
*
* @return bool
+ * @throws \Exception
*/
public function emitListener() {
- $this->dispatcher->dispatch('OC\Connector\Sabre::beforeMethod');
+ $event = new SabrePluginEvent();
+
+ $this->dispatcher->dispatch('OC\Connector\Sabre::beforeMethod', $event);
+
+ if ($event->getStatusCode() !== Http::STATUS_OK) {
+ throw new SabrePluginException($event->getMessage(), $event->getStatusCode());
+ }
return true;
}
diff --git a/lib/private/db/querybuilder/quotehelper.php b/lib/private/db/querybuilder/quotehelper.php
index 0735f313abc..4b62fee6a6c 100644
--- a/lib/private/db/querybuilder/quotehelper.php
+++ b/lib/private/db/querybuilder/quotehelper.php
@@ -52,7 +52,7 @@ class QuoteHelper {
return (string) $string;
}
- if ($string === null || $string === '*') {
+ if ($string === null || $string === 'null' || $string === '*') {
return $string;
}
diff --git a/lib/private/encryption/decryptall.php b/lib/private/encryption/decryptall.php
index 1ff9c74ef84..c1875f16abd 100644
--- a/lib/private/encryption/decryptall.php
+++ b/lib/private/encryption/decryptall.php
@@ -80,7 +80,7 @@ class DecryptAll {
$this->input = $input;
$this->output = $output;
- if ($user !== '' && $this->userManager->userExists($user) === false) {
+ if (!empty($user) && $this->userManager->userExists($user) === false) {
$this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again');
return false;
}
diff --git a/lib/private/files.php b/lib/private/files.php
index 658e708e5de..86ebf40cc57 100644
--- a/lib/private/files.php
+++ b/lib/private/files.php
@@ -41,6 +41,7 @@
*/
use OC\Lock\NoopLockingProvider;
+use OC\Streamer;
use OCP\Lock\ILockingProvider;
/**
@@ -57,20 +58,15 @@ class OC_Files {
/**
* @param string $filename
* @param string $name
- * @param bool $zip
*/
- private static function sendHeaders($filename, $name, $zip = false) {
+ private static function sendHeaders($filename, $name) {
OC_Response::setContentDispositionHeader($name, 'attachment');
header('Content-Transfer-Encoding: binary');
OC_Response::disableCaching();
- if ($zip) {
- header('Content-Type: application/zip');
- } else {
- $filesize = \OC\Files\Filesystem::filesize($filename);
- header('Content-Type: '.\OC_Helper::getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename)));
- if ($filesize > -1) {
- OC_Response::setContentLengthHeader($filesize);
- }
+ $filesize = \OC\Files\Filesystem::filesize($filename);
+ header('Content-Type: '.\OC_Helper::getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename)));
+ if ($filesize > -1) {
+ OC_Response::setContentLengthHeader($filesize);
}
}
@@ -79,9 +75,9 @@ class OC_Files {
*
* @param string $dir
* @param string $files ; separated list of files to download
- * @param boolean $only_header ; boolean to only send header of the request
+ * @param boolean $onlyHeader ; boolean to only send header of the request
*/
- public static function get($dir, $files, $only_header = false) {
+ public static function get($dir, $files, $onlyHeader = false) {
$view = \OC\Files\Filesystem::getView();
if (is_array($files) && count($files) === 1) {
@@ -89,45 +85,48 @@ class OC_Files {
}
if (is_array($files)) {
- $get_type = self::ZIP_FILES;
+ $getType = self::ZIP_FILES;
$basename = basename($dir);
if ($basename) {
- $name = $basename . '.zip';
+ $name = $basename;
} else {
- $name = 'download.zip';
+ $name = 'download';
}
$filename = $dir . '/' . $name;
} else {
$filename = $dir . '/' . $files;
if (\OC\Files\Filesystem::is_dir($dir . '/' . $files)) {
- $get_type = self::ZIP_DIR;
+ $getType = self::ZIP_DIR;
// downloading root ?
if ($files === '') {
- $name = 'download.zip';
+ $name = 'download';
} else {
- $name = $files . '.zip';
+ $name = $files;
}
} else {
- $get_type = self::FILE;
+ $getType = self::FILE;
$name = $files;
}
}
- if ($get_type === self::FILE) {
- $zip = false;
+ if ($getType === self::FILE) {
+ $streamer = false;
} else {
- $zip = new ZipStreamer\ZipStreamer();
+ $streamer = new Streamer();
}
OC_Util::obEnd();
try {
- if ($get_type === self::FILE) {
+ if ($getType === self::FILE) {
$view->lockFile($filename, ILockingProvider::LOCK_SHARED);
}
- if ($zip or \OC\Files\Filesystem::isReadable($filename)) {
- self::sendHeaders($filename, $name, $zip);
+
+ if ($streamer) {
+ $streamer->sendHeaders($name);
+ } elseif (\OC\Files\Filesystem::isReadable($filename)) {
+ self::sendHeaders($filename, $name);
} elseif (!\OC\Files\Filesystem::file_exists($filename)) {
header("HTTP/1.0 404 Not Found");
$tmpl = new OC_Template('', '404', 'guest');
@@ -137,33 +136,34 @@ class OC_Files {
header("HTTP/1.0 403 Forbidden");
die('403 Forbidden');
}
- if ($only_header) {
+ if ($onlyHeader) {
return;
}
- if ($zip) {
+ if ($streamer) {
$executionTime = intval(ini_get('max_execution_time'));
set_time_limit(0);
- if ($get_type === self::ZIP_FILES) {
+ if ($getType === self::ZIP_FILES) {
foreach ($files as $file) {
$file = $dir . '/' . $file;
if (\OC\Files\Filesystem::is_file($file)) {
+ $fileSize = \OC\Files\Filesystem::filesize($file);
$fh = \OC\Files\Filesystem::fopen($file, 'r');
- $zip->addFileFromStream($fh, basename($file));
+ $streamer->addFileFromStream($fh, basename($file), $fileSize);
fclose($fh);
} elseif (\OC\Files\Filesystem::is_dir($file)) {
- self::zipAddDir($file, $zip);
+ $streamer->addDirRecursive($file);
}
}
- } elseif ($get_type === self::ZIP_DIR) {
+ } elseif ($getType === self::ZIP_DIR) {
$file = $dir . '/' . $files;
- self::zipAddDir($file, $zip);
+ $streamer->addDirRecursive($file);
}
- $zip->finalize();
+ $streamer->finalize();
set_time_limit($executionTime);
} else {
\OC\Files\Filesystem::readfile($filename);
}
- if ($get_type === self::FILE) {
+ if ($getType === self::FILE) {
$view->unlockFile($filename, ILockingProvider::LOCK_SHARED);
}
} catch (\OCP\Lock\LockedException $ex) {
@@ -178,35 +178,6 @@ class OC_Files {
}
/**
- * @param string $dir
- * @param ZipStreamer $zip
- * @param string $internalDir
- */
- public static function zipAddDir($dir, ZipStreamer $zip, $internalDir='') {
- $dirname=basename($dir);
- $rootDir = $internalDir.$dirname;
- if (!empty($rootDir)) {
- $zip->addEmptyDir($rootDir);
- }
- $internalDir.=$dirname.='/';
- // prevent absolute dirs
- $internalDir = ltrim($internalDir, '/');
-
- $files=\OC\Files\Filesystem::getDirectoryContent($dir);
- foreach($files as $file) {
- $filename=$file['name'];
- $file=$dir.'/'.$filename;
- if(\OC\Files\Filesystem::is_file($file)) {
- $fh = \OC\Files\Filesystem::fopen($file, 'r');
- $zip->addFileFromStream($fh, $internalDir.$filename);
- fclose($fh);
- }elseif(\OC\Files\Filesystem::is_dir($file)) {
- self::zipAddDir($file, $zip, $internalDir);
- }
- }
- }
-
- /**
* set the maximum upload size limit for apache hosts using .htaccess
*
* @param int $size file size in bytes
diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php
index fb60ee5aa53..bfdab16b645 100644
--- a/lib/private/files/cache/scanner.php
+++ b/lib/private/files/cache/scanner.php
@@ -186,9 +186,9 @@ class Scanner extends BasicEmitter {
}
if (!empty($newData)) {
$data['fileid'] = $this->addToCache($file, $newData, $fileId);
- $this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId));
- \OC_Hook::emit('\OC\Files\Cache\Scanner', 'post_scan_file', array('path' => $file, 'storage' => $this->storageId));
}
+ $this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId));
+ \OC_Hook::emit('\OC\Files\Cache\Scanner', 'post_scan_file', array('path' => $file, 'storage' => $this->storageId));
} else {
$this->removeFromCache($file);
}
diff --git a/lib/private/files/storage/wrapper/permissionsmask.php b/lib/private/files/storage/wrapper/permissionsmask.php
index 50c3f2a6268..8d40d023630 100644
--- a/lib/private/files/storage/wrapper/permissionsmask.php
+++ b/lib/private/files/storage/wrapper/permissionsmask.php
@@ -66,7 +66,7 @@ class PermissionsMask extends Wrapper {
}
public function isSharable($path) {
- return $this->checkMask(Constants::PERMISSION_SHARE) and parent::isSharable($parm);
+ return $this->checkMask(Constants::PERMISSION_SHARE) and parent::isSharable($path);
}
public function getPermissions($path) {
diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php
index c70f4beb31d..558a1fba028 100644
--- a/lib/private/files/utils/scanner.php
+++ b/lib/private/files/utils/scanner.php
@@ -99,7 +99,12 @@ class Scanner extends PublicEmitter {
$scanner->listen('\OC\Files\Cache\Scanner', 'scanFolder', function ($path) use ($mount, $emitter) {
$emitter->emit('\OC\Files\Utils\Scanner', 'scanFolder', array($mount->getMountPoint() . $path));
});
-
+ $scanner->listen('\OC\Files\Cache\Scanner', 'postScanFile', function ($path) use ($mount, $emitter) {
+ $emitter->emit('\OC\Files\Utils\Scanner', 'postScanFile', array($mount->getMountPoint() . $path));
+ });
+ $scanner->listen('\OC\Files\Cache\Scanner', 'postScanFolder', function ($path) use ($mount, $emitter) {
+ $emitter->emit('\OC\Files\Utils\Scanner', 'postScanFolder', array($mount->getMountPoint() . $path));
+ });
// propagate etag and mtimes when files are changed or removed
$propagator = $this->propagator;
$propagatorListener = function ($path) use ($mount, $propagator) {
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index f92441492f7..95b688fef5c 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -153,7 +153,10 @@ class View {
return '/';
}
- if (strpos($path, $this->fakeRoot) !== 0) {
+ // missing slashes can cause wrong matches!
+ $root = rtrim($this->fakeRoot, '/') . '/';
+
+ if (strpos($path, $root) !== 0) {
return null;
} else {
$path = substr($path, strlen($this->fakeRoot));
diff --git a/lib/private/helper.php b/lib/private/helper.php
index b8e4b451835..dcd263daa24 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -193,11 +193,11 @@ class OC_Helper {
* Returns the path to the preview of the file.
*/
public static function previewIcon($path) {
- return self::linkToRoute( 'core_ajax_preview', array('x' => 36, 'y' => 36, 'file' => $path ));
+ return self::linkToRoute( 'core_ajax_preview', array('x' => 32, 'y' => 32, 'file' => $path ));
}
public static function publicPreviewIcon( $path, $token ) {
- return self::linkToRoute( 'core_ajax_public_preview', array('x' => 36, 'y' => 36, 'file' => $path, 't' => $token));
+ return self::linkToRoute( 'core_ajax_public_preview', array('x' => 32, 'y' => 32, 'file' => $path, 't' => $token));
}
/**
diff --git a/lib/private/l10n.php b/lib/private/l10n.php
index 168011cfcec..ad02ba88526 100644
--- a/lib/private/l10n.php
+++ b/lib/private/l10n.php
@@ -503,8 +503,9 @@ class OC_L10N implements \OCP\IL10N {
* @return array an array of available languages
*/
public static function findAvailableLanguages($app=null) {
- if(!empty(self::$availableLanguages)) {
- return self::$availableLanguages;
+ // also works with null as key
+ if(isset(self::$availableLanguages[$app]) && !empty(self::$availableLanguages[$app])) {
+ return self::$availableLanguages[$app];
}
$available=array('en');//english is always available
$dir = self::findI18nDir($app);
@@ -518,7 +519,7 @@ class OC_L10N implements \OCP\IL10N {
}
}
- self::$availableLanguages = $available;
+ self::$availableLanguages[$app] = $available;
return $available;
}
diff --git a/lib/private/lock/dblockingprovider.php b/lib/private/lock/dblockingprovider.php
index a08357a6024..8f017a713c1 100644
--- a/lib/private/lock/dblockingprovider.php
+++ b/lib/private/lock/dblockingprovider.php
@@ -102,10 +102,6 @@ class DBLockingProvider extends AbstractLockingProvider {
* @throws \OCP\Lock\LockedException
*/
public function acquireLock($path, $type) {
- if ($this->connection->inTransaction()) {
- $this->logger->warning("Trying to acquire a lock for '$path' while inside a transition");
- }
-
$expire = $this->getExpireTime();
if ($type === self::LOCK_SHARED) {
$result = $this->initLockField($path,1);
diff --git a/lib/private/log.php b/lib/private/log.php
index 3c0e7b45d1b..4a0a34b7113 100644
--- a/lib/private/log.php
+++ b/lib/private/log.php
@@ -3,6 +3,7 @@
* @author Bart Visscher <bartv@thisnet.nl>
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @author Morris Jobke <hey@morrisjobke.de>
+ * @author Olivier Paroz <owncloud@oparoz.com>
* @author Robin Appelman <icewind@owncloud.com>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Victor Dubiniuk <dubiniuk@owncloud.com>
@@ -26,6 +27,8 @@
namespace OC;
+use InterfaSys\LogNormalizer\Normalizer;
+
use \OCP\ILogger;
use OCP\Security\StringUtils;
@@ -48,12 +51,15 @@ class Log implements ILogger {
/** @var boolean|null cache the result of the log condition check for the request */
private $logConditionSatisfied = null;
+ /** @var Normalizer */
+ private $normalizer;
/**
* @param string $logger The logger that should be used
* @param SystemConfig $config the system config object
+ * @param null $normalizer
*/
- public function __construct($logger=null, SystemConfig $config=null) {
+ public function __construct($logger=null, SystemConfig $config=null, $normalizer = null) {
// FIXME: Add this for backwards compatibility, should be fixed at some point probably
if($config === null) {
$config = \OC::$server->getSystemConfig();
@@ -68,6 +74,11 @@ class Log implements ILogger {
} else {
$this->logger = $logger;
}
+ if ($normalizer === null) {
+ $this->normalizer = new Normalizer();
+ } else {
+ $this->normalizer = $normalizer;
+ }
}
@@ -175,6 +186,8 @@ class Log implements ILogger {
$minLevel = min($this->config->getValue('loglevel', \OCP\Util::WARN), \OCP\Util::ERROR);
$logCondition = $this->config->getValue('log.condition', []);
+ array_walk($context, [$this->normalizer, 'format']);
+
if (isset($context['app'])) {
$app = $context['app'];
@@ -241,4 +254,25 @@ class Log implements ILogger {
call_user_func(array($logger, 'write'), $app, $message, $level);
}
}
+
+ /**
+ * Logs an exception very detailed
+ *
+ * @param \Exception $exception
+ * @param array $context
+ * @return void
+ * @since 8.2.0
+ */
+ public function logException(\Exception $exception, array $context = array()) {
+ $exception = array(
+ 'Exception' => get_class($exception),
+ 'Message' => $exception->getMessage(),
+ 'Code' => $exception->getCode(),
+ 'Trace' => $exception->getTraceAsString(),
+ 'File' => $exception->getFile(),
+ 'Line' => $exception->getLine(),
+ );
+ $exception['Trace'] = preg_replace('!(login|checkPassword)\(.*\)!', '$1(*** username and password replaced ***)', $exception['Trace']);
+ $this->error('Exception: ' . json_encode($exception), $context);
+ }
}
diff --git a/lib/private/preview.php b/lib/private/preview.php
index 978da1161c2..1127048b7fd 100644
--- a/lib/private/preview.php
+++ b/lib/private/preview.php
@@ -837,6 +837,11 @@ class Preview {
$askedWidth = $this->getMaxX();
$askedHeight = $this->getMaxY();
+ if ($this->mode === self::MODE_COVER) {
+ list($askedWidth, $askedHeight) =
+ $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight);
+ }
+
/**
* Phase 1: If required, adjust boundaries to keep aspect ratio
*/
@@ -845,20 +850,12 @@ class Preview {
$this->applyAspectRatio($askedWidth, $askedHeight, $previewWidth, $previewHeight);
}
- if ($this->mode === self::MODE_COVER) {
- list($scaleWidth, $scaleHeight) =
- $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight);
- } else {
- $scaleWidth = $askedWidth;
- $scaleHeight = $askedHeight;
- }
-
/**
* Phase 2: Resizes preview to try and match requirements.
* Takes the scaling ratio into consideration
*/
list($newPreviewWidth, $newPreviewHeight) = $this->scale(
- $image, $scaleWidth, $scaleHeight, $previewWidth, $previewHeight
+ $image, $askedWidth, $askedHeight, $previewWidth, $previewHeight
);
// The preview has been resized and should now have the asked dimensions
@@ -890,6 +887,7 @@ class Preview {
return;
}
+
// The preview is smaller, but we can't touch it
$this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight);
}
@@ -1296,6 +1294,13 @@ class Preview {
/**
* @param array $args
+ */
+ public static function post_delete_versions($args) {
+ self::post_delete($args, 'files/');
+ }
+
+ /**
+ * @param array $args
* @param string $prefix
*/
public static function post_delete($args, $prefix = '') {
diff --git a/lib/private/preview/image.php b/lib/private/preview/image.php
index f9c27e690f6..fd90b15eb0c 100644
--- a/lib/private/preview/image.php
+++ b/lib/private/preview/image.php
@@ -46,12 +46,16 @@ abstract class Image extends Provider {
$image = new \OC_Image();
- if ($fileInfo['encrypted'] === true) {
+ $useTempFile = $fileInfo->isEncrypted() || !$fileInfo->getStorage()->isLocal();
+ if ($useTempFile) {
$fileName = $fileview->toTmpFile($path);
} else {
$fileName = $fileview->getLocalFile($path);
}
$image->loadFromFile($fileName);
+ if ($useTempFile) {
+ unlink($fileName);
+ }
$image->fixOrientation();
if ($image->valid()) {
$image->scaleDownToFit($maxX, $maxY);
diff --git a/lib/private/preview/txt.php b/lib/private/preview/txt.php
index 0bba570a8c9..2fdc86d9546 100644
--- a/lib/private/preview/txt.php
+++ b/lib/private/preview/txt.php
@@ -53,7 +53,7 @@ class TXT extends Provider {
$lines = preg_split("/\r\n|\n|\r/", $content);
- $fontSize = ($maxX) ? (int) ((5 / 36) * $maxX) : 5; //5px
+ $fontSize = ($maxX) ? (int) ((5 / 32) * $maxX) : 5; //5px
$lineSize = ceil($fontSize * 1.25);
$image = imagecreate($maxX, $maxY);
diff --git a/lib/private/repair.php b/lib/private/repair.php
index 533bf05b54c..3639440a518 100644
--- a/lib/private/repair.php
+++ b/lib/private/repair.php
@@ -103,7 +103,7 @@ class Repair extends BasicEmitter {
*/
public static function getRepairSteps() {
return [
- new RepairMimeTypes(),
+ new RepairMimeTypes(\OC::$server->getConfig()),
new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
new RepairConfig(),
new AssetCache(),
diff --git a/lib/private/response.php b/lib/private/response.php
index f1a429463f2..2cd1d990e51 100644
--- a/lib/private/response.php
+++ b/lib/private/response.php
@@ -247,7 +247,7 @@ class OC_Response {
. 'script-src \'self\' \'unsafe-eval\'; '
. 'style-src \'self\' \'unsafe-inline\'; '
. 'frame-src *; '
- . 'img-src *; '
+ . 'img-src * data: blob:; '
. 'font-src \'self\' data:; '
. 'media-src *; '
. 'connect-src *';
diff --git a/lib/private/server.php b/lib/private/server.php
index 9f99ead849b..26eb99927fc 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -1098,4 +1098,5 @@ class Server extends SimpleContainer implements IServerContainer {
public function getUserStoragesService() {
return \OC_Mount_Config::$app->getContainer()->query('OCA\\Files_External\\Service\\UserStoragesService');
}
+
}
diff --git a/lib/private/session/cryptowrapper.php b/lib/private/session/cryptowrapper.php
index 261514d683e..70c1dab7404 100644
--- a/lib/private/session/cryptowrapper.php
+++ b/lib/private/session/cryptowrapper.php
@@ -39,7 +39,7 @@ use OCP\Security\ISecureRandom;
* it as an additional small security obfuscation layer to comply with compliance
* guidelines.
*
- * TODO: Remove this in a future relase with an approach such as
+ * TODO: Remove this in a future release with an approach such as
* https://github.com/owncloud/core/pull/17866
*
* @package OC\Session
diff --git a/lib/private/session/internal.php b/lib/private/session/internal.php
index 8ee21272104..e10999ec48f 100644
--- a/lib/private/session/internal.php
+++ b/lib/private/session/internal.php
@@ -106,7 +106,7 @@ class Internal extends Session {
private function validateSession() {
if ($this->sessionClosed) {
- throw new \Exception('Session has been closed - no further changes to the session as allowed');
+ throw new \Exception('Session has been closed - no further changes to the session are allowed');
}
}
}
diff --git a/lib/private/session/memory.php b/lib/private/session/memory.php
index 1cae62e44d3..0fc9165c7cd 100644
--- a/lib/private/session/memory.php
+++ b/lib/private/session/memory.php
@@ -93,7 +93,7 @@ class Memory extends Session {
*/
private function validateSession() {
if ($this->sessionClosed) {
- throw new \Exception('Session has been closed - no further changes to the session as allowed');
+ throw new \Exception('Session has been closed - no further changes to the session are allowed');
}
}
}
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 07c7f31a853..32389f34868 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -1998,7 +1998,6 @@ class Share extends Constants {
$suggestedItemTarget = $result['suggestedItemTarget'];
$suggestedFileTarget = $result['suggestedFileTarget'];
$filePath = $result['filePath'];
- $expirationDate = $result['expirationDate'];
}
$isGroupShare = false;
diff --git a/lib/private/streamer.php b/lib/private/streamer.php
new file mode 100644
index 00000000000..6f0a70e2388
--- /dev/null
+++ b/lib/private/streamer.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * @author Victor Dubiniuk <dubiniuk@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC;
+
+use ownCloud\TarStreamer\TarStreamer;
+use ZipStreamer\ZipStreamer;
+
+class Streamer {
+ // array of regexp. Matching user agents will get tar instead of zip
+ private $preferTarFor = [ '/macintosh|mac os x/i' ];
+
+ // streamer instance
+ private $streamerInstance;
+
+ public function __construct(){
+ /** @var \OCP\IRequest */
+ $request = \OC::$server->getRequest();
+
+ if ($request->isUserAgent($this->preferTarFor)) {
+ $this->streamerInstance = new TarStreamer();
+ } else {
+ $this->streamerInstance = new ZipStreamer();
+ }
+ }
+
+ /**
+ * Send HTTP headers
+ * @param string $name
+ */
+ public function sendHeaders($name){
+ $extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar';
+ $fullName = $name . $extension;
+ // ZipStreamer does not escape name in Content-Disposition atm
+ if ($this->streamerInstance instanceof ZipStreamer) {
+ $fullName = rawurlencode($fullName);
+ }
+ $this->streamerInstance->sendHeaders($fullName);
+ }
+
+ /**
+ * Stream directory recursively
+ * @param string $dir
+ * @param string $internalDir
+ */
+ public function addDirRecursive($dir, $internalDir='') {
+ $dirname = basename($dir);
+ $rootDir = $internalDir . $dirname;
+ if (!empty($rootDir)) {
+ $this->streamerInstance->addEmptyDir($rootDir);
+ }
+ $internalDir .= $dirname . '/';
+ // prevent absolute dirs
+ $internalDir = ltrim($internalDir, '/');
+
+ $files= \OC\Files\Filesystem::getDirectoryContent($dir);
+ foreach($files as $file) {
+ $filename = $file['name'];
+ $file = $dir . '/' . $filename;
+ if(\OC\Files\Filesystem::is_file($file)) {
+ $filesize = \OC\Files\Filesystem::filesize($file);
+ $fh = \OC\Files\Filesystem::fopen($file, 'r');
+ $this->addFileFromStream($fh, $internalDir . $filename, $filesize);
+ fclose($fh);
+ }elseif(\OC\Files\Filesystem::is_dir($file)) {
+ $this->addDirRecursive($file, $internalDir);
+ }
+ }
+ }
+
+ /**
+ * Add a file to the archive at the specified location and file name.
+ *
+ * @param string $stream Stream to read data from
+ * @param string $internalName Filepath and name to be used in the archive.
+ * @param int $size Filesize
+ * @return bool $success
+ */
+ public function addFileFromStream($stream, $internalName, $size){
+ if ($this->streamerInstance instanceof ZipStreamer) {
+ return $this->streamerInstance->addFileFromStream($stream, $internalName);
+ } else {
+ return $this->streamerInstance->addFileFromStream($stream, $internalName, $size);
+ }
+ }
+
+ /**
+ * Add an empty directory entry to the archive.
+ *
+ * @param string $directoryPath Directory Path and name to be added to the archive.
+ * @return bool $success
+ */
+ public function addEmptyDir($dirName){
+ return $this->streamerInstance->addEmptyDir($dirName);
+ }
+
+ /**
+ * Close the archive.
+ * A closed archive can no longer have new files added to it. After
+ * closing, the file is completely written to the output stream.
+ * @return bool $success
+ */
+ public function finalize(){
+ return $this->streamerInstance->finalize();
+ }
+}
diff --git a/lib/private/systemconfig.php b/lib/private/systemconfig.php
index 13b0959768a..94b815aebd7 100644
--- a/lib/private/systemconfig.php
+++ b/lib/private/systemconfig.php
@@ -22,12 +22,28 @@
namespace OC;
+
+use OCP\IConfig;
+
/**
* Class which provides access to the system config values stored in config.php
* Internal class for bootstrap only.
* fixes cyclic DI: AllConfig needs AppConfig needs Database needs AllConfig
*/
class SystemConfig {
+
+ /** @var array */
+ protected $sensitiveValues = [
+ 'dbpassword' => true,
+ 'dbuser' => true,
+ 'mail_smtpname' => true,
+ 'mail_smtppassword' => true,
+ 'passwordsalt' => true,
+ 'secret' => true,
+ 'ldap_agent_password' => true,
+ 'objectstore' => ['arguments' => ['password' => true]],
+ ];
+
/**
* Lists all available config keys
* @return array an array of key names
@@ -68,6 +84,23 @@ class SystemConfig {
}
/**
+ * Looks up a system wide defined value and filters out sensitive data
+ *
+ * @param string $key the key of the value, under which it was saved
+ * @param mixed $default the default value to be returned if the value isn't set
+ * @return mixed the value or $default
+ */
+ public function getFilteredValue($key, $default = '') {
+ $value = $this->getValue($key, $default);
+
+ if (isset($this->sensitiveValues[$key])) {
+ $value = $this->removeSensitiveValue($this->sensitiveValues[$key], $value);
+ }
+
+ return $value;
+ }
+
+ /**
* Delete a system wide defined value
*
* @param string $key the key of the value, under which it was saved
@@ -75,4 +108,25 @@ class SystemConfig {
public function deleteValue($key) {
\OC_Config::deleteKey($key);
}
+
+ /**
+ * @param bool|array $keysToRemove
+ * @param mixed $value
+ * @return mixed
+ */
+ protected function removeSensitiveValue($keysToRemove, $value) {
+ if ($keysToRemove === true) {
+ return IConfig::SENSITIVE_VALUE;
+ }
+
+ if (is_array($value)) {
+ foreach ($keysToRemove as $keyToRemove => $valueToRemove) {
+ if (isset($value[$keyToRemove])) {
+ $value[$keyToRemove] = $this->removeSensitiveValue($valueToRemove, $value[$keyToRemove]);
+ }
+ }
+ }
+
+ return $value;
+ }
}
diff --git a/lib/private/template.php b/lib/private/template.php
index 920be71abbf..0300e43edea 100644
--- a/lib/private/template.php
+++ b/lib/private/template.php
@@ -37,27 +37,40 @@ require_once __DIR__.'/template/functions.php';
* This class provides the templates for ownCloud.
*/
class OC_Template extends \OC\Template\Base {
- private $renderas; // Create a full page?
+
+ /** @var string */
+ private $renderAs; // Create a full page?
+
+ /** @var string */
private $path; // The path to the template
+
+ /** @var array */
private $headers = array(); //custom headers
+
+ /** @var string */
protected $app; // app id
/**
* Constructor
* @param string $app app providing the template
* @param string $name of the template file (without suffix)
- * @param string $renderas = ""; produce a full page
+ * @param string $renderAs = ""; produce a full page
* @param bool $registerCall = true
* @return OC_Template object
*
* This function creates an OC_Template object.
*
- * If $renderas is set, OC_Template will try to produce a full page in the
- * according layout. For now, renderas can be set to "guest", "user" or
+ * If $renderAs is set, OC_Template will try to produce a full page in the
+ * according layout. For now, $renderAs can be set to "guest", "user" or
* "admin".
*/
- public function __construct( $app, $name, $renderas = "", $registerCall = true ) {
+
+ protected static $initTemplateEngineFirstRun = true;
+
+ public function __construct( $app, $name, $renderAs = "", $registerCall = true ) {
// Read the selected theme from the config file
+ self::initTemplateEngine();
+
$theme = OC_Util::getTheme();
$requesttoken = (OC::$server->getSession() and $registerCall) ? OC_Util::callRegister() : '';
@@ -69,13 +82,85 @@ class OC_Template extends \OC\Template\Base {
list($path, $template) = $this->findTemplate($theme, $app, $name);
// Set the private data
- $this->renderas = $renderas;
+ $this->renderAs = $renderAs;
$this->path = $path;
$this->app = $app;
parent::__construct($template, $requesttoken, $l10n, $themeDefaults);
}
+ public static function initTemplateEngine() {
+ if (self::$initTemplateEngineFirstRun){
+
+ //apps that started before the template initialization can load their own scripts/styles
+ //so to make sure this scripts/styles here are loaded first we use OC_Util::addScript() with $prepend=true
+ //meaning the last script/style in this list will be loaded first
+ if (\OC::$server->getSystemConfig ()->getValue ( 'installed', false ) && ! \OCP\Util::needUpgrade ()) {
+ if (\OC::$server->getConfig ()->getAppValue ( 'core', 'backgroundjobs_mode', 'ajax' ) == 'ajax') {
+ OC_Util::addScript ( 'backgroundjobs', null, true );
+ }
+ }
+
+ OC_Util::addStyle("tooltip",null,true);
+ OC_Util::addStyle('jquery-ui-fixes',null,true);
+ OC_Util::addVendorStyle('jquery-ui/themes/base/jquery-ui',null,true);
+ OC_Util::addStyle("multiselect",null,true);
+ OC_Util::addStyle("fixes",null,true);
+ OC_Util::addStyle("apps",null,true);
+ OC_Util::addStyle("fonts",null,true);
+ OC_Util::addStyle("icons",null,true);
+ OC_Util::addStyle("mobile",null,true);
+ OC_Util::addStyle("header",null,true);
+ OC_Util::addStyle("styles",null,true);
+
+ // avatars
+ if (\OC::$server->getSystemConfig()->getValue('enable_avatars', true) === true) {
+ \OC_Util::addScript('avatar', null, true);
+ \OC_Util::addScript('jquery.avatar', null, true);
+ \OC_Util::addScript('placeholder', null, true);
+ }
+
+ OC_Util::addScript('oc-backbone', null, true);
+ OC_Util::addVendorScript('core', 'backbone/backbone', true);
+ OC_Util::addVendorScript('snapjs/dist/latest/snap', null, true);
+ OC_Util::addScript('mimetypelist', null, true);
+ OC_Util::addScript('mimetype', null, true);
+ OC_Util::addScript("apps", null, true);
+ OC_Util::addScript("oc-requesttoken", null, true);
+ OC_Util::addScript('search', 'search', true);
+ OC_Util::addScript("config", null, true);
+ OC_Util::addScript("eventsource", null, true);
+ OC_Util::addScript("octemplate", null, true);
+ OC_Util::addTranslations("core", null, true);
+ OC_Util::addScript("l10n", null, true);
+ OC_Util::addScript("js", null, true);
+ OC_Util::addScript("oc-dialogs", null, true);
+ OC_Util::addScript("jquery.ocdialog", null, true);
+ OC_Util::addStyle("jquery.ocdialog");
+ OC_Util::addScript("compatibility", null, true);
+ OC_Util::addScript("placeholders", null, true);
+
+ // Add the stuff we need always
+ // following logic will import all vendor libraries that are
+ // specified in core/js/core.json
+ $fileContent = file_get_contents(OC::$SERVERROOT . '/core/js/core.json');
+ if($fileContent !== false) {
+ $coreDependencies = json_decode($fileContent, true);
+ foreach(array_reverse($coreDependencies['vendor']) as $vendorLibrary) {
+ // remove trailing ".js" as addVendorScript will append it
+ OC_Util::addVendorScript(
+ substr($vendorLibrary, 0, strlen($vendorLibrary) - 3),null,true);
+ }
+ } else {
+ throw new \Exception('Cannot read core/js/core.json');
+ }
+
+ self::$initTemplateEngineFirstRun = false;
+ }
+
+ }
+
+
/**
* find the template with the given name
* @param string $name of the template file (without suffix)
@@ -118,14 +203,14 @@ class OC_Template extends \OC\Template\Base {
* Process the template
* @return boolean|string
*
- * This function process the template. If $this->renderas is set, it
+ * This function process the template. If $this->renderAs is set, it
* will produce a full page.
*/
public function fetchPage() {
$data = parent::fetchPage();
- if( $this->renderas ) {
- $page = new OC_TemplateLayout($this->renderas, $this->app);
+ if( $this->renderAs ) {
+ $page = new OC_TemplateLayout($this->renderAs, $this->app);
// Add custom headers
$headers = '';
@@ -141,18 +226,20 @@ class OC_Template extends \OC\Template\Base {
}
}
- $page->assign('headers', $headers, false);
+ $page->assign('headers', $headers);
- $page->assign('content', $data, false );
+ $page->assign('content', $data);
return $page->fetchPage();
}
- else{
- return $data;
- }
+
+ return $data;
}
/**
* Include template
+ *
+ * @param string $file
+ * @param array|null $additionalParams
* @return string returns content of included template
*
* Includes another template. use <?php echo $this->inc('template'); ?> to
@@ -222,7 +309,7 @@ class OC_Template extends \OC\Template\Base {
/**
* print error page using Exception details
- * @param Exception|Error $exception
+ * @param Exception $exception
*/
public static function printExceptionErrorPage($exception) {
$request = \OC::$server->getRequest();
diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php
index 93bf6cbd307..43c83dea815 100644
--- a/lib/private/templatelayout.php
+++ b/lib/private/templatelayout.php
@@ -38,8 +38,8 @@ use Assetic\AssetWriter;
use Assetic\Filter\CssImportFilter;
use Assetic\Filter\CssMinFilter;
use Assetic\Filter\CssRewriteFilter;
-use Assetic\Filter\JSMinFilter;
-use OC\Assetic\SeparatorFilter; // waiting on upstream
+use Assetic\Filter\JSqueezeFilter;
+use Assetic\Filter\SeparatorFilter;
/**
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
@@ -116,9 +116,14 @@ class OC_TemplateLayout extends OC_Template {
}
}
$userDisplayName = OC_User::getDisplayName();
+ $appsMgmtActive = strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')) === 0;
+ if ($appsMgmtActive) {
+ $l = \OC::$server->getL10N('lib');
+ $this->assign('application', $l->t('Apps'));
+ }
$this->assign('user_displayname', $userDisplayName);
$this->assign('user_uid', OC_User::getUser());
- $this->assign('appsmanagement_active', strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')) === 0 );
+ $this->assign('appsmanagement_active', $appsMgmtActive);
$this->assign('enableAvatars', $this->config->getSystemValue('enable_avatars', true));
$this->assign('userAvatarSet', \OC_Helper::userAvatarSet(OC_User::getUser()));
} else if ($renderAs == 'error') {
@@ -148,7 +153,7 @@ class OC_TemplateLayout extends OC_Template {
} else {
// Add the js files
$jsFiles = self::findJavascriptFiles(OC_Util::$scripts);
- $this->assign('jsfiles', array(), false);
+ $this->assign('jsfiles', array());
if ($this->config->getSystemValue('installed', false) && $renderAs != 'error') {
$this->append( 'jsfiles', OC_Helper::linkToRoute('js_config', array('v' => self::$versionHash)));
}
@@ -220,7 +225,7 @@ class OC_TemplateLayout extends OC_Template {
), $root, $file);
}
return new FileAsset($root . '/' . $file, array(
- new JSMinFilter(),
+ new JSqueezeFilter(),
new SeparatorFilter(';')
), $root, $file);
}, $jsFiles);
diff --git a/lib/private/updater.php b/lib/private/updater.php
index b33180c3425..8aa8b0703d7 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -32,6 +32,7 @@
namespace OC;
+use OC\Core\Command\Log\Manage;
use OC\Hooks\BasicEmitter;
use OC_App;
use OC_Installer;
@@ -69,6 +70,14 @@ class Updater extends BasicEmitter {
/** @var bool */
private $skip3rdPartyAppsDisable;
+ private $logLevelNames = [
+ 0 => 'Debug',
+ 1 => 'Info',
+ 2 => 'Warning',
+ 3 => 'Error',
+ 4 => 'Fatal',
+ ];
+
/**
* @param HTTPHelper $httpHelper
* @param IConfig $config
@@ -177,6 +186,10 @@ class Updater extends BasicEmitter {
* @return bool true if the operation succeeded, false otherwise
*/
public function upgrade() {
+ $logLevel = $this->config->getSystemValue('loglevel', \OCP\Util::WARN);
+ $this->emit('\OC\Updater', 'setDebugLogLevel', [ $logLevel, $this->logLevelNames[$logLevel] ]);
+ $this->config->setSystemValue('loglevel', \OCP\Util::DEBUG);
+
$wasMaintenanceModeEnabled = $this->config->getSystemValue('maintenance', false);
if(!$wasMaintenanceModeEnabled) {
@@ -208,6 +221,9 @@ class Updater extends BasicEmitter {
$this->emit('\OC\Updater', 'maintenanceActive');
}
+ $this->emit('\OC\Updater', 'resetLogLevel', [ $logLevel, $this->logLevelNames[$logLevel] ]);
+ $this->config->setSystemValue('loglevel', $logLevel);
+
return $success;
}
diff --git a/lib/private/util.php b/lib/private/util.php
index 667d358655f..9abaef71a68 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -439,16 +439,23 @@ class OC_Util {
*
* @param string $application application id
* @param string|null $file filename
+ * @param bool $prepend prepend the Script to the beginning of the list
* @return void
*/
- public static function addScript($application, $file = null) {
+ public static function addScript($application, $file = null, $prepend = false) {
$path = OC_Util::generatePath($application, 'js', $file);
+ //TODO eliminate double code
if (!in_array($path, self::$scripts)) {
// core js files need separate handling
if ($application !== 'core' && $file !== null) {
self::addTranslations($application);
}
- self::$scripts[] = $path;
+ if ($prepend===true) {
+ array_unshift(self::$scripts, $path);
+ }
+ else {
+ self::$scripts[] = $path;
+ }
}
}
@@ -457,12 +464,18 @@ class OC_Util {
*
* @param string $application application id
* @param string|null $file filename
+ * @param bool $prepend prepend the Script to the beginning of the list
* @return void
*/
- public static function addVendorScript($application, $file = null) {
+ public static function addVendorScript($application, $file = null, $prepend = false) {
$path = OC_Util::generatePath($application, 'vendor', $file);
- if (!in_array($path, self::$scripts)) {
- self::$scripts[] = $path;
+ //TODO eliminate double code
+ if (! in_array ( $path, self::$scripts )) {
+ if ($prepend === true) {
+ array_unshift ( self::$scripts, $path );
+ } else {
+ self::$scripts [] = $path;
+ }
}
}
@@ -471,8 +484,9 @@ class OC_Util {
*
* @param string $application application id
* @param string $languageCode language code, defaults to the current language
+ * @param bool $prepend prepend the Script to the beginning of the list
*/
- public static function addTranslations($application, $languageCode = null) {
+ public static function addTranslations($application, $languageCode = null, $prepend = false) {
if (is_null($languageCode)) {
$languageCode = \OC_L10N::findLanguage($application);
}
@@ -481,8 +495,13 @@ class OC_Util {
} else {
$path = "l10n/$languageCode";
}
+ //TODO eliminate double code
if (!in_array($path, self::$scripts)) {
- self::$scripts[] = $path;
+ if ($prepend === true) {
+ array_unshift ( self::$scripts, $path );
+ } else {
+ self::$scripts [] = $path;
+ }
}
}
@@ -491,12 +510,18 @@ class OC_Util {
*
* @param string $application application id
* @param string|null $file filename
+ * @param bool $prepend prepend the Style to the beginning of the list
* @return void
*/
- public static function addStyle($application, $file = null) {
+ public static function addStyle($application, $file = null, $prepend = false) {
$path = OC_Util::generatePath($application, 'css', $file);
+ //TODO eliminate double code
if (!in_array($path, self::$styles)) {
- self::$styles[] = $path;
+ if ($prepend === true) {
+ array_unshift ( self::$styles, $path );
+ } else {
+ self::$styles[] = $path;
+ }
}
}
@@ -505,12 +530,18 @@ class OC_Util {
*
* @param string $application application id
* @param string|null $file filename
+ * @param bool $prepend prepend the Style to the beginning of the list
* @return void
*/
- public static function addVendorStyle($application, $file = null) {
+ public static function addVendorStyle($application, $file = null, $prepend = false) {
$path = OC_Util::generatePath($application, 'vendor', $file);
+ //TODO eliminate double code
if (!in_array($path, self::$styles)) {
- self::$styles[] = $path;
+ if ($prepend === true) {
+ array_unshift ( self::$styles, $path );
+ } else {
+ self::$styles[] = $path;
+ }
}
}
diff --git a/lib/public/appframework/http/contentsecuritypolicy.php b/lib/public/appframework/http/contentsecuritypolicy.php
index ee36f7aac17..07c76f2969c 100644
--- a/lib/public/appframework/http/contentsecuritypolicy.php
+++ b/lib/public/appframework/http/contentsecuritypolicy.php
@@ -64,6 +64,7 @@ class ContentSecurityPolicy {
private $allowedImageDomains = [
'\'self\'',
'data:',
+ 'blob:',
];
/** @var array Domains to which connections can be done */
private $allowedConnectDomains = [
diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php
index ff0b6c6a5b0..933eef97ae1 100644
--- a/lib/public/iconfig.php
+++ b/lib/public/iconfig.php
@@ -41,6 +41,11 @@ namespace OCP;
*/
interface IConfig {
/**
+ * @since 8.2.0
+ */
+ const SENSITIVE_VALUE = '***REMOVED SENSITIVE VALUE***';
+
+ /**
* Sets and deletes system wide values
*
* @param array $configs Associative array with `key => value` pairs
@@ -69,6 +74,16 @@ interface IConfig {
public function getSystemValue($key, $default = '');
/**
+ * Looks up a system wide defined value and filters out sensitive data
+ *
+ * @param string $key the key of the value, under which it was saved
+ * @param mixed $default the default value to be returned if the value isn't set
+ * @return mixed the value or $default
+ * @since 8.2.0
+ */
+ public function getFilteredSystemValue($key, $default = '');
+
+ /**
* Delete a system wide defined value
*
* @param string $key the key of the value, under which it was saved
diff --git a/lib/public/ilogger.php b/lib/public/ilogger.php
index 43b1ef70e5b..27a5d63dfdb 100644
--- a/lib/public/ilogger.php
+++ b/lib/public/ilogger.php
@@ -122,4 +122,14 @@ interface ILogger {
* @since 7.0.0
*/
public function log($level, $message, array $context = array());
+
+ /**
+ * Logs an exception very detailed
+ *
+ * @param \Exception $exception
+ * @param array $context
+ * @return void
+ * @since 8.2.0
+ */
+ public function logException(\Exception $exception, array $context = array());
}
diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php
index 8be23dff214..e37652c1adc 100644
--- a/lib/public/iservercontainer.php
+++ b/lib/public/iservercontainer.php
@@ -194,6 +194,12 @@ interface IServerContainer {
public function getAppConfig();
/**
+ * @return \OCP\L10N\IFactory
+ * @since 8.2.0
+ */
+ public function getL10NFactory();
+
+ /**
* get an L10N instance
* @param string $app appid
* @param string $lang
diff --git a/lib/public/sabrepluginevent.php b/lib/public/sabrepluginevent.php
new file mode 100644
index 00000000000..fed3237166d
--- /dev/null
+++ b/lib/public/sabrepluginevent.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP;
+
+
+use OCP\AppFramework\Http;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * @since 8.2.0
+ */
+class SabrePluginEvent extends Event {
+
+ /** @var int */
+ protected $statusCode;
+
+ /** @var string */
+ protected $message;
+
+ /**
+ * @since 8.2.0
+ */
+ public function __construct() {
+ $this->message = '';
+ $this->statusCode = Http::STATUS_OK;
+ }
+
+ /**
+ * @param int $statusCode
+ * @return self
+ * @since 8.2.0
+ */
+ public function setStatusCode($statusCode) {
+ $this->statusCode = (int) $statusCode;
+ return $this;
+ }
+
+ /**
+ * @param string $message
+ * @return self
+ * @since 8.2.0
+ */
+ public function setMessage($message) {
+ $this->message = (string) $message;
+ return $this;
+ }
+
+ /**
+ * @return int
+ * @since 8.2.0
+ */
+ public function getStatusCode() {
+ return $this->statusCode;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getMessage() {
+ return $this->message;
+ }
+}
diff --git a/lib/public/sabrepluginexception.php b/lib/public/sabrepluginexception.php
new file mode 100644
index 00000000000..5dba3b90a02
--- /dev/null
+++ b/lib/public/sabrepluginexception.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP;
+
+
+use Sabre\DAV\Exception;
+
+/**
+ * @since 8.2.0
+ */
+class SabrePluginException extends Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ * @since 8.2.0
+ */
+ public function getHTTPCode() {
+ return $this->code;
+ }
+}
diff --git a/lib/public/util.php b/lib/public/util.php
index c32668b14a8..1ba091d1952 100644
--- a/lib/public/util.php
+++ b/lib/public/util.php
@@ -158,17 +158,10 @@ class Util {
* @param \Exception $ex exception to log
* @param int $level log level, defaults to \OCP\Util::FATAL
* @since ....0.0 - parameter $level was added in 7.0.0
+ * @deprecated 8.2.0 use logException of \OCP\ILogger
*/
public static function logException( $app, \Exception $ex, $level = \OCP\Util::FATAL ) {
- $exception = array(
- 'Exception' => get_class($ex),
- 'Message' => $ex->getMessage(),
- 'Code' => $ex->getCode(),
- 'Trace' => $ex->getTraceAsString(),
- 'File' => $ex->getFile(),
- 'Line' => $ex->getLine(),
- );
- \OCP\Util::writeLog($app, 'Exception: ' . json_encode($exception), $level);
+ \OC::$server->getLogger()->logException($ex, ['app' => $app]);
}
/**
@@ -661,6 +654,7 @@ class Util {
return \OC_Util::isDefaultExpireDateEnforced();
}
+ protected static $needUpgradeCache = null;
/**
* Checks whether the current version needs upgrade.
@@ -669,6 +663,9 @@ class Util {
* @since 7.0.0
*/
public static function needUpgrade() {
- return \OC_Util::needUpgrade(\OC::$server->getConfig());
+ if (!isset(self::$needUpgradeCache)) {
+ self::$needUpgradeCache=\OC_Util::needUpgrade(\OC::$server->getConfig());
+ }
+ return self::$needUpgradeCache;
}
}
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index 89ad0ed16c7..db11f526ad6 100644
--- a/lib/repair/repairmimetypes.php
+++ b/lib/repair/repairmimetypes.php
@@ -29,6 +29,17 @@ namespace OC\Repair;
use OC\Hooks\BasicEmitter;
class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
+ /**
+ * @var \OCP\IConfig
+ */
+ protected $config;
+
+ /**
+ * @param \OCP\IConfig $config
+ */
+ public function __construct($config) {
+ $this->config = $config;
+ }
public function getName() {
return 'Repair mime types';
@@ -243,36 +254,45 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
* Fix mime types
*/
public function run() {
- if ($this->fixOfficeMimeTypes()) {
- $this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
- }
- if ($this->fixApkMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
- }
+ $ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
- if ($this->fixFontsMimeTypes()) {
- $this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
- }
+ // NOTE TO DEVELOPERS: when adding new mime types, please make sure to
+ // add a version comparison to avoid doing it every time
- if ($this->fixPostscriptMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
- }
+ // only update mime types if necessary as it can be expensive
+ if (version_compare($ocVersionFromBeforeUpdate, '8.2.0', '<')) {
+ if ($this->fixOfficeMimeTypes()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
+ }
- if ($this->introduceRawMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
- }
+ if ($this->fixApkMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
+ }
- if ($this->introduce3dImagesMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
- }
+ if ($this->fixFontsMimeTypes()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
+ }
- if ($this->introduceConfMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
- }
+ if ($this->fixPostscriptMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
+ }
+
+ if ($this->introduceRawMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
+ }
+
+ if ($this->introduce3dImagesMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
+ }
- if ($this->introduceYamlMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
+ if ($this->introduceConfMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
+ }
+
+ if ($this->introduceYamlMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
+ }
}
}
}
diff --git a/settings/admin.php b/settings/admin.php
index 38683438f3a..31c9b8c1376 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -37,7 +37,7 @@ OC_Util::checkAdminUser();
OC_App::setActiveNavigationEntry("admin");
$template = new OC_Template('settings', 'admin', 'user');
-$l = OC_L10N::get('settings');
+$l = \OC::$server->getL10N('settings');
$showLog = (\OC::$server->getConfig()->getSystemValue('log_type', 'owncloud') === 'owncloud');
$numEntriesToLoad = 3;
@@ -122,6 +122,7 @@ $template->assign('allowPublicUpload', $appConfig->getValue('core', 'shareapi_al
$template->assign('allowResharing', $appConfig->getValue('core', 'shareapi_allow_resharing', 'yes'));
$template->assign('allowPublicMailNotification', $appConfig->getValue('core', 'shareapi_allow_public_notification', 'no'));
$template->assign('allowMailNotification', $appConfig->getValue('core', 'shareapi_allow_mail_notification', 'no'));
+$template->assign('allowShareDialogUserEnumeration', $appConfig->getValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes'));
$template->assign('onlyShareWithGroupMembers', \OC\Share\Share::shareWithGroupMembersOnly());
$databaseOverload = (strpos(\OCP\Config::getSystemValue('dbtype'), 'sqlite') !== false);
$template->assign('databaseOverload', $databaseOverload);
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 5b12366ad40..47d63c11b95 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -813,44 +813,73 @@ $(document).ready(function () {
});
});
+ if ($('#CheckboxStorageLocation').is(':checked')) {
+ $("#userlist .storageLocation").show();
+ }
// Option to display/hide the "Storage location" column
$('#CheckboxStorageLocation').click(function() {
if ($('#CheckboxStorageLocation').is(':checked')) {
$("#userlist .storageLocation").show();
+ OC.AppConfig.setValue('core', 'umgmt_show_storage_location', 'true');
} else {
$("#userlist .storageLocation").hide();
+ OC.AppConfig.setValue('core', 'umgmt_show_storage_location', 'false');
}
});
+
+ if ($('#CheckboxLastLogin').is(':checked')) {
+ $("#userlist .lastLogin").show();
+ }
// Option to display/hide the "Last Login" column
$('#CheckboxLastLogin').click(function() {
if ($('#CheckboxLastLogin').is(':checked')) {
$("#userlist .lastLogin").show();
+ OC.AppConfig.setValue('core', 'umgmt_show_last_login', 'true');
} else {
$("#userlist .lastLogin").hide();
+ OC.AppConfig.setValue('core', 'umgmt_show_last_login', 'false');
}
});
+
+ if ($('#CheckboxEmailAddress').is(':checked')) {
+ $("#userlist .mailAddress").show();
+ }
// Option to display/hide the "Mail Address" column
$('#CheckboxEmailAddress').click(function() {
if ($('#CheckboxEmailAddress').is(':checked')) {
$("#userlist .mailAddress").show();
+ OC.AppConfig.setValue('core', 'umgmt_show_email', 'true');
} else {
$("#userlist .mailAddress").hide();
+ OC.AppConfig.setValue('core', 'umgmt_show_email', 'false');
}
});
+
+ if ($('#CheckboxUserBackend').is(':checked')) {
+ $("#userlist .userBackend").show();
+ }
// Option to display/hide the "User Backend" column
$('#CheckboxUserBackend').click(function() {
if ($('#CheckboxUserBackend').is(':checked')) {
$("#userlist .userBackend").show();
+ OC.AppConfig.setValue('core', 'umgmt_show_backend', 'true');
} else {
$("#userlist .userBackend").hide();
+ OC.AppConfig.setValue('core', 'umgmt_show_backend', 'false');
}
});
+
+ if ($('#CheckboxMailOnUserCreate').is(':checked')) {
+ $("#newemail").show();
+ }
// Option to display/hide the "E-Mail" input field
$('#CheckboxMailOnUserCreate').click(function() {
if ($('#CheckboxMailOnUserCreate').is(':checked')) {
$("#newemail").show();
+ OC.AppConfig.setValue('core', 'umgmt_send_email', 'true');
} else {
$("#newemail").hide();
+ OC.AppConfig.setValue('core', 'umgmt_send_email', 'false');
}
});
diff --git a/settings/l10n/da.js b/settings/l10n/da.js
index 61b012de4f7..8bb3be30fca 100644
--- a/settings/l10n/da.js
+++ b/settings/l10n/da.js
@@ -149,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Tillader brugere at sende mailnotifikationer for delte filer til andre brugere",
"Exclude groups from sharing" : "Ekskluder grupper fra at dele",
"These groups will still be able to receive shares, but not to initiate them." : "Disse grupper vil stadig kunne modtage delefiler, men ikke skabe dem.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Tillad autofuldførelse af brugernavnet i delings dialogboksen. Hvis funktion er deaktiveret skal det fulde brugernavn indtastes.",
"Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
"Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
"Cron was not executed yet!" : "Cron har ikke kørt endnu!",
diff --git a/settings/l10n/da.json b/settings/l10n/da.json
index 2f18fedf629..90896f0ab28 100644
--- a/settings/l10n/da.json
+++ b/settings/l10n/da.json
@@ -147,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "Tillader brugere at sende mailnotifikationer for delte filer til andre brugere",
"Exclude groups from sharing" : "Ekskluder grupper fra at dele",
"These groups will still be able to receive shares, but not to initiate them." : "Disse grupper vil stadig kunne modtage delefiler, men ikke skabe dem.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Tillad autofuldførelse af brugernavnet i delings dialogboksen. Hvis funktion er deaktiveret skal det fulde brugernavn indtastes.",
"Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
"Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
"Cron was not executed yet!" : "Cron har ikke kørt endnu!",
diff --git a/settings/l10n/el.js b/settings/l10n/el.js
index e1ca38deeee..363758011e1 100644
--- a/settings/l10n/el.js
+++ b/settings/l10n/el.js
@@ -149,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Να επιτρέπεται η αποστολή ειδοποιήσεων σε άλλους χρήστες, μέσω αλληλογραφίας για κοινόχρηστα αρχεία",
"Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό",
"These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης στο διάλογο διαμοιρασμού. Αν αυτό είναι απενεργοποιημένο θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη.",
"Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.",
"Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.",
"Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!",
diff --git a/settings/l10n/el.json b/settings/l10n/el.json
index 92873fb1675..12d2436fc92 100644
--- a/settings/l10n/el.json
+++ b/settings/l10n/el.json
@@ -147,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "Να επιτρέπεται η αποστολή ειδοποιήσεων σε άλλους χρήστες, μέσω αλληλογραφίας για κοινόχρηστα αρχεία",
"Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό",
"These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης στο διάλογο διαμοιρασμού. Αν αυτό είναι απενεργοποιημένο θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη.",
"Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.",
"Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.",
"Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!",
diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js
index fa4a506fab0..122422aac97 100644
--- a/settings/l10n/es_AR.js
+++ b/settings/l10n/es_AR.js
@@ -94,6 +94,9 @@ OC.L10N.register(
"Cheers!" : "¡Saludos!",
"Forum" : "Foro",
"Get the apps to sync your files" : "Obtené Apps para sincronizar tus archivos",
+ "Desktop client" : "Cliente de escritorio",
+ "Android app" : "App para Android",
+ "iOS app" : "App para iOS",
"Show First Run Wizard again" : "Mostrar de nuevo el asistente de primera ejecución",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Usás <strong>%s</strong> de los <strong>%s</strong> disponibles",
"Password" : "Contraseña",
diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json
index e8098e575c5..72e593031b8 100644
--- a/settings/l10n/es_AR.json
+++ b/settings/l10n/es_AR.json
@@ -92,6 +92,9 @@
"Cheers!" : "¡Saludos!",
"Forum" : "Foro",
"Get the apps to sync your files" : "Obtené Apps para sincronizar tus archivos",
+ "Desktop client" : "Cliente de escritorio",
+ "Android app" : "App para Android",
+ "iOS app" : "App para iOS",
"Show First Run Wizard again" : "Mostrar de nuevo el asistente de primera ejecución",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Usás <strong>%s</strong> de los <strong>%s</strong> disponibles",
"Password" : "Contraseña",
diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js
index c670d7abb59..a7db9452562 100644
--- a/settings/l10n/fi_FI.js
+++ b/settings/l10n/fi_FI.js
@@ -140,6 +140,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Salli käyttäjien lähettää muille käyttäjille sähköpostitse ilmoitus jaetuista tiedostoista",
"Exclude groups from sharing" : "Kiellä ryhmiä jakamasta",
"These groups will still be able to receive shares, but not to initiate them." : "Nämä ryhmät kykenevät vastaanottamaan jakoja, mutta eivät kuitenkaan itse pysty luoda jakoja.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Salli käyttäjätunnuksen automaattinen täydentäminen jakamisikkunnassa. Jos tämä asetus on pois käytöstä, tulee käyttäjätunnus kirjoittaa kokonaan itse.",
"Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.",
"Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.",
"Cron was not executed yet!" : "Cronia ei suoritettu vielä!",
diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json
index 01b79449331..9705353642b 100644
--- a/settings/l10n/fi_FI.json
+++ b/settings/l10n/fi_FI.json
@@ -138,6 +138,7 @@
"Allow users to send mail notification for shared files to other users" : "Salli käyttäjien lähettää muille käyttäjille sähköpostitse ilmoitus jaetuista tiedostoista",
"Exclude groups from sharing" : "Kiellä ryhmiä jakamasta",
"These groups will still be able to receive shares, but not to initiate them." : "Nämä ryhmät kykenevät vastaanottamaan jakoja, mutta eivät kuitenkaan itse pysty luoda jakoja.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Salli käyttäjätunnuksen automaattinen täydentäminen jakamisikkunnassa. Jos tämä asetus on pois käytöstä, tulee käyttäjätunnus kirjoittaa kokonaan itse.",
"Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.",
"Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.",
"Cron was not executed yet!" : "Cronia ei suoritettu vielä!",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 83b7d5f76d8..a7c389aab1e 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -118,17 +118,20 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php ne semble pas être configuré de manière à récupérer les valeurs des variables d’environnement. Le test de la commande getenv(\"PATH\") retourne seulement une réponse vide. ",
+ "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Veuillez vérifier <a target=\"_blank\" href=\"%s\">la documentation d'installation ↗</a> concernant les instructions de configuration de php ainsi que la configuration de votre serveur, en particulier dans le cas où vous utilisez php-fpm.",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "La configuration est en mode lecture seule. Ceci empêche la modification de certaines configurations via l'interface web. De plus, le fichier doit être passé manuellement en lecture-écriture avant chaque mise à jour.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP est apparemment configuré pour supprimer les blocs de documentation internes. Cela rendra plusieurs applications de base inaccessibles.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La raison est probablement l'utilisation d'un cache / accélérateur tel que Zend OPcache ou eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Votre serveur fonctionne actuellement sur une plateforme Microsoft Windows. Nous vous recommandons fortement d'utiliser une plateforme Linux pour une expérience utilisateur optimale.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "Une version de %1$s plus ancienne que %2$s est installée. Pour améliorer la stabilité et les performances, nous recommandons de mettre %1$s à jour.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Le module PHP 'fileinfo' est manquant. Il est vivement recommandé de l'activer afin d'obtenir de meilleurs résultats de détection mime-type.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers est désactivé, cela peut conduire à des conflits en cas d'accès concurrents. Activez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.",
"System locale can not be set to a one which supports UTF-8." : "Les paramètres régionaux n'ont pu être configurés avec prise en charge d'UTF-8.",
"This means that there might be problems with certain characters in file names." : "Cela signifie qu'il pourrait y avoir des problèmes avec certains caractères dans les noms de fichier.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :",
+ "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données comme moteur de verrouillage, pour de meilleures performances il est recommandé de configurer le memcache pour le verrouillage. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.",
"All checks passed." : "Tous les tests ont réussi.",
"Open documentation" : "Voir la documentation",
@@ -146,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Autoriser les utilisateurs à envoyer des notifications de partage par e-mail",
"Exclude groups from sharing" : "Empêcher certains groupes de partager",
"These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Autoriser la complétion du nom d'utilisateur dans la fenêtre de partage. Sinon le nom complet d'utilisateur doit être indiqué.",
"Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.",
"Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.",
"Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index 3cf724abc26..81011944298 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -116,17 +116,20 @@
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php ne semble pas être configuré de manière à récupérer les valeurs des variables d’environnement. Le test de la commande getenv(\"PATH\") retourne seulement une réponse vide. ",
+ "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Veuillez vérifier <a target=\"_blank\" href=\"%s\">la documentation d'installation ↗</a> concernant les instructions de configuration de php ainsi que la configuration de votre serveur, en particulier dans le cas où vous utilisez php-fpm.",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "La configuration est en mode lecture seule. Ceci empêche la modification de certaines configurations via l'interface web. De plus, le fichier doit être passé manuellement en lecture-écriture avant chaque mise à jour.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP est apparemment configuré pour supprimer les blocs de documentation internes. Cela rendra plusieurs applications de base inaccessibles.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "La raison est probablement l'utilisation d'un cache / accélérateur tel que Zend OPcache ou eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Votre serveur fonctionne actuellement sur une plateforme Microsoft Windows. Nous vous recommandons fortement d'utiliser une plateforme Linux pour une expérience utilisateur optimale.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "Une version de %1$s plus ancienne que %2$s est installée. Pour améliorer la stabilité et les performances, nous recommandons de mettre %1$s à jour.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Le module PHP 'fileinfo' est manquant. Il est vivement recommandé de l'activer afin d'obtenir de meilleurs résultats de détection mime-type.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers est désactivé, cela peut conduire à des conflits en cas d'accès concurrents. Activez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.",
"System locale can not be set to a one which supports UTF-8." : "Les paramètres régionaux n'ont pu être configurés avec prise en charge d'UTF-8.",
"This means that there might be problems with certain characters in file names." : "Cela signifie qu'il pourrait y avoir des problèmes avec certains caractères dans les noms de fichier.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :",
+ "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données comme moteur de verrouillage, pour de meilleures performances il est recommandé de configurer le memcache pour le verrouillage. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.",
"All checks passed." : "Tous les tests ont réussi.",
"Open documentation" : "Voir la documentation",
@@ -144,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "Autoriser les utilisateurs à envoyer des notifications de partage par e-mail",
"Exclude groups from sharing" : "Empêcher certains groupes de partager",
"These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Autoriser la complétion du nom d'utilisateur dans la fenêtre de partage. Sinon le nom complet d'utilisateur doit être indiqué.",
"Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.",
"Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.",
"Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !",
diff --git a/settings/l10n/it.js b/settings/l10n/it.js
index 4279a8d41ca..7081214d89d 100644
--- a/settings/l10n/it.js
+++ b/settings/l10n/it.js
@@ -149,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Consenti agli utenti di inviare email di notifica per i file condivisi con altri utenti",
"Exclude groups from sharing" : "Escludi gruppi dalla condivisione",
"These groups will still be able to receive shares, but not to initiate them." : "Questi gruppi saranno in grado di ricevere condivisioni, ma non iniziarle.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Consenti il completamento del nome utente nella finestra di condivisione. Se è disabilitata, è necessario digitare il nome utente completo.",
"Last cron job execution: %s." : "Ultima esecuzione di cron: %s.",
"Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.",
"Cron was not executed yet!" : "Cron non è stato ancora eseguito!",
diff --git a/settings/l10n/it.json b/settings/l10n/it.json
index 416d5706280..70325f7071a 100644
--- a/settings/l10n/it.json
+++ b/settings/l10n/it.json
@@ -147,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "Consenti agli utenti di inviare email di notifica per i file condivisi con altri utenti",
"Exclude groups from sharing" : "Escludi gruppi dalla condivisione",
"These groups will still be able to receive shares, but not to initiate them." : "Questi gruppi saranno in grado di ricevere condivisioni, ma non iniziarle.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Consenti il completamento del nome utente nella finestra di condivisione. Se è disabilitata, è necessario digitare il nome utente completo.",
"Last cron job execution: %s." : "Ultima esecuzione di cron: %s.",
"Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.",
"Cron was not executed yet!" : "Cron non è stato ancora eseguito!",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index d2026810359..650879510dc 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -149,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Sta gebruikers toe om e-mailnotificaties aan andere gebruikers te versturen voor gedeelde bestanden",
"Exclude groups from sharing" : "Sluit groepen uit van delen",
"These groups will still be able to receive shares, but not to initiate them." : "Deze groepen kunnen gedeelde mappen bestanden ontvangen, maar kunnen ze niet starten.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Sta auto-aanvullen van gebruikersnaam toe in de Delen-dialoog. Als dit is uitgeschakeld, moet de gebruikersnaam volledig worden ingevuld.",
"Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.",
"Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.",
"Cron was not executed yet!" : "Cron is nog niet uitgevoerd!",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index 42c1dacf922..faf920b43ef 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -147,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "Sta gebruikers toe om e-mailnotificaties aan andere gebruikers te versturen voor gedeelde bestanden",
"Exclude groups from sharing" : "Sluit groepen uit van delen",
"These groups will still be able to receive shares, but not to initiate them." : "Deze groepen kunnen gedeelde mappen bestanden ontvangen, maar kunnen ze niet starten.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Sta auto-aanvullen van gebruikersnaam toe in de Delen-dialoog. Als dit is uitgeschakeld, moet de gebruikersnaam volledig worden ingevuld.",
"Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.",
"Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.",
"Cron was not executed yet!" : "Cron is nog niet uitgevoerd!",
diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js
index c4e745e368e..3fce61d224b 100644
--- a/settings/l10n/oc.js
+++ b/settings/l10n/oc.js
@@ -28,6 +28,7 @@ OC.L10N.register(
"Unable to change password" : "Impossible de modificar lo senhal",
"Enabled" : "Activadas",
"Not enabled" : "Desactivadas",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Una error s'es produsida, verificatz vòstres fichièrs de log (Error: %s)",
"Migration Completed" : "Migracion acabada",
"Group already exists." : "Aqueste grop existís ja.",
diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json
index 9a2d5a5bc2d..b1df1e9bd24 100644
--- a/settings/l10n/oc.json
+++ b/settings/l10n/oc.json
@@ -26,6 +26,7 @@
"Unable to change password" : "Impossible de modificar lo senhal",
"Enabled" : "Activadas",
"Not enabled" : "Desactivadas",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Una error s'es produsida, verificatz vòstres fichièrs de log (Error: %s)",
"Migration Completed" : "Migracion acabada",
"Group already exists." : "Aqueste grop existís ja.",
diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js
index 3819e70d5ac..f4bbc350a93 100644
--- a/settings/l10n/pt_BR.js
+++ b/settings/l10n/pt_BR.js
@@ -149,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Permitir aos usuários enviar notificação de email de arquivos compartilhados para outros usuários",
"Exclude groups from sharing" : "Excluir grupos de compartilhamento",
"These groups will still be able to receive shares, but not to initiate them." : "Esses grupos ainda serão capazes de receber compartilhamentos, mas não para iniciá-los.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir autocompletar nome de usuário no diálogo de compartilhamento. Se isto estiver desativado o nome de usuário completo precisa ser inserido.",
"Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
"Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
"Cron was not executed yet!" : "Cron não foi executado ainda!",
diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json
index bba1b4b5847..f27256b828f 100644
--- a/settings/l10n/pt_BR.json
+++ b/settings/l10n/pt_BR.json
@@ -147,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "Permitir aos usuários enviar notificação de email de arquivos compartilhados para outros usuários",
"Exclude groups from sharing" : "Excluir grupos de compartilhamento",
"These groups will still be able to receive shares, but not to initiate them." : "Esses grupos ainda serão capazes de receber compartilhamentos, mas não para iniciá-los.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir autocompletar nome de usuário no diálogo de compartilhamento. Se isto estiver desativado o nome de usuário completo precisa ser inserido.",
"Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
"Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
"Cron was not executed yet!" : "Cron não foi executado ainda!",
diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js
index 62f0164c787..5757116f68d 100644
--- a/settings/l10n/th_TH.js
+++ b/settings/l10n/th_TH.js
@@ -149,6 +149,7 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "อนุญาตให้ผู้ใช้ส่งการแจ้งเตือนอีเมลสำหรับไฟล์ที่แชร์กับผู้ใช้อื่นๆ",
"Exclude groups from sharing" : "ไม่รวมกลุ่มที่แชร์",
"These groups will still be able to receive shares, but not to initiate them." : "กลุ่มนี้จะยังคงสามารถได้รับการแชร์ แต่พวกเขาจะไม่รู้จักมัน",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "อนุญาตให้เติมชื่อผู้ใช้ในกล่องตอบโต้อัตโนมัติ ถ้านี้ถูกปิดใช้งานชื่อผู้ใช้จะต้องกรอกเอง",
"Last cron job execution: %s." : "การดำเนินการ cron job ล่าสุด: %s",
"Last cron job execution: %s. Something seems wrong." : "การดำเนินการ cron job ล่าสุด: %s ดูเหมือนมีบางสิ่งไม่ถูกต้อง",
"Cron was not executed yet!" : "Cron ไม่ได้ถูกดำเนินการ!",
diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json
index 92670ee82d8..b2ef07d5e29 100644
--- a/settings/l10n/th_TH.json
+++ b/settings/l10n/th_TH.json
@@ -147,6 +147,7 @@
"Allow users to send mail notification for shared files to other users" : "อนุญาตให้ผู้ใช้ส่งการแจ้งเตือนอีเมลสำหรับไฟล์ที่แชร์กับผู้ใช้อื่นๆ",
"Exclude groups from sharing" : "ไม่รวมกลุ่มที่แชร์",
"These groups will still be able to receive shares, but not to initiate them." : "กลุ่มนี้จะยังคงสามารถได้รับการแชร์ แต่พวกเขาจะไม่รู้จักมัน",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "อนุญาตให้เติมชื่อผู้ใช้ในกล่องตอบโต้อัตโนมัติ ถ้านี้ถูกปิดใช้งานชื่อผู้ใช้จะต้องกรอกเอง",
"Last cron job execution: %s." : "การดำเนินการ cron job ล่าสุด: %s",
"Last cron job execution: %s. Something seems wrong." : "การดำเนินการ cron job ล่าสุด: %s ดูเหมือนมีบางสิ่งไม่ถูกต้อง",
"Cron was not executed yet!" : "Cron ไม่ได้ถูกดำเนินการ!",
diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js
index d2d08df164c..2a89154dafc 100644
--- a/settings/l10n/uk.js
+++ b/settings/l10n/uk.js
@@ -4,7 +4,7 @@ OC.L10N.register(
"Redis" : "Redis",
"Security & setup warnings" : "Попередження безпеки та налаштування",
"Sharing" : "Спільний доступ",
- "Server-side encryption" : "Серверне шіфрування",
+ "Server-side encryption" : "Шифрування на сервері",
"External Storage" : "Зовнішні сховища",
"Cron" : "Планувальник Cron",
"Email server" : "Сервер електронної пошти",
@@ -12,35 +12,37 @@ OC.L10N.register(
"Tips & tricks" : "Поради і трюки",
"Updates" : "Оновлення",
"Authentication error" : "Помилка автентифікації",
- "Your full name has been changed." : "Ваше ім'я було змінене",
- "Unable to change full name" : "Неможливо змінити ім'я",
+ "Your full name has been changed." : "Ваше повне ім'я було змінено",
+ "Unable to change full name" : "Неможливо змінити повне ім'я",
"Couldn't remove app." : "Неможливо видалити додаток.",
- "Language changed" : "Мова змінена",
+ "Language changed" : "Мову змінено",
"Invalid request" : "Некоректний запит",
"Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів",
"Unable to add user to group %s" : "Не вдалося додати користувача у групу %s",
"Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s",
- "Couldn't update app." : "Не вдалося оновити програму. ",
+ "Couldn't update app." : "Не вдалося оновити додаток. ",
"Wrong password" : "Невірний пароль",
- "No user supplied" : "Користувач не знайдений",
- "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль адміністратора для відновлення, інакше всі дані будуть втрачені",
- "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль адміністратора для відновлення. Будь ласка, перевірте пароль та спробуйте ще раз.",
- "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Використовуваний механізм не підтримує зміну паролів, але користувальницький ключ шифрування був успішно змінено",
+ "No user supplied" : "Користувача не вказано",
+ "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль відновлення адміністратора, інакше всі дані будуть втрачені",
+ "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend не підтримує зміну паролів, але користувацький ключ шифрування було успішно змінено",
"Unable to change password" : "Неможливо змінити пароль",
"Enabled" : "Увімкнено",
"Not enabled" : "Вимкнено",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "встановлення та оновлення додатків через магазин додатків або Об’єднання хмарних сховищ",
"Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
- "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL використовує застарілу версію %s (%s). Будь ласка, поновіть вашу операційну систему або функції, такі як %s не працюватимуть надійно.",
+ "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої файли журналів (Помилка: %s)",
"Migration Completed" : "Міграцію завершено",
"Group already exists." : "Група вже існує.",
"Unable to add group." : "Неможливо додати групу.",
"Unable to delete group." : "Неможливо видалити групу.",
- "log-level out of allowed range" : "Перевищений розмір файлу-журналу",
- "Saved" : "Збереженно",
- "test email settings" : "перевірити налаштування електронної пошти",
- "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час відправки email сталася помилка. Будь ласка перевірте налаштування. (Помилка:%s)",
- "Email sent" : "Ел. пошта надіслана",
- "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових повідомлень ви повинні вказати свою електронну адресу.",
+ "log-level out of allowed range" : "рівень протоколювання перевищує дозволені межі",
+ "Saved" : "Збережено",
+ "test email settings" : "тест налаштувань електронної пошти",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час надсилання email сталася помилка. Будь ласка перевірте налаштування. (Помилка: %s)",
+ "Email sent" : "Лист надіслано",
+ "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових листів ви повинні вказати свою email адресу.",
"Invalid mail address" : "Неправильна email адреса",
"A user with that name already exists." : "Користувач з таким іменем вже існує.",
"Unable to create user." : "Неможливо створити користувача.",
@@ -56,22 +58,25 @@ OC.L10N.register(
"Migration started …" : "Міграцію розпочато ...",
"Sending..." : "Надсилання...",
"Official" : "Офіційні",
+ "Approved" : "Схвалені",
"Experimental" : "Експериментальні",
"All" : "Всі",
- "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні застосунки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшні.",
- "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені застосунки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.",
+ "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні додатки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшені.",
+ "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені додатки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.",
+ "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ця програма не перевірена на вразливості безпеки і є новою або нестабільною. Встановлюйте її на власний ризик.",
"Update to %s" : "Оновити до %s",
"Please wait...." : "Зачекайте, будь ласка...",
- "Error while disabling app" : "Помилка відключення додатка",
+ "Error while disabling app" : "Помилка вимикання додатка",
"Disable" : "Вимкнути",
- "Enable" : "Включити",
- "Error while enabling app" : "Помилка підключення додатка",
+ "Enable" : "Увімкнути",
+ "Error while enabling app" : "Помилка вмикання додатка",
"Updating...." : "Оновлюється...",
- "Error while updating app" : "Помилка при оновленні програми",
+ "Error while updating app" : "Помилка при оновленні додатку",
"Updated" : "Оновлено",
"Uninstalling ...." : "Видалення...",
"Error while uninstalling app" : "Помилка видалення додатка",
"Uninstall" : "Видалити",
+ "An error occurred: {message}" : "Сталася помилка: {message}",
"Select a profile picture" : "Обрати зображення облікового запису",
"Very weak password" : "Дуже слабкий пароль",
"Weak password" : "Слабкий пароль",
@@ -95,11 +100,11 @@ OC.L10N.register(
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"Error creating user" : "Помилка при створенні користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
- "A valid email must be provided" : "Вкажіть дійсний e-mail",
+ "A valid email must be provided" : "Вкажіть дійсний email",
"__language_name__" : "__language_name__",
- "Sync clients" : "Синхронізація клієнтів",
+ "Sync clients" : "Клієнти синхронізації",
"Personal info" : "Особиста інформація",
- "SSL root certificates" : "SSL кореневі сертифікати",
+ "SSL root certificates" : "Кореневі SSL сертифікати",
"Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)",
"Info, warnings, errors and fatal issues" : "Інформаційні, попередження, помилки та критичні проблеми",
"Warnings, errors and fatal issues" : "Попередження, помилки та критичні проблеми",
@@ -121,6 +126,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файлу config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:",
+ "All checks passed." : "Всі перевірки пройдено.",
"Open documentation" : "Відкрити документацію",
"Allow apps to use the Share API" : "Дозволити програмам використовувати API спільного доступу",
"Allow users to share via link" : "Дозволити користувачам ділитися через посилання",
@@ -130,58 +136,60 @@ OC.L10N.register(
"Set default expiration date" : "Встановити термін дії за замовчуванням",
"Expire after " : "Скінчиться через",
"days" : "днів",
- "Enforce expiration date" : "Термін дії обов'язково",
+ "Enforce expiration date" : "Термін дії обов'язковий",
"Allow resharing" : "Дозволити перевідкривати спільний доступ",
"Restrict users to only share with users in their groups" : "Дозволити користувачам відкривати спільний доступ лише для користувачів з їхньої групи",
"Allow users to send mail notification for shared files to other users" : "Дозволити користувачам сповіщати листами про спільний доступ до файлів",
"Exclude groups from sharing" : "Виключити групи зі спільного доступу",
"These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.",
- "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Дозволи автодоповнення імені користувача в діалозі спільного доступу. Якщо вимкнено - треба буде вводити повне ім’я користувача.",
+ "Last cron job execution: %s." : "Останнє виконане Cron завдання: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Останнє виконане Cron завдання: %s. Щось здається неправильним.",
"Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
"Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
"Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.",
- "Enable server-side encryption" : "Увімкнути серверне шіфрування",
+ "Enable server-side encryption" : "Увімкнути шифрування на сервері",
"Enable encryption" : "Увімкнути шифрування",
"Select default encryption module:" : "Обрати модуль шифрування за замовчуванням:",
"Start migration" : "Розпочати міграцію",
"This is used for sending out notifications." : "Використовується для відсилання повідомлень.",
- "Send mode" : "Надіслати повідомлення",
+ "Send mode" : "Режим надсилання",
"Encryption" : "Шифрування",
"From address" : "Адреса відправника",
"mail" : "пошта",
- "Authentication method" : "Метод перевірки автентифікації",
+ "Authentication method" : "Спосіб аутентифікації",
"Authentication required" : "Потрібна аутентифікація",
"Server address" : "Адреса сервера",
"Port" : "Порт",
"Credentials" : "Облікові дані",
"SMTP Username" : "Ім'я користувача SMTP",
"SMTP Password" : "Пароль SMTP",
- "Store credentials" : "Зберігання облікових даних",
- "Test email settings" : "Перевірити налаштування електронної пошти",
+ "Store credentials" : "Зберігати облікові дані",
+ "Test email settings" : "Тестувати налаштування електронної пошти",
"Send email" : "Надіслати листа",
"Log level" : "Рівень протоколювання",
"Download logfile" : "Завантажити файл журналу",
"More" : "Більше",
"Less" : "Менше",
- "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Журнал-файл - більше 100 МБ. Його скачування може зайняти деякий час!",
- "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо переключитися на інший тип серверу баз даних.",
- "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Файл журналу - більше 100 МБ. Його завантаження може зайняти деякий час!",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо перейти на інший тип серверу баз даних.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо сумнівне використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
"How to do backups" : "Як робити резервне копіювання",
- "Advanced monitoring" : "Просунутий моніторинг",
+ "Advanced monitoring" : "Розширений моніторинг",
"Performance tuning" : "Налаштування продуктивності",
- "Improving the config.php" : "Покращення ",
+ "Improving the config.php" : "Покращення config.php",
"Theming" : "Оформлення",
"Hardening and security guidance" : "Інструктування з безпеки та захисту",
"Version" : "Версія",
"Developer documentation" : "Документація для розробників",
- "Experimental applications ahead" : "Спершу експериментальні застосунки",
- "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні застосунки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.",
+ "Experimental applications ahead" : "Спершу експериментальні додатки",
+ "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні додатки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.",
"by" : "по",
"licensed" : "Ліцензовано",
"Documentation:" : "Документація:",
"User documentation" : "Користувацька документація",
+ "Admin documentation" : "Документація адміністратора",
"Show description …" : "Показати деталі ...",
"Hide description …" : "Сховати деталі ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:",
diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json
index 8105eb7e379..de302d28aee 100644
--- a/settings/l10n/uk.json
+++ b/settings/l10n/uk.json
@@ -2,7 +2,7 @@
"Redis" : "Redis",
"Security & setup warnings" : "Попередження безпеки та налаштування",
"Sharing" : "Спільний доступ",
- "Server-side encryption" : "Серверне шіфрування",
+ "Server-side encryption" : "Шифрування на сервері",
"External Storage" : "Зовнішні сховища",
"Cron" : "Планувальник Cron",
"Email server" : "Сервер електронної пошти",
@@ -10,35 +10,37 @@
"Tips & tricks" : "Поради і трюки",
"Updates" : "Оновлення",
"Authentication error" : "Помилка автентифікації",
- "Your full name has been changed." : "Ваше ім'я було змінене",
- "Unable to change full name" : "Неможливо змінити ім'я",
+ "Your full name has been changed." : "Ваше повне ім'я було змінено",
+ "Unable to change full name" : "Неможливо змінити повне ім'я",
"Couldn't remove app." : "Неможливо видалити додаток.",
- "Language changed" : "Мова змінена",
+ "Language changed" : "Мову змінено",
"Invalid request" : "Некоректний запит",
"Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів",
"Unable to add user to group %s" : "Не вдалося додати користувача у групу %s",
"Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s",
- "Couldn't update app." : "Не вдалося оновити програму. ",
+ "Couldn't update app." : "Не вдалося оновити додаток. ",
"Wrong password" : "Невірний пароль",
- "No user supplied" : "Користувач не знайдений",
- "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль адміністратора для відновлення, інакше всі дані будуть втрачені",
- "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль адміністратора для відновлення. Будь ласка, перевірте пароль та спробуйте ще раз.",
- "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Використовуваний механізм не підтримує зміну паролів, але користувальницький ключ шифрування був успішно змінено",
+ "No user supplied" : "Користувача не вказано",
+ "Please provide an admin recovery password, otherwise all user data will be lost" : "Будь ласка введіть пароль відновлення адміністратора, інакше всі дані будуть втрачені",
+ "Wrong admin recovery password. Please check the password and try again." : "Невірний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend не підтримує зміну паролів, але користувацький ключ шифрування було успішно змінено",
"Unable to change password" : "Неможливо змінити пароль",
"Enabled" : "Увімкнено",
"Not enabled" : "Вимкнено",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "встановлення та оновлення додатків через магазин додатків або Об’єднання хмарних сховищ",
"Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
- "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL використовує застарілу версію %s (%s). Будь ласка, поновіть вашу операційну систему або функції, такі як %s не працюватимуть надійно.",
+ "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої файли журналів (Помилка: %s)",
"Migration Completed" : "Міграцію завершено",
"Group already exists." : "Група вже існує.",
"Unable to add group." : "Неможливо додати групу.",
"Unable to delete group." : "Неможливо видалити групу.",
- "log-level out of allowed range" : "Перевищений розмір файлу-журналу",
- "Saved" : "Збереженно",
- "test email settings" : "перевірити налаштування електронної пошти",
- "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час відправки email сталася помилка. Будь ласка перевірте налаштування. (Помилка:%s)",
- "Email sent" : "Ел. пошта надіслана",
- "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових повідомлень ви повинні вказати свою електронну адресу.",
+ "log-level out of allowed range" : "рівень протоколювання перевищує дозволені межі",
+ "Saved" : "Збережено",
+ "test email settings" : "тест налаштувань електронної пошти",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Під час надсилання email сталася помилка. Будь ласка перевірте налаштування. (Помилка: %s)",
+ "Email sent" : "Лист надіслано",
+ "You need to set your user email before being able to send test emails." : "Перед надсиланням тестових листів ви повинні вказати свою email адресу.",
"Invalid mail address" : "Неправильна email адреса",
"A user with that name already exists." : "Користувач з таким іменем вже існує.",
"Unable to create user." : "Неможливо створити користувача.",
@@ -54,22 +56,25 @@
"Migration started …" : "Міграцію розпочато ...",
"Sending..." : "Надсилання...",
"Official" : "Офіційні",
+ "Approved" : "Схвалені",
"Experimental" : "Експериментальні",
"All" : "Всі",
- "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні застосунки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшні.",
- "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені застосунки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.",
+ "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Офіційні додатки розроблені спільнотою ownCloud. Вони реалізують основні можливості ownCloud і готові до використання в продакшені.",
+ "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Схвалені додатки розроблені довіреними розробниками і пройшли незалежну перевірку безпеки. Їх активно супроводжують у репозиторії з відкритим кодом, а їх розробники стежать, щоб вони були стабільні й прийнятні для повсякденного використання.",
+ "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ця програма не перевірена на вразливості безпеки і є новою або нестабільною. Встановлюйте її на власний ризик.",
"Update to %s" : "Оновити до %s",
"Please wait...." : "Зачекайте, будь ласка...",
- "Error while disabling app" : "Помилка відключення додатка",
+ "Error while disabling app" : "Помилка вимикання додатка",
"Disable" : "Вимкнути",
- "Enable" : "Включити",
- "Error while enabling app" : "Помилка підключення додатка",
+ "Enable" : "Увімкнути",
+ "Error while enabling app" : "Помилка вмикання додатка",
"Updating...." : "Оновлюється...",
- "Error while updating app" : "Помилка при оновленні програми",
+ "Error while updating app" : "Помилка при оновленні додатку",
"Updated" : "Оновлено",
"Uninstalling ...." : "Видалення...",
"Error while uninstalling app" : "Помилка видалення додатка",
"Uninstall" : "Видалити",
+ "An error occurred: {message}" : "Сталася помилка: {message}",
"Select a profile picture" : "Обрати зображення облікового запису",
"Very weak password" : "Дуже слабкий пароль",
"Weak password" : "Слабкий пароль",
@@ -93,11 +98,11 @@
"A valid username must be provided" : "Потрібно задати вірне ім'я користувача",
"Error creating user" : "Помилка при створенні користувача",
"A valid password must be provided" : "Потрібно задати вірний пароль",
- "A valid email must be provided" : "Вкажіть дійсний e-mail",
+ "A valid email must be provided" : "Вкажіть дійсний email",
"__language_name__" : "__language_name__",
- "Sync clients" : "Синхронізація клієнтів",
+ "Sync clients" : "Клієнти синхронізації",
"Personal info" : "Особиста інформація",
- "SSL root certificates" : "SSL кореневі сертифікати",
+ "SSL root certificates" : "Кореневі SSL сертифікати",
"Everything (fatal issues, errors, warnings, info, debug)" : "Усі (критичні проблеми, помилки, попередження, інформаційні, налагодження)",
"Info, warnings, errors and fatal issues" : "Інформаційні, попередження, помилки та критичні проблеми",
"Warnings, errors and fatal issues" : "Попередження, помилки та критичні проблеми",
@@ -119,6 +124,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файлу config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:",
+ "All checks passed." : "Всі перевірки пройдено.",
"Open documentation" : "Відкрити документацію",
"Allow apps to use the Share API" : "Дозволити програмам використовувати API спільного доступу",
"Allow users to share via link" : "Дозволити користувачам ділитися через посилання",
@@ -128,58 +134,60 @@
"Set default expiration date" : "Встановити термін дії за замовчуванням",
"Expire after " : "Скінчиться через",
"days" : "днів",
- "Enforce expiration date" : "Термін дії обов'язково",
+ "Enforce expiration date" : "Термін дії обов'язковий",
"Allow resharing" : "Дозволити перевідкривати спільний доступ",
"Restrict users to only share with users in their groups" : "Дозволити користувачам відкривати спільний доступ лише для користувачів з їхньої групи",
"Allow users to send mail notification for shared files to other users" : "Дозволити користувачам сповіщати листами про спільний доступ до файлів",
"Exclude groups from sharing" : "Виключити групи зі спільного доступу",
"These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.",
- "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
+ "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Дозволи автодоповнення імені користувача в діалозі спільного доступу. Якщо вимкнено - треба буде вводити повне ім’я користувача.",
+ "Last cron job execution: %s." : "Останнє виконане Cron завдання: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Останнє виконане Cron завдання: %s. Щось здається неправильним.",
"Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
"Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
"Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.",
- "Enable server-side encryption" : "Увімкнути серверне шіфрування",
+ "Enable server-side encryption" : "Увімкнути шифрування на сервері",
"Enable encryption" : "Увімкнути шифрування",
"Select default encryption module:" : "Обрати модуль шифрування за замовчуванням:",
"Start migration" : "Розпочати міграцію",
"This is used for sending out notifications." : "Використовується для відсилання повідомлень.",
- "Send mode" : "Надіслати повідомлення",
+ "Send mode" : "Режим надсилання",
"Encryption" : "Шифрування",
"From address" : "Адреса відправника",
"mail" : "пошта",
- "Authentication method" : "Метод перевірки автентифікації",
+ "Authentication method" : "Спосіб аутентифікації",
"Authentication required" : "Потрібна аутентифікація",
"Server address" : "Адреса сервера",
"Port" : "Порт",
"Credentials" : "Облікові дані",
"SMTP Username" : "Ім'я користувача SMTP",
"SMTP Password" : "Пароль SMTP",
- "Store credentials" : "Зберігання облікових даних",
- "Test email settings" : "Перевірити налаштування електронної пошти",
+ "Store credentials" : "Зберігати облікові дані",
+ "Test email settings" : "Тестувати налаштування електронної пошти",
"Send email" : "Надіслати листа",
"Log level" : "Рівень протоколювання",
"Download logfile" : "Завантажити файл журналу",
"More" : "Більше",
"Less" : "Менше",
- "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Журнал-файл - більше 100 МБ. Його скачування може зайняти деякий час!",
- "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо переключитися на інший тип серверу баз даних.",
- "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо викликає сумнів використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
+ "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Файл журналу - більше 100 МБ. Його завантаження може зайняти деякий час!",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В якості бази даних використовується SQLite. Для великих установок ми рекомендуємо перейти на інший тип серверу баз даних.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особливо сумнівне використання SQLite при синхронізації файлів з використанням клієнта для ПК.",
"How to do backups" : "Як робити резервне копіювання",
- "Advanced monitoring" : "Просунутий моніторинг",
+ "Advanced monitoring" : "Розширений моніторинг",
"Performance tuning" : "Налаштування продуктивності",
- "Improving the config.php" : "Покращення ",
+ "Improving the config.php" : "Покращення config.php",
"Theming" : "Оформлення",
"Hardening and security guidance" : "Інструктування з безпеки та захисту",
"Version" : "Версія",
"Developer documentation" : "Документація для розробників",
- "Experimental applications ahead" : "Спершу експериментальні застосунки",
- "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні застосунки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.",
+ "Experimental applications ahead" : "Спершу експериментальні додатки",
+ "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Експериментальні додатки не перевірені на наявність проблем безпеки, нові або нестабільні і в процесі активної розробки. Встановлення їх може спричинити втрату даних або дірки в безпеці.",
"by" : "по",
"licensed" : "Ліцензовано",
"Documentation:" : "Документація:",
"User documentation" : "Користувацька документація",
+ "Admin documentation" : "Документація адміністратора",
"Show description …" : "Показати деталі ...",
"Hide description …" : "Сховати деталі ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Ця програма не може бути встановлено, так як наступні залежності не будуть виконані:",
diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js
index 992d70465e3..2b6205f2f4c 100644
--- a/settings/l10n/zh_CN.js
+++ b/settings/l10n/zh_CN.js
@@ -118,17 +118,20 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\\\"PATH\\\") 测试只返回一个空值。",
+ "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "请检查PHP配置说明和服务器的 PHP 配置的 <a target=\"_blank\" href=\"%s\">安装文档 ↗</a>,使用 PHP-FPM 时尤其如此。",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "只读配置已启用。这样可防止通过 WEB 接口设置一些配置。此外,每次更新后该文件需要手动设置为可写。",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除行内 <doc> 块,这将导致数个核心应用无法访问。",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的,例如 Zend OPcache 或 eAccelerator。",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "你的服务器是运行于 Microsoft Windows 系统。我们强烈推荐使用 Linux 系统以获得最佳的用户体验。比如中文文件夹和文件名支持。",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s 下版本 %2$s 已安装。基于稳定和性能的原因,我们强烈建议更新至 %1$s 版本。",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定被禁用,这可能会导致竞争条件问题。在config.php 中启用“filelocking.enabled”可以避免这些问题。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。",
"System locale can not be set to a one which supports UTF-8." : "系统语系无法设置为支持 UTF-8 的语系。",
"This means that there might be problems with certain characters in file names." : "这意味着一些文件名中的特定字符可能有问题。",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:",
+ "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "请点击检查 <a target=\\\"_blank\\\" href=\\\"%s\\\"> 安装向导 ↗</a>, 点击 <a href=\\\"#log-section\\\"> 日志 </a>查看详细错误和警告。",
"All checks passed." : "所有检查已通过。",
"Open documentation" : "打开文档",
diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json
index 97eae6702a7..e67cba96e37 100644
--- a/settings/l10n/zh_CN.json
+++ b/settings/l10n/zh_CN.json
@@ -116,17 +116,20 @@
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\\\"PATH\\\") 测试只返回一个空值。",
+ "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "请检查PHP配置说明和服务器的 PHP 配置的 <a target=\"_blank\" href=\"%s\">安装文档 ↗</a>,使用 PHP-FPM 时尤其如此。",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "只读配置已启用。这样可防止通过 WEB 接口设置一些配置。此外,每次更新后该文件需要手动设置为可写。",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除行内 <doc> 块,这将导致数个核心应用无法访问。",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能是由缓存/加速器造成的,例如 Zend OPcache 或 eAccelerator。",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "你的服务器是运行于 Microsoft Windows 系统。我们强烈推荐使用 Linux 系统以获得最佳的用户体验。比如中文文件夹和文件名支持。",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s 下版本 %2$s 已安装。基于稳定和性能的原因,我们强烈建议更新至 %1$s 版本。",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定被禁用,这可能会导致竞争条件问题。在config.php 中启用“filelocking.enabled”可以避免这些问题。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。",
"System locale can not be set to a one which supports UTF-8." : "系统语系无法设置为支持 UTF-8 的语系。",
"This means that there might be problems with certain characters in file names." : "这意味着一些文件名中的特定字符可能有问题。",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:",
+ "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "请点击检查 <a target=\\\"_blank\\\" href=\\\"%s\\\"> 安装向导 ↗</a>, 点击 <a href=\\\"#log-section\\\"> 日志 </a>查看详细错误和警告。",
"All checks passed." : "所有检查已通过。",
"Open documentation" : "打开文档",
diff --git a/settings/personal.php b/settings/personal.php
index 0cfdc9ed371..26e730d8089 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -148,7 +148,7 @@ sort($groups2);
$tmpl->assign('groups', $groups2);
// add hardcoded forms from the template
-$l = OC_L10N::get('settings');
+$l = \OC::$server->getL10N('settings');
$formsAndMore = [];
$formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')];
$formsAndMore[]= ['anchor' => 'passwordform', 'section-name' => $l->t('Personal info')];
diff --git a/settings/templates/admin.php b/settings/templates/admin.php
index 36088d9f8c2..bfb0d5d364d 100644
--- a/settings/templates/admin.php
+++ b/settings/templates/admin.php
@@ -265,6 +265,11 @@ if ($_['cronErrors']) {
<br />
<em><?php p($l->t('These groups will still be able to receive shares, but not to initiate them.')); ?></em>
</p>
+ <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>">
+ <input type="checkbox" name="shareapi_allow_share_dialog_user_enumeration" value="1" id="shareapi_allow_share_dialog_user_enumeration"
+ <?php if ($_['allowShareDialogUserEnumeration'] === 'yes') print_unescaped('checked="checked"'); ?> />
+ <label for="shareapi_allow_share_dialog_user_enumeration"><?php p($l->t('Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered.'));?></label><br />
+ </p>
<?php print_unescaped($_['fileSharingSettings']); ?>
</div>
diff --git a/settings/templates/users/main.php b/settings/templates/users/main.php
index 73552f8ad2e..0abe31f4a59 100644
--- a/settings/templates/users/main.php
+++ b/settings/templates/users/main.php
@@ -45,31 +45,36 @@ translation('settings');
<div id="userlistoptions">
<p>
- <input type="checkbox" name="StorageLocation" value="StorageLocation" id="CheckboxStorageLocation">
+ <input type="checkbox" name="StorageLocation" value="StorageLocation" id="CheckboxStorageLocation"
+ <?php if ($_['show_storage_location'] === 'true') print_unescaped('checked="checked"'); ?> />
<label for="CheckboxStorageLocation">
<?php p($l->t('Show storage location')) ?>
</label>
</p>
<p>
- <input type="checkbox" name="LastLogin" value="LastLogin" id="CheckboxLastLogin">
+ <input type="checkbox" name="LastLogin" value="LastLogin" id="CheckboxLastLogin"
+ <?php if ($_['show_last_login'] === 'true') print_unescaped('checked="checked"'); ?> />
<label for="CheckboxLastLogin">
<?php p($l->t('Show last log in')) ?>
</label>
</p>
<p>
- <input type="checkbox" name="UserBackend" value="UserBackend" id="CheckboxUserBackend">
+ <input type="checkbox" name="UserBackend" value="UserBackend" id="CheckboxUserBackend"
+ <?php if ($_['show_backend'] === 'true') print_unescaped('checked="checked"'); ?> />
<label for="CheckboxUserBackend">
<?php p($l->t('Show user backend')) ?>
</label>
</p>
<p>
- <input type="checkbox" name="MailOnUserCreate" value="MailOnUserCreate" id="CheckboxMailOnUserCreate">
+ <input type="checkbox" name="MailOnUserCreate" value="MailOnUserCreate" id="CheckboxMailOnUserCreate"
+ <?php if ($_['send_email'] === 'true') print_unescaped('checked="checked"'); ?> />
<label for="CheckboxMailOnUserCreate">
<?php p($l->t('Send email to new user')) ?>
</label>
</p>
<p>
- <input type="checkbox" name="EmailAddress" value="EmailAddress" id="CheckboxEmailAddress">
+ <input type="checkbox" name="EmailAddress" value="EmailAddress" id="CheckboxEmailAddress"
+ <?php if ($_['show_email'] === 'true') print_unescaped('checked="checked"'); ?> />
<label for="CheckboxEmailAddress">
<?php p($l->t('Show email address')) ?>
</label>
diff --git a/settings/users.php b/settings/users.php
index 843995a57f9..e0ef56f15c5 100644
--- a/settings/users.php
+++ b/settings/users.php
@@ -99,4 +99,11 @@ $tmpl->assign('default_quota', $defaultQuota);
$tmpl->assign('defaultQuotaIsUserDefined', $defaultQuotaIsUserDefined);
$tmpl->assign('recoveryAdminEnabled', $recoveryAdminEnabled);
$tmpl->assign('enableAvatars', \OC::$server->getConfig()->getSystemValue('enable_avatars', true));
+
+$tmpl->assign('show_storage_location', $config->getAppValue('core', 'umgmt_show_storage_location', 'false'));
+$tmpl->assign('show_last_login', $config->getAppValue('core', 'umgmt_show_last_login', 'false'));
+$tmpl->assign('show_email', $config->getAppValue('core', 'umgmt_show_email', 'false'));
+$tmpl->assign('show_backend', $config->getAppValue('core', 'umgmt_show_backend', 'false'));
+$tmpl->assign('send_email', $config->getAppValue('core', 'umgmt_send_email', 'false'));
+
$tmpl->printPage();
diff --git a/tests/apps/testapp-infoxml-version-different/appinfo/info.xml b/tests/apps/testapp-infoxml-version-different/appinfo/info.xml
new file mode 100644
index 00000000000..c765400a76f
--- /dev/null
+++ b/tests/apps/testapp-infoxml-version-different/appinfo/info.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<info>
+ <id>testapp-infoxml-version</id>
+ <version>1.2.3</version>
+ <author>Jane</author>
+ <description>A b c</description>
+ <licence>Abc</licence>
+ <name>Test app</name>
+</info>
diff --git a/tests/apps/testapp-infoxml-version-different/appinfo/version b/tests/apps/testapp-infoxml-version-different/appinfo/version
new file mode 100644
index 00000000000..e8ea05db814
--- /dev/null
+++ b/tests/apps/testapp-infoxml-version-different/appinfo/version
@@ -0,0 +1 @@
+1.2.4
diff --git a/tests/apps/testapp-infoxml-version/appinfo/info.xml b/tests/apps/testapp-infoxml-version/appinfo/info.xml
new file mode 100644
index 00000000000..c765400a76f
--- /dev/null
+++ b/tests/apps/testapp-infoxml-version/appinfo/info.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<info>
+ <id>testapp-infoxml-version</id>
+ <version>1.2.3</version>
+ <author>Jane</author>
+ <description>A b c</description>
+ <licence>Abc</licence>
+ <name>Test app</name>
+</info>
diff --git a/tests/apps/testapp-infoxml-version/appinfo/version b/tests/apps/testapp-infoxml-version/appinfo/version
new file mode 100644
index 00000000000..0495c4a88ca
--- /dev/null
+++ b/tests/apps/testapp-infoxml-version/appinfo/version
@@ -0,0 +1 @@
+1.2.3
diff --git a/tests/apps/testapp-infoxml/appinfo/info.xml b/tests/apps/testapp-infoxml/appinfo/info.xml
new file mode 100644
index 00000000000..cb63a0fc76e
--- /dev/null
+++ b/tests/apps/testapp-infoxml/appinfo/info.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<info>
+ <id>testapp-infoxml</id>
+ <version>1.2.3</version>
+ <author>Jane</author>
+ <description>A b c</description>
+ <licence>Abc</licence>
+ <name>Test app</name>
+</info>
diff --git a/tests/apps/testapp-name-missing/appinfo/info.xml b/tests/apps/testapp-name-missing/appinfo/info.xml
new file mode 100644
index 00000000000..f0a62b8d380
--- /dev/null
+++ b/tests/apps/testapp-name-missing/appinfo/info.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<info>
+ <id>testapp-version</id>
+ <version>1.1.1</version>
+ <author>Jane</author>
+ <description>A b c</description>
+ <licence>Abc</licence>
+</info>
diff --git a/tests/apps/testapp-version-missing/appinfo/info.xml b/tests/apps/testapp-version-missing/appinfo/info.xml
new file mode 100644
index 00000000000..d7da3e07e36
--- /dev/null
+++ b/tests/apps/testapp-version-missing/appinfo/info.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<info>
+ <id>testapp-version</id>
+ <author>Jane</author>
+ <description>A b c</description>
+ <licence>Abc</licence>
+ <name>Test app</name>
+</info>
diff --git a/tests/apps/testapp-version/appinfo/info.xml b/tests/apps/testapp-version/appinfo/info.xml
new file mode 100644
index 00000000000..d7da3e07e36
--- /dev/null
+++ b/tests/apps/testapp-version/appinfo/info.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<info>
+ <id>testapp-version</id>
+ <author>Jane</author>
+ <description>A b c</description>
+ <licence>Abc</licence>
+ <name>Test app</name>
+</info>
diff --git a/tests/apps/testapp-version/appinfo/version b/tests/apps/testapp-version/appinfo/version
new file mode 100644
index 00000000000..0495c4a88ca
--- /dev/null
+++ b/tests/apps/testapp-version/appinfo/version
@@ -0,0 +1 @@
+1.2.3
diff --git a/tests/core/command/config/listconfigstest.php b/tests/core/command/config/listconfigstest.php
index 7492701cce3..bde6a1b0db3 100644
--- a/tests/core/command/config/listconfigstest.php
+++ b/tests/core/command/config/listconfigstest.php
@@ -23,6 +23,7 @@ namespace Tests\Core\Command\Config;
use OC\Core\Command\Config\ListConfigs;
+use OCP\IConfig;
use Test\TestCase;
class ListConfigsTest extends TestCase {
@@ -66,7 +67,7 @@ class ListConfigsTest extends TestCase {
'overwrite.cli.url',
],
[
- ['secret', 'N;', 'my secret'],
+ ['secret', 'N;', IConfig::SENSITIVE_VALUE],
['overwrite.cli.url', 'N;', 'http://localhost'],
],
// app config
@@ -81,7 +82,7 @@ class ListConfigsTest extends TestCase {
false,
json_encode([
'system' => [
- 'secret' => ListConfigs::SENSITIVE_VALUE,
+ 'secret' => IConfig::SENSITIVE_VALUE,
'overwrite.cli.url' => 'http://localhost',
],
'apps' => [
@@ -139,12 +140,12 @@ class ListConfigsTest extends TestCase {
'overwrite.cli.url',
],
[
- ['secret', 'N;', 'my secret'],
+ ['secret', 'N;', IConfig::SENSITIVE_VALUE],
['objectstore', 'N;', [
'class' => 'OC\\Files\\ObjectStore\\Swift',
'arguments' => [
'username' => 'facebook100000123456789',
- 'password' => 'Secr3tPaSSWoRdt7',
+ 'password' => IConfig::SENSITIVE_VALUE,
],
]],
['overwrite.cli.url', 'N;', 'http://localhost'],
@@ -161,12 +162,12 @@ class ListConfigsTest extends TestCase {
false,
json_encode([
'system' => [
- 'secret' => ListConfigs::SENSITIVE_VALUE,
+ 'secret' => IConfig::SENSITIVE_VALUE,
'objectstore' => [
'class' => 'OC\\Files\\ObjectStore\\Swift',
'arguments' => [
'username' => 'facebook100000123456789',
- 'password' => ListConfigs::SENSITIVE_VALUE,
+ 'password' => IConfig::SENSITIVE_VALUE,
],
],
'overwrite.cli.url' => 'http://localhost',
@@ -276,9 +277,15 @@ class ListConfigsTest extends TestCase {
$this->systemConfig->expects($this->any())
->method('getKeys')
->willReturn($systemConfigs);
- $this->systemConfig->expects($this->any())
- ->method('getValue')
- ->willReturnMap($systemConfigMap);
+ if ($private) {
+ $this->systemConfig->expects($this->any())
+ ->method('getValue')
+ ->willReturnMap($systemConfigMap);
+ } else {
+ $this->systemConfig->expects($this->any())
+ ->method('getFilteredValue')
+ ->willReturnMap($systemConfigMap);
+ }
$this->appConfig->expects($this->any())
->method('getApps')
diff --git a/tests/lib/app/codechecker/infocheckertest.php b/tests/lib/app/codechecker/infocheckertest.php
new file mode 100644
index 00000000000..59c1316b769
--- /dev/null
+++ b/tests/lib/app/codechecker/infocheckertest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\App\CodeChecker;
+
+use OC\App\InfoParser;
+use Test\TestCase;
+
+class InfoCheckerTest extends TestCase {
+ /** @var InfoChecker */
+ protected $infoChecker;
+
+ public static function setUpBeforeClass() {
+ \OC::$APPSROOTS[] = [
+ 'path' => \OC::$SERVERROOT . '/tests/apps',
+ 'url' => '/apps-test',
+ 'writable' => false,
+ ];
+ }
+
+ public static function tearDownAfterClass() {
+ // remove last element
+ array_pop(\OC::$APPSROOTS);
+ }
+
+ protected function setUp() {
+ parent::setUp();
+ $infoParser = new InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator());
+
+ $this->infoChecker = new InfoChecker($infoParser);
+ }
+
+ public function appInfoData() {
+ return [
+ ['testapp-infoxml', []],
+ ['testapp-version', []],
+ ['testapp-infoxml-version', []],
+ ['testapp-infoxml-version-different', [['type' => 'differentVersions', 'message' => 'appinfo/version: 1.2.4 - appinfo/info.xml: 1.2.3']]],
+ ['testapp-version-missing', [['type' => 'mandatoryFieldMissing', 'field' => 'version']]],
+ ['testapp-name-missing', [['type' => 'mandatoryFieldMissing', 'field' => 'name']]],
+ ];
+ }
+
+ /**
+ * @dataProvider appInfoData
+ *
+ * @param $appId
+ * @param $expectedErrors
+ */
+ public function testApps($appId, $expectedErrors) {
+ $errors = $this->infoChecker->analyse($appId);
+
+ $this->assertEquals($expectedErrors, $errors);
+ }
+}
diff --git a/tests/lib/appframework/controller/ControllerTest.php b/tests/lib/appframework/controller/ControllerTest.php
index 243014a91a7..c847525c263 100644
--- a/tests/lib/appframework/controller/ControllerTest.php
+++ b/tests/lib/appframework/controller/ControllerTest.php
@@ -178,7 +178,7 @@ class ControllerTest extends \Test\TestCase {
'test' => 'something',
'Cache-Control' => 'no-cache, must-revalidate',
'Content-Type' => 'application/json; charset=utf-8',
- 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'",
+ 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'",
];
$response = $this->controller->customDataResponse(array('hi'));
diff --git a/tests/lib/appframework/http/ContentSecurityPolicyTest.php b/tests/lib/appframework/http/ContentSecurityPolicyTest.php
index 082c032a420..6d9c6d7b8d9 100644
--- a/tests/lib/appframework/http/ContentSecurityPolicyTest.php
+++ b/tests/lib/appframework/http/ContentSecurityPolicyTest.php
@@ -28,19 +28,19 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDefault() {
- $defaultPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $defaultPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->assertSame($defaultPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyScriptDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyScriptDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com www.owncloud.org 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com www.owncloud.org 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.org');
@@ -48,7 +48,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowScriptDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.com');
@@ -56,7 +56,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowScriptDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.org');
@@ -64,7 +64,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowScriptDomainMultipleStacked() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowScriptDomain('www.owncloud.org')->disallowScriptDomain('www.owncloud.com');
@@ -72,14 +72,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyScriptAllowInline() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->allowInlineScript(true);
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyScriptAllowInlineWithDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' www.owncloud.com 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedScriptDomain('www.owncloud.com');
$this->contentSecurityPolicy->allowInlineScript(true);
@@ -87,7 +87,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyScriptDisallowInlineAndEval() {
- $expectedPolicy = "default-src 'none';script-src 'self';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->allowInlineScript(false);
$this->contentSecurityPolicy->allowEvalScript(false);
@@ -95,14 +95,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyStyleDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyStyleDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com www.owncloud.org 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com www.owncloud.org 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.org');
@@ -110,7 +110,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowStyleDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.com');
@@ -118,7 +118,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowStyleDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.org');
@@ -126,7 +126,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowStyleDomainMultipleStacked() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowStyleDomain('www.owncloud.org')->disallowStyleDomain('www.owncloud.com');
@@ -134,35 +134,35 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyStyleAllowInline() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->allowInlineStyle(true);
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyStyleAllowInlineWithDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' www.owncloud.com 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedStyleDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyStyleDisallowInline() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->allowInlineStyle(false);
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyImageDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyImageDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: www.owncloud.com www.owncloud.org;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob: www.owncloud.com www.owncloud.org;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.org');
@@ -170,7 +170,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowImageDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowImageDomain('www.owncloud.com');
@@ -178,7 +178,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowImageDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob: www.owncloud.com;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowImageDomain('www.owncloud.org');
@@ -186,7 +186,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowImageDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedImageDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowImageDomain('www.owncloud.org')->disallowImageDomain('www.owncloud.com');
@@ -194,14 +194,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyFontDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyFontDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self' www.owncloud.com www.owncloud.org;connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self' www.owncloud.com www.owncloud.org;connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.org');
@@ -209,7 +209,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowFontDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowFontDomain('www.owncloud.com');
@@ -217,7 +217,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowFontDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self' www.owncloud.com;connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowFontDomain('www.owncloud.org');
@@ -225,7 +225,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowFontDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFontDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowFontDomain('www.owncloud.org')->disallowFontDomain('www.owncloud.com');
@@ -233,14 +233,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyConnectDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'";
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyConnectDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self' www.owncloud.com www.owncloud.org;media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self' www.owncloud.com www.owncloud.org;media-src 'self'";
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.org');
@@ -248,7 +248,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowConnectDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.com');
@@ -256,7 +256,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowConnectDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self' www.owncloud.com;media-src 'self'";
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.org');
@@ -264,7 +264,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowConnectDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedConnectDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowConnectDomain('www.owncloud.org')->disallowConnectDomain('www.owncloud.com');
@@ -272,14 +272,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyMediaDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com";
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyMediaDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com www.owncloud.org";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com www.owncloud.org";
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.org');
@@ -287,7 +287,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowMediaDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.com');
@@ -295,7 +295,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowMediaDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self' www.owncloud.com";
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.org');
@@ -303,7 +303,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowMediaDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedMediaDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowMediaDomain('www.owncloud.org')->disallowMediaDomain('www.owncloud.com');
@@ -311,14 +311,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyObjectDomainValid() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com";
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyObjectDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com www.owncloud.org";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com www.owncloud.org";
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.org');
@@ -326,7 +326,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowObjectDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.com');
@@ -334,7 +334,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowObjectDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';object-src www.owncloud.com";
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.org');
@@ -342,7 +342,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowObjectDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedObjectDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowObjectDomain('www.owncloud.org')->disallowObjectDomain('www.owncloud.com');
@@ -350,14 +350,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetAllowedFrameDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com";
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyFrameDomainValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com www.owncloud.org";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com www.owncloud.org";
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com');
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.org');
@@ -365,7 +365,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowFrameDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.com');
@@ -373,7 +373,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowFrameDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';frame-src www.owncloud.com";
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.org');
@@ -381,7 +381,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowFrameDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedFrameDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowFrameDomain('www.owncloud.org')->disallowFrameDomain('www.owncloud.com');
@@ -389,14 +389,14 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetAllowedChildSrcDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com";
$this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.com');
$this->assertSame($expectedPolicy, $this->contentSecurityPolicy->buildPolicy());
}
public function testGetPolicyChildSrcValidMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com child.owncloud.org";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';child-src child.owncloud.com child.owncloud.org";
$this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.com');
$this->contentSecurityPolicy->addAllowedChildSrcDomain('child.owncloud.org');
@@ -404,7 +404,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowChildSrcDomain() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.com');
@@ -412,7 +412,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowChildSrcDomainMultiple() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self';child-src www.owncloud.com";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self';child-src www.owncloud.com";
$this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.org');
@@ -420,7 +420,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testGetPolicyDisallowChildSrcDomainMultipleStakes() {
- $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expectedPolicy = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->contentSecurityPolicy->addAllowedChildSrcDomain('www.owncloud.com');
$this->contentSecurityPolicy->disallowChildSrcDomain('www.owncloud.org')->disallowChildSrcDomain('www.owncloud.com');
@@ -428,7 +428,7 @@ class ContentSecurityPolicyTest extends \Test\TestCase {
}
public function testConfigureStacked() {
- $expectedPolicy = "default-src 'none';script-src 'self' script.owncloud.org;style-src 'self' style.owncloud.org;img-src 'self' data: img.owncloud.org;font-src 'self' font.owncloud.org;connect-src 'self' connect.owncloud.org;media-src 'self' media.owncloud.org;object-src objects.owncloud.org;frame-src frame.owncloud.org;child-src child.owncloud.org";
+ $expectedPolicy = "default-src 'none';script-src 'self' script.owncloud.org;style-src 'self' style.owncloud.org;img-src 'self' data: blob: img.owncloud.org;font-src 'self' font.owncloud.org;connect-src 'self' connect.owncloud.org;media-src 'self' media.owncloud.org;object-src objects.owncloud.org;frame-src frame.owncloud.org;child-src child.owncloud.org";
$this->contentSecurityPolicy->allowInlineStyle(false)
->allowEvalScript(false)
diff --git a/tests/lib/appframework/http/DataResponseTest.php b/tests/lib/appframework/http/DataResponseTest.php
index 2b7817c28e9..e3d5689d54c 100644
--- a/tests/lib/appframework/http/DataResponseTest.php
+++ b/tests/lib/appframework/http/DataResponseTest.php
@@ -68,7 +68,7 @@ class DataResponseTest extends \Test\TestCase {
$expectedHeaders = [
'Cache-Control' => 'no-cache, must-revalidate',
- 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'",
+ 'Content-Security-Policy' => "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'",
];
$expectedHeaders = array_merge($expectedHeaders, $headers);
diff --git a/tests/lib/appframework/http/ResponseTest.php b/tests/lib/appframework/http/ResponseTest.php
index 61dd95e5948..f845f02d984 100644
--- a/tests/lib/appframework/http/ResponseTest.php
+++ b/tests/lib/appframework/http/ResponseTest.php
@@ -58,7 +58,7 @@ class ResponseTest extends \Test\TestCase {
$this->childResponse->setHeaders($expected);
$headers = $this->childResponse->getHeaders();
- $expected['Content-Security-Policy'] = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data:;font-src 'self';connect-src 'self';media-src 'self'";
+ $expected['Content-Security-Policy'] = "default-src 'none';script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline';img-src 'self' data: blob:;font-src 'self';connect-src 'self';media-src 'self'";
$this->assertEquals($expected, $headers);
}
diff --git a/tests/lib/config.php b/tests/lib/configtests.php
index 91154579ab5..0269ae542f4 100644
--- a/tests/lib/config.php
+++ b/tests/lib/configtests.php
@@ -6,7 +6,9 @@
* See the COPYING-README file.
*/
-class Test_Config extends \Test\TestCase {
+namespace Test;
+
+class ConfigTests extends TestCase {
const TESTCONTENT = '<?php $CONFIG=array("foo"=>"bar", "beers" => array("Appenzeller", "Guinness", "Kölsch"), "alcohol_free" => false);';
/** @var array */
@@ -24,7 +26,7 @@ class Test_Config extends \Test\TestCase {
$this->randomTmpDir = \OC_Helper::tmpFolder();
$this->configFile = $this->randomTmpDir.'testconfig.php';
file_put_contents($this->configFile, self::TESTCONTENT);
- $this->config = new OC\Config($this->randomTmpDir, 'testconfig.php');
+ $this->config = new \OC\Config($this->randomTmpDir, 'testconfig.php');
}
protected function tearDown() {
diff --git a/tests/lib/db/querybuilder/quotehelpertest.php b/tests/lib/db/querybuilder/quotehelpertest.php
index 904b4c500db..b83d9eed2df 100644
--- a/tests/lib/db/querybuilder/quotehelpertest.php
+++ b/tests/lib/db/querybuilder/quotehelpertest.php
@@ -43,6 +43,10 @@ class QuoteHelperTest extends \Test\TestCase {
[new Literal('literal'), 'literal'],
[new Literal(1), '1'],
[new Parameter(':param'), ':param'],
+
+ // (string) 'null' is Doctrines way to set columns to null
+ // See https://github.com/owncloud/core/issues/19314
+ ['null', 'null'],
];
}
diff --git a/tests/lib/encryption/decryptalltest.php b/tests/lib/encryption/decryptalltest.php
index c2a0711c0a0..ce5bcf1e5ae 100644
--- a/tests/lib/encryption/decryptalltest.php
+++ b/tests/lib/encryption/decryptalltest.php
@@ -82,11 +82,13 @@ class DecryptAllTest extends TestCase {
* @dataProvider dataTrueFalse
* @param bool $prepareResult
*/
- public function testDecryptAll($prepareResult) {
+ public function testDecryptAll($prepareResult, $user) {
- $user = 'user1';
-
- $this->userManager->expects($this->once())->method('userExists')->willReturn(true);
+ if (!empty($user)) {
+ $this->userManager->expects($this->once())->method('userExists')->willReturn(true);
+ } else {
+ $this->userManager->expects($this->never())->method('userExists');
+ }
/** @var DecryptAll | \PHPUnit_Framework_MockObject_MockObject | $instance */
$instance = $this->getMockBuilder('OC\Encryption\DecryptAll')
->setConstructorArgs(
@@ -117,8 +119,10 @@ class DecryptAllTest extends TestCase {
public function dataTrueFalse() {
return [
- [true],
- [false]
+ [true, 'user1'],
+ [false, 'user1'],
+ [true, ''],
+ [true, null]
];
}
diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php
index fcd7f73dcde..d381b4cdf40 100644
--- a/tests/lib/files/storage/storage.php
+++ b/tests/lib/files/storage/storage.php
@@ -573,4 +573,29 @@ abstract class Storage extends \Test\TestCase {
$this->assertSameAsLorem($target);
$this->assertTrue($this->instance->file_exists($source), $source . ' was deleted');
}
+
+ public function testIsCreatable() {
+ $this->instance->mkdir('source');
+ $this->assertTrue($this->instance->isCreatable('source'));
+ }
+
+ public function testIsReadable() {
+ $this->instance->mkdir('source');
+ $this->assertTrue($this->instance->isReadable('source'));
+ }
+
+ public function testIsUpdatable() {
+ $this->instance->mkdir('source');
+ $this->assertTrue($this->instance->isUpdatable('source'));
+ }
+
+ public function testIsDeletable() {
+ $this->instance->mkdir('source');
+ $this->assertTrue($this->instance->isDeletable('source'));
+ }
+
+ public function testIsShareable() {
+ $this->instance->mkdir('source');
+ $this->assertTrue($this->instance->isSharable('source'));
+ }
}
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 83f53833855..ceeb9ba7a94 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -193,7 +193,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testGetPath() {
+ public function testGetPath() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
$storage3 = $this->getTestStorage();
@@ -219,7 +219,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testMountPointOverwrite() {
+ public function testMountPointOverwrite() {
$storage1 = $this->getTestStorage(false);
$storage2 = $this->getTestStorage();
$storage1->mkdir('substorage');
@@ -265,7 +265,7 @@ class View extends \Test\TestCase {
$appConfig->setValue('core', 'shareapi_exclude_groups_list', $oldExcludeGroupsList);
}
- function testCacheIncompleteFolder() {
+ public function testCacheIncompleteFolder() {
$storage1 = $this->getTestStorage(false);
\OC\Files\Filesystem::clearMounts();
\OC\Files\Filesystem::mount($storage1, array(), '/incomplete');
@@ -300,7 +300,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testSearch() {
+ public function testSearch() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
$storage3 = $this->getTestStorage();
@@ -350,7 +350,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testWatcher() {
+ public function testWatcher() {
$storage1 = $this->getTestStorage();
\OC\Files\Filesystem::mount($storage1, array(), '/');
$storage1->getWatcher()->setPolicy(Watcher::CHECK_ALWAYS);
@@ -371,7 +371,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testCopyBetweenStorageNoCross() {
+ public function testCopyBetweenStorageNoCross() {
$storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross');
$storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross');
$this->copyBetweenStorages($storage1, $storage2);
@@ -380,7 +380,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testCopyBetweenStorageCross() {
+ public function testCopyBetweenStorageCross() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
$this->copyBetweenStorages($storage1, $storage2);
@@ -389,7 +389,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testCopyBetweenStorageCrossNonLocal() {
+ public function testCopyBetweenStorageCrossNonLocal() {
$storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal');
$storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal');
$this->copyBetweenStorages($storage1, $storage2);
@@ -417,7 +417,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testMoveBetweenStorageNoCross() {
+ public function testMoveBetweenStorageNoCross() {
$storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross');
$storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoCross');
$this->moveBetweenStorages($storage1, $storage2);
@@ -426,7 +426,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testMoveBetweenStorageCross() {
+ public function testMoveBetweenStorageCross() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
$this->moveBetweenStorages($storage1, $storage2);
@@ -435,7 +435,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testMoveBetweenStorageCrossNonLocal() {
+ public function testMoveBetweenStorageCrossNonLocal() {
$storage1 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal');
$storage2 = $this->getTestStorage(true, '\Test\Files\TemporaryNoLocal');
$this->moveBetweenStorages($storage1, $storage2);
@@ -458,7 +458,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testUnlink() {
+ public function testUnlink() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
\OC\Files\Filesystem::mount($storage1, array(), '/');
@@ -481,7 +481,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testUnlinkRootMustFail() {
+ public function testUnlinkRootMustFail() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
\OC\Files\Filesystem::mount($storage1, array(), '/');
@@ -500,7 +500,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testTouch() {
+ public function testTouch() {
$storage = $this->getTestStorage(true, '\Test\Files\TemporaryNoTouch');
\OC\Files\Filesystem::mount($storage, array(), '/');
@@ -524,7 +524,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testViewHooks() {
+ public function testViewHooks() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
$defaultRoot = \OC\Files\Filesystem::getRoot();
@@ -590,7 +590,7 @@ class View extends \Test\TestCase {
/**
* @medium
*/
- function testViewHooksIfRootStartsTheSame() {
+ public function testViewHooksIfRootStartsTheSame() {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
$defaultRoot = \OC\Files\Filesystem::getRoot();
@@ -851,24 +851,98 @@ class View extends \Test\TestCase {
}
/**
- * @dataProvider relativePathProvider
+ * @dataProvider chrootRelativePathProvider
*/
- function testGetRelativePath($absolutePath, $expectedPath) {
+ function testChrootGetRelativePath($root, $absolutePath, $expectedPath) {
$view = new \OC\Files\View('/files');
- // simulate a external storage mount point which has a trailing slash
- $view->chroot('/files/');
+ $view->chroot($root);
$this->assertEquals($expectedPath, $view->getRelativePath($absolutePath));
}
- function relativePathProvider() {
+ public function chrootRelativePathProvider() {
+ return $this->relativePathProvider('/');
+ }
+
+ /**
+ * @dataProvider initRelativePathProvider
+ */
+ public function testInitGetRelativePath($root, $absolutePath, $expectedPath) {
+ $view = new \OC\Files\View($root);
+ $this->assertEquals($expectedPath, $view->getRelativePath($absolutePath));
+ }
+
+ public function initRelativePathProvider() {
+ return $this->relativePathProvider(null);
+ }
+
+ public function relativePathProvider($missingRootExpectedPath) {
return array(
- array('/files/', '/'),
- array('/files', '/'),
- array('/files/0', '0'),
- array('/files/false', 'false'),
- array('/files/true', 'true'),
- array('/files/test', 'test'),
- array('/files/test/foo', 'test/foo'),
+ // No root - returns the path
+ array('', '/files', '/files'),
+ array('', '/files/', '/files/'),
+
+ // Root equals path - /
+ array('/files/', '/files/', '/'),
+ array('/files/', '/files', '/'),
+ array('/files', '/files/', '/'),
+ array('/files', '/files', '/'),
+
+ // False negatives: chroot fixes those by adding the leading slash.
+ // But setting them up with this root (instead of chroot($root))
+ // will fail them, although they should be the same.
+ // TODO init should be fixed, so it also adds the leading slash
+ array('files/', '/files/', $missingRootExpectedPath),
+ array('files', '/files/', $missingRootExpectedPath),
+ array('files/', '/files', $missingRootExpectedPath),
+ array('files', '/files', $missingRootExpectedPath),
+
+ // False negatives: Paths provided to the method should have a leading slash
+ // TODO input should be checked to have a leading slash
+ array('/files/', 'files/', null),
+ array('/files', 'files/', null),
+ array('/files/', 'files', null),
+ array('/files', 'files', null),
+
+ // with trailing slashes
+ array('/files/', '/files/0', '0'),
+ array('/files/', '/files/false', 'false'),
+ array('/files/', '/files/true', 'true'),
+ array('/files/', '/files/test', 'test'),
+ array('/files/', '/files/test/foo', 'test/foo'),
+
+ // without trailing slashes
+ // TODO false expectation: Should match "with trailing slashes"
+ array('/files', '/files/0', '/0'),
+ array('/files', '/files/false', '/false'),
+ array('/files', '/files/true', '/true'),
+ array('/files', '/files/test', '/test'),
+ array('/files', '/files/test/foo', '/test/foo'),
+
+ // leading slashes
+ array('/files/', '/files_trashbin/', null),
+ array('/files', '/files_trashbin/', null),
+ array('/files/', '/files_trashbin', null),
+ array('/files', '/files_trashbin', null),
+
+ // no leading slashes
+ array('files/', 'files_trashbin/', null),
+ array('files', 'files_trashbin/', null),
+ array('files/', 'files_trashbin', null),
+ array('files', 'files_trashbin', null),
+
+ // mixed leading slashes
+ array('files/', '/files_trashbin/', null),
+ array('/files/', 'files_trashbin/', null),
+ array('files', '/files_trashbin/', null),
+ array('/files', 'files_trashbin/', null),
+ array('files/', '/files_trashbin', null),
+ array('/files/', 'files_trashbin', null),
+ array('files', '/files_trashbin', null),
+ array('/files', 'files_trashbin', null),
+
+ array('files', 'files_trashbin/test', null),
+ array('/files', '/files_trashbin/test', null),
+ array('/files', 'files_trashbin/test', null),
);
}
@@ -1012,6 +1086,7 @@ class View extends \Test\TestCase {
$storage2->expects($this->any())
->method('fopen')
->will($this->returnCallback(function ($path, $mode) use ($storage2) {
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OC\Files\Storage\Temporary $storage2 */
$source = fopen($storage2->getSourcePath($path), $mode);
return \OC\Files\Stream\Quota::wrap($source, 9);
}));
@@ -1020,7 +1095,7 @@ class View extends \Test\TestCase {
$storage1->file_put_contents('foo.txt', '0123456789ABCDEFGH');
$storage1->mkdir('dirtomove');
$storage1->file_put_contents('dirtomove/indir1.txt', '0123456'); // fits
- $storage1->file_put_contents('dirtomove/indir2.txt', '0123456789ABCDEFGH'); // doesn't fit
+ $storage1->file_put_contents('dirtomove/indir2.txt', '0123456789ABCDEFGH'); // doesn't fit
$storage2->file_put_contents('existing.txt', '0123');
$storage1->getScanner()->scan('');
$storage2->getScanner()->scan('');
@@ -1296,7 +1371,7 @@ class View extends \Test\TestCase {
$thrown = false;
try {
- // this actually acquires two locks, one on the mount point and one no the storage root,
+ // this actually acquires two locks, one on the mount point and one on the storage root,
// but the one on the storage root will fail
$view->lockFile('/mountpoint.txt', ILockingProvider::LOCK_SHARED);
} catch (\OCP\Lock\LockedException $e) {
diff --git a/tests/lib/logger.php b/tests/lib/logger.php
index c8566988cf4..9c9cd9e6728 100644
--- a/tests/lib/logger.php
+++ b/tests/lib/logger.php
@@ -63,4 +63,48 @@ class Logger extends TestCase {
public static function write($app, $message, $level) {
self::$logs[]= "$level $message";
}
+
+ public function userAndPasswordData() {
+ return [
+ ['abc', 'def'],
+ ['mySpecialUsername', 'MySuperSecretPassword'],
+ ['my-user', '324324()#ä234'],
+ ['my-user', ')qwer'],
+ ['my-user', 'qwer)asdf'],
+ ['my-user', 'qwer)'],
+ ['my-user', '(qwer'],
+ ['my-user', 'qwer(asdf'],
+ ['my-user', 'qwer('],
+ ];
+ }
+
+ /**
+ * @dataProvider userAndPasswordData
+ */
+ public function testDetectlogin($user, $password) {
+ $e = new \Exception('test');
+ $this->logger->logException($e);
+
+ $logLines = $this->getLogs();
+ foreach($logLines as $logLine) {
+ $this->assertNotContains($user, $logLine);
+ $this->assertNotContains($password, $logLine);
+ $this->assertContains('login(*** username and password replaced ***)', $logLine);
+ }
+ }
+
+ /**
+ * @dataProvider userAndPasswordData
+ */
+ public function testDetectcheckPassword($user, $password) {
+ $e = new \Exception('test');
+ $this->logger->logException($e);
+ $logLines = $this->getLogs();
+
+ foreach($logLines as $logLine) {
+ $this->assertNotContains($user, $logLine);
+ $this->assertNotContains($password, $logLine);
+ $this->assertContains('checkPassword(*** username and password replaced ***)', $logLine);
+ }
+ }
}
diff --git a/tests/lib/preview.php b/tests/lib/preview.php
index 9e118014bac..9374cf2393f 100644
--- a/tests/lib/preview.php
+++ b/tests/lib/preview.php
@@ -534,10 +534,10 @@ class Preview extends TestCase {
// Small thumbnails are always cropped
$this->keepAspect = false;
// Smaller previews should be based on the previous, larger preview, with the correct aspect ratio
- $this->createThumbnailFromBiggerCachedPreview($fileId, 36, 36);
+ $this->createThumbnailFromBiggerCachedPreview($fileId, 32, 32);
// 2nd cache query should indicate that we have a cached copy of the exact dimension
- $this->getCachedSmallThumbnail($fileId, 36, 36);
+ $this->getCachedSmallThumbnail($fileId, 32, 32);
// We create a preview in order to be able to delete the cache
$preview = $this->createPreview(rand(), rand());
@@ -874,4 +874,45 @@ class Preview extends TestCase {
return [(int)$askedWidth, (int)$askedHeight];
}
+
+ public function testKeepAspectRatio() {
+ $originalWidth = 1680;
+ $originalHeight = 1050;
+ $originalAspectRation = $originalWidth / $originalHeight;
+
+ $preview = new \OC\Preview(
+ self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg',
+ 150,
+ 150
+ );
+ $preview->setKeepAspect(true);
+ $image = $preview->getPreview();
+
+ $aspectRatio = $image->width() / $image->height();
+ $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2));
+
+ $this->assertLessThanOrEqual(150, $image->width());
+ $this->assertLessThanOrEqual(150, $image->height());
+ }
+
+ public function testKeepAspectRatioCover() {
+ $originalWidth = 1680;
+ $originalHeight = 1050;
+ $originalAspectRation = $originalWidth / $originalHeight;
+
+ $preview = new \OC\Preview(
+ self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg',
+ 150,
+ 150
+ );
+ $preview->setKeepAspect(true);
+ $preview->setMode(\OC\Preview::MODE_COVER);
+ $image = $preview->getPreview();
+
+ $aspectRatio = $image->width() / $image->height();
+ $this->assertEquals(round($originalAspectRation, 2), round($aspectRatio, 2));
+
+ $this->assertGreaterThanOrEqual(150, $image->width());
+ $this->assertGreaterThanOrEqual(150, $image->height());
+ }
}
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index da36e7de58a..3c100b808cf 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -26,8 +26,17 @@ class RepairMimeTypes extends \Test\TestCase {
$this->savedMimetypeLoader = \OC::$server->getMimeTypeLoader();
$this->mimetypeLoader = \OC::$server->getMimeTypeLoader();
+ $config = $this->getMockBuilder('OCP\IConfig')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $config->expects($this->any())
+ ->method('getSystemValue')
+ ->with('version')
+ ->will($this->returnValue('8.0.0.0'));
+
$this->storage = new \OC\Files\Storage\Temporary([]);
- $this->repair = new \OC\Repair\RepairMimeTypes();
+
+ $this->repair = new \OC\Repair\RepairMimeTypes($config);
}
protected function tearDown() {
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index ef0d9822085..58a76470afa 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -1567,6 +1567,43 @@ class Test_Share extends \Test\TestCase {
$this->setHttpHelper($oldHttpHelper);
}
+ /**
+ * Test case for #19119
+ */
+ public function testReshareWithLinkDefaultExpirationDate() {
+ $config = \OC::$server->getConfig();
+ $config->setAppValue('core', 'shareapi_default_expire_date', 'yes');
+ $config->setAppValue('core', 'shareapi_expire_after_n_days', '2');
+
+ // Expiration date
+ $expireAt = time() + 2 * 24*60*60;
+ $date = new DateTime();
+ $date->setTimestamp($expireAt);
+ $date->setTime(0, 0, 0);
+
+ //Share a file from user 1 to user 2
+ $this->shareUserTestFileWithUser($this->user1, $this->user2);
+
+ //User 2 shares as link
+ OC_User::setUserId($this->user2);
+ $result = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
+ $this->assertTrue(is_string($result));
+
+ //Check if expire date is correct
+ $result = OCP\Share::getItemShared('test', 'test.txt');
+ $this->assertCount(1, $result);
+ $result = reset($result);
+ $this->assertNotEmpty($result['expiration']);
+ $expireDate = new DateTime($result['expiration']);
+ $this->assertEquals($date, $expireDate);
+
+ //Unshare
+ $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt'));
+
+ //Reset config
+ $config->deleteAppValue('core', 'shareapi_default_expire_date');
+ $config->deleteAppValue('core', 'shareapi_expire_after_n_days');
+ }
}
class DummyShareClass extends \OC\Share\Share {
diff --git a/tests/lib/util.php b/tests/lib/util.php
index b9b8062653e..49579b3b6bd 100644
--- a/tests/lib/util.php
+++ b/tests/lib/util.php
@@ -406,11 +406,13 @@ class Test_Util extends \Test\TestCase {
OC_Config::setValue('version', '7.0.0.0');
\OC::$server->getSession()->set('OC_Version', array(7, 0, 0, 1));
+ self::invokePrivate(new \OCP\Util, 'needUpgradeCache', array(null));
$this->assertTrue(\OCP\Util::needUpgrade());
OC_Config::setValue('version', $oldConfigVersion);
$oldSessionVersion = \OC::$server->getSession()->set('OC_Version', $oldSessionVersion);
+ self::invokePrivate(new \OCP\Util, 'needUpgradeCache', array(null));
$this->assertFalse(\OCP\Util::needUpgrade());
}