Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/files/ajax/delete.php20
-rw-r--r--apps/files/ajax/download.php1
-rw-r--r--apps/files/ajax/getstoragestats.php1
-rw-r--r--apps/files/ajax/list.php6
-rw-r--r--apps/files/ajax/mimeicon.php1
-rw-r--r--apps/files/ajax/move.php6
-rw-r--r--apps/files/ajax/newfile.php17
-rw-r--r--apps/files/ajax/newfolder.php5
-rw-r--r--apps/files/ajax/rawlist.php59
-rw-r--r--apps/files/ajax/rename.php1
-rw-r--r--apps/files/ajax/scan.php2
-rw-r--r--apps/files/ajax/upgrade.php44
-rw-r--r--apps/files/ajax/upload.php19
-rw-r--r--apps/files/appinfo/remote.php1
-rw-r--r--apps/files/appinfo/update.php19
-rw-r--r--apps/files/command/scan.php1
-rw-r--r--apps/files/css/files.css49
-rw-r--r--apps/files/index.php142
-rw-r--r--apps/files/js/admin.js19
-rw-r--r--apps/files/js/file-upload.js1017
-rw-r--r--apps/files/js/filelist.js143
-rw-r--r--apps/files/js/files.js46
-rw-r--r--apps/files/js/upgrade.js28
-rw-r--r--apps/files/l10n/ar.php10
-rw-r--r--apps/files/l10n/az.php8
-rw-r--r--apps/files/l10n/bn_BD.php4
-rw-r--r--apps/files/l10n/ca.php18
-rw-r--r--apps/files/l10n/cs_CZ.php16
-rw-r--r--apps/files/l10n/cy_GB.php7
-rw-r--r--apps/files/l10n/da.php16
-rw-r--r--apps/files/l10n/de.php16
-rw-r--r--apps/files/l10n/de_AT.php6
-rw-r--r--apps/files/l10n/de_CH.php7
-rw-r--r--apps/files/l10n/de_DE.php18
-rw-r--r--apps/files/l10n/el.php13
-rw-r--r--apps/files/l10n/en_GB.php16
-rw-r--r--apps/files/l10n/eo.php11
-rw-r--r--apps/files/l10n/es.php24
-rw-r--r--apps/files/l10n/es_AR.php31
-rw-r--r--apps/files/l10n/es_CL.php5
-rw-r--r--apps/files/l10n/es_MX.php11
-rw-r--r--apps/files/l10n/et_EE.php11
-rw-r--r--apps/files/l10n/eu.php13
-rw-r--r--apps/files/l10n/eu_ES.php10
-rw-r--r--apps/files/l10n/fa.php11
-rw-r--r--apps/files/l10n/fi_FI.php16
-rw-r--r--apps/files/l10n/fr.php16
-rw-r--r--apps/files/l10n/gl.php16
-rw-r--r--apps/files/l10n/he.php2
-rw-r--r--apps/files/l10n/hu_HU.php11
-rw-r--r--apps/files/l10n/id.php11
-rw-r--r--apps/files/l10n/is.php4
-rw-r--r--apps/files/l10n/it.php16
-rw-r--r--apps/files/l10n/ja.php95
-rw-r--r--apps/files/l10n/ja_JP.php47
-rw-r--r--apps/files/l10n/ka_GE.php7
-rw-r--r--apps/files/l10n/km.php11
-rw-r--r--apps/files/l10n/ko.php11
-rw-r--r--apps/files/l10n/ku_IQ.php1
-rw-r--r--apps/files/l10n/lt_LT.php16
-rw-r--r--apps/files/l10n/lv.php7
-rw-r--r--apps/files/l10n/mk.php8
-rw-r--r--apps/files/l10n/ml.php7
-rw-r--r--apps/files/l10n/mn.php7
-rw-r--r--apps/files/l10n/nb_NO.php35
-rw-r--r--apps/files/l10n/nl.php16
-rw-r--r--apps/files/l10n/nn_NO.php9
-rw-r--r--apps/files/l10n/pl.php18
-rw-r--r--apps/files/l10n/pt_BR.php16
-rw-r--r--apps/files/l10n/pt_PT.php30
-rw-r--r--apps/files/l10n/ro.php74
-rw-r--r--apps/files/l10n/ru.php67
-rw-r--r--apps/files/l10n/sk_SK.php13
-rw-r--r--apps/files/l10n/sl.php16
-rw-r--r--apps/files/l10n/sq.php11
-rw-r--r--apps/files/l10n/sr.php7
-rw-r--r--apps/files/l10n/sr@latin.php1
-rw-r--r--apps/files/l10n/su.php7
-rw-r--r--apps/files/l10n/sv.php11
-rw-r--r--apps/files/l10n/ta_LK.php2
-rw-r--r--apps/files/l10n/th_TH.php8
-rw-r--r--apps/files/l10n/tr.php16
-rw-r--r--apps/files/l10n/ug.php4
-rw-r--r--apps/files/l10n/uk.php7
-rw-r--r--apps/files/l10n/vi.php40
-rw-r--r--apps/files/l10n/zh_CN.php35
-rw-r--r--apps/files/l10n/zh_TW.php11
-rw-r--r--apps/files/lib/helper.php63
-rw-r--r--apps/files/templates/index.php21
-rw-r--r--apps/files/templates/part.list.php16
-rw-r--r--apps/files/templates/upgrade.php4
-rw-r--r--apps/files/tests/ajax_rename.php8
-rw-r--r--apps/files/tests/js/fileUploadSpec.js127
-rw-r--r--apps/files/tests/js/fileactionsSpec.js2
-rw-r--r--apps/files/tests/js/filelistSpec.js13
-rw-r--r--apps/files/tests/js/filesSpec.js35
-rw-r--r--apps/files_encryption/ajax/adminrecovery.php2
-rw-r--r--apps/files_encryption/ajax/getMigrationStatus.php8
-rw-r--r--apps/files_encryption/appinfo/app.php1
-rw-r--r--apps/files_encryption/appinfo/info.xml2
-rw-r--r--apps/files_encryption/hooks/hooks.php51
-rw-r--r--apps/files_encryption/js/detect-migration.js6
-rw-r--r--apps/files_encryption/js/encryption.js12
-rw-r--r--apps/files_encryption/js/settings-admin.js22
-rw-r--r--apps/files_encryption/l10n/ar.php42
-rw-r--r--apps/files_encryption/l10n/bg_BG.php1
-rw-r--r--apps/files_encryption/l10n/bn_BD.php1
-rw-r--r--apps/files_encryption/l10n/ca.php2
-rw-r--r--apps/files_encryption/l10n/cs_CZ.php1
-rw-r--r--apps/files_encryption/l10n/cy_GB.php1
-rw-r--r--apps/files_encryption/l10n/da.php2
-rw-r--r--apps/files_encryption/l10n/de.php2
-rw-r--r--apps/files_encryption/l10n/de_CH.php1
-rw-r--r--apps/files_encryption/l10n/de_DE.php4
-rw-r--r--apps/files_encryption/l10n/el.php1
-rw-r--r--apps/files_encryption/l10n/en_GB.php2
-rw-r--r--apps/files_encryption/l10n/eo.php1
-rw-r--r--apps/files_encryption/l10n/es.php2
-rw-r--r--apps/files_encryption/l10n/es_AR.php9
-rw-r--r--apps/files_encryption/l10n/es_MX.php1
-rw-r--r--apps/files_encryption/l10n/et_EE.php1
-rw-r--r--apps/files_encryption/l10n/eu.php1
-rw-r--r--apps/files_encryption/l10n/fa.php1
-rw-r--r--apps/files_encryption/l10n/fi_FI.php2
-rw-r--r--apps/files_encryption/l10n/fr.php2
-rw-r--r--apps/files_encryption/l10n/gl.php2
-rw-r--r--apps/files_encryption/l10n/he.php1
-rw-r--r--apps/files_encryption/l10n/hu_HU.php1
-rw-r--r--apps/files_encryption/l10n/id.php1
-rw-r--r--apps/files_encryption/l10n/is.php1
-rw-r--r--apps/files_encryption/l10n/it.php2
-rw-r--r--apps/files_encryption/l10n/ja.php44
-rw-r--r--apps/files_encryption/l10n/ja_JP.php32
-rw-r--r--apps/files_encryption/l10n/ka_GE.php1
-rw-r--r--apps/files_encryption/l10n/ko.php1
-rw-r--r--apps/files_encryption/l10n/ku_IQ.php1
-rw-r--r--apps/files_encryption/l10n/lt_LT.php3
-rw-r--r--apps/files_encryption/l10n/lv.php1
-rw-r--r--apps/files_encryption/l10n/mk.php1
-rw-r--r--apps/files_encryption/l10n/nb_NO.php41
-rw-r--r--apps/files_encryption/l10n/nl.php2
-rw-r--r--apps/files_encryption/l10n/nn_NO.php1
-rw-r--r--apps/files_encryption/l10n/pl.php2
-rw-r--r--apps/files_encryption/l10n/pt_BR.php2
-rw-r--r--apps/files_encryption/l10n/pt_PT.php1
-rw-r--r--apps/files_encryption/l10n/ro.php18
-rw-r--r--apps/files_encryption/l10n/ru.php1
-rw-r--r--apps/files_encryption/l10n/si_LK.php1
-rw-r--r--apps/files_encryption/l10n/sk_SK.php1
-rw-r--r--apps/files_encryption/l10n/sl.php2
-rw-r--r--apps/files_encryption/l10n/sr.php1
-rw-r--r--apps/files_encryption/l10n/sv.php1
-rw-r--r--apps/files_encryption/l10n/ta_LK.php1
-rw-r--r--apps/files_encryption/l10n/th_TH.php1
-rw-r--r--apps/files_encryption/l10n/tr.php2
-rw-r--r--apps/files_encryption/l10n/ug.php1
-rw-r--r--apps/files_encryption/l10n/uk.php1
-rw-r--r--apps/files_encryption/l10n/vi.php20
-rw-r--r--apps/files_encryption/l10n/zh_CN.php1
-rw-r--r--apps/files_encryption/l10n/zh_TW.php1
-rwxr-xr-xapps/files_encryption/lib/crypt.php18
-rwxr-xr-xapps/files_encryption/lib/helper.php31
-rwxr-xr-xapps/files_encryption/lib/keymanager.php6
-rw-r--r--apps/files_encryption/lib/proxy.php47
-rw-r--r--apps/files_encryption/lib/session.php16
-rw-r--r--apps/files_encryption/lib/stream.php5
-rw-r--r--apps/files_encryption/lib/util.php117
-rw-r--r--apps/files_encryption/settings-admin.php2
-rw-r--r--apps/files_encryption/settings-personal.php2
-rwxr-xr-xapps/files_encryption/tests/crypt.php2
-rw-r--r--apps/files_encryption/tests/hooks.php61
-rw-r--r--apps/files_encryption/tests/keymanager.php4
-rw-r--r--apps/files_encryption/tests/proxy.php20
-rwxr-xr-xapps/files_encryption/tests/share.php96
-rwxr-xr-xapps/files_encryption/tests/util.php95
-rw-r--r--apps/files_external/3rdparty/smb4php/smb.php16
-rw-r--r--apps/files_external/ajax/addRootCertificate.php2
-rw-r--r--apps/files_external/appinfo/app.php3
-rw-r--r--apps/files_external/js/settings.js12
-rw-r--r--apps/files_external/l10n/ar.php1
-rw-r--r--apps/files_external/l10n/bg_BG.php1
-rw-r--r--apps/files_external/l10n/bn_BD.php1
-rw-r--r--apps/files_external/l10n/ca.php3
-rw-r--r--apps/files_external/l10n/cs_CZ.php3
-rw-r--r--apps/files_external/l10n/da.php3
-rw-r--r--apps/files_external/l10n/de.php3
-rw-r--r--apps/files_external/l10n/de_AT.php5
-rw-r--r--apps/files_external/l10n/de_CH.php1
-rw-r--r--apps/files_external/l10n/de_DE.php3
-rw-r--r--apps/files_external/l10n/el.php2
-rw-r--r--apps/files_external/l10n/en_GB.php3
-rw-r--r--apps/files_external/l10n/eo.php1
-rw-r--r--apps/files_external/l10n/es.php3
-rw-r--r--apps/files_external/l10n/es_AR.php1
-rw-r--r--apps/files_external/l10n/es_MX.php1
-rw-r--r--apps/files_external/l10n/et_EE.php1
-rw-r--r--apps/files_external/l10n/eu.php1
-rw-r--r--apps/files_external/l10n/eu_ES.php5
-rw-r--r--apps/files_external/l10n/fa.php1
-rw-r--r--apps/files_external/l10n/fi_FI.php3
-rw-r--r--apps/files_external/l10n/fr.php3
-rw-r--r--apps/files_external/l10n/gl.php3
-rw-r--r--apps/files_external/l10n/he.php1
-rw-r--r--apps/files_external/l10n/hu_HU.php1
-rw-r--r--apps/files_external/l10n/id.php1
-rw-r--r--apps/files_external/l10n/is.php1
-rw-r--r--apps/files_external/l10n/it.php3
-rw-r--r--apps/files_external/l10n/ja.php29
-rw-r--r--apps/files_external/l10n/ja_JP.php19
-rw-r--r--apps/files_external/l10n/ka_GE.php1
-rw-r--r--apps/files_external/l10n/km.php3
-rw-r--r--apps/files_external/l10n/ko.php1
-rw-r--r--apps/files_external/l10n/lt_LT.php1
-rw-r--r--apps/files_external/l10n/lv.php1
-rw-r--r--apps/files_external/l10n/mk.php1
-rw-r--r--apps/files_external/l10n/nb_NO.php1
-rw-r--r--apps/files_external/l10n/nl.php3
-rw-r--r--apps/files_external/l10n/pl.php3
-rw-r--r--apps/files_external/l10n/pt_BR.php3
-rw-r--r--apps/files_external/l10n/pt_PT.php2
-rw-r--r--apps/files_external/l10n/ro.php3
-rw-r--r--apps/files_external/l10n/ru.php1
-rw-r--r--apps/files_external/l10n/si_LK.php1
-rw-r--r--apps/files_external/l10n/sk_SK.php1
-rw-r--r--apps/files_external/l10n/sl.php3
-rw-r--r--apps/files_external/l10n/sv.php1
-rw-r--r--apps/files_external/l10n/ta_LK.php1
-rw-r--r--apps/files_external/l10n/th_TH.php1
-rw-r--r--apps/files_external/l10n/tr.php3
-rw-r--r--apps/files_external/l10n/uk.php1
-rw-r--r--apps/files_external/l10n/vi.php1
-rw-r--r--apps/files_external/l10n/zh_CN.php1
-rw-r--r--apps/files_external/l10n/zh_TW.php1
-rw-r--r--apps/files_external/lib/amazons3.php3
-rwxr-xr-xapps/files_external/lib/config.php267
-rwxr-xr-xapps/files_external/lib/dropbox.php5
-rw-r--r--apps/files_external/lib/google.php7
-rw-r--r--apps/files_external/lib/irods.php1
-rw-r--r--apps/files_external/lib/sftp.php6
-rw-r--r--apps/files_external/lib/smb.php2
-rw-r--r--apps/files_external/lib/streamwrapper.php12
-rw-r--r--apps/files_external/lib/swift.php6
-rw-r--r--apps/files_external/lib/webdav.php234
-rwxr-xr-xapps/files_external/personal.php5
-rw-r--r--apps/files_external/settings.php18
-rw-r--r--apps/files_external/templates/settings.php18
-rw-r--r--apps/files_external/tests/config.php6
-rw-r--r--apps/files_external/tests/mountconfig.php435
-rw-r--r--apps/files_external/tests/webdav.php3
-rw-r--r--apps/files_sharing/ajax/publicpreview.php2
-rw-r--r--apps/files_sharing/appinfo/routes.php1
-rw-r--r--apps/files_sharing/css/public.css5
-rw-r--r--apps/files_sharing/js/public.js30
-rw-r--r--apps/files_sharing/js/share.js21
-rw-r--r--apps/files_sharing/l10n/ar.php8
-rw-r--r--apps/files_sharing/l10n/bg_BG.php8
-rw-r--r--apps/files_sharing/l10n/bn_BD.php8
-rw-r--r--apps/files_sharing/l10n/ca.php9
-rw-r--r--apps/files_sharing/l10n/cs_CZ.php9
-rw-r--r--apps/files_sharing/l10n/cy_GB.php8
-rw-r--r--apps/files_sharing/l10n/da.php8
-rw-r--r--apps/files_sharing/l10n/de.php9
-rw-r--r--apps/files_sharing/l10n/de_AT.php5
-rw-r--r--apps/files_sharing/l10n/de_CH.php9
-rw-r--r--apps/files_sharing/l10n/de_DE.php9
-rw-r--r--apps/files_sharing/l10n/el.php9
-rw-r--r--apps/files_sharing/l10n/en@pirate.php6
-rw-r--r--apps/files_sharing/l10n/en_GB.php9
-rw-r--r--apps/files_sharing/l10n/eo.php7
-rw-r--r--apps/files_sharing/l10n/es.php9
-rw-r--r--apps/files_sharing/l10n/es_AR.php9
-rw-r--r--apps/files_sharing/l10n/es_CL.php3
-rw-r--r--apps/files_sharing/l10n/es_MX.php7
-rw-r--r--apps/files_sharing/l10n/et_EE.php8
-rw-r--r--apps/files_sharing/l10n/eu.php8
-rw-r--r--apps/files_sharing/l10n/fa.php9
-rw-r--r--apps/files_sharing/l10n/fi_FI.php9
-rw-r--r--apps/files_sharing/l10n/fr.php9
-rw-r--r--apps/files_sharing/l10n/gl.php9
-rw-r--r--apps/files_sharing/l10n/he.php9
-rw-r--r--apps/files_sharing/l10n/hi.php3
-rw-r--r--apps/files_sharing/l10n/hr.php5
-rw-r--r--apps/files_sharing/l10n/hu_HU.php8
-rw-r--r--apps/files_sharing/l10n/ia.php4
-rw-r--r--apps/files_sharing/l10n/id.php7
-rw-r--r--apps/files_sharing/l10n/is.php8
-rw-r--r--apps/files_sharing/l10n/it.php9
-rw-r--r--apps/files_sharing/l10n/ja.php17
-rw-r--r--apps/files_sharing/l10n/ja_JP.php9
-rw-r--r--apps/files_sharing/l10n/ka_GE.php9
-rw-r--r--apps/files_sharing/l10n/km.php6
-rw-r--r--apps/files_sharing/l10n/ko.php7
-rw-r--r--apps/files_sharing/l10n/ku_IQ.php7
-rw-r--r--apps/files_sharing/l10n/lb.php8
-rw-r--r--apps/files_sharing/l10n/lt_LT.php8
-rw-r--r--apps/files_sharing/l10n/lv.php9
-rw-r--r--apps/files_sharing/l10n/mk.php9
-rw-r--r--apps/files_sharing/l10n/ms_MY.php5
-rw-r--r--apps/files_sharing/l10n/my_MM.php3
-rw-r--r--apps/files_sharing/l10n/nb_NO.php16
-rw-r--r--apps/files_sharing/l10n/nl.php9
-rw-r--r--apps/files_sharing/l10n/nn_NO.php9
-rw-r--r--apps/files_sharing/l10n/oc.php5
-rw-r--r--apps/files_sharing/l10n/pa.php5
-rw-r--r--apps/files_sharing/l10n/pl.php9
-rw-r--r--apps/files_sharing/l10n/pt_BR.php9
-rw-r--r--apps/files_sharing/l10n/pt_PT.php9
-rw-r--r--apps/files_sharing/l10n/ro.php8
-rw-r--r--apps/files_sharing/l10n/ru.php14
-rw-r--r--apps/files_sharing/l10n/si_LK.php8
-rw-r--r--apps/files_sharing/l10n/sk_SK.php8
-rw-r--r--apps/files_sharing/l10n/sl.php9
-rw-r--r--apps/files_sharing/l10n/sq.php8
-rw-r--r--apps/files_sharing/l10n/sr.php5
-rw-r--r--apps/files_sharing/l10n/sr@latin.php4
-rw-r--r--apps/files_sharing/l10n/sv.php7
-rw-r--r--apps/files_sharing/l10n/ta_LK.php9
-rw-r--r--apps/files_sharing/l10n/th_TH.php9
-rw-r--r--apps/files_sharing/l10n/tr.php9
-rw-r--r--apps/files_sharing/l10n/ug.php5
-rw-r--r--apps/files_sharing/l10n/uk.php7
-rw-r--r--apps/files_sharing/l10n/vi.php8
-rw-r--r--apps/files_sharing/l10n/zh_CN.php10
-rw-r--r--apps/files_sharing/l10n/zh_HK.php4
-rw-r--r--apps/files_sharing/l10n/zh_TW.php9
-rw-r--r--apps/files_sharing/lib/api.php57
-rw-r--r--apps/files_sharing/lib/cache.php74
-rw-r--r--apps/files_sharing/lib/permissions.php4
-rw-r--r--apps/files_sharing/lib/share/file.php12
-rw-r--r--apps/files_sharing/lib/sharedstorage.php2
-rw-r--r--apps/files_sharing/public.php23
-rw-r--r--apps/files_sharing/templates/authenticate.php7
-rw-r--r--apps/files_sharing/templates/public.php4
-rw-r--r--apps/files_sharing/tests/api.php400
-rw-r--r--apps/files_sharing/tests/base.php1
-rw-r--r--apps/files_sharing/tests/cache.php249
-rw-r--r--apps/files_sharing/tests/watcher.php1
-rw-r--r--apps/files_trashbin/ajax/delete.php16
-rw-r--r--apps/files_trashbin/ajax/list.php6
-rw-r--r--apps/files_trashbin/ajax/preview.php2
-rw-r--r--apps/files_trashbin/ajax/undelete.php31
-rw-r--r--apps/files_trashbin/appinfo/database.xml4
-rw-r--r--apps/files_trashbin/appinfo/update.php2
-rw-r--r--apps/files_trashbin/appinfo/version2
-rw-r--r--apps/files_trashbin/index.php13
-rw-r--r--apps/files_trashbin/js/filelist.js32
-rw-r--r--apps/files_trashbin/js/trash.js141
-rw-r--r--apps/files_trashbin/l10n/ar.php1
-rw-r--r--apps/files_trashbin/l10n/ca.php1
-rw-r--r--apps/files_trashbin/l10n/cs_CZ.php1
-rw-r--r--apps/files_trashbin/l10n/cy_GB.php1
-rw-r--r--apps/files_trashbin/l10n/da.php1
-rw-r--r--apps/files_trashbin/l10n/de.php1
-rw-r--r--apps/files_trashbin/l10n/de_AT.php3
-rw-r--r--apps/files_trashbin/l10n/de_CH.php1
-rw-r--r--apps/files_trashbin/l10n/de_DE.php1
-rw-r--r--apps/files_trashbin/l10n/el.php1
-rw-r--r--apps/files_trashbin/l10n/en_GB.php1
-rw-r--r--apps/files_trashbin/l10n/eo.php1
-rw-r--r--apps/files_trashbin/l10n/es.php1
-rw-r--r--apps/files_trashbin/l10n/es_AR.php1
-rw-r--r--apps/files_trashbin/l10n/es_CL.php5
-rw-r--r--apps/files_trashbin/l10n/es_MX.php1
-rw-r--r--apps/files_trashbin/l10n/et_EE.php1
-rw-r--r--apps/files_trashbin/l10n/eu.php1
-rw-r--r--apps/files_trashbin/l10n/eu_ES.php5
-rw-r--r--apps/files_trashbin/l10n/fa.php1
-rw-r--r--apps/files_trashbin/l10n/fi_FI.php1
-rw-r--r--apps/files_trashbin/l10n/fr.php1
-rw-r--r--apps/files_trashbin/l10n/gl.php1
-rw-r--r--apps/files_trashbin/l10n/he.php2
-rw-r--r--apps/files_trashbin/l10n/hu_HU.php1
-rw-r--r--apps/files_trashbin/l10n/id.php1
-rw-r--r--apps/files_trashbin/l10n/it.php1
-rw-r--r--apps/files_trashbin/l10n/ja.php15
-rw-r--r--apps/files_trashbin/l10n/ja_JP.php5
-rw-r--r--apps/files_trashbin/l10n/ka_GE.php1
-rw-r--r--apps/files_trashbin/l10n/km.php3
-rw-r--r--apps/files_trashbin/l10n/ko.php1
-rw-r--r--apps/files_trashbin/l10n/lt_LT.php1
-rw-r--r--apps/files_trashbin/l10n/lv.php1
-rw-r--r--apps/files_trashbin/l10n/mk.php1
-rw-r--r--apps/files_trashbin/l10n/nb_NO.php4
-rw-r--r--apps/files_trashbin/l10n/nl.php1
-rw-r--r--apps/files_trashbin/l10n/nn_NO.php1
-rw-r--r--apps/files_trashbin/l10n/pl.php1
-rw-r--r--apps/files_trashbin/l10n/pt_BR.php1
-rw-r--r--apps/files_trashbin/l10n/pt_PT.php1
-rw-r--r--apps/files_trashbin/l10n/ro.php1
-rw-r--r--apps/files_trashbin/l10n/ru.php1
-rw-r--r--apps/files_trashbin/l10n/sk_SK.php1
-rw-r--r--apps/files_trashbin/l10n/sl.php1
-rw-r--r--apps/files_trashbin/l10n/sq.php1
-rw-r--r--apps/files_trashbin/l10n/sr.php1
-rw-r--r--apps/files_trashbin/l10n/sv.php1
-rw-r--r--apps/files_trashbin/l10n/tr.php1
-rw-r--r--apps/files_trashbin/l10n/ug.php1
-rw-r--r--apps/files_trashbin/l10n/uk.php1
-rw-r--r--apps/files_trashbin/l10n/vi.php4
-rw-r--r--apps/files_trashbin/l10n/zh_CN.php1
-rw-r--r--apps/files_trashbin/l10n/zh_TW.php1
-rw-r--r--apps/files_trashbin/lib/helper.php70
-rw-r--r--apps/files_trashbin/lib/trashbin.php175
-rw-r--r--apps/files_versions/l10n/ja.php10
-rw-r--r--apps/files_versions/l10n/km.php10
-rw-r--r--apps/files_versions/l10n/nb_NO.php4
-rw-r--r--apps/files_versions/l10n/sq.php5
-rw-r--r--apps/files_versions/l10n/vi.php3
-rw-r--r--apps/files_versions/l10n/zh_CN.php3
-rw-r--r--apps/files_versions/lib/versions.php13
-rw-r--r--apps/files_versions/tests/versions.php3
-rw-r--r--apps/user_ldap/appinfo/info.xml3
-rw-r--r--apps/user_ldap/group_ldap.php78
-rw-r--r--apps/user_ldap/js/settings.js1
-rw-r--r--apps/user_ldap/l10n/ar.php7
-rw-r--r--apps/user_ldap/l10n/ca.php8
-rw-r--r--apps/user_ldap/l10n/cs_CZ.php3
-rw-r--r--apps/user_ldap/l10n/de.php8
-rw-r--r--apps/user_ldap/l10n/de_AT.php5
-rw-r--r--apps/user_ldap/l10n/de_DE.php8
-rw-r--r--apps/user_ldap/l10n/el.php5
-rw-r--r--apps/user_ldap/l10n/en_GB.php8
-rw-r--r--apps/user_ldap/l10n/es.php10
-rw-r--r--apps/user_ldap/l10n/es_AR.php28
-rw-r--r--apps/user_ldap/l10n/es_CL.php1
-rw-r--r--apps/user_ldap/l10n/es_MX.php3
-rw-r--r--apps/user_ldap/l10n/et_EE.php3
-rw-r--r--apps/user_ldap/l10n/eu.php3
-rw-r--r--apps/user_ldap/l10n/eu_ES.php7
-rw-r--r--apps/user_ldap/l10n/fr.php8
-rw-r--r--apps/user_ldap/l10n/gl.php8
-rw-r--r--apps/user_ldap/l10n/hu_HU.php3
-rw-r--r--apps/user_ldap/l10n/it.php8
-rw-r--r--apps/user_ldap/l10n/ja.php112
-rw-r--r--apps/user_ldap/l10n/ja_JP.php72
-rw-r--r--apps/user_ldap/l10n/km.php16
-rw-r--r--apps/user_ldap/l10n/ko.php3
-rw-r--r--apps/user_ldap/l10n/ml.php6
-rw-r--r--apps/user_ldap/l10n/mn.php6
-rw-r--r--apps/user_ldap/l10n/nb_NO.php63
-rw-r--r--apps/user_ldap/l10n/nl.php8
-rw-r--r--apps/user_ldap/l10n/pl.php40
-rw-r--r--apps/user_ldap/l10n/pt_BR.php8
-rw-r--r--apps/user_ldap/l10n/pt_PT.php35
-rw-r--r--apps/user_ldap/l10n/ru.php5
-rw-r--r--apps/user_ldap/l10n/sk_SK.php25
-rw-r--r--apps/user_ldap/l10n/sl.php3
-rw-r--r--apps/user_ldap/l10n/su.php6
-rw-r--r--apps/user_ldap/l10n/sv.php5
-rw-r--r--apps/user_ldap/l10n/te.php3
-rw-r--r--apps/user_ldap/l10n/tr.php8
-rw-r--r--apps/user_ldap/l10n/vi.php1
-rw-r--r--apps/user_ldap/l10n/zh_CN.php2
-rw-r--r--apps/user_ldap/lib/access.php66
-rw-r--r--apps/user_ldap/lib/configuration.php8
-rw-r--r--apps/user_ldap/lib/connection.php11
-rw-r--r--apps/user_ldap/lib/helper.php6
-rw-r--r--apps/user_ldap/lib/ildapwrapper.php22
-rw-r--r--apps/user_ldap/lib/ldap.php15
-rw-r--r--apps/user_ldap/lib/proxy.php19
-rw-r--r--apps/user_ldap/lib/wizard.php30
-rw-r--r--apps/user_ldap/templates/part.wizard-groupfilter.php2
-rw-r--r--apps/user_ldap/templates/part.wizard-loginfilter.php2
-rw-r--r--apps/user_ldap/templates/part.wizard-userfilter.php2
-rw-r--r--apps/user_ldap/templates/settings.php1
-rw-r--r--apps/user_ldap/tests/access.php71
-rw-r--r--apps/user_ldap/tests/user_ldap.php101
-rw-r--r--apps/user_ldap/user_ldap.php43
-rw-r--r--apps/user_ldap/user_proxy.php17
-rw-r--r--apps/user_webdavauth/l10n/id.php4
-rw-r--r--apps/user_webdavauth/l10n/ja.php7
-rw-r--r--apps/user_webdavauth/l10n/km.php7
-rw-r--r--apps/user_webdavauth/l10n/nb_NO.php4
-rw-r--r--apps/user_webdavauth/l10n/vi.php4
474 files changed, 5611 insertions, 2654 deletions
diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php
index c69f5a8860c..f6aa4f0c90e 100644
--- a/apps/files/ajax/delete.php
+++ b/apps/files/ajax/delete.php
@@ -1,16 +1,28 @@
<?php
-// Init owncloud
-
-
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
+\OC::$session->close();
+
// Get data
$dir = stripslashes($_POST["dir"]);
$files = isset($_POST["file"]) ? $_POST["file"] : $_POST["files"];
+$allFiles = isset($_POST["allfiles"]) ? $_POST["allfiles"] : false;
+if ($allFiles === 'true') {
+ $allFiles = true;
+}
-$files = json_decode($files);
+// delete all files in dir ?
+if ($allFiles) {
+ $files = array();
+ $fileList = \OC\Files\Filesystem::getDirectoryContent($dir);
+ foreach ($fileList as $fileInfo) {
+ $files[] = $fileInfo['name'];
+ }
+} else {
+ $files = json_decode($files);
+}
$filesWithError = '';
$success = true;
diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php
index 58037cb0c87..4b4a7f8948d 100644
--- a/apps/files/ajax/download.php
+++ b/apps/files/ajax/download.php
@@ -23,6 +23,7 @@
// Check if we are a user
OCP\User::checkLoggedIn();
+\OC::$session->close();
$files = $_GET["files"];
$dir = $_GET["dir"];
diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php
index 69a26ed8eb3..dd8af39bada 100644
--- a/apps/files/ajax/getstoragestats.php
+++ b/apps/files/ajax/getstoragestats.php
@@ -7,6 +7,7 @@ if (isset($_GET['dir'])) {
}
OCP\JSON::checkLoggedIn();
+\OC::$session->close();
// send back json
OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir)));
diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php
index 3617cd426cc..3bb35579d5f 100644
--- a/apps/files/ajax/list.php
+++ b/apps/files/ajax/list.php
@@ -1,11 +1,13 @@
<?php
OCP\JSON::checkLoggedIn();
+\OC::$session->close();
// Load the files
$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';
$dir = \OC\Files\Filesystem::normalizePath($dir);
-if (!\OC\Files\Filesystem::is_dir($dir . '/')) {
+$dirInfo = \OC\Files\Filesystem::getFileInfo($dir);
+if (!$dirInfo->getType() === 'dir') {
header("HTTP/1.0 404 Not Found");
exit();
}
@@ -14,7 +16,7 @@ $doBreadcrumb = isset($_GET['breadcrumb']);
$data = array();
$baseUrl = OCP\Util::linkTo('files', 'index.php') . '?dir=';
-$permissions = \OCA\Files\Helper::getDirPermissions($dir);
+$permissions = $dirInfo->getPermissions();
// Make breadcrumb
if($doBreadcrumb) {
diff --git a/apps/files/ajax/mimeicon.php b/apps/files/ajax/mimeicon.php
index dbb8b60112a..6557ff941ac 100644
--- a/apps/files/ajax/mimeicon.php
+++ b/apps/files/ajax/mimeicon.php
@@ -1,3 +1,4 @@
<?php
+\OC::$session->close();
print OC_Helper::mimetypeIcon($_GET['mime']);
diff --git a/apps/files/ajax/move.php b/apps/files/ajax/move.php
index 93063e52eb0..0a8dbc24a65 100644
--- a/apps/files/ajax/move.php
+++ b/apps/files/ajax/move.php
@@ -1,10 +1,8 @@
<?php
-// Init owncloud
-
-
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
+\OC::$session->close();
// Get data
$dir = stripslashes($_POST["dir"]);
@@ -18,7 +16,7 @@ if(\OC\Files\Filesystem::file_exists($target . '/' . $file)) {
exit;
}
-if ($dir != '' || $file != 'Shared') {
+if ($target != '' || strtolower($file) != 'shared') {
$targetFile = \OC\Files\Filesystem::normalizePath($target . '/' . $file);
$sourceFile = \OC\Files\Filesystem::normalizePath($dir . '/' . $file);
if(\OC\Files\Filesystem::rename($sourceFile, $targetFile)) {
diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php
index 1853098c507..1234cf11394 100644
--- a/apps/files/ajax/newfile.php
+++ b/apps/files/ajax/newfile.php
@@ -7,7 +7,8 @@ if(!OC_User::isLoggedIn()) {
exit;
}
-session_write_close();
+\OC::$session->close();
+
// Get the params
$dir = isset( $_REQUEST['dir'] ) ? '/'.trim($_REQUEST['dir'], '/\\') : '';
$filename = isset( $_REQUEST['filename'] ) ? trim($_REQUEST['filename'], '/\\') : '';
@@ -50,16 +51,22 @@ $l10n = \OC_L10n::get('files');
$result = array(
'success' => false,
'data' => NULL
- );
+);
+$trimmedFileName = trim($filename);
-if(trim($filename) === '') {
+if($trimmedFileName === '') {
$result['data'] = array('message' => (string)$l10n->t('File name cannot be empty.'));
OCP\JSON::error($result);
exit();
}
+if($trimmedFileName === '.' || $trimmedFileName === '..') {
+ $result['data'] = array('message' => (string)$l10n->t('"%s" is an invalid file name.', $trimmedFileName));
+ OCP\JSON::error($result);
+ exit();
+}
-if(strpos($filename, '/') !== false) {
- $result['data'] = array('message' => (string)$l10n->t('File name must not contain "/". Please choose a different name.'));
+if(!OCP\Util::isValidFileName($filename)) {
+ $result['data'] = array('message' => (string)$l10n->t("Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."));
OCP\JSON::error($result);
exit();
}
diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php
index 4cfcae3090d..032447460f3 100644
--- a/apps/files/ajax/newfolder.php
+++ b/apps/files/ajax/newfolder.php
@@ -5,6 +5,7 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
+\OC::$session->close();
// Get the params
$dir = isset( $_POST['dir'] ) ? stripslashes($_POST['dir']) : '';
@@ -23,8 +24,8 @@ if(trim($foldername) === '') {
exit();
}
-if(strpos($foldername, '/') !== false) {
- $result['data'] = array('message' => $l10n->t('Folder name must not contain "/". Please choose a different name.'));
+if(!OCP\Util::isValidFileName($foldername)) {
+ $result['data'] = array('message' => (string)$l10n->t("Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."));
OCP\JSON::error($result);
exit();
}
diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php
index fb34e518fa2..f18bbffb74a 100644
--- a/apps/files/ajax/rawlist.php
+++ b/apps/files/ajax/rawlist.php
@@ -1,9 +1,10 @@
<?php
OCP\JSON::checkLoggedIn();
+\OC::$session->close();
// Load the files
-$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';
+$dir = isset($_GET['dir']) ? $_GET['dir'] : '';
$mimetypes = isset($_GET['mimetypes']) ? json_decode($_GET['mimetypes'], true) : '';
// Clean up duplicates from array and deal with non-array requests
@@ -15,43 +16,39 @@ if (is_array($mimetypes)) {
// make filelist
$files = array();
+/**
+ * @var \OCP\Files\FileInfo[] $files
+ */
// If a type other than directory is requested first load them.
-if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
- foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) {
- $file['directory'] = $dir;
- $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
- $file["date"] = OCP\Util::formatDate($file["mtime"]);
- $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
- $files[] = $file;
- }
+if ($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
+ $files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir, 'httpd/unix-directory'));
}
if (is_array($mimetypes) && count($mimetypes)) {
foreach ($mimetypes as $mimetype) {
- foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) {
- $file['directory'] = $dir;
- $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
- $file["date"] = OCP\Util::formatDate($file["mtime"]);
- $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
- $files[] = $file;
- }
+ $files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir, $mimetype));
}
} else {
- foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) {
- $file['directory'] = $dir;
- $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
- $file["date"] = OCP\Util::formatDate($file["mtime"]);
- $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
- $files[] = $file;
- }
+ $files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir));
}
-
// Sort by name
-usort($files, function ($a, $b) {
- if ($a['name'] === $b['name']) {
- return 0;
- }
- return ($a['name'] < $b['name']) ? -1 : 1;
-});
+usort($files, array('\OCA\Files\Helper', 'fileCmp'));
+
+$result = array();
+foreach ($files as $file) {
+ $fileData = array();
+ $fileData['directory'] = $dir;
+ $fileData['name'] = $file->getName();
+ $fileData['type'] = $file->getType();
+ $fileData['path'] = $file['path'];
+ $fileData['id'] = $file->getId();
+ $fileData['size'] = $file->getSize();
+ $fileData['mtime'] = $file->getMtime();
+ $fileData['mimetype'] = $file->getMimetype();
+ $fileData['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file->getMimetype());
+ $fileData["date"] = OCP\Util::formatDate($file->getMtime());
+ $fileData['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
+ $result[] = $fileData;
+}
-OC_JSON::success(array('data' => $files));
+OC_JSON::success(array('data' => $result));
diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php
index 5b07c306af8..fa3ddace63d 100644
--- a/apps/files/ajax/rename.php
+++ b/apps/files/ajax/rename.php
@@ -23,6 +23,7 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
+\OC::$session->close();
$files = new \OCA\Files\App(
\OC\Files\Filesystem::getView(),
diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php
index 5b32b6db9b7..d5d88483801 100644
--- a/apps/files/ajax/scan.php
+++ b/apps/files/ajax/scan.php
@@ -1,6 +1,6 @@
<?php
set_time_limit(0); //scanning can take ages
-session_write_close();
+\OC::$session->close();
$force = (isset($_GET['force']) and ($_GET['force'] === 'true'));
$dir = isset($_GET['dir']) ? $_GET['dir'] : '';
diff --git a/apps/files/ajax/upgrade.php b/apps/files/ajax/upgrade.php
deleted file mode 100644
index 7237b02c0b0..00000000000
--- a/apps/files/ajax/upgrade.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-set_time_limit(0); //scanning can take ages
-session_write_close();
-
-$user = OC_User::getUser();
-$eventSource = new OC_EventSource();
-$listener = new UpgradeListener($eventSource);
-$legacy = new \OC\Files\Cache\Legacy($user);
-
-if ($legacy->hasItems()) {
- OC_Hook::connect('\OC\Files\Cache\Upgrade', 'migrate_path', $listener, 'upgradePath');
-
- OC_DB::beginTransaction();
- $upgrade = new \OC\Files\Cache\Upgrade($legacy);
- $count = $legacy->getCount();
- $eventSource->send('total', $count);
- $upgrade->upgradePath('/' . $user . '/files');
- OC_DB::commit();
-}
-\OC\Files\Cache\Upgrade::upgradeDone($user);
-$eventSource->send('done', true);
-$eventSource->close();
-
-class UpgradeListener {
- /**
- * @var OC_EventSource $eventSource
- */
- private $eventSource;
-
- private $count = 0;
- private $lastSend = 0;
-
- public function __construct($eventSource) {
- $this->eventSource = $eventSource;
- }
-
- public function upgradePath($path) {
- $this->count++;
- if ($this->count > ($this->lastSend + 5)) {
- $this->lastSend = $this->count;
- $this->eventSource->send('count', $this->count);
- }
- }
-}
diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index 8f6c42d6620..37c600e91da 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -22,6 +22,7 @@ if (empty($_POST['dirToken'])) {
} else {
// return only read permissions for public upload
$allowedPermissions = OCP\PERMISSION_READ;
+ $public_directory = !empty($_POST['subdir']) ? $_POST['subdir'] : '/';
$linkItem = OCP\Share::getShareByToken($_POST['dirToken']);
if ($linkItem === false) {
@@ -45,7 +46,7 @@ if (empty($_POST['dirToken'])) {
$dir = sprintf(
"/%s/%s",
$path,
- isset($_POST['subdir']) ? $_POST['subdir'] : ''
+ $public_directory
);
if (!$dir || empty($dir) || $dir === false) {
@@ -57,6 +58,7 @@ if (empty($_POST['dirToken'])) {
OCP\JSON::callCheck();
+\OC::$session->close();
// get array with current storage stats (e.g. max file size)
@@ -112,7 +114,14 @@ if (strpos($dir, '..') === false) {
} else {
$target = \OC\Files\Filesystem::normalizePath(stripslashes($dir).'/'.$files['name'][$i]);
}
-
+
+ $directory = \OC\Files\Filesystem::normalizePath(stripslashes($dir));
+ if (isset($public_directory)) {
+ // If we are uploading from the public app,
+ // we want to send the relative path in the ajax request.
+ $directory = $public_directory;
+ }
+
if ( ! \OC\Files\Filesystem::file_exists($target)
|| (isset($_POST['resolution']) && $_POST['resolution']==='replace')
) {
@@ -139,7 +148,8 @@ if (strpos($dir, '..') === false) {
'originalname' => $files['tmp_name'][$i],
'uploadMaxFilesize' => $maxUploadFileSize,
'maxHumanFilesize' => $maxHumanFileSize,
- 'permissions' => $meta['permissions'] & $allowedPermissions
+ 'permissions' => $meta['permissions'] & $allowedPermissions,
+ 'directory' => $directory,
);
}
@@ -166,7 +176,8 @@ if (strpos($dir, '..') === false) {
'originalname' => $files['tmp_name'][$i],
'uploadMaxFilesize' => $maxUploadFileSize,
'maxHumanFilesize' => $maxHumanFileSize,
- 'permissions' => $meta['permissions'] & $allowedPermissions
+ 'permissions' => $meta['permissions'] & $allowedPermissions,
+ 'directory' => $directory,
);
}
}
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index 8d762d4e880..a8acfdb6e6e 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -41,7 +41,6 @@ $server->setBaseUri($baseuri);
$defaults = new OC_Defaults();
$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName()));
$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
-$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_FilesPlugin());
$server->addPlugin(new OC_Connector_Sabre_AbortedUploadDetectionPlugin());
$server->addPlugin(new OC_Connector_Sabre_QuotaPlugin());
diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
index 3503678e7c7..f920f842166 100644
--- a/apps/files/appinfo/update.php
+++ b/apps/files/appinfo/update.php
@@ -3,17 +3,14 @@
// fix webdav properties,add namespace in front of the property, update for OC4.5
$installedVersion=OCP\Config::getAppValue('files', 'installed_version');
if (version_compare($installedVersion, '1.1.6', '<')) {
- $query = OC_DB::prepare( 'SELECT `propertyname`, `propertypath`, `userid` FROM `*PREFIX*properties`' );
- $result = $query->execute();
- $updateQuery = OC_DB::prepare('UPDATE `*PREFIX*properties`'
- .' SET `propertyname` = ?'
- .' WHERE `userid` = ?'
- .' AND `propertypath` = ?');
- while( $row = $result->fetchRow()) {
- if ( $row['propertyname'][0] != '{' ) {
- $updateQuery->execute(array('{DAV:}' + $row['propertyname'], $row['userid'], $row['propertypath']));
- }
- }
+ $concat = OC_DB::getConnection()->getDatabasePlatform()->
+ getConcatExpression( '\'{DAV:}\'', '`propertyname`' );
+ $query = OC_DB::prepare('
+ UPDATE `*PREFIX*properties`
+ SET `propertyname` = ' . $concat . '
+ WHERE `propertyname` NOT LIKE \'{%\'
+ ');
+ $query->execute();
}
//update from OC 3
diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php
index 25ab70af362..f334f29a939 100644
--- a/apps/files/command/scan.php
+++ b/apps/files/command/scan.php
@@ -58,6 +58,7 @@ class Scan extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
if ($input->getOption('all')) {
+ \OC_App::loadApps('authentication');
$users = $this->userManager->search('');
} else {
$users = $input->getArgument('user_id');
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 5526abaf6e2..af863aca33e 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -20,7 +20,7 @@
padding: 10px;
font-weight: normal;
}
-#new>a {
+#new > a {
padding: 14px 10px;
position: relative;
top: 7px;
@@ -30,7 +30,7 @@
border-bottom-right-radius: 0;
border-bottom: none;
}
-#new>ul {
+#new > ul {
display: none;
position: fixed;
min-width: 112px;
@@ -39,16 +39,26 @@
padding-bottom: 0;
margin-top: 14px;
margin-left: -1px;
- text-align:left;
+ text-align: left;
background: #f8f8f8;
border: 1px solid #ddd;
border-radius: 5px;
border-top-left-radius: 0;
- box-shadow:0 2px 7px rgba(170,170,170,.4);
+ box-shadow: 0 2px 7px rgba(170,170,170,.4);
+}
+#new > ul > li {
+ height: 36px;
+ margin: 5px;
+ padding-left: 42px;
+ padding-bottom: 2px;
+ background-position: initial;
+ cursor: pointer;
+}
+#new > ul > li > p {
+ cursor: pointer;
+ padding-top: 7px;
+ padding-bottom: 7px;
}
-#new>ul>li { height:36px; margin:5px; padding-left:48px; padding-bottom:2px;
- background-repeat:no-repeat; cursor:pointer; }
-#new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;}
#new .error, #fileList .error {
color: #e9322d;
@@ -84,9 +94,26 @@
background-color: rgb(240,240,240);
}
tbody a { color:#000; }
-span.extension, span.uploading, td.date { color:#999; }
-span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; }
-tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; color:#777; }
+
+span.extension, span.uploading, td.date {
+ color: #999;
+}
+span.extension {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
+ filter: alpha(opacity=70);
+ opacity: .7;
+ -webkit-transition: opacity 300ms;
+ -moz-transition: opacity 300ms;
+ -o-transition: opacity 300ms;
+ transition: opacity 300ms;
+}
+tr:hover span.extension {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ filter: alpha(opacity=100);
+ opacity: 1;
+ color: #777;
+}
+
table tr.mouseOver td { background-color:#eee; }
table th { height:24px; padding:0 8px; color:#999; }
table th .name {
@@ -302,7 +329,7 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; }
#fileList a.action {
display: inline;
margin: -8px 0;
- padding: 18px 8px !important;
+ padding: 18px 8px;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
diff --git a/apps/files/index.php b/apps/files/index.php
index dd63f29bc28..c66cd40fb56 100644
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -37,8 +37,9 @@ OCP\App::setActiveNavigationEntry('files_index');
// Load the files
$dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : '';
$dir = \OC\Files\Filesystem::normalizePath($dir);
+$dirInfo = \OC\Files\Filesystem::getFileInfo($dir);
// Redirect if directory does not exist
-if (!\OC\Files\Filesystem::is_dir($dir . '/')) {
+if (!$dirInfo->getType() === 'dir') {
header('Location: ' . OCP\Util::getScriptName() . '');
exit();
}
@@ -61,24 +62,21 @@ if ($isIE8 && isset($_GET['dir'])){
$ajaxLoad = false;
$files = array();
$user = OC_User::getUser();
-if (\OC\Files\Cache\Upgrade::needUpgrade($user)) { //dont load anything if we need to upgrade the cache
- $needUpgrade = true;
-} else {
- if ($isIE8){
- // after the redirect above, the URL will have a format
- // like "files#?dir=path" which means that no path was given
- // (dir is not set). In that specific case, we don't return any
- // files because the client will take care of switching the dir
- // to the one from the hash, then ajax-load the initial file list
- $files = array();
- $ajaxLoad = true;
- }
- else{
- $files = \OCA\Files\Helper::getFiles($dir);
- }
- $needUpgrade = false;
+if ($isIE8){
+ // after the redirect above, the URL will have a format
+ // like "files#?dir=path" which means that no path was given
+ // (dir is not set). In that specific case, we don't return any
+ // files because the client will take care of switching the dir
+ // to the one from the hash, then ajax-load the initial file list
+ $files = array();
+ $ajaxLoad = true;
+}
+else{
+ $files = \OCA\Files\Helper::getFiles($dir);
}
+$config = \OC::$server->getConfig();
+
// Make breadcrumb
$breadcrumb = \OCA\Files\Helper::makeBreadcrumb($dir);
@@ -92,64 +90,58 @@ $breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '');
$breadcrumbNav->assign('breadcrumb', $breadcrumb);
$breadcrumbNav->assign('baseURL', OCP\Util::linkTo('files', 'index.php') . '?dir=');
-$permissions = \OCA\Files\Helper::getDirPermissions($dir);
-
-if ($needUpgrade) {
- OCP\Util::addscript('files', 'upgrade');
- $tmpl = new OCP\Template('files', 'upgrade', 'user');
- $tmpl->printPage();
-} else {
- // information about storage capacities
- $storageInfo=OC_Helper::getStorageInfo($dir);
- $freeSpace=$storageInfo['free'];
- $uploadLimit=OCP\Util::uploadLimit();
- $maxUploadFilesize=OCP\Util::maxUploadFilesize($dir);
- $publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
- // if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code)
- $encryptionInitStatus = 2;
- if (OC_App::isEnabled('files_encryption')) {
- $session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
- $encryptionInitStatus = $session->getInitialized();
- }
+$permissions = $dirInfo->getPermissions();
- $trashEnabled = \OCP\App::isEnabled('files_trashbin');
- $trashEmpty = true;
- if ($trashEnabled) {
- $trashEmpty = \OCA\Files_Trashbin\Trashbin::isEmpty($user);
- }
+// information about storage capacities
+$storageInfo=OC_Helper::getStorageInfo($dir);
+$freeSpace=$storageInfo['free'];
+$uploadLimit=OCP\Util::uploadLimit();
+$maxUploadFilesize=OCP\Util::maxUploadFilesize($dir);
+$publicUploadEnabled = $config->getAppValue('core', 'shareapi_allow_public_upload', 'yes');
+// if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code)
+$encryptionInitStatus = 2;
+if (OC_App::isEnabled('files_encryption')) {
+ $session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
+ $encryptionInitStatus = $session->getInitialized();
+}
- $isCreatable = \OC\Files\Filesystem::isCreatable($dir . '/');
- $fileHeader = (!isset($files) or count($files) > 0);
- $emptyContent = ($isCreatable and !$fileHeader) or $ajaxLoad;
-
- OCP\Util::addscript('files', 'fileactions');
- OCP\Util::addscript('files', 'files');
- OCP\Util::addscript('files', 'keyboardshortcuts');
- $tmpl = new OCP\Template('files', 'index', 'user');
- $tmpl->assign('fileList', $list->fetchPage());
- $tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage());
- $tmpl->assign('dir', $dir);
- $tmpl->assign('isCreatable', $isCreatable);
- $tmpl->assign('permissions', $permissions);
- $tmpl->assign('files', $files);
- $tmpl->assign('trash', $trashEnabled);
- $tmpl->assign('trashEmpty', $trashEmpty);
- $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); // minimium of freeSpace and uploadLimit
- $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
- $tmpl->assign('freeSpace', $freeSpace);
- $tmpl->assign('uploadLimit', $uploadLimit); // PHP upload limit
- $tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
- $tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']);
- $tmpl->assign('isPublic', false);
- $tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
- $tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
- $tmpl->assign("mailNotificationEnabled", \OC_Appconfig::getValue('core', 'shareapi_allow_mail_notification', 'yes'));
- $tmpl->assign("allowShareWithLink", \OC_Appconfig::getValue('core', 'shareapi_allow_links', 'yes'));
- $tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
- $tmpl->assign('disableSharing', false);
- $tmpl->assign('ajaxLoad', $ajaxLoad);
- $tmpl->assign('emptyContent', $emptyContent);
- $tmpl->assign('fileHeader', $fileHeader);
-
- $tmpl->printPage();
+$trashEnabled = \OCP\App::isEnabled('files_trashbin');
+$trashEmpty = true;
+if ($trashEnabled) {
+ $trashEmpty = \OCA\Files_Trashbin\Trashbin::isEmpty($user);
}
+
+$isCreatable = \OC\Files\Filesystem::isCreatable($dir . '/');
+$fileHeader = (!isset($files) or count($files) > 0);
+$emptyContent = ($isCreatable and !$fileHeader) or $ajaxLoad;
+
+OCP\Util::addscript('files', 'fileactions');
+OCP\Util::addscript('files', 'files');
+OCP\Util::addscript('files', 'keyboardshortcuts');
+$tmpl = new OCP\Template('files', 'index', 'user');
+$tmpl->assign('fileList', $list->fetchPage());
+$tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage());
+$tmpl->assign('dir', $dir);
+$tmpl->assign('isCreatable', $isCreatable);
+$tmpl->assign('permissions', $permissions);
+$tmpl->assign('files', $files);
+$tmpl->assign('trash', $trashEnabled);
+$tmpl->assign('trashEmpty', $trashEmpty);
+$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); // minimium of freeSpace and uploadLimit
+$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
+$tmpl->assign('freeSpace', $freeSpace);
+$tmpl->assign('uploadLimit', $uploadLimit); // PHP upload limit
+$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
+$tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']);
+$tmpl->assign('isPublic', false);
+$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
+$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
+$tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'yes'));
+$tmpl->assign("allowShareWithLink", $config->getAppValue('core', 'shareapi_allow_links', 'yes'));
+$tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
+$tmpl->assign('disableSharing', false);
+$tmpl->assign('ajaxLoad', $ajaxLoad);
+$tmpl->assign('emptyContent', $emptyContent);
+$tmpl->assign('fileHeader', $fileHeader);
+
+$tmpl->printPage();
diff --git a/apps/files/js/admin.js b/apps/files/js/admin.js
index f735079fcbe..842b73c0cae 100644
--- a/apps/files/js/admin.js
+++ b/apps/files/js/admin.js
@@ -8,19 +8,22 @@
*
*/
-function switchPublicFolder()
-{
+function switchPublicFolder() {
var publicEnable = $('#publicEnable').is(':checked');
- var sharingaimGroup = $('input:radio[name=sharingaim]'); //find all radiobuttons of that group
+ // find all radiobuttons of that group
+ var sharingaimGroup = $('input:radio[name=sharingaim]');
$.each(sharingaimGroup, function(index, sharingaimItem) {
- sharingaimItem.disabled = !publicEnable; //set all buttons to the correct state
+ // set all buttons to the correct state
+ sharingaimItem.disabled = !publicEnable;
});
}
-$(document).ready(function(){
- switchPublicFolder(); // Execute the function after loading DOM tree
- $('#publicEnable').click(function(){
- switchPublicFolder(); // To get rid of onClick()
+$(document).ready(function() {
+ // Execute the function after loading DOM tree
+ switchPublicFolder();
+ $('#publicEnable').click(function() {
+ // To get rid of onClick()
+ switchPublicFolder();
});
$('#allowZipDownload').bind('change', function() {
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index f962a7044a8..371c83e742c 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -82,7 +82,7 @@ OC.Upload = {
*/
isProcessing:function() {
var count = 0;
-
+
jQuery.each(this._uploads,function(i, data) {
if (data.state() === 'pending') {
count++;
@@ -177,549 +177,558 @@ OC.Upload = {
checkExistingFiles: function (selection, callbacks) {
// TODO check filelist before uploading and show dialog on conflicts, use callbacks
callbacks.onNoConflicts(selection);
- }
-};
+ },
-$(document).ready(function() {
+ init: function() {
+ if ( $('#file_upload_start').exists() && $('#file_upload_start').is(':visible')) {
- if ( $('#file_upload_start').exists() ) {
-
- var file_upload_param = {
- dropZone: $('#content'), // restrict dropZone to content div
- autoUpload: false,
- sequentialUploads: true,
- //singleFileUploads is on by default, so the data.files array will always have length 1
- /**
- * on first add of every selection
- * - check all files of originalFiles array with files in dir
- * - on conflict show dialog
- * - skip all -> remember as single skip action for all conflicting files
- * - replace all -> remember as single replace action for all conflicting files
- * - choose -> show choose dialog
- * - mark files to keep
- * - when only existing -> remember as single skip action
- * - when only new -> remember as single replace action
- * - when both -> remember as single autorename action
- * - start uploading selection
- * @param {object} e
- * @param {object} data
- * @returns {boolean}
- */
- add: function(e, data) {
- OC.Upload.log('add', e, data);
- var that = $(this);
-
- // we need to collect all data upload objects before starting the upload so we can check their existence
- // and set individual conflict actions. unfortunately there is only one variable that we can use to identify
- // the selection a data upload is part of, so we have to collect them in data.originalFiles
- // turning singleFileUploads off is not an option because we want to gracefully handle server errors like
- // already exists
-
- // create a container where we can store the data objects
- if ( ! data.originalFiles.selection ) {
- // initialize selection and remember number of files to upload
- data.originalFiles.selection = {
- uploads: [],
- filesToUpload: data.originalFiles.length,
- totalBytes: 0
- };
- }
- var selection = data.originalFiles.selection;
-
- // add uploads
- if ( selection.uploads.length < selection.filesToUpload ) {
- // remember upload
- selection.uploads.push(data);
- }
-
- //examine file
- var file = data.files[0];
- try {
- // FIXME: not so elegant... need to refactor that method to return a value
- Files.isFileNameValid(file.name);
- }
- catch (errorMessage) {
- data.textStatus = 'invalidcharacters';
- data.errorThrown = errorMessage;
- }
-
- if (file.type === '' && file.size === 4096) {
- data.textStatus = 'dirorzero';
- data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes',
- {filename: file.name}
- );
- }
-
- // add size
- selection.totalBytes += file.size;
-
- // check PHP upload limit
- if (selection.totalBytes > $('#upload_limit').val()) {
- data.textStatus = 'sizeexceedlimit';
- data.errorThrown = t('files', 'Total file size {size1} exceeds upload limit {size2}', {
- 'size1': humanFileSize(selection.totalBytes),
- 'size2': humanFileSize($('#upload_limit').val())
- });
- }
+ var file_upload_param = {
+ dropZone: $('#content'), // restrict dropZone to content div
+ autoUpload: false,
+ sequentialUploads: true,
+ //singleFileUploads is on by default, so the data.files array will always have length 1
+ /**
+ * on first add of every selection
+ * - check all files of originalFiles array with files in dir
+ * - on conflict show dialog
+ * - skip all -> remember as single skip action for all conflicting files
+ * - replace all -> remember as single replace action for all conflicting files
+ * - choose -> show choose dialog
+ * - mark files to keep
+ * - when only existing -> remember as single skip action
+ * - when only new -> remember as single replace action
+ * - when both -> remember as single autorename action
+ * - start uploading selection
+ * @param {object} e
+ * @param {object} data
+ * @returns {boolean}
+ */
+ add: function(e, data) {
+ OC.Upload.log('add', e, data);
+ var that = $(this);
+ var freeSpace;
- // check free space
- if (selection.totalBytes > $('#free_space').val()) {
- data.textStatus = 'notenoughspace';
- data.errorThrown = t('files', 'Not enough free space, you are uploading {size1} but only {size2} is left', {
- 'size1': humanFileSize(selection.totalBytes),
- 'size2': humanFileSize($('#free_space').val())
- });
- }
-
- // end upload for whole selection on error
- if (data.errorThrown) {
- // trigger fileupload fail
- var fu = that.data('blueimp-fileupload') || that.data('fileupload');
- fu._trigger('fail', e, data);
- return false; //don't upload anything
- }
+ // we need to collect all data upload objects before starting the upload so we can check their existence
+ // and set individual conflict actions. unfortunately there is only one variable that we can use to identify
+ // the selection a data upload is part of, so we have to collect them in data.originalFiles
+ // turning singleFileUploads off is not an option because we want to gracefully handle server errors like
+ // already exists
- // check existing files when all is collected
- if ( selection.uploads.length >= selection.filesToUpload ) {
-
- //remove our selection hack:
- delete data.originalFiles.selection;
-
- var callbacks = {
-
- onNoConflicts: function (selection) {
- $.each(selection.uploads, function(i, upload) {
- upload.submit();
- });
- },
- onSkipConflicts: function (selection) {
- //TODO mark conflicting files as toskip
- },
- onReplaceConflicts: function (selection) {
- //TODO mark conflicting files as toreplace
- },
- onChooseConflicts: function (selection) {
- //TODO mark conflicting files as chosen
- },
- onCancel: function (selection) {
- $.each(selection.uploads, function(i, upload) {
- upload.abort();
- });
- }
- };
+ // create a container where we can store the data objects
+ if ( ! data.originalFiles.selection ) {
+ // initialize selection and remember number of files to upload
+ data.originalFiles.selection = {
+ uploads: [],
+ filesToUpload: data.originalFiles.length,
+ totalBytes: 0
+ };
+ }
+ var selection = data.originalFiles.selection;
- OC.Upload.checkExistingFiles(selection, callbacks);
-
- }
+ // add uploads
+ if ( selection.uploads.length < selection.filesToUpload ) {
+ // remember upload
+ selection.uploads.push(data);
+ }
- return true; // continue adding files
- },
- /**
- * called after the first add, does NOT have the data param
- * @param {object} e
- */
- start: function(e) {
- OC.Upload.log('start', e, null);
- },
- submit: function(e, data) {
- OC.Upload.rememberUpload(data);
- if ( ! data.formData ) {
- // noone set update parameters, we set the minimum
- data.formData = {
- requesttoken: oc_requesttoken,
- dir: $('#dir').val()
- };
- }
- },
- fail: function(e, data) {
- OC.Upload.log('fail', e, data);
- if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) {
- if (data.textStatus === 'abort') {
- OC.Notification.show(t('files', 'Upload cancelled.'));
- } else {
- // HTTP connection problem
- OC.Notification.show(data.errorThrown);
- if (data.result) {
- var result = JSON.parse(data.result);
- if (result && result[0] && result[0].data && result[0].data.code === 'targetnotfound') {
- // abort upload of next files if any
- OC.Upload.cancelUploads();
+ //examine file
+ var file = data.files[0];
+ try {
+ // FIXME: not so elegant... need to refactor that method to return a value
+ Files.isFileNameValid(file.name, FileList.getCurrentDirectory());
+ }
+ catch (errorMessage) {
+ data.textStatus = 'invalidcharacters';
+ data.errorThrown = errorMessage;
+ }
+
+ if (file.type === '' && file.size === 4096) {
+ data.textStatus = 'dirorzero';
+ data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes',
+ {filename: file.name}
+ );
+ }
+
+ // add size
+ selection.totalBytes += file.size;
+
+ // check PHP upload limit
+ if (selection.totalBytes > $('#upload_limit').val()) {
+ data.textStatus = 'sizeexceedlimit';
+ data.errorThrown = t('files', 'Total file size {size1} exceeds upload limit {size2}', {
+ 'size1': humanFileSize(selection.totalBytes),
+ 'size2': humanFileSize($('#upload_limit').val())
+ });
+ }
+
+ // check free space
+ freeSpace = $('#free_space').val();
+ if (freeSpace >= 0 && selection.totalBytes > freeSpace) {
+ data.textStatus = 'notenoughspace';
+ data.errorThrown = t('files', 'Not enough free space, you are uploading {size1} but only {size2} is left', {
+ 'size1': humanFileSize(selection.totalBytes),
+ 'size2': humanFileSize($('#free_space').val())
+ });
+ }
+
+ // end upload for whole selection on error
+ if (data.errorThrown) {
+ // trigger fileupload fail
+ var fu = that.data('blueimp-fileupload') || that.data('fileupload');
+ fu._trigger('fail', e, data);
+ return false; //don't upload anything
+ }
+
+ // check existing files when all is collected
+ if ( selection.uploads.length >= selection.filesToUpload ) {
+
+ //remove our selection hack:
+ delete data.originalFiles.selection;
+
+ var callbacks = {
+
+ onNoConflicts: function (selection) {
+ $.each(selection.uploads, function(i, upload) {
+ upload.submit();
+ });
+ },
+ onSkipConflicts: function (selection) {
+ //TODO mark conflicting files as toskip
+ },
+ onReplaceConflicts: function (selection) {
+ //TODO mark conflicting files as toreplace
+ },
+ onChooseConflicts: function (selection) {
+ //TODO mark conflicting files as chosen
+ },
+ onCancel: function (selection) {
+ $.each(selection.uploads, function(i, upload) {
+ upload.abort();
+ });
+ }
+ };
+
+ OC.Upload.checkExistingFiles(selection, callbacks);
+
+ }
+
+ return true; // continue adding files
+ },
+ /**
+ * called after the first add, does NOT have the data param
+ * @param {object} e
+ */
+ start: function(e) {
+ OC.Upload.log('start', e, null);
+ //hide the tooltip otherwise it covers the progress bar
+ $('#upload').tipsy('hide');
+ },
+ submit: function(e, data) {
+ OC.Upload.rememberUpload(data);
+ if ( ! data.formData ) {
+ // noone set update parameters, we set the minimum
+ data.formData = {
+ requesttoken: oc_requesttoken,
+ dir: $('#dir').val()
+ };
+ }
+ },
+ fail: function(e, data) {
+ OC.Upload.log('fail', e, data);
+ if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) {
+ if (data.textStatus === 'abort') {
+ OC.Notification.show(t('files', 'Upload cancelled.'));
+ } else {
+ // HTTP connection problem
+ OC.Notification.show(data.errorThrown);
+ if (data.result) {
+ var result = JSON.parse(data.result);
+ if (result && result[0] && result[0].data && result[0].data.code === 'targetnotfound') {
+ // abort upload of next files if any
+ OC.Upload.cancelUploads();
+ }
}
}
+ //hide notification after 10 sec
+ setTimeout(function() {
+ OC.Notification.hide();
+ }, 10000);
}
- //hide notification after 10 sec
- setTimeout(function() {
- OC.Notification.hide();
- }, 10000);
- }
- OC.Upload.deleteUpload(data);
- },
- /**
- * called for every successful upload
- * @param {object} e
- * @param {object} data
- */
- done:function(e, data) {
- OC.Upload.log('done', e, data);
- // handle different responses (json or body from iframe for ie)
- var response;
- if (typeof data.result === 'string') {
- response = data.result;
- } else {
- //fetch response from iframe
- response = data.result[0].body.innerText;
- }
- var result=$.parseJSON(response);
-
- delete data.jqXHR;
-
- if (result.status === 'error' && result.data && result.data.message){
- data.textStatus = 'servererror';
- data.errorThrown = result.data.message;
- var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
- fu._trigger('fail', e, data);
- } else if (typeof result[0] === 'undefined') {
- data.textStatus = 'servererror';
- data.errorThrown = t('files', 'Could not get result from server.');
- var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
- fu._trigger('fail', e, data);
- } else if (result[0].status === 'existserror') {
- //show "file already exists" dialog
- var original = result[0];
- var replacement = data.files[0];
- var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
- OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu);
- } else if (result[0].status !== 'success') {
- //delete data.jqXHR;
- data.textStatus = 'servererror';
- data.errorThrown = result[0].data.message; // error message has been translated on server
- var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
- fu._trigger('fail', e, data);
+ OC.Upload.deleteUpload(data);
+ },
+ /**
+ * called for every successful upload
+ * @param {object} e
+ * @param {object} data
+ */
+ done:function(e, data) {
+ OC.Upload.log('done', e, data);
+ // handle different responses (json or body from iframe for ie)
+ var response;
+ if (typeof data.result === 'string') {
+ response = data.result;
+ } else {
+ //fetch response from iframe
+ response = data.result[0].body.innerText;
+ }
+ var result=$.parseJSON(response);
+
+ delete data.jqXHR;
+
+ if (result.status === 'error' && result.data && result.data.message){
+ data.textStatus = 'servererror';
+ data.errorThrown = result.data.message;
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ fu._trigger('fail', e, data);
+ } else if (typeof result[0] === 'undefined') {
+ data.textStatus = 'servererror';
+ data.errorThrown = t('files', 'Could not get result from server.');
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ fu._trigger('fail', e, data);
+ } else if (result[0].status === 'existserror') {
+ //show "file already exists" dialog
+ var original = result[0];
+ var replacement = data.files[0];
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu);
+ } else if (result[0].status !== 'success') {
+ //delete data.jqXHR;
+ data.textStatus = 'servererror';
+ data.errorThrown = result[0].data.message; // error message has been translated on server
+ var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
+ fu._trigger('fail', e, data);
+ }
+ },
+ /**
+ * called after last upload
+ * @param {object} e
+ * @param {object} data
+ */
+ stop: function(e, data) {
+ OC.Upload.log('stop', e, data);
}
- },
- /**
- * called after last upload
- * @param {object} e
- * @param {object} data
- */
- stop: function(e, data) {
- OC.Upload.log('stop', e, data);
- }
- };
+ };
- // initialize jquery fileupload (blueimp)
- var fileupload = $('#file_upload_start').fileupload(file_upload_param);
- window.file_upload_param = fileupload;
+ // initialize jquery fileupload (blueimp)
+ var fileupload = $('#file_upload_start').fileupload(file_upload_param);
+ window.file_upload_param = fileupload;
- if (supportAjaxUploadWithProgress()) {
+ if (supportAjaxUploadWithProgress()) {
+
+ // add progress handlers
+ fileupload.on('fileuploadadd', function(e, data) {
+ OC.Upload.log('progress handle fileuploadadd', e, data);
+ //show cancel button
+ //if (data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie?
+ // $('#uploadprogresswrapper input.stop').show();
+ //}
+ });
+ // add progress handlers
+ fileupload.on('fileuploadstart', function(e, data) {
+ OC.Upload.log('progress handle fileuploadstart', e, data);
+ $('#uploadprogresswrapper input.stop').show();
+ $('#uploadprogressbar').progressbar({value:0});
+ $('#uploadprogressbar').fadeIn();
+ });
+ fileupload.on('fileuploadprogress', function(e, data) {
+ OC.Upload.log('progress handle fileuploadprogress', e, data);
+ //TODO progressbar in row
+ });
+ fileupload.on('fileuploadprogressall', function(e, data) {
+ OC.Upload.log('progress handle fileuploadprogressall', e, data);
+ var progress = (data.loaded / data.total) * 100;
+ $('#uploadprogressbar').progressbar('value', progress);
+ });
+ fileupload.on('fileuploadstop', function(e, data) {
+ OC.Upload.log('progress handle fileuploadstop', e, data);
- // add progress handlers
- fileupload.on('fileuploadadd', function(e, data) {
- OC.Upload.log('progress handle fileuploadadd', e, data);
- //show cancel button
- //if (data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie?
- // $('#uploadprogresswrapper input.stop').show();
- //}
- });
- // add progress handlers
- fileupload.on('fileuploadstart', function(e, data) {
- OC.Upload.log('progress handle fileuploadstart', e, data);
- $('#uploadprogresswrapper input.stop').show();
- $('#uploadprogressbar').progressbar({value:0});
- $('#uploadprogressbar').fadeIn();
- });
- fileupload.on('fileuploadprogress', function(e, data) {
- OC.Upload.log('progress handle fileuploadprogress', e, data);
- //TODO progressbar in row
- });
- fileupload.on('fileuploadprogressall', function(e, data) {
- OC.Upload.log('progress handle fileuploadprogressall', e, data);
- var progress = (data.loaded / data.total) * 100;
- $('#uploadprogressbar').progressbar('value', progress);
- });
- fileupload.on('fileuploadstop', function(e, data) {
- OC.Upload.log('progress handle fileuploadstop', e, data);
-
- $('#uploadprogresswrapper input.stop').fadeOut();
- $('#uploadprogressbar').fadeOut();
- Files.updateStorageStatistics();
- });
- fileupload.on('fileuploadfail', function(e, data) {
- OC.Upload.log('progress handle fileuploadfail', e, data);
- //if user pressed cancel hide upload progress bar and cancel button
- if (data.errorThrown === 'abort') {
$('#uploadprogresswrapper input.stop').fadeOut();
$('#uploadprogressbar').fadeOut();
- }
- });
-
- } else {
- console.log('skipping file progress because your browser is broken');
- }
- }
+ Files.updateStorageStatistics();
+ });
+ fileupload.on('fileuploadfail', function(e, data) {
+ OC.Upload.log('progress handle fileuploadfail', e, data);
+ //if user pressed cancel hide upload progress bar and cancel button
+ if (data.errorThrown === 'abort') {
+ $('#uploadprogresswrapper input.stop').fadeOut();
+ $('#uploadprogressbar').fadeOut();
+ }
+ });
- $.assocArraySize = function(obj) {
- // http://stackoverflow.com/a/6700/11236
- var size = 0, key;
- for (key in obj) {
- if (obj.hasOwnProperty(key)) {
- size++;
+ } else {
+ console.log('skipping file progress because your browser is broken');
}
}
- return size;
- };
- // warn user not to leave the page while upload is in progress
- $(window).on('beforeunload', function(e) {
- if (OC.Upload.isProcessing()) {
- return t('files', 'File upload is in progress. Leaving the page now will cancel the upload.');
- }
- });
+ $.assocArraySize = function(obj) {
+ // http://stackoverflow.com/a/6700/11236
+ var size = 0, key;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ size++;
+ }
+ }
+ return size;
+ };
- //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
- if (navigator.userAgent.search(/konqueror/i) === -1) {
- $('#file_upload_start').attr('multiple', 'multiple');
- }
+ // warn user not to leave the page while upload is in progress
+ $(window).on('beforeunload', function(e) {
+ if (OC.Upload.isProcessing()) {
+ return t('files', 'File upload is in progress. Leaving the page now will cancel the upload.');
+ }
+ });
- //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder
- var crumb=$('div.crumb').first();
- while($('div.controls').height() > 40 && crumb.next('div.crumb').length > 0) {
- crumb.children('a').text('...');
- crumb = crumb.next('div.crumb');
- }
- //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent
- var crumb = $('div.crumb').first();
- var next = crumb.next('div.crumb');
- while($('div.controls').height()>40 && next.next('div.crumb').length > 0) {
- crumb.remove();
- crumb = next;
- next = crumb.next('div.crumb');
- }
- //still not enough, start shorting down the current folder name
- var crumb=$('div.crumb>a').last();
- while($('div.controls').height() > 40 && crumb.text().length > 6) {
- var text=crumb.text();
- text = text.substr(0,text.length-6)+'...';
- crumb.text(text);
- }
+ //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
+ if (navigator.userAgent.search(/konqueror/i) === -1) {
+ $('#file_upload_start').attr('multiple', 'multiple');
+ }
- $(document).click(function(ev) {
- // do not close when clicking in the dropdown
- if ($(ev.target).closest('#new').length){
- return;
+ //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder
+ var crumb=$('div.crumb').first();
+ while($('div.controls').height() > 40 && crumb.next('div.crumb').length > 0) {
+ crumb.children('a').text('...');
+ crumb = crumb.next('div.crumb');
}
- $('#new>ul').hide();
- $('#new').removeClass('active');
- if ($('#new .error').length > 0) {
- $('#new .error').tipsy('hide');
+ //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent
+ var crumb = $('div.crumb').first();
+ var next = crumb.next('div.crumb');
+ while($('div.controls').height()>40 && next.next('div.crumb').length > 0) {
+ crumb.remove();
+ crumb = next;
+ next = crumb.next('div.crumb');
}
- $('#new li').each(function(i,element) {
- if ($(element).children('p').length === 0) {
- $(element).children('form').remove();
- $(element).append('<p>'+$(element).data('text')+'</p>');
- }
- });
- });
- $('#new').click(function(event) {
- event.stopPropagation();
- });
- $('#new>a').click(function() {
- $('#new>ul').toggle();
- $('#new').toggleClass('active');
- });
- $('#new li').click(function() {
- if ($(this).children('p').length === 0) {
- return;
+ //still not enough, start shorting down the current folder name
+ var crumb=$('div.crumb>a').last();
+ while($('div.controls').height() > 40 && crumb.text().length > 6) {
+ var text=crumb.text();
+ text = text.substr(0,text.length-6)+'...';
+ crumb.text(text);
}
-
- $('#new .error').tipsy('hide');
- $('#new li').each(function(i,element) {
- if ($(element).children('p').length === 0) {
- $(element).children('form').remove();
- $(element).append('<p>'+$(element).data('text')+'</p>');
+ $(document).click(function(ev) {
+ // do not close when clicking in the dropdown
+ if ($(ev.target).closest('#new').length){
+ return;
+ }
+ $('#new>ul').hide();
+ $('#new').removeClass('active');
+ if ($('#new .error').length > 0) {
+ $('#new .error').tipsy('hide');
}
+ $('#new li').each(function(i,element) {
+ if ($(element).children('p').length === 0) {
+ $(element).children('form').remove();
+ $(element).append('<p>'+$(element).data('text')+'</p>');
+ }
+ });
});
-
- var type=$(this).data('type');
- var text=$(this).children('p').text();
- $(this).data('text',text);
- $(this).children('p').remove();
-
- // add input field
- var form = $('<form></form>');
- var input = $('<input type="text">');
- var newName = $(this).attr('data-newname') || '';
- if (newName) {
- input.val(newName);
- }
- form.append(input);
- $(this).append(form);
- var lastPos;
- var checkInput = function () {
- var filename = input.val();
- if (type === 'web' && filename.length === 0) {
- throw t('files', 'URL cannot be empty');
- } else if (type !== 'web' && !Files.isFileNameValid(filename)) {
- // Files.isFileNameValid(filename) throws an exception itself
- } else if ($('#dir').val() === '/' && filename === 'Shared') {
- throw t('files', 'In the home folder \'Shared\' is a reserved filename');
- } else if (FileList.inList(filename)) {
- throw t('files', '{new_name} already exists', {new_name: filename});
- } else {
- return true;
+ $('#new').click(function(event) {
+ event.stopPropagation();
+ });
+ $('#new>a').click(function() {
+ $('#new>ul').toggle();
+ $('#new').toggleClass('active');
+ });
+ $('#new li').click(function() {
+ if ($(this).children('p').length === 0) {
+ return;
}
- };
- // verify filename on typing
- input.keyup(function(event) {
- try {
- checkInput();
- input.tipsy('hide');
- input.removeClass('error');
- } catch (error) {
- input.attr('title', error);
- input.tipsy({gravity: 'w', trigger: 'manual'});
- input.tipsy('show');
- input.addClass('error');
- }
- });
+ $('#new .error').tipsy('hide');
- input.focus();
- // pre select name up to the extension
- lastPos = newName.lastIndexOf('.');
- if (lastPos === -1) {
- lastPos = newName.length;
- }
- input.selectRange(0, lastPos);
- form.submit(function(event) {
- event.stopPropagation();
- event.preventDefault();
- try {
- checkInput();
- var newname = input.val();
- if (FileList.lastAction) {
- FileList.lastAction();
+ $('#new li').each(function(i,element) {
+ if ($(element).children('p').length === 0) {
+ $(element).children('form').remove();
+ $(element).append('<p>'+$(element).data('text')+'</p>');
}
- var name = getUniqueName(newname);
- if (newname !== name) {
- FileList.checkName(name, newname, true);
- var hidden = true;
+ });
+
+ var type=$(this).data('type');
+ var text=$(this).children('p').text();
+ $(this).data('text',text);
+ $(this).children('p').remove();
+
+ // add input field
+ var form = $('<form></form>');
+ var input = $('<input type="text">');
+ var newName = $(this).attr('data-newname') || '';
+ if (newName) {
+ input.val(newName);
+ }
+ form.append(input);
+ $(this).append(form);
+ var lastPos;
+ var checkInput = function () {
+ var filename = input.val();
+ if (type === 'web' && filename.length === 0) {
+ throw t('files', 'URL cannot be empty');
+ } else if (type !== 'web' && !Files.isFileNameValid(filename)) {
+ // Files.isFileNameValid(filename) throws an exception itself
+ } else if (FileList.getCurrentDirectory() === '/' && filename.toLowerCase() === 'shared') {
+ throw t('files', 'In the home folder \'Shared\' is a reserved filename');
+ } else if (FileList.inList(filename)) {
+ throw t('files', '{new_name} already exists', {new_name: filename});
} else {
- var hidden = false;
+ return true;
+ }
+ };
+
+ // verify filename on typing
+ input.keyup(function(event) {
+ try {
+ checkInput();
+ input.tipsy('hide');
+ input.removeClass('error');
+ } catch (error) {
+ input.attr('title', error);
+ input.tipsy({gravity: 'w', trigger: 'manual'});
+ input.tipsy('show');
+ input.addClass('error');
}
- switch(type) {
- case 'file':
- $.post(
- OC.filePath('files', 'ajax', 'newfile.php'),
- {dir:$('#dir').val(), filename:name},
- function(result) {
- if (result.status === 'success') {
- var date = new Date();
- // TODO: ideally addFile should be able to receive
- // all attributes and set them automatically,
- // and also auto-load the preview
- var tr = FileList.addFile(name, 0, date, false, hidden);
- tr.attr('data-size', result.data.size);
- tr.attr('data-mime', result.data.mime);
- tr.attr('data-id', result.data.id);
- tr.attr('data-etag', result.data.etag);
- tr.find('.filesize').text(humanFileSize(result.data.size));
- var path = getPathForPreview(name);
- Files.lazyLoadPreview(path, result.data.mime, function(previewpath) {
- tr.find('td.filename').attr('style','background-image:url('+previewpath+')');
- }, null, null, result.data.etag);
- FileActions.display(tr.find('td.filename'), true);
- } else {
- OC.dialogs.alert(result.data.message, t('core', 'Could not create file'));
+ });
+
+ input.focus();
+ // pre select name up to the extension
+ lastPos = newName.lastIndexOf('.');
+ if (lastPos === -1) {
+ lastPos = newName.length;
+ }
+ input.selectRange(0, lastPos);
+ form.submit(function(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ try {
+ checkInput();
+ var newname = input.val();
+ if (FileList.lastAction) {
+ FileList.lastAction();
+ }
+ var name = getUniqueName(newname);
+ if (newname !== name) {
+ FileList.checkName(name, newname, true);
+ var hidden = true;
+ } else {
+ var hidden = false;
+ }
+ switch(type) {
+ case 'file':
+ $.post(
+ OC.filePath('files', 'ajax', 'newfile.php'),
+ {dir:$('#dir').val(), filename:name},
+ function(result) {
+ if (result.status === 'success') {
+ var date = new Date();
+ // TODO: ideally addFile should be able to receive
+ // all attributes and set them automatically,
+ // and also auto-load the preview
+ var tr = FileList.addFile(name, 0, date, false, hidden);
+ tr.attr('data-size', result.data.size);
+ tr.attr('data-mime', result.data.mime);
+ tr.attr('data-id', result.data.id);
+ tr.attr('data-etag', result.data.etag);
+ tr.find('.filesize').text(humanFileSize(result.data.size));
+ var path = getPathForPreview(name);
+ Files.lazyLoadPreview(path, result.data.mime, function(previewpath) {
+ tr.find('td.filename').attr('style','background-image:url('+previewpath+')');
+ }, null, null, result.data.etag);
+ FileActions.display(tr.find('td.filename'), true);
+ } else {
+ OC.dialogs.alert(result.data.message, t('core', 'Could not create file'));
+ }
}
- }
- );
- break;
- case 'folder':
- $.post(
- OC.filePath('files','ajax','newfolder.php'),
- {dir:$('#dir').val(), foldername:name},
- function(result) {
- if (result.status === 'success') {
- var date=new Date();
- FileList.addDir(name, 0, date, hidden);
- var tr = FileList.findFileEl(name);
- tr.attr('data-id', result.data.id);
- } else {
- OC.dialogs.alert(result.data.message, t('core', 'Could not create folder'));
+ );
+ break;
+ case 'folder':
+ $.post(
+ OC.filePath('files','ajax','newfolder.php'),
+ {dir:$('#dir').val(), foldername:name},
+ function(result) {
+ if (result.status === 'success') {
+ var date=new Date();
+ FileList.addDir(name, 0, date, hidden);
+ var tr = FileList.findFileEl(name);
+ tr.attr('data-id', result.data.id);
+ } else {
+ OC.dialogs.alert(result.data.message, t('core', 'Could not create folder'));
+ }
}
+ );
+ break;
+ case 'web':
+ if (name.substr(0,8) !== 'https://' && name.substr(0,7) !== 'http://') {
+ name = 'http://' + name;
}
- );
- break;
- case 'web':
- if (name.substr(0,8) !== 'https://' && name.substr(0,7) !== 'http://') {
- name = 'http://' + name;
- }
- var localName=name;
- if (localName.substr(localName.length-1,1)==='/') {//strip /
- localName=localName.substr(0,localName.length-1);
- }
- if (localName.indexOf('/')) {//use last part of url
- localName=localName.split('/').pop();
- } else { //or the domain
- localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.','');
- }
- localName = getUniqueName(localName);
- //IE < 10 does not fire the necessary events for the progress bar.
- if ($('html.lte9').length === 0) {
- $('#uploadprogressbar').progressbar({value:0});
- $('#uploadprogressbar').fadeIn();
- }
-
- var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName});
- eventSource.listen('progress',function(progress) {
+ var localName=name;
+ if (localName.substr(localName.length-1,1)==='/') {//strip /
+ localName=localName.substr(0,localName.length-1);
+ }
+ if (localName.indexOf('/')) {//use last part of url
+ localName=localName.split('/').pop();
+ } else { //or the domain
+ localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.','');
+ }
+ localName = getUniqueName(localName);
//IE < 10 does not fire the necessary events for the progress bar.
if ($('html.lte9').length === 0) {
- $('#uploadprogressbar').progressbar('value',progress);
+ $('#uploadprogressbar').progressbar({value:0});
+ $('#uploadprogressbar').fadeIn();
}
- });
- eventSource.listen('success',function(data) {
- var mime = data.mime;
- var size = data.size;
- var id = data.id;
- $('#uploadprogressbar').fadeOut();
- var date = new Date();
- FileList.addFile(localName, size, date, false, hidden);
- var tr = FileList.findFileEl(localName);
- tr.data('mime', mime).data('id', id);
- tr.attr('data-id', id);
- var path = $('#dir').val()+'/'+localName;
- Files.lazyLoadPreview(path, mime, function(previewpath) {
- tr.find('td.filename').attr('style', 'background-image:url('+previewpath+')');
- }, null, null, data.etag);
- FileActions.display(tr.find('td.filename'), true);
- });
- eventSource.listen('error',function(error) {
- $('#uploadprogressbar').fadeOut();
- var message = (error && error.message) || t('core', 'Error fetching URL');
- OC.Notification.show(message);
- //hide notification after 10 sec
- setTimeout(function() {
- OC.Notification.hide();
- }, 10000);
- });
- break;
+
+ var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName});
+ eventSource.listen('progress',function(progress) {
+ //IE < 10 does not fire the necessary events for the progress bar.
+ if ($('html.lte9').length === 0) {
+ $('#uploadprogressbar').progressbar('value',progress);
+ }
+ });
+ eventSource.listen('success',function(data) {
+ var mime = data.mime;
+ var size = data.size;
+ var id = data.id;
+ $('#uploadprogressbar').fadeOut();
+ var date = new Date();
+ FileList.addFile(localName, size, date, false, hidden);
+ var tr = FileList.findFileEl(localName);
+ tr.data('mime', mime).data('id', id);
+ tr.attr('data-id', id);
+ var path = $('#dir').val()+'/'+localName;
+ Files.lazyLoadPreview(path, mime, function(previewpath) {
+ tr.find('td.filename').attr('style', 'background-image:url('+previewpath+')');
+ }, null, null, data.etag);
+ FileActions.display(tr.find('td.filename'), true);
+ });
+ eventSource.listen('error',function(error) {
+ $('#uploadprogressbar').fadeOut();
+ var message = (error && error.message) || t('core', 'Error fetching URL');
+ OC.Notification.show(message);
+ //hide notification after 10 sec
+ setTimeout(function() {
+ OC.Notification.hide();
+ }, 10000);
+ });
+ break;
+ }
+ var li=form.parent();
+ form.remove();
+ /* workaround for IE 9&10 click event trap, 2 lines: */
+ $('input').first().focus();
+ $('#content').focus();
+ li.append('<p>'+li.data('text')+'</p>');
+ $('#new>a').click();
+ } catch (error) {
+ input.attr('title', error);
+ input.tipsy({gravity: 'w', trigger: 'manual'});
+ input.tipsy('show');
+ input.addClass('error');
}
- var li=form.parent();
- form.remove();
- /* workaround for IE 9&10 click event trap, 2 lines: */
- $('input').first().focus();
- $('#content').focus();
- li.append('<p>'+li.data('text')+'</p>');
- $('#new>a').click();
- } catch (error) {
- input.attr('title', error);
- input.tipsy({gravity: 'w', trigger: 'manual'});
- input.tipsy('show');
- input.addClass('error');
- }
+ });
});
- });
- window.file_upload_param = file_upload_param;
+ window.file_upload_param = file_upload_param;
+ return file_upload_param;
+ }
+};
+
+$(document).ready(function() {
+ OC.Upload.init();
});
+
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index f538af10362..503bf681139 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -11,6 +11,7 @@
/* global OC, t, n, FileList, FileActions, Files */
/* global procesSelection, dragOptions, SVGSupport, replaceSVG */
window.FileList={
+ appName: t('files', 'Files'),
useUndo:true,
postProcessList: function() {
$('#fileList tr').each(function() {
@@ -19,6 +20,21 @@ window.FileList={
});
},
/**
+ * Sets a new page title
+ */
+ setPageTitle: function(title){
+ if (title) {
+ title += ' - ';
+ } else {
+ title = '';
+ }
+ title += FileList.appName;
+ // Sets the page title with the " - ownCloud" suffix as in templates
+ window.document.title = title + ' - ' + oc_defaults.title;
+
+ return true;
+ },
+ /**
* Returns the tr element for a given file name
*/
findFileEl: function(fileName){
@@ -121,7 +137,9 @@ window.FileList={
var download_url = null;
if (!param.download_url) {
- download_url = OC.Router.generate('download', { file: $('#dir').val()+'/'+name });
+ download_url = OC.generateUrl(
+ 'apps/files/download{file}',
+ { file: $('#dir').val()+'/'+name });
} else {
download_url = param.download_url;
}
@@ -129,7 +147,7 @@ window.FileList={
if (loading) {
imgurl = OC.imagePath('core', 'loading.gif');
} else {
- imgurl = OC.imagePath('core', 'filetypes/file.png');
+ imgurl = OC.imagePath('core', 'filetypes/file');
}
var tr = this.createRow(
'file',
@@ -157,7 +175,7 @@ window.FileList={
var tr = this.createRow(
'dir',
name,
- OC.imagePath('core', 'filetypes/folder.png'),
+ OC.imagePath('core', 'filetypes/folder'),
OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent($('#dir').val()+'/'+name).replace(/%2F/g, '/'),
size,
lastModified,
@@ -204,7 +222,16 @@ window.FileList={
return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
},
setCurrentDir: function(targetDir, changeUrl) {
- var url;
+ var url,
+ baseDir = OC.basename(targetDir);
+
+ if (baseDir !== '') {
+ FileList.setPageTitle(baseDir);
+ }
+ else {
+ FileList.setPageTitle();
+ }
+
$('#dir').val(targetDir);
if (changeUrl !== false) {
if (window.history.pushState && changeUrl !== false) {
@@ -394,15 +421,12 @@ window.FileList={
len = input.val().length;
}
input.selectRange(0, len);
-
var checkInput = function () {
var filename = input.val();
if (filename !== oldname) {
- if (!Files.isFileNameValid(filename)) {
- // Files.isFileNameValid(filename) throws an exception itself
- } else if($('#dir').val() === '/' && filename === 'Shared') {
- throw t('files','In the home folder \'Shared\' is a reserved filename');
- } else if (FileList.inList(filename)) {
+ // Files.isFileNameValid(filename) throws an exception itself
+ Files.isFileNameValid(filename, FileList.getCurrentDirectory());
+ if (FileList.inList(filename)) {
throw t('files', '{new_name} already exists', {new_name: filename});
}
}
@@ -435,10 +459,9 @@ window.FileList={
tr.attr('data-file', newname);
var path = td.children('a.name').attr('href');
td.children('a.name').attr('href', path.replace(encodeURIComponent(oldname), encodeURIComponent(newname)));
+ var basename = newname;
if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') {
- var basename=newname.substr(0,newname.lastIndexOf('.'));
- } else {
- var basename=newname;
+ basename = newname.substr(0,newname.lastIndexOf('.'));
}
td.find('a.name span.nametext').text(basename);
if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') {
@@ -544,10 +567,9 @@ window.FileList={
td.children('a.name .span').text(newName);
var path = td.children('a.name').attr('href');
td.children('a.name').attr('href', path.replace(encodeURIComponent(oldName), encodeURIComponent(newName)));
+ var basename = newName;
if (newName.indexOf('.') > 0) {
- var basename = newName.substr(0, newName.lastIndexOf('.'));
- } else {
- var basename = newName;
+ basename = newName.substr(0, newName.lastIndexOf('.'));
}
td.children('a.name').empty();
var span = $('<span class="nametext"></span>');
@@ -584,30 +606,49 @@ window.FileList={
}});
}
},
- do_delete:function(files) {
- if (files.substr) {
+ do_delete:function(files, dir) {
+ var params;
+ if (files && files.substr) {
files=[files];
}
- for (var i=0; i<files.length; i++) {
- var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
- deleteAction.removeClass('delete-icon').addClass('progress-icon');
+ if (files) {
+ for (var i=0; i<files.length; i++) {
+ var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
+ deleteAction.removeClass('delete-icon').addClass('progress-icon');
+ }
}
// Finish any existing actions
if (FileList.lastAction) {
FileList.lastAction();
}
- var fileNames = JSON.stringify(files);
+ var params = {
+ dir: dir || FileList.getCurrentDirectory()
+ };
+ if (files) {
+ params.files = JSON.stringify(files);
+ }
+ else {
+ // no files passed, delete all in current dir
+ params.allfiles = true;
+ }
+
$.post(OC.filePath('files', 'ajax', 'delete.php'),
- {dir:$('#dir').val(),files:fileNames},
+ params,
function(result) {
if (result.status === 'success') {
- $.each(files,function(index,file) {
- var files = FileList.findFileEl(file);
- files.remove();
- files.find('input[type="checkbox"]').removeAttr('checked');
- files.removeClass('selected');
- });
+ if (params.allfiles) {
+ // clear whole list
+ $('#fileList tr').remove();
+ }
+ else {
+ $.each(files,function(index,file) {
+ var files = FileList.findFileEl(file);
+ files.remove();
+ files.find('input[type="checkbox"]').removeAttr('checked');
+ files.removeClass('selected');
+ });
+ }
procesSelection();
checkTrashStatus();
FileList.updateFileSummary();
@@ -624,10 +665,17 @@ window.FileList={
setTimeout(function() {
OC.Notification.hide();
}, 10000);
- $.each(files,function(index,file) {
- var deleteAction = FileList.findFileEl(file).find('.action.delete');
- deleteAction.removeClass('progress-icon').addClass('delete-icon');
- });
+ if (params.allfiles) {
+ // reload the page as we don't know what files were deleted
+ // and which ones remain
+ FileList.reload();
+ }
+ else {
+ $.each(files,function(index,file) {
+ var deleteAction = FileList.findFileEl(file).find('.action.delete');
+ deleteAction.removeClass('progress-icon').addClass('delete-icon');
+ });
+ }
}
});
},
@@ -796,6 +844,13 @@ window.FileList={
$(e).removeClass("searchresult");
});
},
+ /**
+ * Returns whether all files are selected
+ * @return true if all files are selected, false otherwise
+ */
+ isAllSelected: function() {
+ return $('#select_all').prop('checked');
+ },
/**
* Returns the download URL of the given file
@@ -803,17 +858,21 @@ window.FileList={
* @param dir optional directory in which the file name is, defaults to the current directory
*/
getDownloadUrl: function(filename, dir) {
+ var files = filename;
+ if ($.isArray(filename)) {
+ files = JSON.stringify(filename);
+ }
var params = {
- files: filename,
dir: dir || FileList.getCurrentDirectory(),
- download: null
+ files: files
};
return OC.filePath('files', 'ajax', 'download.php') + '?' + OC.buildQueryString(params);
}
};
$(document).ready(function() {
- var isPublic = !!$('#isPublic').val();
+ var baseDir,
+ isPublic = !!$('#isPublic').val();
// handle upload events
var file_upload_start = $('#file_upload_start');
@@ -909,7 +968,7 @@ $(document).ready(function() {
uploadtext.attr('currentUploads', currentUploads);
var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads);
if (currentUploads === 0) {
- var img = OC.imagePath('core', 'filetypes/folder.png');
+ var img = OC.imagePath('core', 'filetypes/folder');
data.context.find('td.filename').attr('style','background-image:url('+img+')');
uploadtext.text(translatedText);
uploadtext.hide();
@@ -924,8 +983,8 @@ $(document).ready(function() {
data.context.find('td.filesize').text(humanFileSize(size));
} else {
- // only append new file if dragged onto current dir's crumb (last)
- if (data.context && data.context.hasClass('crumb') && !data.context.hasClass('last')) {
+ // only append new file if uploaded into the current folder
+ if (file.directory !== FileList.getCurrentDirectory()) {
return;
}
@@ -969,7 +1028,7 @@ $(document).ready(function() {
if (data.errorThrown === 'abort') {
//cleanup uploading to a dir
var uploadtext = $('tr .uploadtext');
- var img = OC.imagePath('core', 'filetypes/folder.png');
+ var img = OC.imagePath('core', 'filetypes/folder');
uploadtext.parents('td.filename').attr('style','background-image:url('+img+')');
uploadtext.fadeOut();
uploadtext.attr('currentUploads', 0);
@@ -982,7 +1041,7 @@ $(document).ready(function() {
if (data.errorThrown === 'abort') {
//cleanup uploading to a dir
var uploadtext = $('tr .uploadtext');
- var img = OC.imagePath('core', 'filetypes/folder.png');
+ var img = OC.imagePath('core', 'filetypes/folder');
uploadtext.parents('td.filename').attr('style','background-image:url('+img+')');
uploadtext.fadeOut();
uploadtext.attr('currentUploads', 0);
@@ -1096,6 +1155,8 @@ $(document).ready(function() {
// need to initially switch the dir to the one from the hash (IE8)
FileList.changeDirectory(parseCurrentDirFromUrl(), false, true);
}
+
+ FileList.setCurrentDir(parseCurrentDirFromUrl(), false);
}
FileList.createFileSummary();
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index a535700c1b3..1186a72a44f 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -87,9 +87,12 @@ var Files = {
* Throws a string exception with an error message if
* the file name is not valid
*/
- isFileNameValid: function (name) {
+ isFileNameValid: function (name, root) {
var trimmedName = name.trim();
- if (trimmedName === '.' || trimmedName === '..') {
+ if (trimmedName === '.'
+ || trimmedName === '..'
+ || (root === '/' && trimmedName.toLowerCase() === 'shared'))
+ {
throw t('files', '"{name}" is an invalid file name.', {name: name});
} else if (trimmedName.length === 0) {
throw t('files', 'File name cannot be empty.');
@@ -364,23 +367,26 @@ $(document).ready(function() {
});
$('.download').click('click',function(event) {
- var files=getSelectedFilesTrash('name');
- var fileslist = JSON.stringify(files);
- var dir=$('#dir').val()||'/';
- OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.'));
- // use special download URL if provided, e.g. for public shared files
- var downloadURL = document.getElementById("downloadURL");
- if ( downloadURL ) {
- window.location = downloadURL.value+"&download&files=" + encodeURIComponent(fileslist);
- } else {
- window.location = OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist });
+ var files;
+ var dir = FileList.getCurrentDirectory();
+ if (FileList.isAllSelected()) {
+ files = OC.basename(dir);
+ dir = OC.dirname(dir) || '/';
+ }
+ else {
+ files = getSelectedFilesTrash('name');
}
+ OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.'));
+ OC.redirect(FileList.getDownloadUrl(files, dir));
return false;
});
$('.delete-selected').click(function(event) {
var files=getSelectedFilesTrash('name');
event.preventDefault();
+ if (FileList.isAllSelected()) {
+ files = null;
+ }
FileList.do_delete(files);
return false;
});
@@ -405,7 +411,7 @@ $(document).ready(function() {
Files.resizeBreadcrumbs(width, true);
// display storage warnings
- setTimeout ( "Files.displayStorageWarnings()", 100 );
+ setTimeout(Files.displayStorageWarnings, 100);
OC.Notification.setDefault(Files.displayStorageWarnings);
// only possible at the moment if user is logged in
@@ -731,6 +737,9 @@ Files.getMimeIcon = function(mime, ready) {
ready(Files.getMimeIcon.cache[mime]);
} else {
$.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path) {
+ if(SVGSupport()){
+ path = path.substr(0, path.length-4) + '.svg';
+ }
Files.getMimeIcon.cache[mime]=path;
ready(Files.getMimeIcon.cache[mime]);
});
@@ -774,19 +783,22 @@ Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) {
if ( $('#isPublic').length ) {
urlSpec.t = $('#dirToken').val();
- previewURL = OC.Router.generate('core_ajax_public_preview', urlSpec);
+ previewURL = OC.generateUrl('/publicpreview.png?') + $.param(urlSpec);
} else {
- previewURL = OC.Router.generate('core_ajax_preview', urlSpec);
+ previewURL = OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
}
previewURL = previewURL.replace('(', '%28');
previewURL = previewURL.replace(')', '%29');
+ previewURL += '&forceIcon=0';
// preload image to prevent delay
// this will make the browser cache the image
var img = new Image();
img.onload = function(){
- //set preview thumbnail URL
- ready(previewURL);
+ // if loading the preview image failed (no preview for the mimetype) then img.width will < 5
+ if (img.width > 5) {
+ ready(previewURL);
+ }
}
img.src = previewURL;
});
diff --git a/apps/files/js/upgrade.js b/apps/files/js/upgrade.js
deleted file mode 100644
index 714adf824a1..00000000000
--- a/apps/files/js/upgrade.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/* global OC */
-$(document).ready(function () {
- var eventSource, total, bar = $('#progressbar');
- console.log('start');
- bar.progressbar({value: 0});
- eventSource = new OC.EventSource(OC.filePath('files', 'ajax', 'upgrade.php'));
- eventSource.listen('total', function (count) {
- total = count;
- console.log(count + ' files needed to be migrated');
- });
- eventSource.listen('count', function (count) {
- bar.progressbar({value: (count / total) * 100});
- console.log(count);
- });
- eventSource.listen('done', function () {
- document.location.reload();
- });
-});
diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php
index 0148f5ca3c1..147d77d4cb0 100644
--- a/apps/files/l10n/ar.php
+++ b/apps/files/l10n/ar.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم",
"Could not move %s" => "فشل في نقل %s",
"File name cannot be empty." => "اسم الملف لا يجوز أن يكون فارغا",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "اسم غير صحيح , الرموز '\\', '/', '<', '>', ':', '\"', '|', '?' و \"*\" غير مسموح استخدامها",
"Unable to set upload directory." => "غير قادر على تحميل المجلد",
"Invalid Token" => "علامة غير صالحة",
"No file was uploaded. Unknown error" => "لم يتم رفع أي ملف , خطأ غير معروف",
@@ -14,12 +15,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "المجلد المؤقت غير موجود",
"Failed to write to disk" => "خطأ في الكتابة على القرص الصلب",
"Not enough storage available" => "لا يوجد مساحة تخزينية كافية",
-"Upload failed. Could not get file info." => "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.",
"Upload failed. Could not find uploaded file" => "*فشلت علمية الرفع. تعذر إيجاد الملف الذي تم رفعه.\n*فشلت علمية التحميل. تعذر إيجاد الملف الذي تم تحميله.",
+"Upload failed. Could not get file info." => "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.",
"Invalid directory." => "مسار غير صحيح.",
"Files" => "الملفات",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
-"Not enough space available" => "لا توجد مساحة كافية",
"Upload cancelled." => "تم إلغاء عملية رفع الملفات .",
"Could not get result from server." => "تعذر الحصول على نتيجة من الخادم",
"File upload is in progress. Leaving the page now will cancel the upload." => "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.",
@@ -34,8 +34,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("لا يوجد ملفات %n","ملف %n","2 ملف %n","قليل من ملفات %n","الكثير من ملفات %n"," ملفات %n"),
"{dirs} and {files}" => "{dirs} و {files}",
"_Uploading %n file_::_Uploading %n files_" => array("لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"),
-"'.' is an invalid file name." => "\".\" اسم ملف غير صحيح.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "اسم غير صحيح , الرموز '\\', '/', '<', '>', ':', '\"', '|', '?' و \"*\" غير مسموح استخدامها",
"Your storage is full, files can not be updated or synced anymore!" => "مساحتك التخزينية ممتلئة, لا يمكم تحديث ملفاتك أو مزامنتها بعد الآن !",
"Your storage is almost full ({usedSpacePercent}%)" => "مساحتك التخزينية امتلأت تقريبا ",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "تم تمكين تشفير البرامج لكن لم يتم تهيئة المفاتيح لذا يرجى تسجيل الخروج ثم تسجيل الدخول مرة آخرى.",
@@ -59,6 +57,7 @@ $TRANSLATIONS = array(
"Save" => "حفظ",
"New" => "جديد",
"Text file" => "ملف",
+"New folder" => "مجلد جديد",
"Folder" => "مجلد",
"From link" => "من رابط",
"Deleted files" => "حذف الملفات",
@@ -69,7 +68,6 @@ $TRANSLATIONS = array(
"Upload too large" => "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
"Files are being scanned, please wait." => "يرجى الانتظار , جاري فحص الملفات .",
-"Current scanning" => "الفحص الحالي",
-"Upgrading filesystem cache..." => "تحديث ذاكرة التخزين المؤقت(الكاش) الخاصة بملفات النظام ..."
+"Current scanning" => "الفحص الحالي"
);
$PLURAL_FORMS = "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;";
diff --git a/apps/files/l10n/az.php b/apps/files/l10n/az.php
index 70ab6572ba4..0157af093e9 100644
--- a/apps/files/l10n/az.php
+++ b/apps/files/l10n/az.php
@@ -1,7 +1,7 @@
<?php
$TRANSLATIONS = array(
-"_%n folder_::_%n folders_" => array(""),
-"_%n file_::_%n files_" => array(""),
-"_Uploading %n file_::_Uploading %n files_" => array("")
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
);
-$PLURAL_FORMS = "nplurals=1; plural=0;";
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/bn_BD.php b/apps/files/l10n/bn_BD.php
index f7266517e9e..11f3525690b 100644
--- a/apps/files/l10n/bn_BD.php
+++ b/apps/files/l10n/bn_BD.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s কে স্থানান্তর করা সম্ভব হলো না - এই নামের ফাইল বিদ্যমান",
"Could not move %s" => "%s কে স্থানান্তর করা সম্ভব হলো না",
"File name cannot be empty." => "ফাইলের নামটি ফাঁকা রাখা যাবে না।",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "নামটি সঠিক নয়, '\\', '/', '<', '>', ':', '\"', '|', '?' এবং '*' অনুমোদিত নয়।",
"No file was uploaded. Unknown error" => "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।",
"There is no error, the file uploaded with success" => "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "আপলোড করা ফাইলটি php.ini তে বর্ণিত upload_max_filesize নির্দেশিত আয়তন অতিক্রম করছেঃ",
@@ -13,7 +14,6 @@ $TRANSLATIONS = array(
"Failed to write to disk" => "ডিস্কে লিখতে ব্যর্থ",
"Invalid directory." => "ভুল ডিরেক্টরি",
"Files" => "ফাইল",
-"Not enough space available" => "যথেষ্ঠ পরিমাণ স্থান নেই",
"Upload cancelled." => "আপলোড বাতিল করা হয়েছে।",
"File upload is in progress. Leaving the page now will cancel the upload." => "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
"{new_name} already exists" => "{new_name} টি বিদ্যমান",
@@ -25,8 +25,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"'.' is an invalid file name." => "টি একটি অননুমোদিত নাম।",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "নামটি সঠিক নয়, '\\', '/', '<', '>', ':', '\"', '|', '?' এবং '*' অনুমোদিত নয়।",
"Error" => "সমস্যা",
"Name" => "রাম",
"Size" => "আকার",
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index 261713bc581..a4418b1be50 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -3,13 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom",
"Could not move %s" => " No s'ha pogut moure %s",
"File name cannot be empty." => "El nom del fitxer no pot ser buit.",
-"File name must not contain \"/\". Please choose a different name." => "El nom de fitxer no pot contenir \"/\". Indiqueu un nom diferent.",
+"\"%s\" is an invalid file name." => "\"%s\" no es un fitxer vàlid.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.",
+"The target folder has been moved or deleted." => "La carpeta de destí s'ha mogut o eliminat.",
"The name %s is already used in the folder %s. Please choose a different name." => "El nom %s ja s'usa en la carpeta %s. Indiqueu un nom diferent.",
"Not a valid source" => "No és un origen vàlid",
+"Server is not allowed to open URLs, please check the server configuration" => "El servidor no té autorització per obrir URLs, comproveu la configuració del servidor",
"Error while downloading %s to %s" => "S'ha produït un error en baixar %s a %s",
"Error when creating the file" => "S'ha produït un error en crear el fitxer",
"Folder name cannot be empty." => "El nom de la carpeta no pot ser buit.",
-"Folder name must not contain \"/\". Please choose a different name." => "El nom de la carpeta no pot contenir \"/\". Indiqueu un nom diferent.",
"Error when creating the folder" => "S'ha produït un error en crear la carpeta",
"Unable to set upload directory." => "No es pot establir la carpeta de pujada.",
"Invalid Token" => "Testimoni no vàlid",
@@ -22,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta un fitxer temporal",
"Failed to write to disk" => "Ha fallat en escriure al disc",
"Not enough storage available" => "No hi ha prou espai disponible",
-"Upload failed. Could not get file info." => "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.",
"Upload failed. Could not find uploaded file" => "La pujada ha fallat. El fitxer pujat no s'ha trobat.",
+"Upload failed. Could not get file info." => "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.",
"Invalid directory." => "Directori no vàlid.",
"Files" => "Fitxers",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "No es pot pujar {filename} perquè és una carpeta o té 0 bytes",
-"Not enough space available" => "No hi ha prou espai disponible",
+"Total file size {size1} exceeds upload limit {size2}" => "Mida total del fitxer {size1} excedeix el límit de pujada {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}",
"Upload cancelled." => "La pujada s'ha cancel·lat.",
"Could not get result from server." => "No hi ha resposta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.",
@@ -36,6 +39,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} ja existeix",
"Could not create file" => "No s'ha pogut crear el fitxer",
"Could not create folder" => "No s'ha pogut crear la carpeta",
+"Error fetching URL" => "Error en obtenir la URL",
"Share" => "Comparteix",
"Delete permanently" => "Esborra permanentment",
"Rename" => "Reanomena",
@@ -48,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fitxer","%n fitxers"),
"{dirs} and {files}" => "{dirs} i {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Pujant %n fitxer","Pujant %n fitxers"),
-"'.' is an invalid file name." => "'.' és un nom no vàlid per un fitxer.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.",
+"\"{name}\" is an invalid file name." => "\"{name}\" no es un fitxer vàlid.",
"Your storage is full, files can not be updated or synced anymore!" => "El vostre espai d'emmagatzemament és ple, els fitxers ja no es poden actualitzar o sincronitzar!",
"Your storage is almost full ({usedSpacePercent}%)" => "El vostre espai d'emmagatzemament és gairebé ple ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "L'aplicació d'encriptació està activada però les claus no estan inicialitzades, sortiu i acrediteu-vos de nou.",
@@ -87,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "La pujada és massa gran",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
"Files are being scanned, please wait." => "S'estan escanejant els fitxers, espereu",
-"Current scanning" => "Actualment escanejant",
-"Upgrading filesystem cache..." => "Actualitzant la memòria de cau del sistema de fitxers..."
+"Current scanning" => "Actualment escanejant"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index 44e0fdae1f1..5bcf1087b9c 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Nelze přesunout %s - již existuje soubor se stejným názvem",
"Could not move %s" => "Nelze přesunout %s",
"File name cannot be empty." => "Název souboru nemůže být prázdný řetězec.",
-"File name must not contain \"/\". Please choose a different name." => "Název souboru nesmí obsahovat \"/\". Vyberte prosím jiné jméno.",
+"\"%s\" is an invalid file name." => "\"%s\" je neplatným názvem souboru.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neplatný název, znaky '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nejsou povoleny.",
+"The target folder has been moved or deleted." => "Cílová složka byla přesunuta nebo smazána.",
"The name %s is already used in the folder %s. Please choose a different name." => "Název %s ve složce %s již existuje. Vyberte prosím jiné jméno.",
"Not a valid source" => "Neplatný zdroj",
"Server is not allowed to open URLs, please check the server configuration" => "Server není oprávněn otevírat adresy URL. Ověřte, prosím, konfiguraci serveru.",
"Error while downloading %s to %s" => "Chyba při stahování %s do %s",
"Error when creating the file" => "Chyba při vytváření souboru",
"Folder name cannot be empty." => "Název složky nemůže být prázdný.",
-"Folder name must not contain \"/\". Please choose a different name." => "Název složky nesmí obsahovat \"/\". Zvolte prosím jiný.",
"Error when creating the folder" => "Chyba při vytváření složky",
"Unable to set upload directory." => "Nelze nastavit adresář pro nahrané soubory.",
"Invalid Token" => "Neplatný token",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Chybí adresář pro dočasné soubory",
"Failed to write to disk" => "Zápis na disk selhal",
"Not enough storage available" => "Nedostatek dostupného úložného prostoru",
-"Upload failed. Could not get file info." => "Nahrávání selhalo. Nepodařilo se získat informace o souboru.",
"Upload failed. Could not find uploaded file" => "Nahrávání selhalo. Nepodařilo se nalézt nahraný soubor.",
+"Upload failed. Could not get file info." => "Nahrávání selhalo. Nepodařilo se získat informace o souboru.",
"Invalid directory." => "Neplatný adresář",
"Files" => "Soubory",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nelze nahrát soubor {filename}, protože je to buď adresář nebo má velikost 0 bytů",
-"Not enough space available" => "Nedostatek volného místa",
+"Total file size {size1} exceeds upload limit {size2}" => "Celková velikost souboru {size1} překračuje povolenou velikost pro nahrávání {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Není dostatek místa pro uložení, velikost souboru je {size1}, zbývá pouze {size2}",
"Upload cancelled." => "Odesílání zrušeno.",
"Could not get result from server." => "Nepodařilo se získat výsledek ze serveru.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n soubor","%n soubory","%n souborů"),
"{dirs} and {files}" => "{dirs} a {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Nahrávám %n soubor","Nahrávám %n soubory","Nahrávám %n souborů"),
-"'.' is an invalid file name." => "'.' je neplatným názvem souboru.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neplatný název, znaky '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nejsou povoleny.",
+"\"{name}\" is an invalid file name." => "\"{name}\" je neplatným názvem souboru.",
"Your storage is full, files can not be updated or synced anymore!" => "Vaše úložiště je plné, nelze aktualizovat ani synchronizovat soubory.",
"Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložiště je téměř plné ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Odesílaný soubor je příliš velký",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.",
"Files are being scanned, please wait." => "Soubory se prohledávají, prosím čekejte.",
-"Current scanning" => "Aktuální prohledávání",
-"Upgrading filesystem cache..." => "Aktualizuji mezipaměť souborového systému..."
+"Current scanning" => "Aktuální prohledávání"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files/l10n/cy_GB.php b/apps/files/l10n/cy_GB.php
index 2a007761c52..df93ca507b1 100644
--- a/apps/files/l10n/cy_GB.php
+++ b/apps/files/l10n/cy_GB.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Methwyd symud %s - Mae ffeil gyda'r enw hwn eisoes yn bodoli",
"Could not move %s" => "Methwyd symud %s",
"File name cannot be empty." => "Does dim hawl cael enw ffeil gwag.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Enw annilys, ni chaniateir, '\\', '/', '<', '>', ':', '\"', '|', '?' na '*'.",
"No file was uploaded. Unknown error" => "Ni lwythwyd ffeil i fyny. Gwall anhysbys.",
"There is no error, the file uploaded with success" => "Does dim gwall, llwythodd y ffeil i fyny'n llwyddiannus",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb upload_max_filesize yn php.ini:",
@@ -14,7 +15,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "Dim digon o le storio ar gael",
"Invalid directory." => "Cyfeiriadur annilys.",
"Files" => "Ffeiliau",
-"Not enough space available" => "Dim digon o le ar gael",
"Upload cancelled." => "Diddymwyd llwytho i fyny.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.",
"{new_name} already exists" => "{new_name} yn bodoli'n barod",
@@ -27,8 +27,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","","",""),
"_%n file_::_%n files_" => array("","","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","","",""),
-"'.' is an invalid file name." => "Mae '.' yn enw ffeil annilys.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Enw annilys, ni chaniateir, '\\', '/', '<', '>', ':', '\"', '|', '?' na '*'.",
"Your storage is full, files can not be updated or synced anymore!" => "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!",
"Your storage is almost full ({usedSpacePercent}%)" => "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "Wrthi'n paratoi i lwytho i lawr. Gall gymryd peth amser os yw'r ffeiliau'n fawr.",
@@ -57,7 +55,6 @@ $TRANSLATIONS = array(
"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.",
-"Current scanning" => "Sganio cyfredol",
-"Upgrading filesystem cache..." => "Uwchraddio storfa system ffeiliau..."
+"Current scanning" => "Sganio cyfredol"
);
$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php
index 9b7722444a8..7069849b430 100644
--- a/apps/files/l10n/da.php
+++ b/apps/files/l10n/da.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Kunne ikke flytte %s - der findes allerede en fil med dette navn",
"Could not move %s" => "Kunne ikke flytte %s",
"File name cannot be empty." => "Filnavnet kan ikke stå tomt.",
-"File name must not contain \"/\". Please choose a different name." => "Filnavnet må ikke indeholde \"/\". Vælg venligst et andet navn.",
+"\"%s\" is an invalid file name." => "\"%s\" er et ugyldigt filnavn.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.",
+"The target folder has been moved or deleted." => "Mappen er blevet slettet eller fjernet.",
"The name %s is already used in the folder %s. Please choose a different name." => "Navnet %s er allerede i brug i mappen %s. Vælg venligst et andet navn.",
"Not a valid source" => "Ikke en gyldig kilde",
"Server is not allowed to open URLs, please check the server configuration" => "Server har ikke tilladelse til at åbne URL'er. Kontroller venligst serverens indstillinger",
"Error while downloading %s to %s" => "Fejl ved hentning af %s til %s",
"Error when creating the file" => "Fejl ved oprettelse af fil",
"Folder name cannot be empty." => "Mappenavnet kan ikke være tomt.",
-"Folder name must not contain \"/\". Please choose a different name." => "Mappenavnet må ikke indeholde \"/\". Vælg venligst et andet navn.",
"Error when creating the folder" => "Fejl ved oprettelse af mappen",
"Unable to set upload directory." => "Ude af stand til at vælge upload mappe.",
"Invalid Token" => "Ugyldig Token ",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manglende midlertidig mappe.",
"Failed to write to disk" => "Fejl ved skrivning til disk.",
"Not enough storage available" => "Der er ikke nok plads til rådlighed",
-"Upload failed. Could not get file info." => "Upload fejlede. Kunne ikke hente filinformation.",
"Upload failed. Could not find uploaded file" => "Upload fejlede. Kunne ikke finde den uploadede fil.",
+"Upload failed. Could not get file info." => "Upload fejlede. Kunne ikke hente filinformation.",
"Invalid directory." => "Ugyldig mappe.",
"Files" => "Filer",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.",
-"Not enough space available" => "ikke nok tilgængelig ledig plads ",
+"Total file size {size1} exceeds upload limit {size2}" => "Den totale filstørrelse {size1} er større end uploadgrænsen {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage",
"Upload cancelled." => "Upload afbrudt.",
"Could not get result from server." => "Kunne ikke hente resultat fra server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fil","%n filer"),
"{dirs} and {files}" => "{dirs} og {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Uploader %n fil","Uploader %n filer"),
-"'.' is an invalid file name." => "'.' er et ugyldigt filnavn.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.",
+"\"{name}\" is an invalid file name." => "'{name}' er et ugyldigt filnavn.",
"Your storage is full, files can not be updated or synced anymore!" => "Din opbevaringsplads er fyldt op, filer kan ikke opdateres eller synkroniseres længere!",
"Your storage is almost full ({usedSpacePercent}%)" => "Din opbevaringsplads er næsten fyldt op ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Krypteringsprogrammet er aktiveret, men din nøgle er ikke igangsat. Log venligst ud og ind igen.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Upload er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
"Files are being scanned, please wait." => "Filerne bliver indlæst, vent venligst.",
-"Current scanning" => "Indlæser",
-"Upgrading filesystem cache..." => "Opgraderer filsystems cachen..."
+"Current scanning" => "Indlæser"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php
index b209fee88ae..376cbaa4e25 100644
--- a/apps/files/l10n/de.php
+++ b/apps/files/l10n/de.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Konnte %s nicht verschieben. Eine Datei mit diesem Namen existiert bereits",
"Could not move %s" => "Konnte %s nicht verschieben",
"File name cannot be empty." => "Der Dateiname darf nicht leer sein.",
-"File name must not contain \"/\". Please choose a different name." => "Der Dateiname darf kein \"/\" enthalten. Bitte wähle einen anderen Namen.",
+"\"%s\" is an invalid file name." => "\"%s\" ist kein gültiger Dateiname.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.",
+"The target folder has been moved or deleted." => "Der Zielordner wurde verschoben oder gelöscht.",
"The name %s is already used in the folder %s. Please choose a different name." => "Der Name %s wird bereits im Ordner %s benutzt. Bitte wähle einen anderen Namen.",
"Not a valid source" => "Keine gültige Quelle",
"Server is not allowed to open URLs, please check the server configuration" => "Dem Server ist das Öffnen von URLs nicht erlaubt, bitte die Serverkonfiguration prüfen",
"Error while downloading %s to %s" => "Fehler beim Herunterladen von %s nach %s",
"Error when creating the file" => "Fehler beim Erstellen der Datei",
"Folder name cannot be empty." => "Der Ordner-Name darf nicht leer sein.",
-"Folder name must not contain \"/\". Please choose a different name." => "Der Ordner-Name darf kein \"/\" enthalten. Bitte wähle einen anderen Namen.",
"Error when creating the folder" => "Fehler beim Erstellen des Ordners",
"Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.",
"Invalid Token" => "Ungültiges Merkmal",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte",
"Not enough storage available" => "Nicht genug Speicher vorhanden.",
-"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.",
"Upload failed. Could not find uploaded file" => "Hochladen fehlgeschlagen. Hochgeladene Datei konnte nicht gefunden werden.",
+"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.",
"Invalid directory." => "Ungültiges Verzeichnis.",
"Files" => "Dateien",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
-"Not enough space available" => "Nicht genug Speicherplatz verfügbar",
+"Total file size {size1} exceeds upload limit {size2}" => "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Nicht genügend freier Speicherplatz, du möchtest {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
"Upload cancelled." => "Upload abgebrochen.",
"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n Datei","%n Dateien"),
"{dirs} and {files}" => "{dirs} und {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hochgeladen","%n Dateien werden hochgeladen"),
-"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.",
+"\"{name}\" is an invalid file name." => "\"{name}\" ist kein gültiger Dateiname.",
"Your storage is full, files can not be updated or synced anymore!" => "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
"Your storage is almost full ({usedSpacePercent}%)" => "Dein Speicher ist fast voll ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melden Dich nochmals ab und wieder an.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
-"Current scanning" => "Scanne",
-"Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..."
+"Current scanning" => "Scanne"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de_AT.php b/apps/files/l10n/de_AT.php
index 0157af093e9..e1b55f6dd10 100644
--- a/apps/files/l10n/de_AT.php
+++ b/apps/files/l10n/de_AT.php
@@ -1,7 +1,11 @@
<?php
$TRANSLATIONS = array(
+"Share" => "Freigeben",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
-"_Uploading %n file_::_Uploading %n files_" => array("","")
+"_Uploading %n file_::_Uploading %n files_" => array("",""),
+"Save" => "Speichern",
+"Download" => "Herunterladen",
+"Delete" => "Löschen"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de_CH.php b/apps/files/l10n/de_CH.php
index b9504293467..8b70d7f0f06 100644
--- a/apps/files/l10n/de_CH.php
+++ b/apps/files/l10n/de_CH.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.",
"Could not move %s" => "Konnte %s nicht verschieben",
"File name cannot be empty." => "Der Dateiname darf nicht leer sein.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, «\\», «/», «<», «>», «:», «\"», «|», «?» und «*» sind nicht zulässig.",
"Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.",
"Invalid Token" => "Ungültiges Merkmal",
"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler",
@@ -16,7 +17,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "Nicht genug Speicher vorhanden.",
"Invalid directory." => "Ungültiges Verzeichnis.",
"Files" => "Dateien",
-"Not enough space available" => "Nicht genügend Speicherplatz verfügbar",
"Upload cancelled." => "Upload abgebrochen.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
"{new_name} already exists" => "{new_name} existiert bereits",
@@ -29,8 +29,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","%n Ordner"),
"_%n file_::_%n files_" => array("","%n Dateien"),
"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hochgeladen","%n Dateien werden hochgeladen"),
-"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, «\\», «/», «<», «>», «:», «\"», «|», «?» und «*» sind nicht zulässig.",
"Your storage is full, files can not be updated or synced anymore!" => "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
"Your storage is almost full ({usedSpacePercent}%)" => "Ihr Speicher ist fast voll ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.",
@@ -62,7 +60,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Der Upload ist zu gross",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgrösse für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
-"Current scanning" => "Scanne",
-"Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..."
+"Current scanning" => "Scanne"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php
index 76cdce00e4c..0df0f46dc24 100644
--- a/apps/files/l10n/de_DE.php
+++ b/apps/files/l10n/de_DE.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.",
"Could not move %s" => "Konnte %s nicht verschieben",
"File name cannot be empty." => "Der Dateiname darf nicht leer sein.",
-"File name must not contain \"/\". Please choose a different name." => "Der Dateiname darf kein \"/\" enthalten. Bitte wählen Sie einen anderen Namen.",
+"\"%s\" is an invalid file name." => "\"%s\" ist kein gültiger Dateiname.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.",
+"The target folder has been moved or deleted." => "Der Ziel-Ordner wurde verschoben oder gelöscht.",
"The name %s is already used in the folder %s. Please choose a different name." => "Der Name %s wird bereits im Ordner %s benutzt. Bitte wählen Sie einen anderen Namen.",
"Not a valid source" => "Keine gültige Quelle",
"Server is not allowed to open URLs, please check the server configuration" => "Dem Server ist das Öffnen von URLs nicht erlaubt, bitte die Serverkonfiguration prüfen",
"Error while downloading %s to %s" => "Fehler beim Herunterladen von %s nach %s",
"Error when creating the file" => "Fehler beim Erstellen der Datei",
"Folder name cannot be empty." => "Der Ordner-Name darf nicht leer sein.",
-"Folder name must not contain \"/\". Please choose a different name." => "Der Ordner-Name darf kein \"/\" enthalten. Bitte wählen Sie einen anderen Namen.",
"Error when creating the folder" => "Fehler beim Erstellen des Ordners",
"Unable to set upload directory." => "Das Upload-Verzeichnis konnte nicht gesetzt werden.",
"Invalid Token" => "Ungültiges Merkmal",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte",
"Not enough storage available" => "Nicht genug Speicher vorhanden.",
-"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Die Dateiinformationen konnten nicht abgerufen werden.",
"Upload failed. Could not find uploaded file" => "Hochladen fehlgeschlagen. Die hochgeladene Datei konnte nicht gefunden werden.",
+"Upload failed. Could not get file info." => "Hochladen fehlgeschlagen. Die Dateiinformationen konnten nicht abgerufen werden.",
"Invalid directory." => "Ungültiges Verzeichnis.",
"Files" => "Dateien",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist",
-"Not enough space available" => "Nicht genügend Speicherplatz verfügbar",
+"Total file size {size1} exceeds upload limit {size2}" => "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.",
"Upload cancelled." => "Upload abgebrochen.",
"Could not get result from server." => "Ergebnis konnte nicht vom Server abgerufen werden.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n Datei","%n Dateien"),
"{dirs} and {files}" => "{dirs} und {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n Datei wird hoch geladen","%n Dateien werden hoch geladen"),
-"'.' is an invalid file name." => "'.' ist kein gültiger Dateiname.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ungültiger Name, '\\', '/', '<', '>', ':', '\"', '|', '?' und '*' sind nicht zulässig.",
+"\"{name}\" is an invalid file name." => "\"{name}\" ist kein gültiger Dateiname.",
"Your storage is full, files can not be updated or synced anymore!" => "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!",
"Your storage is almost full ({usedSpacePercent}%)" => "Ihr Speicher ist fast voll ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Verschlüsselung-App ist aktiviert, aber Ihre Schlüssel sind nicht initialisiert. Bitte melden sich nochmals ab und wieder an.",
@@ -77,7 +78,7 @@ $TRANSLATIONS = array(
"New" => "Neu",
"New text file" => "Neue Textdatei",
"Text file" => "Textdatei",
-"New folder" => "Neues Verzeichnis",
+"New folder" => "Neues Ordner",
"Folder" => "Ordner",
"From link" => "Von einem Link",
"Deleted files" => "Gelöschte Dateien",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
-"Current scanning" => "Scanne",
-"Upgrading filesystem cache..." => "Dateisystem-Cache wird aktualisiert ..."
+"Current scanning" => "Scanne"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index 9efe1af7dd3..9144cf3ea10 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -3,14 +3,14 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Αδυναμία μετακίνησης του %s - υπάρχει ήδη αρχείο με αυτό το όνομα",
"Could not move %s" => "Αδυναμία μετακίνησης του %s",
"File name cannot be empty." => "Το όνομα αρχείου δεν μπορεί να είναι κενό.",
-"File name must not contain \"/\". Please choose a different name." => "Το όνομα αρχείου δεν μπορεί να περιέχει \"/\". Παρακαλώ επιλέξτε ένα διαφορετικό όνομα. ",
+"\"%s\" is an invalid file name." => "Το \"%s\" είναι ένα μη έγκυρο όνομα αρχείου.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Μη έγκυρο όνομα, '\\', '/', '<', '>', ':', '\"', '|', '?' και '*' δεν επιτρέπονται.",
"The name %s is already used in the folder %s. Please choose a different name." => "Το όνομα %s χρησιμοποιείτε ήδη στον φάκελο %s. Παρακαλώ επιλέξτε ένα άλλο όνομα.",
"Not a valid source" => "Μη έγκυρη πηγή",
"Server is not allowed to open URLs, please check the server configuration" => "Ο διακομιστής δεν επιτρέπεται να ανοίγει URL, παρακαλώ ελέγξτε τις ρυθμίσεις του διακομιστή",
"Error while downloading %s to %s" => "Σφάλμα κατά τη λήψη του %s στο %s",
"Error when creating the file" => "Σφάλμα κατά τη δημιουργία του αρχείου",
"Folder name cannot be empty." => "Το όνομα φακέλου δεν μπορεί να είναι κενό.",
-"Folder name must not contain \"/\". Please choose a different name." => "Το όνομα φακέλου δεν μπορεί να περιέχει \"/\". Παρακαλώ επιλέξτε ένα διαφορετικό όνομα. ",
"Error when creating the folder" => "Σφάλμα δημιουργίας φακέλου",
"Unable to set upload directory." => "Αδυναμία ορισμού καταλόγου αποστολής.",
"Invalid Token" => "Μη έγκυρο Token",
@@ -23,12 +23,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος",
"Failed to write to disk" => "Αποτυχία εγγραφής στο δίσκο",
"Not enough storage available" => "Μη επαρκής διαθέσιμος αποθηκευτικός χώρος",
-"Upload failed. Could not get file info." => "Η φόρτωση απέτυχε. Αδυναμία λήψης πληροφοριών αρχείων.",
"Upload failed. Could not find uploaded file" => "Η φόρτωση απέτυχε. Αδυναμία εύρεσης αρχείου προς φόρτωση.",
+"Upload failed. Could not get file info." => "Η φόρτωση απέτυχε. Αδυναμία λήψης πληροφοριών αρχείων.",
"Invalid directory." => "Μη έγκυρος φάκελος.",
"Files" => "Αρχεία",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος αρχείων ή έχει 0 bytes",
-"Not enough space available" => "Δεν υπάρχει αρκετός διαθέσιμος χώρος",
"Upload cancelled." => "Η αποστολή ακυρώθηκε.",
"Could not get result from server." => "Αδυναμία λήψης αποτελέσματος από το διακομιστή.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Η αποστολή του αρχείου βρίσκεται σε εξέλιξη. Το κλείσιμο της σελίδας θα ακυρώσει την αποστολή.",
@@ -50,8 +49,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n αρχείο","%n αρχεία"),
"{dirs} and {files}" => "{Κατάλογοι αρχείων} και {αρχεία}",
"_Uploading %n file_::_Uploading %n files_" => array("Ανέβασμα %n αρχείου","Ανέβασμα %n αρχείων"),
-"'.' is an invalid file name." => "'.' είναι μη έγκυρο όνομα αρχείου.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Μη έγκυρο όνομα, '\\', '/', '<', '>', ':', '\"', '|', '?' και '*' δεν επιτρέπονται.",
+"\"{name}\" is an invalid file name." => "Το \"{name}\" είναι μη έγκυρο όνομα αρχείου.",
"Your storage is full, files can not be updated or synced anymore!" => "Ο αποθηκευτικός σας χώρος είναι γεμάτος, τα αρχεία δεν μπορούν να ενημερωθούν ή να συγχρονιστούν πια!",
"Your storage is almost full ({usedSpacePercent}%)" => "Ο αποθηκευτικός χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.",
@@ -89,7 +87,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Πολύ μεγάλο αρχείο προς αποστολή",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.",
"Files are being scanned, please wait." => "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.",
-"Current scanning" => "Τρέχουσα ανίχνευση",
-"Upgrading filesystem cache..." => "Ενημέρωση της μνήμης cache του συστήματος αρχείων..."
+"Current scanning" => "Τρέχουσα ανίχνευση"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php
index ac93aa68abb..3fb2cb62e60 100644
--- a/apps/files/l10n/en_GB.php
+++ b/apps/files/l10n/en_GB.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Could not move %s - File with this name already exists",
"Could not move %s" => "Could not move %s",
"File name cannot be empty." => "File name cannot be empty.",
-"File name must not contain \"/\". Please choose a different name." => "File name must not contain \"/\". Please choose a different name.",
+"\"%s\" is an invalid file name." => "\"%s\" is an invalid file name.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Invalid name: '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.",
+"The target folder has been moved or deleted." => "The target folder has been moved or deleted.",
"The name %s is already used in the folder %s. Please choose a different name." => "The name %s is already used in the folder %s. Please choose a different name.",
"Not a valid source" => "Not a valid source",
"Server is not allowed to open URLs, please check the server configuration" => "Server is not allowed to open URLs, please check the server configuration",
"Error while downloading %s to %s" => "Error whilst downloading %s to %s",
"Error when creating the file" => "Error when creating the file",
"Folder name cannot be empty." => "Folder name cannot be empty.",
-"Folder name must not contain \"/\". Please choose a different name." => "Folder name must not contain \"/\". Please choose a different name.",
"Error when creating the folder" => "Error when creating the folder",
"Unable to set upload directory." => "Unable to set upload directory.",
"Invalid Token" => "Invalid Token",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Missing a temporary folder",
"Failed to write to disk" => "Failed to write to disk",
"Not enough storage available" => "Not enough storage available",
-"Upload failed. Could not get file info." => "Upload failed. Could not get file info.",
"Upload failed. Could not find uploaded file" => "Upload failed. Could not find uploaded file",
+"Upload failed. Could not get file info." => "Upload failed. Could not get file info.",
"Invalid directory." => "Invalid directory.",
"Files" => "Files",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Unable to upload {filename} as it is a directory or has 0 bytes",
-"Not enough space available" => "Not enough space available",
+"Total file size {size1} exceeds upload limit {size2}" => "Total file size {size1} exceeds upload limit {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Not enough free space, you are uploading {size1} but only {size2} is left",
"Upload cancelled." => "Upload cancelled.",
"Could not get result from server." => "Could not get result from server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "File upload is in progress. Leaving the page now will cancel the upload.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n file","%n files"),
"{dirs} and {files}" => "{dirs} and {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Uploading %n file","Uploading %n files"),
-"'.' is an invalid file name." => "'.' is an invalid file name.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Invalid name: '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.",
+"\"{name}\" is an invalid file name." => "\"{name}\" is an invalid file name.",
"Your storage is full, files can not be updated or synced anymore!" => "Your storage is full, files can not be updated or synced anymore!",
"Your storage is almost full ({usedSpacePercent}%)" => "Your storage is almost full ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Encryption App is enabled but your keys are not initialised, please log-out and log-in again",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "The files you are trying to upload exceed the maximum size for file uploads on this server.",
"Files are being scanned, please wait." => "Files are being scanned, please wait.",
-"Current scanning" => "Current scanning",
-"Upgrading filesystem cache..." => "Upgrading filesystem cache..."
+"Current scanning" => "Current scanning"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php
index 81cfa03fd6d..b92fef50006 100644
--- a/apps/files/l10n/eo.php
+++ b/apps/files/l10n/eo.php
@@ -3,13 +3,12 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Ne eblis movi %s: dosiero kun ĉi tiu nomo jam ekzistas",
"Could not move %s" => "Ne eblis movi %s",
"File name cannot be empty." => "Dosiernomo devas ne malpleni.",
-"File name must not contain \"/\". Please choose a different name." => "La dosieronomo ne devas enhavi “/”. Bonvolu elekti malsaman nomon.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nevalida nomo: “\\”, “/”, “<”, “>”, “:”, “\"”, “|”, “?” kaj “*” ne permesatas.",
"The name %s is already used in the folder %s. Please choose a different name." => "La nomo %s jam uziĝas en la dosierujo %s. Bonvolu elekti malsaman nomon.",
"Not a valid source" => "Nevalida fonto",
"Error while downloading %s to %s" => "Eraris elŝuto de %s al %s",
"Error when creating the file" => "Eraris la kreo de la dosiero",
"Folder name cannot be empty." => "La dosierujnomo ne povas malpleni.",
-"Folder name must not contain \"/\". Please choose a different name." => "La dosiernomo ne devas enhavi “/”. Bonvolu elekti malsaman nomon.",
"Error when creating the folder" => "Eraris la kreo de la dosierujo",
"Unable to set upload directory." => "Ne povis agordiĝi la alŝuta dosierujo.",
"No file was uploaded. Unknown error" => "Neniu dosiero alŝutiĝis. Nekonata eraro.",
@@ -21,12 +20,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Mankas provizora dosierujo.",
"Failed to write to disk" => "Malsukcesis skribo al disko",
"Not enough storage available" => "Ne haveblas sufiĉa memoro",
-"Upload failed. Could not get file info." => "La alŝuto malsukcesis. Ne povis ekhaviĝi informo pri dosiero.",
"Upload failed. Could not find uploaded file" => "La alŝuto malsukcesis. Ne troviĝis alŝutota dosiero.",
+"Upload failed. Could not get file info." => "La alŝuto malsukcesis. Ne povis ekhaviĝi informo pri dosiero.",
"Invalid directory." => "Nevalida dosierujo.",
"Files" => "Dosieroj",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn",
-"Not enough space available" => "Ne haveblas sufiĉa spaco",
"Upload cancelled." => "La alŝuto nuliĝis.",
"Could not get result from server." => "Ne povis ekhaviĝi rezulto el la servilo.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.",
@@ -45,8 +43,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n dosiero","%n dosieroj"),
"{dirs} and {files}" => "{dirs} kaj {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Alŝutatas %n dosiero","Alŝutatas %n dosieroj"),
-"'.' is an invalid file name." => "'.' ne estas valida dosiernomo.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nevalida nomo: “\\”, “/”, “<”, “>”, “:”, “\"”, “|”, “?” kaj “*” ne permesatas.",
"Your storage is full, files can not be updated or synced anymore!" => "Via memoro plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!",
"Your storage is almost full ({usedSpacePercent}%)" => "Via memoro preskaŭ plenas ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "Via elŝuto pretiĝatas. Ĉi tio povas daŭri iom da tempo se la dosieroj grandas.",
@@ -79,7 +75,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Alŝuto tro larĝa",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
"Files are being scanned, please wait." => "Dosieroj estas skanataj, bonvolu atendi.",
-"Current scanning" => "Nuna skano",
-"Upgrading filesystem cache..." => "Ĝisdatiĝas dosiersistema kaŝmemoro..."
+"Current scanning" => "Nuna skano"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php
index bfbb80e8962..6083ab2a5d6 100644
--- a/apps/files/l10n/es.php
+++ b/apps/files/l10n/es.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "No se pudo mover %s - Ya existe un archivo con ese nombre.",
"Could not move %s" => "No se pudo mover %s",
"File name cannot be empty." => "El nombre de archivo no puede estar vacío.",
-"File name must not contain \"/\". Please choose a different name." => "El nombre del archivo, NO puede contener el simbolo\"/\", por favor elija un nombre diferente.",
+"\"%s\" is an invalid file name." => "\"%s\" es un nombre de archivo inválido.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre inválido, los caracteres \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ",
+"The target folder has been moved or deleted." => "La carpeta destino fue movida o eliminada.",
"The name %s is already used in the folder %s. Please choose a different name." => "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.",
-"Not a valid source" => "No es un origen válido",
-"Server is not allowed to open URLs, please check the server configuration" => "El servidor no puede acceder URLs; revise la configuración del servidor.",
+"Not a valid source" => "No es una fuente válida",
+"Server is not allowed to open URLs, please check the server configuration" => "La configuración del servidor no le permite abrir URLs, revísela.",
"Error while downloading %s to %s" => "Error mientras se descargaba %s a %s",
"Error when creating the file" => "Error al crear el archivo",
"Folder name cannot be empty." => "El nombre de la carpeta no puede estar vacío.",
-"Folder name must not contain \"/\". Please choose a different name." => "El nombre de la carpeta, NO puede contener el simbolo\"/\", por favor elija un nombre diferente.",
"Error when creating the folder" => "Error al crear la carpeta.",
"Unable to set upload directory." => "Incapaz de crear directorio de subida.",
"Invalid Token" => "Token Inválido",
@@ -23,17 +24,18 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta la carpeta temporal",
"Failed to write to disk" => "Falló al escribir al disco",
"Not enough storage available" => "No hay suficiente espacio disponible",
-"Upload failed. Could not get file info." => "Actualización fallida. No se pudo obtener información del archivo.",
"Upload failed. Could not find uploaded file" => "Actualización fallida. No se pudo encontrar el archivo subido",
+"Upload failed. Could not get file info." => "Actualización fallida. No se pudo obtener información del archivo.",
"Invalid directory." => "Directorio inválido.",
"Files" => "Archivos",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes",
-"Not enough space available" => "No hay suficiente espacio disponible",
+"Total file size {size1} exceeds upload limit {size2}" => "El tamaño total del archivo {size1} excede el límite {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}",
"Upload cancelled." => "Subida cancelada.",
"Could not get result from server." => "No se pudo obtener respuesta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
"URL cannot be empty" => "La dirección URL no puede estar vacía",
-"In the home folder 'Shared' is a reserved filename" => "En la carpeta de inicio, 'Shared' es un nombre reservado",
+"In the home folder 'Shared' is a reserved filename" => "En la carpeta home, no se puede usar 'Shared'",
"{new_name} already exists" => "{new_name} ya existe",
"Could not create file" => "No se pudo crear el archivo",
"Could not create folder" => "No se pudo crear la carpeta",
@@ -45,13 +47,12 @@ $TRANSLATIONS = array(
"Could not rename file" => "No se pudo renombrar el archivo",
"replaced {new_name} with {old_name}" => "reemplazado {new_name} con {old_name}",
"undo" => "deshacer",
-"Error deleting file." => "Error borrando el archivo.",
+"Error deleting file." => "Error al borrar el archivo",
"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetas"),
"_%n file_::_%n files_" => array("%n archivo","%n archivos"),
"{dirs} and {files}" => "{dirs} y {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"),
-"'.' is an invalid file name." => "'.' no es un nombre de archivo válido.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre inválido, los caracteres \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ",
+"\"{name}\" is an invalid file name." => "\"{name}\" es un nombre de archivo inválido.",
"Your storage is full, files can not be updated or synced anymore!" => "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!",
"Your storage is almost full ({usedSpacePercent}%)" => "Su almacenamiento está casi lleno ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "La app de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." => "Los archivos están siendo escaneados, por favor espere.",
-"Current scanning" => "Escaneo actual",
-"Upgrading filesystem cache..." => "Actualizando caché del sistema de archivos..."
+"Current scanning" => "Escaneo actual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php
index 78d6388cd9b..105321276c1 100644
--- a/apps/files/l10n/es_AR.php
+++ b/apps/files/l10n/es_AR.php
@@ -3,6 +3,14 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "No se pudo mover %s - Un archivo con este nombre ya existe",
"Could not move %s" => "No se pudo mover %s ",
"File name cannot be empty." => "El nombre del archivo no puede quedar vacío.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre invalido, '\\', '/', '<', '>', ':', '\"', '|', '?' y '*' no están permitidos.",
+"The name %s is already used in the folder %s. Please choose a different name." => "El nombre %s está en uso en el directorio %s. Por favor elija un otro nombre.",
+"Not a valid source" => "No es una fuente válida",
+"Server is not allowed to open URLs, please check the server configuration" => "El servidor no está permitido abrir las URLs, por favor chequee la configuración del servidor",
+"Error while downloading %s to %s" => "Error mientras se descargaba %s a %s",
+"Error when creating the file" => "Error al crear el archivo",
+"Folder name cannot be empty." => "El nombre del directorio no puede estar vacío.",
+"Error when creating the folder" => "Error al crear el directorio",
"Unable to set upload directory." => "No fue posible crear el directorio de subida.",
"Invalid Token" => "Token Inválido",
"No file was uploaded. Unknown error" => "El archivo no fue subido. Error desconocido",
@@ -14,32 +22,44 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta un directorio temporal",
"Failed to write to disk" => "Error al escribir en el disco",
"Not enough storage available" => "No hay suficiente almacenamiento",
+"Upload failed. Could not find uploaded file" => "Falló la carga. No se pudo encontrar el archivo subido.",
+"Upload failed. Could not get file info." => "Falló la carga. No se pudo obtener la información del archivo.",
"Invalid directory." => "Directorio inválido.",
"Files" => "Archivos",
-"Not enough space available" => "No hay suficiente espacio disponible",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.",
"Upload cancelled." => "La subida fue cancelada",
+"Could not get result from server." => "No se pudo obtener resultados del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.",
+"URL cannot be empty" => "La URL no puede estar vacía",
+"In the home folder 'Shared' is a reserved filename" => "En el directorio inicial 'Shared' es un nombre de archivo reservado",
"{new_name} already exists" => "{new_name} ya existe",
+"Could not create file" => "No se pudo crear el archivo",
+"Could not create folder" => "No se pudo crear el directorio",
+"Error fetching URL" => "Error al obtener la URL",
"Share" => "Compartir",
"Delete permanently" => "Borrar permanentemente",
"Rename" => "Cambiar nombre",
"Pending" => "Pendientes",
+"Could not rename file" => "No se pudo renombrar el archivo",
"replaced {new_name} with {old_name}" => "se reemplazó {new_name} con {old_name}",
"undo" => "deshacer",
+"Error deleting file." => "Error al borrar el archivo.",
"_%n folder_::_%n folders_" => array("%n carpeta","%n carpetas"),
"_%n file_::_%n files_" => array("%n archivo","%n archivos"),
"{dirs} and {files}" => "{carpetas} y {archivos}",
"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"),
-"'.' is an invalid file name." => "'.' es un nombre de archivo inválido.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre invalido, '\\', '/', '<', '>', ':', '\"', '|', '?' y '*' no están permitidos.",
"Your storage is full, files can not be updated or synced anymore!" => "El almacenamiento está lleno, los archivos no se pueden seguir actualizando ni sincronizando",
"Your storage is almost full ({usedSpacePercent}%)" => "El almacenamiento está casi lleno ({usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "La aplicación de encriptación está habilitada pero las llaves no fueron inicializadas, por favor termine y vuelva a iniciar la sesión",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Llave privada inválida para la aplicación de encriptación. Por favor actualice la clave de la llave privada en las configuraciones personales para recobrar el acceso a sus archivos encriptados.",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "El proceso de cifrado se ha desactivado, pero los archivos aún están encriptados. Por favor, vaya a la configuración personal para descifrar los archivos.",
"Your download is being prepared. This might take some time if the files are big." => "Tu descarga se está preparando. Esto puede demorar si los archivos son muy grandes.",
+"Error moving file" => "Error moviendo el archivo",
"Error" => "Error",
"Name" => "Nombre",
"Size" => "Tamaño",
"Modified" => "Modificado",
+"Invalid folder name. Usage of 'Shared' is reserved." => "Nombre de directorio inválido. 'Shared' está reservado.",
"%s could not be renamed" => "No se pudo renombrar %s",
"Upload" => "Subir",
"File handling" => "Tratamiento de archivos",
@@ -51,19 +71,20 @@ $TRANSLATIONS = array(
"Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada",
"Save" => "Guardar",
"New" => "Nuevo",
+"New text file" => "Nuevo archivo de texto",
"Text file" => "Archivo de texto",
"New folder" => "Nueva Carpeta",
"Folder" => "Carpeta",
"From link" => "Desde enlace",
"Deleted files" => "Archivos borrados",
"Cancel upload" => "Cancelar subida",
+"You don’t have permission to upload or create files here" => "No tienes permisos para subir o crear archivos aquí",
"Nothing in here. Upload something!" => "No hay nada. ¡Subí contenido!",
"Download" => "Descargar",
"Delete" => "Borrar",
"Upload too large" => "El tamaño del archivo que querés subir es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que intentás subir sobrepasan el tamaño máximo ",
"Files are being scanned, please wait." => "Se están escaneando los archivos, por favor esperá.",
-"Current scanning" => "Escaneo actual",
-"Upgrading filesystem cache..." => "Actualizando el cache del sistema de archivos"
+"Current scanning" => "Escaneo actual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/es_CL.php b/apps/files/l10n/es_CL.php
index 6f97758878f..4f5e35bd887 100644
--- a/apps/files/l10n/es_CL.php
+++ b/apps/files/l10n/es_CL.php
@@ -1,9 +1,12 @@
<?php
$TRANSLATIONS = array(
"Files" => "Archivos",
+"Share" => "Compartir",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"Upload" => "Subir"
+"Error" => "Error",
+"Upload" => "Subir",
+"Download" => "Descargar"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/es_MX.php b/apps/files/l10n/es_MX.php
index 0b7571defc7..f8a72f95d85 100644
--- a/apps/files/l10n/es_MX.php
+++ b/apps/files/l10n/es_MX.php
@@ -3,14 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "No se pudo mover %s - Ya existe un archivo con ese nombre.",
"Could not move %s" => "No se pudo mover %s",
"File name cannot be empty." => "El nombre de archivo no puede estar vacío.",
-"File name must not contain \"/\". Please choose a different name." => "El nombre del archivo, NO puede contener el simbolo\"/\", por favor elija un nombre diferente.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre inválido, los caracteres \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ",
"The name %s is already used in the folder %s. Please choose a different name." => "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.",
"Not a valid source" => "No es un origen válido",
"Server is not allowed to open URLs, please check the server configuration" => "El servidor no puede acceder URLs; revise la configuración del servidor.",
"Error while downloading %s to %s" => "Error mientras se descargaba %s a %s",
"Error when creating the file" => "Error al crear el archivo",
"Folder name cannot be empty." => "El nombre de la carpeta no puede estar vacío.",
-"Folder name must not contain \"/\". Please choose a different name." => "El nombre de la carpeta, NO puede contener el simbolo\"/\", por favor elija un nombre diferente.",
"Error when creating the folder" => "Error al crear la carpeta.",
"Unable to set upload directory." => "Incapaz de crear directorio de subida.",
"Invalid Token" => "Token Inválido",
@@ -23,12 +22,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta la carpeta temporal",
"Failed to write to disk" => "Falló al escribir al disco",
"Not enough storage available" => "No hay suficiente espacio disponible",
-"Upload failed. Could not get file info." => "Actualización fallida. No se pudo obtener información del archivo.",
"Upload failed. Could not find uploaded file" => "Actualización fallida. No se pudo encontrar el archivo subido",
+"Upload failed. Could not get file info." => "Actualización fallida. No se pudo obtener información del archivo.",
"Invalid directory." => "Directorio inválido.",
"Files" => "Archivos",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes",
-"Not enough space available" => "No hay suficiente espacio disponible",
"Upload cancelled." => "Subida cancelada.",
"Could not get result from server." => "No se pudo obtener respuesta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.",
@@ -50,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n archivo","%n archivos"),
"{dirs} and {files}" => "{dirs} y {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Subiendo %n archivo","Subiendo %n archivos"),
-"'.' is an invalid file name." => "'.' no es un nombre de archivo válido.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nombre inválido, los caracteres \"\\\", \"/\", \"<\", \">\", \":\", \"\", \"|\" \"?\" y \"*\" no están permitidos ",
"Your storage is full, files can not be updated or synced anymore!" => "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!",
"Your storage is almost full ({usedSpacePercent}%)" => "Su almacenamiento está casi lleno ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.",
@@ -89,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." => "Los archivos están siendo escaneados, por favor espere.",
-"Current scanning" => "Escaneo actual",
-"Upgrading filesystem cache..." => "Actualizando caché del sistema de archivos..."
+"Current scanning" => "Escaneo actual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php
index fd031527738..f1fdc82673c 100644
--- a/apps/files/l10n/et_EE.php
+++ b/apps/files/l10n/et_EE.php
@@ -3,14 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Ei saa liigutada faili %s - samanimeline fail on juba olemas",
"Could not move %s" => "%s liigutamine ebaõnnestus",
"File name cannot be empty." => "Faili nimi ei saa olla tühi.",
-"File name must not contain \"/\". Please choose a different name." => "Faili nimi ei tohi sisaldada \"/\". Palun vali mõni teine nimi.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud.",
"The name %s is already used in the folder %s. Please choose a different name." => "Nimi %s on juba kasutusel kataloogis %s. Palun vali mõni teine nimi.",
"Not a valid source" => "Pole korrektne lähteallikas",
"Server is not allowed to open URLs, please check the server configuration" => "Server ei võimalda URL-ide avamist, palun kontrolli serveri seadistust",
"Error while downloading %s to %s" => "Viga %s allalaadimisel %s",
"Error when creating the file" => "Viga faili loomisel",
"Folder name cannot be empty." => "Kataloogi nimi ei saa olla tühi.",
-"Folder name must not contain \"/\". Please choose a different name." => "Kataloogi nimi ei tohi sisaldada \"/\". Palun vali mõni teine nimi.",
"Error when creating the folder" => "Viga kataloogi loomisel",
"Unable to set upload directory." => "Üleslaadimiste kausta määramine ebaõnnestus.",
"Invalid Token" => "Vigane kontrollkood",
@@ -23,12 +22,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Ajutiste failide kaust puudub",
"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
"Not enough storage available" => "Saadaval pole piisavalt ruumi",
-"Upload failed. Could not get file info." => "Üleslaadimine ebaõnnestus. Faili info hankimine ebaõnnestus.",
"Upload failed. Could not find uploaded file" => "Üleslaadimine ebaõnnestus. Üleslaetud faili ei leitud",
+"Upload failed. Could not get file info." => "Üleslaadimine ebaõnnestus. Faili info hankimine ebaõnnestus.",
"Invalid directory." => "Vigane kaust.",
"Files" => "Failid",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti",
-"Not enough space available" => "Pole piisavalt ruumi",
"Upload cancelled." => "Üleslaadimine tühistati.",
"Could not get result from server." => "Serverist ei saadud tulemusi",
"File upload is in progress. Leaving the page now will cancel the upload." => "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.",
@@ -50,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fail","%n faili"),
"{dirs} and {files}" => "{dirs} ja {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Laadin üles %n faili","Laadin üles %n faili"),
-"'.' is an invalid file name." => "'.' on vigane failinimi.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud.",
"Your storage is full, files can not be updated or synced anymore!" => "Sinu andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
"Your storage is almost full ({usedSpacePercent}%)" => "Su andmemaht on peaaegu täis ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Krüpteerimisrakend on lubatud, kuid võtmeid pole lähtestatud. Palun logi välja ning uuesti sisse.",
@@ -89,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Üleslaadimine on liiga suur",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
"Files are being scanned, please wait." => "Faile skannitakse, palun oota.",
-"Current scanning" => "Praegune skannimine",
-"Upgrading filesystem cache..." => "Failisüsteemi puhvri uuendamine..."
+"Current scanning" => "Praegune skannimine"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php
index 5df480c2bc3..be601eecfbf 100644
--- a/apps/files/l10n/eu.php
+++ b/apps/files/l10n/eu.php
@@ -3,13 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Ezin da %s mugitu - Izen hau duen fitxategia dagoeneko existitzen da",
"Could not move %s" => "Ezin dira fitxategiak mugitu %s",
"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.",
-"File name must not contain \"/\". Please choose a different name." => "Fitxategi izenak ezin du \"/\" izan. Mesedez hautatu beste izen bat.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.",
"The name %s is already used in the folder %s. Please choose a different name." => "%s izena dagoeneko erabilita dago %s karpetan. Mesdez hautatu izen ezberdina.",
"Not a valid source" => "Ez da jatorri baliogarria",
+"Server is not allowed to open URLs, please check the server configuration" => "Zerbitzaria ez dago URLak irekitzeko baimendua, mesedez egiaztatu zerbitzariaren konfigurazioa",
"Error while downloading %s to %s" => "Errorea %s %sra deskargatzerakoan",
"Error when creating the file" => "Errorea fitxategia sortzerakoan",
"Folder name cannot be empty." => "Karpeta izena ezin da hutsa izan.",
-"Folder name must not contain \"/\". Please choose a different name." => "Karpeta izenak ezin du \"/\" izan. Mesedez hautatu beste izen bat.",
"Error when creating the folder" => "Errorea karpeta sortzerakoan",
"Unable to set upload directory." => "Ezin da igoera direktorioa ezarri.",
"Invalid Token" => "Lekuko baliogabea",
@@ -22,12 +22,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Aldi bateko karpeta falta da",
"Failed to write to disk" => "Errore bat izan da diskoan idazterakoan",
"Not enough storage available" => "Ez dago behar aina leku erabilgarri,",
-"Upload failed. Could not get file info." => "Igoerak huts egin du. Ezin izan da fitxategiaren informazioa eskuratu.",
"Upload failed. Could not find uploaded file" => "Igoerak huts egin du. Ezin izan da igotako fitxategia aurkitu",
+"Upload failed. Could not get file info." => "Igoerak huts egin du. Ezin izan da fitxategiaren informazioa eskuratu.",
"Invalid directory." => "Baliogabeko karpeta.",
"Files" => "Fitxategiak",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako",
-"Not enough space available" => "Ez dago leku nahikorik.",
"Upload cancelled." => "Igoera ezeztatuta",
"Could not get result from server." => "Ezin da zerbitzaritik emaitzik lortu",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.",
@@ -36,6 +35,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} dagoeneko existitzen da",
"Could not create file" => "Ezin izan da fitxategia sortu",
"Could not create folder" => "Ezin izan da karpeta sortu",
+"Error fetching URL" => "Errorea URLa eskuratzerakoan",
"Share" => "Elkarbanatu",
"Delete permanently" => "Ezabatu betirako",
"Rename" => "Berrizendatu",
@@ -48,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("fitxategi %n","%n fitxategi"),
"{dirs} and {files}" => "{dirs} eta {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Fitxategi %n igotzen","%n fitxategi igotzen"),
-"'.' is an invalid file name." => "'.' ez da fitxategi izen baliogarria.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.",
"Your storage is full, files can not be updated or synced anymore!" => "Zure biltegiratzea beterik dago, ezingo duzu aurrerantzean fitxategirik igo edo sinkronizatu!",
"Your storage is almost full ({usedSpacePercent}%)" => "Zure biltegiratzea nahiko beterik dago (%{usedSpacePercent})",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Enkriptazio aplikazioa gaituta dago baina zure gakoak ez daude konfiguratuta, mesedez saioa bukatu eta berriro hasi",
@@ -87,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Igoera handiegia da",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
"Files are being scanned, please wait." => "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
-"Current scanning" => "Orain eskaneatzen ari da",
-"Upgrading filesystem cache..." => "Fitxategi sistemaren katxea eguneratzen..."
+"Current scanning" => "Orain eskaneatzen ari da"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/eu_ES.php b/apps/files/l10n/eu_ES.php
new file mode 100644
index 00000000000..293e6de8379
--- /dev/null
+++ b/apps/files/l10n/eu_ES.php
@@ -0,0 +1,10 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("",""),
+"Save" => "Gorde",
+"Download" => "Deskargatu",
+"Delete" => "Ezabatu"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php
index 4f3257bc075..e1142aba160 100644
--- a/apps/files/l10n/fa.php
+++ b/apps/files/l10n/fa.php
@@ -1,8 +1,9 @@
<?php
$TRANSLATIONS = array(
-"Could not move %s - File with this name already exists" => "%s نمی تواند حرکت کند - در حال حاضر پرونده با این نام وجود دارد. ",
+"Could not move %s - File with this name already exists" => "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ",
"Could not move %s" => "%s نمی تواند حرکت کند ",
"File name cannot be empty." => "نام پرونده نمی تواند خالی باشد.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "نام نامعتبر ، '\\', '/', '<', '>', ':', '\"', '|', '?' و '*' مجاز نمی باشند.",
"Unable to set upload directory." => "قادر به تنظیم پوشه آپلود نمی باشد.",
"Invalid Token" => "رمز نامعتبر",
"No file was uploaded. Unknown error" => "هیچ فایلی آپلود نشد.خطای ناشناس",
@@ -16,7 +17,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "فضای کافی در دسترس نیست",
"Invalid directory." => "فهرست راهنما نامعتبر می باشد.",
"Files" => "پرونده‌ها",
-"Not enough space available" => "فضای کافی در دسترس نیست",
"Upload cancelled." => "بار گذاری لغو شد",
"File upload is in progress. Leaving the page now will cancel the upload." => "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ",
"{new_name} already exists" => "{نام _جدید} در حال حاضر وجود دارد.",
@@ -28,9 +28,7 @@ $TRANSLATIONS = array(
"undo" => "بازگشت",
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
-"_Uploading %n file_::_Uploading %n files_" => array(""),
-"'.' is an invalid file name." => "'.' یک نام پرونده نامعتبر است.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "نام نامعتبر ، '\\', '/', '<', '>', ':', '\"', '|', '?' و '*' مجاز نمی باشند.",
+"_Uploading %n file_::_Uploading %n files_" => array("در حال بارگذاری %n فایل"),
"Your storage is full, files can not be updated or synced anymore!" => "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!",
"Your storage is almost full ({usedSpacePercent}%)" => "فضای ذخیره ی شما تقریبا پر است ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "دانلود شما در حال آماده شدن است. در صورتیکه پرونده ها بزرگ باشند ممکن است مدتی طول بکشد.",
@@ -61,7 +59,6 @@ $TRANSLATIONS = array(
"Upload too large" => "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
"Files are being scanned, please wait." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید",
-"Current scanning" => "بازرسی کنونی",
-"Upgrading filesystem cache..." => "بهبود فایل سیستمی ذخیره گاه..."
+"Current scanning" => "بازرسی کنونی"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php
index d1241b77da0..6b94d8b4fae 100644
--- a/apps/files/l10n/fi_FI.php
+++ b/apps/files/l10n/fi_FI.php
@@ -3,15 +3,17 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Kohteen %s siirto ei onnistunut - Tiedosto samalla nimellä on jo olemassa",
"Could not move %s" => "Kohteen %s siirto ei onnistunut",
"File name cannot be empty." => "Tiedoston nimi ei voi olla tyhjä.",
-"File name must not contain \"/\". Please choose a different name." => "Tiedoston nimessä ei saa olla merkkiä \"/\". Valitse toinen nimi.",
+"\"%s\" is an invalid file name." => "\"%s\" on virheellinen tiedostonimi.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Virheellinen nimi, merkit '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' eivät ole sallittuja.",
+"The target folder has been moved or deleted." => "Kohdekansio on siirretty tai poistettu.",
"The name %s is already used in the folder %s. Please choose a different name." => "Nimi %s on jo käytössä kansiossa %s. Valitse toinen nimi.",
"Not a valid source" => "Virheellinen lähde",
"Server is not allowed to open URLs, please check the server configuration" => "Palvelimen ei ole lupa avata verkko-osoitteita. Tarkista palvelimen asetukset",
"Error while downloading %s to %s" => "Virhe ladatessa kohdetta %s sijaintiin %s",
"Error when creating the file" => "Virhe tiedostoa luotaessa",
"Folder name cannot be empty." => "Kansion nimi ei voi olla tyhjä.",
-"Folder name must not contain \"/\". Please choose a different name." => "Kansion nimessä ei saa olla merkkiä \"/\". Valitse toinen nimi.",
"Error when creating the folder" => "Virhe kansiota luotaessa",
+"Unable to set upload directory." => "Lähetyskansion asettaminen epäonnistui.",
"No file was uploaded. Unknown error" => "Tiedostoa ei lähetetty. Tuntematon virhe",
"There is no error, the file uploaded with success" => "Ei virheitä, tiedosto lähetettiin onnistuneesti",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Lähetetyn tiedoston koko ylittää php.ini-tiedoston upload_max_filesize-säännön:",
@@ -22,10 +24,12 @@ $TRANSLATIONS = array(
"Failed to write to disk" => "Levylle kirjoitus epäonnistui",
"Not enough storage available" => "Tallennustilaa ei ole riittävästi käytettävissä",
"Upload failed. Could not find uploaded file" => "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.",
+"Upload failed. Could not get file info." => "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.",
"Invalid directory." => "Virheellinen kansio.",
"Files" => "Tiedostot",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua",
-"Not enough space available" => "Tilaa ei ole riittävästi",
+"Total file size {size1} exceeds upload limit {size2}" => "Yhteiskoko {size1} ylittää lähetysrajan {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä",
"Upload cancelled." => "Lähetys peruttu.",
"Could not get result from server." => "Tuloksien saaminen palvelimelta ei onnistunut.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.",
@@ -45,8 +49,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n tiedosto","%n tiedostoa"),
"{dirs} and {files}" => "{dirs} ja {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Lähetetään %n tiedosto","Lähetetään %n tiedostoa"),
-"'.' is an invalid file name." => "'.' on virheellinen nimi tiedostolle.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Virheellinen nimi, merkit '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' eivät ole sallittuja.",
+"\"{name}\" is an invalid file name." => "\"{name}\" on virheellinen tiedostonimi.",
"Your storage is full, files can not be updated or synced anymore!" => "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!",
"Your storage is almost full ({usedSpacePercent}%)" => "Tallennustila on melkein loppu ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Salaus poistettiin käytöstä, mutta tiedostosi ovat edelleen salattuina. Siirry henkilökohtaisiin asetuksiin avataksesi tiedostojesi salauksen.",
@@ -82,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Lähetettävä tiedosto on liian suuri",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
"Files are being scanned, please wait." => "Tiedostoja tarkistetaan, odota hetki.",
-"Current scanning" => "Tämänhetkinen tutkinta",
-"Upgrading filesystem cache..." => "Päivitetään tiedostojärjestelmän välimuistia..."
+"Current scanning" => "Tämänhetkinen tutkinta"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index 73b89434778..ad768f03de7 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Impossible de déplacer %s - Un fichier possédant ce nom existe déjà",
"Could not move %s" => "Impossible de déplacer %s",
"File name cannot be empty." => "Le nom de fichier ne peut être vide.",
-"File name must not contain \"/\". Please choose a different name." => "Le nom de fichier ne doit pas contenir \"/\". Merci de choisir un nom différent.",
+"\"%s\" is an invalid file name." => "\"%s\" n'est pas un nom de fichier valide.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.",
+"The target folder has been moved or deleted." => "Le dossier cible a été déplacé ou supprimé.",
"The name %s is already used in the folder %s. Please choose a different name." => "Le nom %s est déjà utilisé dans le dossier %s. Merci de choisir un nom différent.",
"Not a valid source" => "La source n'est pas valide",
"Server is not allowed to open URLs, please check the server configuration" => "Le serveur n'est pas autorisé à ouvrir des URL, veuillez vérifier la configuration du serveur",
"Error while downloading %s to %s" => "Erreur pendant le téléchargement de %s à %s",
"Error when creating the file" => "Erreur pendant la création du fichier",
"Folder name cannot be empty." => "Le nom de dossier ne peux pas être vide.",
-"Folder name must not contain \"/\". Please choose a different name." => "Le nom de dossier ne doit pas contenir \"/\". Merci de choisir un nom différent.",
"Error when creating the folder" => "Erreur pendant la création du dossier",
"Unable to set upload directory." => "Impossible de définir le dossier pour l'upload, charger.",
"Invalid Token" => "Jeton non valide",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Absence de dossier temporaire.",
"Failed to write to disk" => "Erreur d'écriture sur le disque",
"Not enough storage available" => "Plus assez d'espace de stockage disponible",
-"Upload failed. Could not get file info." => "L'envoi a échoué. Impossible d'obtenir les informations du fichier.",
"Upload failed. Could not find uploaded file" => "L'envoi a échoué. Impossible de trouver le fichier envoyé.",
+"Upload failed. Could not get file info." => "L'envoi a échoué. Impossible d'obtenir les informations du fichier.",
"Invalid directory." => "Dossier invalide.",
"Files" => "Fichiers",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle",
-"Not enough space available" => "Espace disponible insuffisant",
+"Total file size {size1} exceeds upload limit {size2}" => "La taille totale du fichier {size1} excède la taille maximale d'envoi {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Espace insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles",
"Upload cancelled." => "Envoi annulé.",
"Could not get result from server." => "Ne peut recevoir les résultats du serveur.",
"File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fichier","%n fichiers"),
"{dirs} and {files}" => "{dirs} et {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Téléversement de %n fichier","Téléversement de %n fichiers"),
-"'.' is an invalid file name." => "'.' n'est pas un nom de fichier valide.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.",
+"\"{name}\" is an invalid file name." => "\"{name}\" n'est pas un nom de fichier valide.",
"Your storage is full, files can not be updated or synced anymore!" => "Votre espage de stockage est plein, les fichiers ne peuvent plus être téléversés ou synchronisés !",
"Your storage is almost full ({usedSpacePercent}%)" => "Votre espace de stockage est presque plein ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "L'application de chiffrement est activée mais vos clés ne sont pas initialisées, veuillez vous déconnecter et ensuite vous reconnecter.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Téléversement trop volumineux",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.",
"Files are being scanned, please wait." => "Les fichiers sont en cours d'analyse, veuillez patienter.",
-"Current scanning" => "Analyse en cours",
-"Upgrading filesystem cache..." => "Mise à niveau du cache du système de fichier"
+"Current scanning" => "Analyse en cours"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 1d22691d93c..7ea8181dc71 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Non foi posíbel mover %s; Xa existe un ficheiro con ese nome.",
"Could not move %s" => "Non foi posíbel mover %s",
"File name cannot be empty." => "O nome de ficheiro non pode estar baleiro",
-"File name must not contain \"/\". Please choose a different name." => "O nome do ficheiro non pode conter «/». Escolla outro nome.",
+"\"%s\" is an invalid file name." => "«%s» é un nome incorrecto de ficheiro.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».",
+"The target folder has been moved or deleted." => "O cartafol de destino foi movido ou eliminado.",
"The name %s is already used in the folder %s. Please choose a different name." => "Xa existe o nome %s no cartafol %s. Escolla outro nome.",
"Not a valid source" => "Esta orixe non é correcta",
"Server is not allowed to open URLs, please check the server configuration" => "O servidor non ten permisos para abrir os enderezos URL, comprobe a configuración do servidor",
"Error while downloading %s to %s" => "Produciuse un erro ao descargar %s en %s",
"Error when creating the file" => "Produciuse un erro ao crear o ficheiro",
"Folder name cannot be empty." => "O nome de cartafol non pode estar baleiro.",
-"Folder name must not contain \"/\". Please choose a different name." => "O nome do cartafol non pode conter «/». Escolla outro nome.",
"Error when creating the folder" => "Produciuse un erro ao crear o cartafol",
"Unable to set upload directory." => "Non é posíbel configurar o directorio de envíos.",
"Invalid Token" => "Marca incorrecta",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta o cartafol temporal",
"Failed to write to disk" => "Produciuse un erro ao escribir no disco",
"Not enough storage available" => "Non hai espazo de almacenamento abondo",
-"Upload failed. Could not get file info." => "O envío fracasou. Non foi posíbel obter información do ficheiro.",
"Upload failed. Could not find uploaded file" => "O envío fracasou. Non foi posíbel atopar o ficheiro enviado",
+"Upload failed. Could not get file info." => "O envío fracasou. Non foi posíbel obter información do ficheiro.",
"Invalid directory." => "O directorio é incorrecto.",
"Files" => "Ficheiros",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes",
-"Not enough space available" => "O espazo dispoñíbel é insuficiente",
+"Total file size {size1} exceeds upload limit {size2}" => "O tamaño total do ficheiro {size1} excede do límite de envío {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}",
"Upload cancelled." => "Envío cancelado.",
"Could not get result from server." => "Non foi posíbel obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n ficheiro","%n ficheiros"),
"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Cargando %n ficheiro","Cargando %n ficheiros"),
-"'.' is an invalid file name." => "«.» é un nome de ficheiro incorrecto",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».",
+"\"{name}\" is an invalid file name." => "«{name}» é un nome incorrecto de ficheiro.",
"Your storage is full, files can not be updated or synced anymore!" => "O seu espazo de almacenamento está cheo, non é posíbel actualizar ou sincronizar máis os ficheiros!",
"Your storage is almost full ({usedSpacePercent}%)" => "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "O aplicativo de cifrado está activado, mais as chaves non foron inicializadas, saia da sesión e volva a acceder de novo",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Envío demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"Files are being scanned, please wait." => "Estanse analizando os ficheiros. Agarde.",
-"Current scanning" => "Análise actual",
-"Upgrading filesystem cache..." => "Anovando a caché do sistema de ficheiros..."
+"Current scanning" => "Análise actual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php
index 0cdb178254e..2035c8488bd 100644
--- a/apps/files/l10n/he.php
+++ b/apps/files/l10n/he.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים",
"Could not move %s" => "לא ניתן להעביר את %s",
"File name cannot be empty." => "שם קובץ אינו יכול להיות ריק",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'.",
"No file was uploaded. Unknown error" => "לא הועלה קובץ. טעות בלתי מזוהה.",
"There is no error, the file uploaded with success" => "לא התרחשה שגיאה, הקובץ הועלה בהצלחה",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:",
@@ -28,7 +29,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "השם שגוי, אסור להשתמש בתווים '\\', '/', '<', '>', ':', '\"', '|', '?' ו־'*'.",
"Your storage is almost full ({usedSpacePercent}%)" => "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)",
"Error" => "שגיאה",
"Name" => "שם",
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index 22c3926ed1c..6f5ba9b4724 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -3,14 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s áthelyezése nem sikerült - már létezik másik fájl ezzel a névvel",
"Could not move %s" => "Nem sikerült %s áthelyezése",
"File name cannot be empty." => "A fájlnév nem lehet semmi.",
-"File name must not contain \"/\". Please choose a different name." => "Az állomány neve nem tartalmazhatja a \"/\" karaktert. Kérem válasszon másik nevet!",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Érvénytelen elnevezés. Ezek a karakterek nem használhatók: '\\', '/', '<', '>', ':', '\"', '|', '?' és '*'",
"The name %s is already used in the folder %s. Please choose a different name." => "A %s név már létezik a %s mappában. Kérem válasszon másik nevet!",
"Not a valid source" => "A kiinduló állomány érvénytelen",
"Server is not allowed to open URLs, please check the server configuration" => "A kiszolgálón nincs engedélyezve URL-ek megnyitása, kérem ellenőrizze a beállításokat",
"Error while downloading %s to %s" => "Hiba történt miközben %s-t letöltöttük %s-be",
"Error when creating the file" => "Hiba történt az állomány létrehozásakor",
"Folder name cannot be empty." => "A mappa neve nem maradhat kitöltetlenül",
-"Folder name must not contain \"/\". Please choose a different name." => "A mappa neve nem tartalmazhatja a \"/\" karaktert. Kérem válasszon másik nevet!",
"Error when creating the folder" => "Hiba történt a mappa létrehozásakor",
"Unable to set upload directory." => "Nem található a mappa, ahova feltölteni szeretne.",
"Invalid Token" => "Hibás mappacím",
@@ -23,12 +22,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Hiányzik egy ideiglenes mappa",
"Failed to write to disk" => "Nem sikerült a lemezre történő írás",
"Not enough storage available" => "Nincs elég szabad hely.",
-"Upload failed. Could not get file info." => "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el.",
"Upload failed. Could not find uploaded file" => "A feltöltés nem sikerült. Nem található a feltöltendő állomány.",
+"Upload failed. Could not get file info." => "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el.",
"Invalid directory." => "Érvénytelen mappa.",
"Files" => "Fájlok",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.",
-"Not enough space available" => "Nincs elég szabad hely",
"Upload cancelled." => "A feltöltést megszakítottuk.",
"Could not get result from server." => "A kiszolgálótól nem kapható meg az eredmény.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
@@ -50,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n állomány","%n állomány"),
"{dirs} and {files}" => "{dirs} és {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n állomány feltöltése","%n állomány feltöltése"),
-"'.' is an invalid file name." => "'.' fájlnév érvénytelen.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Érvénytelen elnevezés. Ezek a karakterek nem használhatók: '\\', '/', '<', '>', ':', '\"', '|', '?' és '*'",
"Your storage is full, files can not be updated or synced anymore!" => "A tároló tele van, a fájlok nem frissíthetőek vagy szinkronizálhatóak a jövőben.",
"Your storage is almost full ({usedSpacePercent}%)" => "A tároló majdnem tele van ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Az állományok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérjük, hogy jelentkezzen ki, és lépjen be újra!",
@@ -89,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "A feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.",
"Files are being scanned, please wait." => "A fájllista ellenőrzése zajlik, kis türelmet!",
-"Current scanning" => "Ellenőrzés alatt",
-"Upgrading filesystem cache..." => "A fájlrendszer gyorsítótárának frissítése zajlik..."
+"Current scanning" => "Ellenőrzés alatt"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php
index 4e254ff6f60..45bc05c9182 100644
--- a/apps/files/l10n/id.php
+++ b/apps/files/l10n/id.php
@@ -3,13 +3,12 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Tidak dapat memindahkan %s - Berkas dengan nama ini sudah ada",
"Could not move %s" => "Tidak dapat memindahkan %s",
"File name cannot be empty." => "Nama berkas tidak boleh kosong.",
-"File name must not contain \"/\". Please choose a different name." => "Nama berkas tidak boleh mengandung \"/\". Silakan pilih nama yang berbeda.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nama tidak valid, karakter '\\', '/', '<', '>', ':', '\"', '|', '?' dan '*' tidak diizinkan.",
"The name %s is already used in the folder %s. Please choose a different name." => "Nama %s sudah digunakan dalam folder %s. Silakan pilih nama yang berbeda.",
"Not a valid source" => "Sumber tidak sah",
"Error while downloading %s to %s" => "Galat saat mengunduh %s ke %s",
"Error when creating the file" => "Galat saat membuat berkas",
"Folder name cannot be empty." => "Nama folder tidak bolh kosong.",
-"Folder name must not contain \"/\". Please choose a different name." => "Nama folder tidak boleh mengandung \"/\". Silakan pilih nama yang berbeda.",
"Error when creating the folder" => "Galat saat membuat folder",
"Unable to set upload directory." => "Tidak dapat mengatur folder unggah",
"Invalid Token" => "Token tidak sah",
@@ -22,12 +21,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Folder sementara tidak ada",
"Failed to write to disk" => "Gagal menulis ke disk",
"Not enough storage available" => "Ruang penyimpanan tidak mencukupi",
-"Upload failed. Could not get file info." => "Unggah gagal. Tidak mendapatkan informasi berkas.",
"Upload failed. Could not find uploaded file" => "Unggah gagal. Tidak menemukan berkas yang akan diunggah",
+"Upload failed. Could not get file info." => "Unggah gagal. Tidak mendapatkan informasi berkas.",
"Invalid directory." => "Direktori tidak valid.",
"Files" => "Berkas",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte",
-"Not enough space available" => "Ruang penyimpanan tidak mencukupi",
"Upload cancelled." => "Pengunggahan dibatalkan.",
"Could not get result from server." => "Tidak mendapatkan hasil dari server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.",
@@ -48,8 +46,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n berkas"),
"{dirs} and {files}" => "{dirs} dan {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Mengunggah %n berkas"),
-"'.' is an invalid file name." => "'.' bukan nama berkas yang valid.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nama tidak valid, karakter '\\', '/', '<', '>', ':', '\"', '|', '?' dan '*' tidak diizinkan.",
"Your storage is full, files can not be updated or synced anymore!" => "Ruang penyimpanan Anda penuh, berkas tidak dapat diperbarui atau disinkronkan lagi!",
"Your storage is almost full ({usedSpacePercent}%)" => "Ruang penyimpanan hampir penuh ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikasi Enskripsi telah diaktifkan tetapi kunci tidak diinisialisasi, silakan log-out dan log-in lagi",
@@ -87,7 +83,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Yang diunggah terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.",
"Files are being scanned, please wait." => "Berkas sedang dipindai, silakan tunggu.",
-"Current scanning" => "Yang sedang dipindai",
-"Upgrading filesystem cache..." => "Meningkatkan tembolok sistem berkas..."
+"Current scanning" => "Yang sedang dipindai"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/is.php b/apps/files/l10n/is.php
index 5c5cc7d5d73..088cdefa304 100644
--- a/apps/files/l10n/is.php
+++ b/apps/files/l10n/is.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Gat ekki fært %s - Skrá með þessu nafni er þegar til",
"Could not move %s" => "Gat ekki fært %s",
"File name cannot be empty." => "Nafn skráar má ekki vera tómt",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ógilt nafn, táknin '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' eru ekki leyfð.",
"No file was uploaded. Unknown error" => "Engin skrá var send inn. Óþekkt villa.",
"There is no error, the file uploaded with success" => "Engin villa, innsending heppnaðist",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Innsend skrá er stærri en upload_max stillingin í php.ini:",
@@ -13,7 +14,6 @@ $TRANSLATIONS = array(
"Failed to write to disk" => "Tókst ekki að skrifa á disk",
"Invalid directory." => "Ógild mappa.",
"Files" => "Skrár",
-"Not enough space available" => "Ekki nægt pláss tiltækt",
"Upload cancelled." => "Hætt við innsendingu.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.",
"{new_name} already exists" => "{new_name} er þegar til",
@@ -25,8 +25,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"'.' is an invalid file name." => "'.' er ekki leyfilegt nafn.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ógilt nafn, táknin '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' eru ekki leyfð.",
"Error" => "Villa",
"Name" => "Nafn",
"Size" => "Stærð",
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index 2a10e9977f4..e1a34e646fb 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Impossibile spostare %s - un file con questo nome esiste già",
"Could not move %s" => "Impossibile spostare %s",
"File name cannot be empty." => "Il nome del file non può essere vuoto.",
-"File name must not contain \"/\". Please choose a different name." => "Il nome del file non può contenere il carattere \"/\". Scegli un nome diverso.",
+"\"%s\" is an invalid file name." => "\"%s\" non è un nome file valido.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non valido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non sono consentiti.",
+"The target folder has been moved or deleted." => "La cartella di destinazione è stata spostata o eliminata.",
"The name %s is already used in the folder %s. Please choose a different name." => "Il nome %s è attualmente in uso nella cartella %s. Scegli un nome diverso.",
"Not a valid source" => "Non è una sorgente valida",
"Server is not allowed to open URLs, please check the server configuration" => "Al server non è permesso aprire URL, controlla la configurazione del server",
"Error while downloading %s to %s" => "Errore durante lo scaricamento di %s su %s",
"Error when creating the file" => "Errore durante la creazione del file",
"Folder name cannot be empty." => "Il nome della cartella non può essere vuoto.",
-"Folder name must not contain \"/\". Please choose a different name." => "Il nome della cartella non può contenere il carattere \"/\". Scegli un nome diverso.",
"Error when creating the folder" => "Errore durante la creazione della cartella",
"Unable to set upload directory." => "Impossibile impostare una cartella di caricamento.",
"Invalid Token" => "Token non valido",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manca una cartella temporanea",
"Failed to write to disk" => "Scrittura su disco non riuscita",
"Not enough storage available" => "Spazio di archiviazione insufficiente",
-"Upload failed. Could not get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.",
"Upload failed. Could not find uploaded file" => "Caricamento non riuscito. Impossibile trovare il file caricato.",
+"Upload failed. Could not get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.",
"Invalid directory." => "Cartella non valida.",
"Files" => "File",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.",
-"Not enough space available" => "Spazio disponibile insufficiente",
+"Total file size {size1} exceeds upload limit {size2}" => "La dimensione totale del file {size1} supera il limite di caricamento {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}",
"Upload cancelled." => "Invio annullato",
"Could not get result from server." => "Impossibile ottenere il risultato dal server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n file","%n file"),
"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Caricamento di %n file in corso","Caricamento di %n file in corso"),
-"'.' is an invalid file name." => "'.' non è un nome file valido.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non valido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non sono consentiti.",
+"\"{name}\" is an invalid file name." => "\"{name}\" non è un nome file valido.",
"Your storage is full, files can not be updated or synced anymore!" => "Lo spazio di archiviazione è pieno, i file non possono essere più aggiornati o sincronizzati!",
"Your storage is almost full ({usedSpacePercent}%)" => "Lo spazio di archiviazione è quasi pieno ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "L'applicazione di cifratura è abilitata, ma le chiavi non sono state inizializzate, disconnettiti ed effettua nuovamente l'accesso",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Caricamento troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
"Files are being scanned, please wait." => "Scansione dei file in corso, attendi",
-"Current scanning" => "Scansione corrente",
-"Upgrading filesystem cache..." => "Aggiornamento della cache del filesystem in corso..."
+"Current scanning" => "Scansione corrente"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ja.php b/apps/files/l10n/ja.php
new file mode 100644
index 00000000000..eb6cb0efc50
--- /dev/null
+++ b/apps/files/l10n/ja.php
@@ -0,0 +1,95 @@
+<?php
+$TRANSLATIONS = array(
+"Could not move %s - File with this name already exists" => "%s を移動できませんでした ― この名前のファイルはすでに存在します",
+"Could not move %s" => "%s を移動できませんでした",
+"File name cannot be empty." => "ファイル名を空にすることはできません。",
+"\"%s\" is an invalid file name." => "\"%s\" は無効なファイル名です。",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。",
+"The target folder has been moved or deleted." => "目標のフォルダは移動されたか、削除されました。",
+"The name %s is already used in the folder %s. Please choose a different name." => "%s はフォルダー %s ですでに使われています。別の名前を選択してください。",
+"Not a valid source" => "有効なソースではありません",
+"Server is not allowed to open URLs, please check the server configuration" => "サーバーは、URLを開くことは許されません。サーバーの設定をチェックしてください。",
+"Error while downloading %s to %s" => "%s から %s へのダウンロードエラー",
+"Error when creating the file" => "ファイルの生成エラー",
+"Folder name cannot be empty." => "フォルダー名は空にできません",
+"Error when creating the folder" => "フォルダーの生成エラー",
+"Unable to set upload directory." => "アップロードディレクトリを設定できません。",
+"Invalid Token" => "無効なトークン",
+"No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー",
+"There is no error, the file uploaded with success" => "エラーはありません。ファイルのアップロードは成功しました",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "アップロードされたファイルはphp.ini の upload_max_filesize に設定されたサイズを超えています:",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードファイルはHTMLフォームで指定された MAX_FILE_SIZE の制限を超えています",
+"The uploaded file was only partially uploaded" => "アップロードファイルは一部分だけアップロードされました",
+"No file was uploaded" => "ファイルはアップロードされませんでした",
+"Missing a temporary folder" => "一時保存フォルダーが見つかりません",
+"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
+"Not enough storage available" => "ストレージに十分な空き容量がありません",
+"Upload failed. Could not find uploaded file" => "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。",
+"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。",
+"Invalid directory." => "無効なディレクトリです。",
+"Files" => "ファイル",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのため {filename} をアップロードできません",
+"Total file size {size1} exceeds upload limit {size2}" => "合計ファイルサイズ {size1} はアップロード制限 {size2} を超過しています。",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
+"Upload cancelled." => "アップロードはキャンセルされました。",
+"Could not get result from server." => "サーバーから結果を取得できませんでした。",
+"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
+"URL cannot be empty" => "URL は空にできません",
+"In the home folder 'Shared' is a reserved filename" => "ホームフォルダーでは、'Shared' はシステムが使用する予約済みのファイル名です",
+"{new_name} already exists" => "{new_name} はすでに存在します",
+"Could not create file" => "ファイルを作成できませんでした",
+"Could not create folder" => "フォルダーを作成できませんでした",
+"Error fetching URL" => "URL取得エラー",
+"Share" => "共有",
+"Delete permanently" => "完全に削除する",
+"Rename" => "名前の変更",
+"Pending" => "中断",
+"Could not rename file" => "ファイルの名前変更ができませんでした",
+"replaced {new_name} with {old_name}" => "{old_name} を {new_name} に置換",
+"undo" => "元に戻す",
+"Error deleting file." => "ファイルの削除エラー。",
+"_%n folder_::_%n folders_" => array("%n 個のフォルダー"),
+"_%n file_::_%n files_" => array("%n 個のファイル"),
+"{dirs} and {files}" => "{dirs} と {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("%n 個のファイルをアップロード中"),
+"\"{name}\" is an invalid file name." => "\"{name}\" は無効なファイル名です。",
+"Your storage is full, files can not be updated or synced anymore!" => "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!",
+"Your storage is almost full ({usedSpacePercent}%)" => "ストレージがほぼ一杯です({usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "暗号化アプリの無効なプライベートキーです。あなたの暗号化されたファイルへアクセスするために、個人設定からプライベートキーのパスワードを更新してください。",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。",
+"Your download is being prepared. This might take some time if the files are big." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。",
+"Error moving file" => "ファイルの移動エラー",
+"Error" => "エラー",
+"Name" => "名前",
+"Size" => "サイズ",
+"Modified" => "更新日時",
+"Invalid folder name. Usage of 'Shared' is reserved." => "無効なフォルダー名。「Shared」の利用は予約されています。",
+"%s could not be renamed" => "%sの名前を変更できませんでした",
+"Upload" => "アップロード",
+"File handling" => "ファイル操作",
+"Maximum upload size" => "最大アップロードサイズ",
+"max. possible: " => "最大容量: ",
+"Needed for multi-file and folder downloads." => "複数ファイルおよびフォルダーのダウンロードに必要",
+"Enable ZIP-download" => "ZIP形式のダウンロードを有効にする",
+"0 is unlimited" => "0を指定した場合は無制限",
+"Maximum input size for ZIP files" => "ZIPファイルでの最大入力サイズ",
+"Save" => "保存",
+"New" => "新規作成",
+"New text file" => "新規のテキストファイル作成",
+"Text file" => "テキストファイル",
+"New folder" => "新しいフォルダー",
+"Folder" => "フォルダー",
+"From link" => "リンク",
+"Deleted files" => "ゴミ箱",
+"Cancel upload" => "アップロードをキャンセル",
+"You don’t have permission to upload or create files here" => "ここにファイルをアップロードもしくは作成する権限がありません",
+"Nothing in here. Upload something!" => "ここには何もありません。何かアップロードしてください。",
+"Download" => "ダウンロード",
+"Delete" => "削除",
+"Upload too large" => "アップロードには大きすぎます。",
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。",
+"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。",
+"Current scanning" => "スキャン中"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php
index 8019b825d3c..8a4b3ca8774 100644
--- a/apps/files/l10n/ja_JP.php
+++ b/apps/files/l10n/ja_JP.php
@@ -3,16 +3,17 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s を移動できませんでした ― この名前のファイルはすでに存在します",
"Could not move %s" => "%s を移動できませんでした",
"File name cannot be empty." => "ファイル名を空にすることはできません。",
-"File name must not contain \"/\". Please choose a different name." => "ファイル名には \"/\" を含めることはできません。別の名前を選択してください。",
-"The name %s is already used in the folder %s. Please choose a different name." => "%s はフォルダ %s ないですでに使われています。別の名前を選択してください。",
+"\"%s\" is an invalid file name." => "\"%s\" は無効なファイル名です。",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。",
+"The target folder has been moved or deleted." => "目標のフォルダは移動されたか、削除されました。",
+"The name %s is already used in the folder %s. Please choose a different name." => "%s はフォルダー %s ですでに使われています。別の名前を選択してください。",
"Not a valid source" => "有効なソースではありません",
"Server is not allowed to open URLs, please check the server configuration" => "サーバーは、URLを開くことは許されません。サーバーの設定をチェックしてください。",
"Error while downloading %s to %s" => "%s から %s へのダウンロードエラー",
"Error when creating the file" => "ファイルの生成エラー",
-"Folder name cannot be empty." => "フォルダ名は空にできません",
-"Folder name must not contain \"/\". Please choose a different name." => "フォルダ名には \"/\" を含めることはできません。別の名前を選択してください。",
-"Error when creating the folder" => "フォルダの生成エラー",
-"Unable to set upload directory." => "アップロードディレクトリを設定出来ません。",
+"Folder name cannot be empty." => "フォルダー名は空にできません",
+"Error when creating the folder" => "フォルダーの生成エラー",
+"Unable to set upload directory." => "アップロードディレクトリを設定できません。",
"Invalid Token" => "無効なトークン",
"No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー",
"There is no error, the file uploaded with success" => "エラーはありません。ファイルのアップロードは成功しました",
@@ -20,23 +21,24 @@ $TRANSLATIONS = array(
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードファイルはHTMLフォームで指定された MAX_FILE_SIZE の制限を超えています",
"The uploaded file was only partially uploaded" => "アップロードファイルは一部分だけアップロードされました",
"No file was uploaded" => "ファイルはアップロードされませんでした",
-"Missing a temporary folder" => "一時保存フォルダが見つかりません",
+"Missing a temporary folder" => "一時保存フォルダーが見つかりません",
"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
"Not enough storage available" => "ストレージに十分な空き容量がありません",
-"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。",
"Upload failed. Could not find uploaded file" => "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。",
+"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。",
"Invalid directory." => "無効なディレクトリです。",
"Files" => "ファイル",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのため {filename} をアップロードできません",
-"Not enough space available" => "利用可能なスペースが十分にありません",
+"Total file size {size1} exceeds upload limit {size2}" => "合計ファイルサイズ {size1} はアップロード制限 {size2} を超過しています。",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
"Upload cancelled." => "アップロードはキャンセルされました。",
-"Could not get result from server." => "サーバから結果を取得できませんでした。",
+"Could not get result from server." => "サーバーから結果を取得できませんでした。",
"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
"URL cannot be empty" => "URL は空にできません",
-"In the home folder 'Shared' is a reserved filename" => "ホームフォルダでは、'Shared' はシステムが使用する予約済みのファイル名です",
-"{new_name} already exists" => "{new_name} はすでに存在しています",
+"In the home folder 'Shared' is a reserved filename" => "ホームフォルダーでは、'Shared' はシステムが使用する予約済みのファイル名です",
+"{new_name} already exists" => "{new_name} はすでに存在します",
"Could not create file" => "ファイルを作成できませんでした",
-"Could not create folder" => "フォルダを作成できませんでした",
+"Could not create folder" => "フォルダーを作成できませんでした",
"Error fetching URL" => "URL取得エラー",
"Share" => "共有",
"Delete permanently" => "完全に削除する",
@@ -46,14 +48,13 @@ $TRANSLATIONS = array(
"replaced {new_name} with {old_name}" => "{old_name} を {new_name} に置換",
"undo" => "元に戻す",
"Error deleting file." => "ファイルの削除エラー。",
-"_%n folder_::_%n folders_" => array("%n 個のフォルダ"),
+"_%n folder_::_%n folders_" => array("%n 個のフォルダー"),
"_%n file_::_%n files_" => array("%n 個のファイル"),
"{dirs} and {files}" => "{dirs} と {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n 個のファイルをアップロード中"),
-"'.' is an invalid file name." => "'.' は無効なファイル名です。",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。",
+"\"{name}\" is an invalid file name." => "\"{name}\" は無効なファイル名です。",
"Your storage is full, files can not be updated or synced anymore!" => "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!",
-"Your storage is almost full ({usedSpacePercent}%)" => "あなたのストレージはほぼ一杯です({usedSpacePercent}%)",
+"Your storage is almost full ({usedSpacePercent}%)" => "ストレージがほぼ一杯です({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください",
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "暗号化アプリの無効なプライベートキーです。あなたの暗号化されたファイルへアクセスするために、個人設定からプライベートキーのパスワードを更新してください。",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。",
@@ -63,22 +64,22 @@ $TRANSLATIONS = array(
"Name" => "名前",
"Size" => "サイズ",
"Modified" => "更新日時",
-"Invalid folder name. Usage of 'Shared' is reserved." => "無効なフォルダ名。「Shared」の利用は予約されています。",
+"Invalid folder name. Usage of 'Shared' is reserved." => "無効なフォルダー名。「Shared」の利用は予約されています。",
"%s could not be renamed" => "%sの名前を変更できませんでした",
"Upload" => "アップロード",
"File handling" => "ファイル操作",
"Maximum upload size" => "最大アップロードサイズ",
"max. possible: " => "最大容量: ",
-"Needed for multi-file and folder downloads." => "複数ファイルおよびフォルダのダウンロードに必要",
+"Needed for multi-file and folder downloads." => "複数ファイルおよびフォルダーのダウンロードに必要",
"Enable ZIP-download" => "ZIP形式のダウンロードを有効にする",
"0 is unlimited" => "0を指定した場合は無制限",
-"Maximum input size for ZIP files" => "ZIPファイルへの最大入力サイズ",
+"Maximum input size for ZIP files" => "ZIPファイルでの最大入力サイズ",
"Save" => "保存",
"New" => "新規作成",
"New text file" => "新規のテキストファイル作成",
"Text file" => "テキストファイル",
-"New folder" => "新しいフォルダ",
-"Folder" => "フォルダ",
+"New folder" => "新しいフォルダー",
+"Folder" => "フォルダー",
"From link" => "リンク",
"Deleted files" => "ゴミ箱",
"Cancel upload" => "アップロードをキャンセル",
@@ -87,7 +88,7 @@ $TRANSLATIONS = array(
"Download" => "ダウンロード",
"Delete" => "削除",
"Upload too large" => "アップロードには大きすぎます。",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバで規定された最大サイズを超えています。",
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。",
"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。",
"Current scanning" => "スキャン中",
"Upgrading filesystem cache..." => "ファイルシステムキャッシュを更新中..."
diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php
index eafa0c083f7..230c2e4ede2 100644
--- a/apps/files/l10n/ka_GE.php
+++ b/apps/files/l10n/ka_GE.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s –ის გადატანა ვერ მოხერხდა – ფაილი ამ სახელით უკვე არსებობს",
"Could not move %s" => "%s –ის გადატანა ვერ მოხერხდა",
"File name cannot be empty." => "ფაილის სახელი არ შეიძლება იყოს ცარიელი.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "არადაშვებადი სახელი, '\\', '/', '<', '>', ':', '\"', '|', '?' და '*' არ არის დაიშვებული.",
"No file was uploaded. Unknown error" => "ფაილი არ აიტვირთა. უცნობი შეცდომა",
"There is no error, the file uploaded with success" => "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში",
@@ -14,7 +15,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "საცავში საკმარისი ადგილი არ არის",
"Invalid directory." => "დაუშვებელი დირექტორია.",
"Files" => "ფაილები",
-"Not enough space available" => "საკმარისი ადგილი არ არის",
"Upload cancelled." => "ატვირთვა შეჩერებულ იქნა.",
"File upload is in progress. Leaving the page now will cancel the upload." => "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას",
"{new_name} already exists" => "{new_name} უკვე არსებობს",
@@ -27,8 +27,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"'.' is an invalid file name." => "'.' არის დაუშვებელი ფაილის სახელი.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "არადაშვებადი სახელი, '\\', '/', '<', '>', ':', '\"', '|', '?' და '*' არ არის დაიშვებული.",
"Your storage is full, files can not be updated or synced anymore!" => "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!",
"Your storage is almost full ({usedSpacePercent}%)" => "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "გადმოწერის მოთხოვნა მუშავდება. ის მოითხოვს გარკვეულ დროს რაგდან ფაილები არის დიდი ზომის.",
@@ -58,7 +56,6 @@ $TRANSLATIONS = array(
"Upload too large" => "ასატვირთი ფაილი ძალიან დიდია",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
"Files are being scanned, please wait." => "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.",
-"Current scanning" => "მიმდინარე სკანირება",
-"Upgrading filesystem cache..." => "ფაილური სისტემის ქეშის განახლება...."
+"Current scanning" => "მიმდინარე სკანირება"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/km.php b/apps/files/l10n/km.php
index 9733358d628..702c811ecf2 100644
--- a/apps/files/l10n/km.php
+++ b/apps/files/l10n/km.php
@@ -1,8 +1,19 @@
<?php
$TRANSLATIONS = array(
+"Files" => "ឯកសារ",
+"Share" => "ចែក​រំលែក",
+"undo" => "មិន​ធ្វើ​វិញ",
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
+"Error" => "កំហុស",
+"Name" => "ឈ្មោះ",
+"Size" => "ទំហំ",
+"Upload" => "ផ្ទុក​ឡើង",
+"Save" => "រក្សាទុក",
+"New folder" => "ថត​ថ្មី",
+"Folder" => "ថត",
+"Download" => "ទាញយក",
"Delete" => "លុប"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index 35a9f2fb85c..92a2578074c 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -3,14 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "항목 %s을(를) 이동시킬 수 없음 - 같은 이름의 파일이 이미 존재함",
"Could not move %s" => "항목 %s을(를) 이동시킬 수 없음",
"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.",
-"File name must not contain \"/\". Please choose a different name." => "파일 이름에는 \"/\"가 들어갈 수 없습니다. 다른 이름을 사용하십시오.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.",
"The name %s is already used in the folder %s. Please choose a different name." => "이름 %s이(가) 폴더 %s에서 이미 사용 중입니다. 다른 이름을 사용하십시오.",
"Not a valid source" => "올바르지 않은 원본",
"Server is not allowed to open URLs, please check the server configuration" => "서버에서 URL을 열 수 없습니다. 서버 설정을 확인하십시오",
"Error while downloading %s to %s" => "%s을(를) %s(으)로 다운로드하는 중 오류 발생",
"Error when creating the file" => "파일 생성 중 오류 발생",
"Folder name cannot be empty." => "폴더 이름이 비어있을 수 없습니다.",
-"Folder name must not contain \"/\". Please choose a different name." => "폴더 이름에는 \"/\"가 들어갈 수 없습니다. 다른 이름을 사용하십시오.",
"Error when creating the folder" => "폴더 생성 중 오류 발생",
"Unable to set upload directory." => "업로드 디렉터리를 설정할 수 없습니다.",
"Invalid Token" => "잘못된 토큰",
@@ -23,12 +22,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "임시 폴더가 없음",
"Failed to write to disk" => "디스크에 쓰지 못했습니다",
"Not enough storage available" => "저장소가 용량이 충분하지 않습니다.",
-"Upload failed. Could not get file info." => "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.",
"Upload failed. Could not find uploaded file" => "업로드에 실패했습니다. 업로드할 파일을 찾을 수 없습니다",
+"Upload failed. Could not get file info." => "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.",
"Invalid directory." => "올바르지 않은 디렉터리입니다.",
"Files" => "파일",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.",
-"Not enough space available" => "여유 공간이 부족합니다",
"Upload cancelled." => "업로드가 취소되었습니다.",
"Could not get result from server." => "서버에서 결과를 가져올 수 없습니다.",
"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
@@ -50,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("파일 %n개"),
"{dirs} and {files}" => "{dirs} 그리고 {files}",
"_Uploading %n file_::_Uploading %n files_" => array("파일 %n개 업로드 중"),
-"'.' is an invalid file name." => "'.' 는 올바르지 않은 파일 이름입니다.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.",
"Your storage is full, files can not be updated or synced anymore!" => "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
"Your storage is almost full ({usedSpacePercent}%)" => "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "암호화 앱이 활성화되어 있지만 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오",
@@ -89,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "업로드한 파일이 너무 큼",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
"Files are being scanned, please wait." => "파일을 검색하고 있습니다. 기다려 주십시오.",
-"Current scanning" => "현재 검색",
-"Upgrading filesystem cache..." => "파일 시스템 캐시 업그레이드 중..."
+"Current scanning" => "현재 검색"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/ku_IQ.php b/apps/files/l10n/ku_IQ.php
index f04e9ec44df..c0141656f5d 100644
--- a/apps/files/l10n/ku_IQ.php
+++ b/apps/files/l10n/ku_IQ.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Files" => "په‌ڕگەکان",
"Share" => "هاوبەشی کردن",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php
index d9023658631..14c48621174 100644
--- a/apps/files/l10n/lt_LT.php
+++ b/apps/files/l10n/lt_LT.php
@@ -3,13 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja",
"Could not move %s" => "Nepavyko perkelti %s",
"File name cannot be empty." => "Failo pavadinimas negali būti tuščias.",
-"File name must not contain \"/\". Please choose a different name." => "Failo pavadinime negali būti simbolio \"/\". Prašome pasirinkti kitokį pavadinimą.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neleistinas pavadinimas, '\\', '/', '<', '>', ':', '\"', '|', '?' ir '*' yra neleidžiami.",
"The name %s is already used in the folder %s. Please choose a different name." => "Pavadinimas %s jau naudojamas aplanke %s. Prašome pasirinkti kitokį pavadinimą.",
"Not a valid source" => "Netinkamas šaltinis",
+"Server is not allowed to open URLs, please check the server configuration" => "Serveriui neleidžiama atverti URL, prašome patikrinti serverio konfigūraciją",
"Error while downloading %s to %s" => "Klaida siunčiant %s į %s",
"Error when creating the file" => "Klaida kuriant failą",
"Folder name cannot be empty." => "Aplanko pavadinimas negali būti tuščias.",
-"Folder name must not contain \"/\". Please choose a different name." => "Aplanko pavadinime negali būti simbolio \"/\". Prašome pasirinkti kitokį pavadinimą.",
"Error when creating the folder" => "Klaida kuriant aplanką",
"Unable to set upload directory." => "Nepavyksta nustatyti įkėlimų katalogo.",
"Invalid Token" => "Netinkamas ženklas",
@@ -22,19 +22,20 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Failed to write to disk" => "Nepavyko įrašyti į diską",
"Not enough storage available" => "Nepakanka vietos serveryje",
-"Upload failed. Could not get file info." => "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.",
"Upload failed. Could not find uploaded file" => "Įkėlimas nepavyko. Nepavyko rasti įkelto failo",
+"Upload failed. Could not get file info." => "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.",
"Invalid directory." => "Neteisingas aplankas",
"Files" => "Failai",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio",
-"Not enough space available" => "Nepakanka vietos",
"Upload cancelled." => "Įkėlimas atšauktas.",
"Could not get result from server." => "Nepavyko gauti rezultato iš serverio.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
"URL cannot be empty" => "URL negali būti tuščias.",
+"In the home folder 'Shared' is a reserved filename" => "Pradiniame aplanke failo pavadinimas „Shared“ yra rezervuotas",
"{new_name} already exists" => "{new_name} jau egzistuoja",
"Could not create file" => "Neįmanoma sukurti failo",
"Could not create folder" => "Neįmanoma sukurti aplanko",
+"Error fetching URL" => "Klauda gaunant URL",
"Share" => "Dalintis",
"Delete permanently" => "Ištrinti negrįžtamai",
"Rename" => "Pervadinti",
@@ -47,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n failas","%n failai","%n failų"),
"{dirs} and {files}" => "{dirs} ir {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"),
-"'.' is an invalid file name." => "'.' yra neleidžiamas failo pavadinime.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neleistinas pavadinimas, '\\', '/', '<', '>', ':', '\"', '|', '?' ir '*' yra neleidžiami.",
"Your storage is full, files can not be updated or synced anymore!" => "Jūsų visa vieta serveryje užimta",
"Your storage is almost full ({usedSpacePercent}%)" => "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Šifravimo programa įjungta, bet Jūsų raktai nėra pritaikyti. Prašome atsijungti ir vėl prisijungti",
@@ -60,6 +59,7 @@ $TRANSLATIONS = array(
"Name" => "Pavadinimas",
"Size" => "Dydis",
"Modified" => "Pakeista",
+"Invalid folder name. Usage of 'Shared' is reserved." => "Netinkamas aplanko pavadinimas. „Shared“ pavadinimas yra rezervuotas.",
"%s could not be renamed" => "%s negali būti pervadintas",
"Upload" => "Įkelti",
"File handling" => "Failų tvarkymas",
@@ -71,6 +71,7 @@ $TRANSLATIONS = array(
"Maximum input size for ZIP files" => "Maksimalus ZIP archyvo failo dydis",
"Save" => "Išsaugoti",
"New" => "Naujas",
+"New text file" => "Naujas tekstinis failas",
"Text file" => "Teksto failas",
"New folder" => "Naujas aplankas",
"Folder" => "Katalogas",
@@ -84,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje",
"Files are being scanned, please wait." => "Skenuojami failai, prašome palaukti.",
-"Current scanning" => "Šiuo metu skenuojama",
-"Upgrading filesystem cache..." => "Atnaujinamas sistemos kešavimas..."
+"Current scanning" => "Šiuo metu skenuojama"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php
index 7f8975b2940..0d2ebf281ab 100644
--- a/apps/files/l10n/lv.php
+++ b/apps/files/l10n/lv.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu",
"Could not move %s" => "Nevarēja pārvietot %s",
"File name cannot be empty." => "Datnes nosaukums nevar būt tukšs.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nederīgs nosaukums, nav atļauti '\\', '/', '<', '>', ':', '\"', '|', '?' un '*'.",
"Unable to set upload directory." => "Nevar uzstādīt augšupielādes mapi.",
"Invalid Token" => "Nepareiza pilnvara",
"No file was uploaded. Unknown error" => "Netika augšupielādēta neviena datne. Nezināma kļūda",
@@ -16,7 +17,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "Nav pietiekami daudz vietas",
"Invalid directory." => "Nederīga direktorija.",
"Files" => "Datnes",
-"Not enough space available" => "Nepietiek brīvas vietas",
"Upload cancelled." => "Augšupielāde ir atcelta.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.",
"{new_name} already exists" => "{new_name} jau eksistē",
@@ -29,8 +29,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n mapes","%n mape","%n mapes"),
"_%n file_::_%n files_" => array("%n faili","%n fails","%n faili"),
"_Uploading %n file_::_Uploading %n files_" => array("%n","Augšupielāde %n failu","Augšupielāde %n failus"),
-"'.' is an invalid file name." => "'.' ir nederīgs datnes nosaukums.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nederīgs nosaukums, nav atļauti '\\', '/', '<', '>', ':', '\"', '|', '?' un '*'.",
"Your storage is full, files can not be updated or synced anymore!" => "Jūsu krātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!",
"Your storage is almost full ({usedSpacePercent}%)" => "Jūsu krātuve ir gandrīz pilna ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrēšana tika atslēgta, tomēr jūsu faili joprojām ir šifrēti. Atšifrēt failus var Personiskajos uzstādījumos.",
@@ -62,7 +60,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Datne ir par lielu, lai to augšupielādētu",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu",
"Files are being scanned, please wait." => "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.",
-"Current scanning" => "Šobrīd tiek caurskatīts",
-"Upgrading filesystem cache..." => "Uzlabo datņu sistēmas kešatmiņu..."
+"Current scanning" => "Šobrīd tiek caurskatīts"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);";
diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php
index fadf5efc07b..bc9ee15823c 100644
--- a/apps/files/l10n/mk.php
+++ b/apps/files/l10n/mk.php
@@ -3,11 +3,11 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Не можам да го преместам %s - Датотека со такво име веќе постои",
"Could not move %s" => "Не можам да ги префрлам %s",
"File name cannot be empty." => "Името на датотеката не може да биде празно.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправилно име. , '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не се дозволени.",
"Not a valid source" => "Не е валиден извор",
"Error while downloading %s to %s" => "Грешка додека преземам %s to %s",
"Error when creating the file" => "Грешка при креирање на датотека",
"Folder name cannot be empty." => "Името на папката не може да биде празно.",
-"Folder name must not contain \"/\". Please choose a different name." => "Името на папката не смее да содржи \"/\". Одберете друго име.",
"Error when creating the folder" => "Грешка при креирање на папка",
"Unable to set upload directory." => "Не може да се постави папката за префрлање на податоци.",
"Invalid Token" => "Грешен токен",
@@ -23,7 +23,6 @@ $TRANSLATIONS = array(
"Upload failed. Could not find uploaded file" => "Префрлањето е неуспешно. Не можам да го најдам префрлената датотека.",
"Invalid directory." => "Погрешна папка.",
"Files" => "Датотеки",
-"Not enough space available" => "Немате доволно дисков простор",
"Upload cancelled." => "Преземањето е прекинато.",
"Could not get result from server." => "Не можам да добијам резултат од серверот.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.",
@@ -43,8 +42,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("",""),
"{dirs} and {files}" => "{dirs} и {files}",
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"'.' is an invalid file name." => "'.' е грешно име за датотека.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправилно име. , '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' не се дозволени.",
"Your storage is full, files can not be updated or synced anymore!" => "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!",
"Your storage is almost full ({usedSpacePercent}%)" => "Вашиот сториџ е скоро полн ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "Вашето преземање се подготвува. Ова може да потрае до колку датотеките се големи.",
@@ -75,7 +72,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
"Files are being scanned, please wait." => "Се скенираат датотеки, ве молам почекајте.",
-"Current scanning" => "Моментално скенирам",
-"Upgrading filesystem cache..." => "Го надградувам кешот на фјал системот..."
+"Current scanning" => "Моментално скенирам"
);
$PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;";
diff --git a/apps/files/l10n/ml.php b/apps/files/l10n/ml.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/ml.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/mn.php b/apps/files/l10n/mn.php
new file mode 100644
index 00000000000..0157af093e9
--- /dev/null
+++ b/apps/files/l10n/mn.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array("",""),
+"_%n file_::_%n files_" => array("",""),
+"_Uploading %n file_::_Uploading %n files_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php
index ebd7ef38998..b90bee38f99 100644
--- a/apps/files/l10n/nb_NO.php
+++ b/apps/files/l10n/nb_NO.php
@@ -3,6 +3,14 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Kan ikke flytte %s - En fil med samme navn finnes allerede",
"Could not move %s" => "Kunne ikke flytte %s",
"File name cannot be empty." => "Filnavn kan ikke være tomt.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig navn, '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' er ikke tillatt.",
+"The name %s is already used in the folder %s. Please choose a different name." => "Navnet %s brukes allerede i mappen %s. Velg et annet navn.",
+"Not a valid source" => "Ikke en gyldig kilde",
+"Server is not allowed to open URLs, please check the server configuration" => "Serveren har ikke lov til å åpne URL-er. Sjekk konfigurasjon av server",
+"Error while downloading %s to %s" => "Feil ved nedlasting av %s til %s",
+"Error when creating the file" => "Feil ved oppretting av filen",
+"Folder name cannot be empty." => "Mappenavn kan ikke være tomt.",
+"Error when creating the folder" => "Feil ved oppretting av mappen",
"Unable to set upload directory." => "Kunne ikke sette opplastingskatalog.",
"Invalid Token" => "Ugyldig nøkkel",
"No file was uploaded. Unknown error" => "Ingen filer ble lastet opp. Ukjent feil.",
@@ -14,30 +22,44 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Mangler midlertidig mappe",
"Failed to write to disk" => "Klarte ikke å skrive til disk",
"Not enough storage available" => "Ikke nok lagringsplass",
+"Upload failed. Could not find uploaded file" => "Opplasting feilet. Fant ikke opplastet fil.",
+"Upload failed. Could not get file info." => "Opplasting feilet. Klarte ikke å finne informasjon om fil.",
"Invalid directory." => "Ugyldig katalog.",
"Files" => "Filer",
-"Not enough space available" => "Ikke nok lagringsplass",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 bytes",
"Upload cancelled." => "Opplasting avbrutt.",
+"Could not get result from server." => "Fikk ikke resultat fra serveren.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Filopplasting pågår. Forlater du siden nå avbrytes opplastingen.",
+"URL cannot be empty" => "URL kan ikke være tom",
+"In the home folder 'Shared' is a reserved filename" => "I hjemmemappen er 'Shared' et reservert filnavn",
"{new_name} already exists" => "{new_name} finnes allerede",
+"Could not create file" => "Klarte ikke å opprette fil",
+"Could not create folder" => "Klarte ikke å opprette mappe",
+"Error fetching URL" => "Feil ved henting av URL",
"Share" => "Del",
"Delete permanently" => "Slett permanent",
"Rename" => "Gi nytt navn",
"Pending" => "Ventende",
+"Could not rename file" => "Klarte ikke å gi nytt navn til fil",
"replaced {new_name} with {old_name}" => "erstattet {new_name} med {old_name}",
"undo" => "angre",
+"Error deleting file." => "Feil ved sletting av fil.",
"_%n folder_::_%n folders_" => array("%n mappe","%n mapper"),
"_%n file_::_%n files_" => array("%n fil","%n filer"),
+"{dirs} and {files}" => "{dirs} og {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Laster opp %n fil","Laster opp %n filer"),
-"'.' is an invalid file name." => "'.' er et ugyldig filnavn.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig navn, '\\', '/', '<', '>', ':', '\"', '|', '?' og '*' er ikke tillatt.",
"Your storage is full, files can not be updated or synced anymore!" => "Lagringsplass er oppbrukt, filer kan ikke lenger oppdateres eller synkroniseres!",
"Your storage is almost full ({usedSpacePercent}%)" => "Lagringsplass er nesten brukt opp ([usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Ugyldig privat nøkkel for Krypterings-app. Oppdater passordet for din private nøkkel i dine personlige innstillinger for å gjenopprette tilgang til de krypterte filene dine.",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kryptering ble slått av men filene dine er fremdeles kryptert. Gå til dine personlige innstillinger for å dekryptere filene dine.",
"Your download is being prepared. This might take some time if the files are big." => "Nedlastingen din klargjøres. Hvis filene er store kan dette ta litt tid.",
+"Error moving file" => "Feil ved flytting av fil",
"Error" => "Feil",
"Name" => "Navn",
"Size" => "Størrelse",
"Modified" => "Endret",
+"Invalid folder name. Usage of 'Shared' is reserved." => "Ulovlig mappenavn. Bruken av 'Shared' er reservert.",
"%s could not be renamed" => "Kunne ikke gi nytt navn til %s",
"Upload" => "Last opp",
"File handling" => "Filhåndtering",
@@ -49,19 +71,20 @@ $TRANSLATIONS = array(
"Maximum input size for ZIP files" => "Maksimal størrelse på ZIP-filer",
"Save" => "Lagre",
"New" => "Ny",
+"New text file" => "Ny tekstfil",
"Text file" => "Tekstfil",
"New folder" => "Ny mappe",
"Folder" => "Mappe",
"From link" => "Fra link",
-"Deleted files" => "Slettet filer",
+"Deleted files" => "Slettede filer",
"Cancel upload" => "Avbryt opplasting",
+"You don’t have permission to upload or create files here" => "Du har ikke tillatelse til å laste opp eller opprette filer her",
"Nothing in here. Upload something!" => "Ingenting her. Last opp noe!",
"Download" => "Last ned",
"Delete" => "Slett",
"Upload too large" => "Filen er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren.",
"Files are being scanned, please wait." => "Skanner filer, vennligst vent.",
-"Current scanning" => "Pågående skanning",
-"Upgrading filesystem cache..." => "Oppgraderer filsystemets mellomlager..."
+"Current scanning" => "Pågående skanning"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php
index a391e25b952..c617f0bfdde 100644
--- a/apps/files/l10n/nl.php
+++ b/apps/files/l10n/nl.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Kon %s niet verplaatsen - Er bestaat al een bestand met deze naam",
"Could not move %s" => "Kon %s niet verplaatsen",
"File name cannot be empty." => "Bestandsnaam kan niet leeg zijn.",
-"File name must not contain \"/\". Please choose a different name." => "De bestandsnaam mag geen \"/\" bevatten. Kies een andere naam.",
+"\"%s\" is an invalid file name." => "\"%s\" is een ongeldige bestandsnaam.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Onjuiste naam; '\\', '/', '<', '>', ':', '\"', '|', '?' en '*' zijn niet toegestaan.",
+"The target folder has been moved or deleted." => "De doelmap is verplaatst of verwijderd.",
"The name %s is already used in the folder %s. Please choose a different name." => "De naam %s bestaat al in map %s. Kies een andere naam.",
"Not a valid source" => "Geen geldige bron",
"Server is not allowed to open URLs, please check the server configuration" => "Server mag geen URS's openen, controleer de server configuratie",
"Error while downloading %s to %s" => "Fout bij downloaden %s naar %s",
"Error when creating the file" => "Fout bij creëren bestand",
"Folder name cannot be empty." => "Mapnaam mag niet leeg zijn.",
-"Folder name must not contain \"/\". Please choose a different name." => "De mapnaam mag geen \"/\" bevatten. Kies een andere naam.",
"Error when creating the folder" => "Fout bij aanmaken map",
"Unable to set upload directory." => "Kan upload map niet instellen.",
"Invalid Token" => "Ongeldig Token",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Er ontbreekt een tijdelijke map",
"Failed to write to disk" => "Schrijven naar schijf mislukt",
"Not enough storage available" => "Niet genoeg opslagruimte beschikbaar",
-"Upload failed. Could not get file info." => "Upload mislukt, Kon geen bestandsinfo krijgen.",
"Upload failed. Could not find uploaded file" => "Upload mislukt. Kon ge-uploade bestand niet vinden",
+"Upload failed. Could not get file info." => "Upload mislukt, Kon geen bestandsinfo krijgen.",
"Invalid directory." => "Ongeldige directory.",
"Files" => "Bestanden",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is",
-"Not enough space available" => "Niet genoeg ruimte beschikbaar",
+"Total file size {size1} exceeds upload limit {size2}" => "Totale bestandsgrootte {size1} groter dan uploadlimiet {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Niet genoeg vrije ruimte. U upload {size1}, maar is is slechts {size2} beschikbaar",
"Upload cancelled." => "Uploaden geannuleerd.",
"Could not get result from server." => "Kon het resultaat van de server niet terugkrijgen.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("","%n bestanden"),
"{dirs} and {files}" => "{dirs} en {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n bestand aan het uploaden","%n bestanden aan het uploaden"),
-"'.' is an invalid file name." => "'.' is een ongeldige bestandsnaam.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Onjuiste naam; '\\', '/', '<', '>', ':', '\"', '|', '?' en '*' zijn niet toegestaan.",
+"\"{name}\" is an invalid file name." => "\"{name}\" is een ongeldige bestandsnaam.",
"Your storage is full, files can not be updated or synced anymore!" => "Uw opslagruimte zit vol, Bestanden kunnen niet meer worden ge-upload of gesynchroniseerd!",
"Your storage is almost full ({usedSpacePercent}%)" => "Uw opslagruimte zit bijna vol ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Crypto app is geactiveerd, maar uw sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Upload is te groot",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
"Files are being scanned, please wait." => "Bestanden worden gescand, even wachten.",
-"Current scanning" => "Er wordt gescand",
-"Upgrading filesystem cache..." => "Upgraden bestandssysteem cache..."
+"Current scanning" => "Er wordt gescand"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php
index a5e6e737eae..4f74167d9ad 100644
--- a/apps/files/l10n/nn_NO.php
+++ b/apps/files/l10n/nn_NO.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet",
"Could not move %s" => "Klarte ikkje flytta %s",
"File name cannot be empty." => "Filnamnet kan ikkje vera tomt.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig namn, «\\», «/», «<», «>», «:», «\"», «|», «?» og «*» er ikkje tillate.",
"Unable to set upload directory." => "Klarte ikkje å endra opplastingsmappa.",
"Invalid Token" => "Ugyldig token",
"No file was uploaded. Unknown error" => "Ingen filer lasta opp. Ukjend feil",
@@ -14,12 +15,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manglar ei mellombels mappe",
"Failed to write to disk" => "Klarte ikkje skriva til disk",
"Not enough storage available" => "Ikkje nok lagringsplass tilgjengeleg",
-"Upload failed. Could not get file info." => "Feil ved opplasting. Klarte ikkje å henta filinfo.",
"Upload failed. Could not find uploaded file" => "Feil ved opplasting. Klarte ikkje å finna opplasta fil.",
+"Upload failed. Could not get file info." => "Feil ved opplasting. Klarte ikkje å henta filinfo.",
"Invalid directory." => "Ugyldig mappe.",
"Files" => "Filer",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.",
-"Not enough space available" => "Ikkje nok lagringsplass tilgjengeleg",
"Upload cancelled." => "Opplasting avbroten.",
"Could not get result from server." => "Klarte ikkje å henta resultat frå tenaren.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
@@ -34,8 +34,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fil","%n filer"),
"{dirs} and {files}" => "{dirs} og {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Lastar opp %n fil","Lastar opp %n filer"),
-"'.' is an invalid file name." => "«.» er eit ugyldig filnamn.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldig namn, «\\», «/», «<», «>», «:», «\"», «|», «?» og «*» er ikkje tillate.",
"Your storage is full, files can not be updated or synced anymore!" => "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!",
"Your storage is almost full ({usedSpacePercent}%)" => "Lagringa di er nesten full ({usedSpacePercent} %)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kryptering er skrudd av, men filene dine er enno krypterte. Du kan dekryptera filene i personlege innstillingar.",
@@ -67,7 +65,6 @@ $TRANSLATIONS = array(
"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.",
-"Current scanning" => "Køyrande skanning",
-"Upgrading filesystem cache..." => "Oppgraderer mellomlageret av filsystemet …"
+"Current scanning" => "Køyrande skanning"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php
index 031bd508700..3e93dc881e9 100644
--- a/apps/files/l10n/pl.php
+++ b/apps/files/l10n/pl.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Nie można było przenieść %s - Plik o takiej nazwie już istnieje",
"Could not move %s" => "Nie można było przenieść %s",
"File name cannot be empty." => "Nazwa pliku nie może być pusta.",
-"File name must not contain \"/\". Please choose a different name." => "Nazwa pliku nie może zawierać \"/\". Proszę wybrać inną nazwę.",
+"\"%s\" is an invalid file name." => "\"%s\" jest nieprawidłową nazwą pliku.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nieprawidłowa nazwa. Znaki '\\', '/', '<', '>', ':', '\"', '|', '?' oraz '*' są niedozwolone.",
+"The target folder has been moved or deleted." => "Folder docelowy został przeniesiony lub usunięty",
"The name %s is already used in the folder %s. Please choose a different name." => "Nazwa %s jest już używana w folderze %s. Proszę wybrać inną nazwę.",
"Not a valid source" => "Niepoprawne źródło",
"Server is not allowed to open URLs, please check the server configuration" => "Serwer nie mógł otworzyć adresów URL, należy sprawdzić konfigurację serwera",
"Error while downloading %s to %s" => "Błąd podczas pobierania %s do %S",
"Error when creating the file" => "Błąd przy tworzeniu pliku",
"Folder name cannot be empty." => "Nazwa folderu nie może być pusta.",
-"Folder name must not contain \"/\". Please choose a different name." => "Nazwa folderu nie może zawierać \"/\". Proszę wybrać inną nazwę.",
"Error when creating the folder" => "Błąd przy tworzeniu folderu",
"Unable to set upload directory." => "Nie można ustawić katalog wczytywania.",
"Invalid Token" => "Nieprawidłowy Token",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Brak folderu tymczasowego",
"Failed to write to disk" => "Błąd zapisu na dysk",
"Not enough storage available" => "Za mało dostępnego miejsca",
-"Upload failed. Could not get file info." => "Nieudane przesłanie. Nie można pobrać informacji o pliku.",
"Upload failed. Could not find uploaded file" => "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku",
+"Upload failed. Could not get file info." => "Nieudane przesłanie. Nie można pobrać informacji o pliku.",
"Invalid directory." => "Zła ścieżka.",
"Files" => "Pliki",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów",
-"Not enough space available" => "Za mało miejsca",
+"Total file size {size1} exceeds upload limit {size2}" => "Całkowity rozmiar {size1} przekracza limit uploadu {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Brak wolnej przestrzeni, przesyłasz {size1} a pozostało tylko {size2}",
"Upload cancelled." => "Wczytywanie anulowane.",
"Could not get result from server." => "Nie można uzyskać wyniku z serwera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
@@ -48,10 +50,9 @@ $TRANSLATIONS = array(
"Error deleting file." => "Błąd podczas usuwania pliku",
"_%n folder_::_%n folders_" => array("%n katalog","%n katalogi","%n katalogów"),
"_%n file_::_%n files_" => array("%n plik","%n pliki","%n plików"),
-"{dirs} and {files}" => "{dirs} and {files}",
+"{dirs} and {files}" => "{dirs} i {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Wysyłanie %n pliku","Wysyłanie %n plików","Wysyłanie %n plików"),
-"'.' is an invalid file name." => "„.” jest nieprawidłową nazwą pliku.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nieprawidłowa nazwa. Znaki '\\', '/', '<', '>', ':', '\"', '|', '?' oraz '*' są niedozwolone.",
+"\"{name}\" is an invalid file name." => "\"{name}\" jest nieprawidłową nazwą pliku.",
"Your storage is full, files can not be updated or synced anymore!" => "Magazyn jest pełny. Pliki nie mogą zostać zaktualizowane lub zsynchronizowane!",
"Your storage is almost full ({usedSpacePercent}%)" => "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikacja szyfrująca jest aktywna, ale twoje klucze nie zostały zainicjowane, prosze wyloguj się i zaloguj ponownie.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Ładowany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.",
"Files are being scanned, please wait." => "Skanowanie plików, proszę czekać.",
-"Current scanning" => "Aktualnie skanowane",
-"Upgrading filesystem cache..." => "Uaktualnianie plików pamięci podręcznej..."
+"Current scanning" => "Aktualnie skanowane"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php
index f84dcfcd488..d0c27431daa 100644
--- a/apps/files/l10n/pt_BR.php
+++ b/apps/files/l10n/pt_BR.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Impossível mover %s - Um arquivo com este nome já existe",
"Could not move %s" => "Impossível mover %s",
"File name cannot be empty." => "O nome do arquivo não pode estar vazio.",
-"File name must not contain \"/\". Please choose a different name." => "O nome do arquivo não deve conter \"/\". Por favor, escolha um nome diferente.",
+"\"%s\" is an invalid file name." => "\"%s\" é um nome de arquivo inválido.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
+"The target folder has been moved or deleted." => "A pasta de destino foi movida ou excluída.",
"The name %s is already used in the folder %s. Please choose a different name." => "O nome %s já é usado na pasta %s. Por favor, escolha um nome diferente.",
"Not a valid source" => "Não é uma fonte válida",
"Server is not allowed to open URLs, please check the server configuration" => "Não é permitido ao servidor abrir URLs, por favor verificar a configuração do servidor.",
"Error while downloading %s to %s" => "Erro ao baixar %s para %s",
"Error when creating the file" => "Erro ao criar o arquivo",
"Folder name cannot be empty." => "O nome da pasta não pode estar vazio.",
-"Folder name must not contain \"/\". Please choose a different name." => "O nome da pasta não pode conter \"/\". Por favor, escolha um nome diferente.",
"Error when creating the folder" => "Erro ao criar a pasta",
"Unable to set upload directory." => "Impossível configurar o diretório de upload",
"Invalid Token" => "Token inválido",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Pasta temporária não encontrada",
"Failed to write to disk" => "Falha ao escrever no disco",
"Not enough storage available" => "Espaço de armazenamento insuficiente",
-"Upload failed. Could not get file info." => "Falha no envio. Não foi possível obter informações do arquivo.",
"Upload failed. Could not find uploaded file" => "Falha no envio. Não foi possível encontrar o arquivo enviado",
+"Upload failed. Could not get file info." => "Falha no envio. Não foi possível obter informações do arquivo.",
"Invalid directory." => "Diretório inválido.",
"Files" => "Arquivos",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes",
-"Not enough space available" => "Espaço de armazenamento insuficiente",
+"Total file size {size1} exceeds upload limit {size2}" => "Tamanho total do arquivo {size1} excede limite de envio {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}",
"Upload cancelled." => "Envio cancelado.",
"Could not get result from server." => "Não foi possível obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Upload em andamento. Sair da página agora resultará no cancelamento do envio.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n arquivo","%n arquivos"),
"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Enviando %n arquivo","Enviando %n arquivos"),
-"'.' is an invalid file name." => "'.' é um nome de arquivo inválido.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
+"\"{name}\" is an invalid file name." => "\"{name}\" é um nome de arquivo inválido.",
"Your storage is full, files can not be updated or synced anymore!" => "Seu armazenamento está cheio, arquivos não podem mais ser atualizados ou sincronizados!",
"Your storage is almost full ({usedSpacePercent}%)" => "Seu armazenamento está quase cheio ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "App de encriptação está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Upload muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.",
"Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.",
-"Current scanning" => "Scanning atual",
-"Upgrading filesystem cache..." => "Atualizando cache do sistema de arquivos..."
+"Current scanning" => "Scanning atual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php
index 4b9fade2e22..3b3c2f842bd 100644
--- a/apps/files/l10n/pt_PT.php
+++ b/apps/files/l10n/pt_PT.php
@@ -1,8 +1,16 @@
<?php
$TRANSLATIONS = array(
-"Could not move %s - File with this name already exists" => "Não foi possível mover o ficheiro %s - Já existe um ficheiro com esse nome",
+"Could not move %s - File with this name already exists" => "Não pôde mover o ficheiro %s - Já existe um ficheiro com esse nome",
"Could not move %s" => "Não foi possível move o ficheiro %s",
"File name cannot be empty." => "O nome do ficheiro não pode estar vazio.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome Inválido, os caracteres '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
+"The name %s is already used in the folder %s. Please choose a different name." => "O nome %s já está em uso na pasta %s. Por favor escolha um nome diferente.",
+"Not a valid source" => "Não é uma fonte válida",
+"Server is not allowed to open URLs, please check the server configuration" => "O servidor não consegue abrir URLs, por favor verifique a configuração do servidor",
+"Error while downloading %s to %s" => "Erro ao transferir %s para %s",
+"Error when creating the file" => "Erro ao criar o ficheiro",
+"Folder name cannot be empty." => "O nome da pasta não pode estar vazio.",
+"Error when creating the folder" => "Erro ao criar a pasta",
"Unable to set upload directory." => "Não foi possível criar o diretório de upload",
"Invalid Token" => "Token inválido",
"No file was uploaded. Unknown error" => "Nenhum ficheiro foi carregado. Erro desconhecido",
@@ -14,28 +22,36 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Está a faltar a pasta temporária",
"Failed to write to disk" => "Falhou a escrita no disco",
"Not enough storage available" => "Não há espaço suficiente em disco",
+"Upload failed. Could not find uploaded file" => "Falhou o envio. Não conseguiu encontrar o ficheiro enviado",
"Upload failed. Could not get file info." => "O carregamento falhou. Não foi possível obter a informação do ficheiro.",
"Invalid directory." => "Directório Inválido",
"Files" => "Ficheiros",
-"Not enough space available" => "Espaço em disco insuficiente!",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Incapaz de enviar {filename}, dado que é uma pasta, ou tem 0 bytes",
"Upload cancelled." => "Envio cancelado.",
"Could not get result from server." => "Não foi possível obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Envio de ficheiro em progresso. Irá cancelar o envio se sair da página agora.",
+"URL cannot be empty" => "URL não pode estar vazio",
+"In the home folder 'Shared' is a reserved filename" => "Na pasta pessoal \"Partilhado\" é um nome de ficheiro reservado",
"{new_name} already exists" => "O nome {new_name} já existe",
+"Could not create file" => "Não pôde criar ficheiro",
+"Could not create folder" => "Não pôde criar pasta",
+"Error fetching URL" => "Erro ao obter URL",
"Share" => "Partilhar",
"Delete permanently" => "Eliminar permanentemente",
"Rename" => "Renomear",
"Pending" => "Pendente",
+"Could not rename file" => "Não pôde renomear o ficheiro",
"replaced {new_name} with {old_name}" => "substituido {new_name} por {old_name}",
"undo" => "desfazer",
+"Error deleting file." => "Erro ao apagar o ficheiro.",
"_%n folder_::_%n folders_" => array("%n pasta","%n pastas"),
"_%n file_::_%n files_" => array("%n ficheiro","%n ficheiros"),
"{dirs} and {files}" => "{dirs} e {files}",
"_Uploading %n file_::_Uploading %n files_" => array("A carregar %n ficheiro","A carregar %n ficheiros"),
-"'.' is an invalid file name." => "'.' não é um nome de ficheiro válido!",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome Inválido, os caracteres '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
"Your storage is full, files can not be updated or synced anymore!" => "O seu armazenamento está cheio, os ficheiros não podem ser sincronizados.",
"Your storage is almost full ({usedSpacePercent}%)" => "O seu espaço de armazenamento está quase cheiro ({usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "A encriptação foi desactivada mas os seus ficheiros continuam encriptados. Por favor consulte as suas definições pessoais para desencriptar os ficheiros.",
"Your download is being prepared. This might take some time if the files are big." => "O seu download está a ser preparado. Este processo pode demorar algum tempo se os ficheiros forem grandes.",
"Error moving file" => "Erro ao mover o ficheiro",
@@ -43,6 +59,7 @@ $TRANSLATIONS = array(
"Name" => "Nome",
"Size" => "Tamanho",
"Modified" => "Modificado",
+"Invalid folder name. Usage of 'Shared' is reserved." => "Nome de pasta inválido. Utilização de \"Partilhado\" está reservada.",
"%s could not be renamed" => "%s não pode ser renomeada",
"Upload" => "Carregar",
"File handling" => "Manuseamento de ficheiros",
@@ -54,19 +71,20 @@ $TRANSLATIONS = array(
"Maximum input size for ZIP files" => "Tamanho máximo para ficheiros ZIP",
"Save" => "Guardar",
"New" => "Novo",
+"New text file" => "Novo ficheiro de texto",
"Text file" => "Ficheiro de texto",
"New folder" => "Nova Pasta",
"Folder" => "Pasta",
"From link" => "Da ligação",
"Deleted files" => "Ficheiros eliminados",
"Cancel upload" => "Cancelar envio",
+"You don’t have permission to upload or create files here" => "Você não tem permissão para enviar ou criar ficheiros aqui",
"Nothing in here. Upload something!" => "Vazio. Envie alguma coisa!",
"Download" => "Transferir",
"Delete" => "Eliminar",
"Upload too large" => "Upload muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.",
"Files are being scanned, please wait." => "Os ficheiros estão a ser analisados, por favor aguarde.",
-"Current scanning" => "Análise actual",
-"Upgrading filesystem cache..." => "Atualizar cache do sistema de ficheiros..."
+"Current scanning" => "Análise actual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php
index 933625d8d1e..7686025e35c 100644
--- a/apps/files/l10n/ro.php
+++ b/apps/files/l10n/ro.php
@@ -1,73 +1,77 @@
<?php
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s nu se poate muta - Fișierul cu acest nume există deja ",
-"Could not move %s" => "Nu s-a putut muta %s",
+"Could not move %s" => "Nu se poate muta %s",
"File name cannot be empty." => "Numele fișierului nu poate rămâne gol.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume nevalide, '\\', '/', '<', '>', ':', '\"', '|', '?' și '*' nu sunt permise.",
+"Error when creating the file" => "Eroare la crearea fisierului",
+"Error when creating the folder" => "Eroare la crearea folderului",
"Unable to set upload directory." => "Imposibil de a seta directorul pentru incărcare.",
"Invalid Token" => "Jeton Invalid",
-"No file was uploaded. Unknown error" => "Nici un fișier nu a fost încărcat. Eroare necunoscută",
+"No file was uploaded. Unknown error" => "Niciun fișier nu a fost încărcat. Eroare necunoscută",
"There is no error, the file uploaded with success" => "Nu a apărut nici o eroare, fișierul a fost încărcat cu succes",
-"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fisierul incarcat depaseste marimea maxima permisa in php.ini: ",
-"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fișierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Fișierul încărcat depășește directiva upload_max_filesize din php.ini:",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fișierul încărcat depășește directiva MAX_FILE_SIZE specificată în formularul HTML",
"The uploaded file was only partially uploaded" => "Fișierul a fost încărcat doar parțial",
-"No file was uploaded" => "Nu a fost încărcat nici un fișier",
+"No file was uploaded" => "Nu a fost încărcat niciun fișier",
"Missing a temporary folder" => "Lipsește un dosar temporar",
-"Failed to write to disk" => "Eroare la scrierea discului",
-"Not enough storage available" => "Nu este suficient spațiu disponibil",
-"Upload failed. Could not get file info." => "Încărcare eșuată. Nu se pot obține informații despre fișier.",
+"Failed to write to disk" => "Eroare la scrierea pe disc",
+"Not enough storage available" => "Nu este disponibil suficient spațiu",
"Upload failed. Could not find uploaded file" => "Încărcare eșuată. Nu se poate găsi fișierul încărcat",
-"Invalid directory." => "registru invalid.",
+"Upload failed. Could not get file info." => "Încărcare eșuată. Nu se pot obține informații despre fișier.",
+"Invalid directory." => "Dosar nevalid.",
"Files" => "Fișiere",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
-"Not enough space available" => "Nu este suficient spațiu disponibil",
"Upload cancelled." => "Încărcare anulată.",
"Could not get result from server." => "Nu se poate obține rezultatul de la server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.",
-"{new_name} already exists" => "{new_name} deja exista",
-"Share" => "a imparti",
-"Delete permanently" => "Stergere permanenta",
-"Rename" => "Redenumire",
-"Pending" => "in timpul",
-"replaced {new_name} with {old_name}" => "{new_name} inlocuit cu {old_name}",
-"undo" => "Anulează ultima acțiune",
+"URL cannot be empty" => "URL nu poate fi gol",
+"{new_name} already exists" => "{new_name} există deja",
+"Could not create file" => "Nu s-a putut crea fisierul",
+"Could not create folder" => "Nu s-a putut crea folderul",
+"Share" => "Partajează",
+"Delete permanently" => "Șterge permanent",
+"Rename" => "Redenumește",
+"Pending" => "În așteptare",
+"Could not rename file" => "Nu s-a putut redenumi fisierul",
+"replaced {new_name} with {old_name}" => "{new_name} a fost înlocuit cu {old_name}",
+"undo" => "desfă",
"_%n folder_::_%n folders_" => array("%n director","%n directoare","%n directoare"),
"_%n file_::_%n files_" => array("%n fișier","%n fișiere","%n fișiere"),
"{dirs} and {files}" => "{dirs} și {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."),
-"'.' is an invalid file name." => "'.' este un nume invalid de fișier.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nume invalide, '\\', '/', '<', '>', ':', '\"', '|', '?' si '*' nu sunt permise.",
-"Your storage is full, files can not be updated or synced anymore!" => "Spatiul de stocare este plin, fisierele nu mai pot fi actualizate sau sincronizate",
-"Your storage is almost full ({usedSpacePercent}%)" => "Spatiul de stocare este aproape plin {spatiu folosit}%",
+"Your storage is full, files can not be updated or synced anymore!" => "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!",
+"Your storage is almost full ({usedSpacePercent}%)" => "Spațiul de stocare este aproape plin ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "criptarea a fost disactivata dar fisierele sant inca criptate.va rog intrati in setarile personale pentru a decripta fisierele",
-"Your download is being prepared. This might take some time if the files are big." => "in curs de descarcare. Aceasta poate să dureze ceva timp dacă fișierele sunt mari.",
+"Your download is being prepared. This might take some time if the files are big." => "Se pregătește descărcarea. Aceasta poate dura ceva timp dacă fișierele sunt mari.",
"Error moving file" => "Eroare la mutarea fișierului",
"Error" => "Eroare",
"Name" => "Nume",
-"Size" => "Dimensiune",
+"Size" => "Mărime",
"Modified" => "Modificat",
"%s could not be renamed" => "%s nu a putut fi redenumit",
-"Upload" => "Încărcare",
+"Upload" => "Încărcă",
"File handling" => "Manipulare fișiere",
"Maximum upload size" => "Dimensiune maximă admisă la încărcare",
"max. possible: " => "max. posibil:",
-"Needed for multi-file and folder downloads." => "necesar la descarcarea mai multor liste si fisiere",
-"Enable ZIP-download" => "permite descarcarea codurilor ZIP",
-"0 is unlimited" => "0 e nelimitat",
-"Maximum input size for ZIP files" => "Dimensiunea maximă de intrare pentru fișiere compresate",
+"Needed for multi-file and folder downloads." => "Necesar pentru descărcarea mai multor fișiere și a dosarelor.",
+"Enable ZIP-download" => "Permite descărcarea ZIP",
+"0 is unlimited" => "0 este nelimitat",
+"Maximum input size for ZIP files" => "Dimensiunea maximă de intrare pentru fișierele ZIP",
"Save" => "Salvează",
"New" => "Nou",
-"Text file" => "lista",
+"Text file" => "Fișier text",
"Folder" => "Dosar",
-"From link" => "de la adresa",
-"Deleted files" => "Sterge fisierele",
+"From link" => "De la adresa",
+"Deleted files" => "Fișiere șterse",
"Cancel upload" => "Anulează încărcarea",
+"You don’t have permission to upload or create files here" => "Nu aveti permisiunea de a incarca sau crea fisiere aici",
"Nothing in here. Upload something!" => "Nimic aici. Încarcă ceva!",
"Download" => "Descarcă",
"Delete" => "Șterge",
"Upload too large" => "Fișierul încărcat este prea mare",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fișierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server.",
-"Files are being scanned, please wait." => "Fișierele sunt scanate, asteptati va rog",
-"Current scanning" => "În curs de scanare",
-"Upgrading filesystem cache..." => "Modernizare fisiere de sistem cache.."
+"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ă.",
+"Current scanning" => "În curs de scanare"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php
index 968da63aaca..2c0335f3cc3 100644
--- a/apps/files/l10n/ru.php
+++ b/apps/files/l10n/ru.php
@@ -3,66 +3,62 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Невозможно переместить %s - файл с таким именем уже существует",
"Could not move %s" => "Невозможно переместить %s",
"File name cannot be empty." => "Имя файла не может быть пустым.",
-"File name must not contain \"/\". Please choose a different name." => "Имя файла не должно содержать символ \"/\". Пожалуйста, выберите другое имя.",
-"The name %s is already used in the folder %s. Please choose a different name." => "Имя %s уже используется в папке %s. Пожалуйста выберите другое имя.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправильное имя: символы '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.",
+"The name %s is already used in the folder %s. Please choose a different name." => "Имя %s уже используется для каталога %s. Пожалуйста, выберите другое имя.",
"Not a valid source" => "Неправильный источник",
"Server is not allowed to open URLs, please check the server configuration" => "Сервер не позволяет открывать URL-адреса, пожалуйста, проверьте настройки сервера",
-"Error while downloading %s to %s" => "Ошибка при загрузке %s в %s",
+"Error while downloading %s to %s" => "Ошибка при скачивании %s в %s",
"Error when creating the file" => "Ошибка при создании файла",
"Folder name cannot be empty." => "Имя папки не может быть пустым.",
-"Folder name must not contain \"/\". Please choose a different name." => "Имя папки не должно содержать символ \"/\". Пожалуйста, выберите другое имя.",
-"Error when creating the folder" => "Ошибка при создании папки",
+"Error when creating the folder" => "Ошибка создания каталога",
"Unable to set upload directory." => "Не удалось установить каталог загрузки.",
"Invalid Token" => "Недопустимый маркер",
"No file was uploaded. Unknown error" => "Файл не был загружен. Неизвестная ошибка",
"There is no error, the file uploaded with success" => "Файл загружен успешно.",
-"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Файл превышает размер установленный upload_max_filesize в php.ini:",
-"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Загружаемый файл превосходит значение переменной MAX_FILE_SIZE, указанной в форме HTML",
-"The uploaded file was only partially uploaded" => "Файл загружен частично",
-"No file was uploaded" => "Файл не был загружен",
-"Missing a temporary folder" => "Отсутствует временная папка",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Файл превышает размер, установленный параметром upload_max_filesize в php.ini:",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Загруженный файл превышает размер, установленный параметром MAX_FILE_SIZE в HTML-форме",
+"The uploaded file was only partially uploaded" => "Файл загружен лишь частично",
+"No file was uploaded" => "Ни одного файла загружено не было",
+"Missing a temporary folder" => "Отсутствует временный каталог",
"Failed to write to disk" => "Ошибка записи на диск",
"Not enough storage available" => "Недостаточно доступного места в хранилище",
+"Upload failed. Could not find uploaded file" => "Загрузка не удалась. Невозможно найти загружаемый файл",
"Upload failed. Could not get file info." => "Загрузка не удалась. Невозможно получить информацию о файле",
-"Upload failed. Could not find uploaded file" => "Загрузка не удалась. Невозможно найти загруженный файл",
-"Invalid directory." => "Неправильный каталог.",
+"Invalid directory." => "Неверный каталог.",
"Files" => "Файлы",
-"Unable to upload {filename} as it is a directory or has 0 bytes" => "Невозможно загрузить файл {filename} так как он является директорией либо имеет размер 0 байт",
-"Not enough space available" => "Недостаточно свободного места",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Невозможно загрузить {filename}, так как это либо каталог, либо файл нулевого размера",
"Upload cancelled." => "Загрузка отменена.",
-"Could not get result from server." => "Не получен ответ от сервера",
-"File upload is in progress. Leaving the page now will cancel the upload." => "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку.",
+"Could not get result from server." => "Не удалось получить ответ от сервера.",
+"File upload is in progress. Leaving the page now will cancel the upload." => "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.",
"URL cannot be empty" => "Ссылка не может быть пустой.",
-"In the home folder 'Shared' is a reserved filename" => "В домашней папке 'Shared' зарезервированное имя файла",
+"In the home folder 'Shared' is a reserved filename" => "'Shared' - это зарезервированное имя файла в домашнем каталоге",
"{new_name} already exists" => "{new_name} уже существует",
"Could not create file" => "Не удалось создать файл",
-"Could not create folder" => "Не удалось создать папку",
+"Could not create folder" => "Не удалось создать каталог",
"Error fetching URL" => "Ошибка получения URL",
"Share" => "Открыть доступ",
-"Delete permanently" => "Удалено навсегда",
+"Delete permanently" => "Удалить окончательно",
"Rename" => "Переименовать",
"Pending" => "Ожидание",
"Could not rename file" => "Не удалось переименовать файл",
"replaced {new_name} with {old_name}" => "заменено {new_name} на {old_name}",
"undo" => "отмена",
"Error deleting file." => "Ошибка при удалении файла.",
-"_%n folder_::_%n folders_" => array("%n папка","%n папки","%n папок"),
+"_%n folder_::_%n folders_" => array("%n каталог","%n каталога","%n каталогов"),
"_%n file_::_%n files_" => array("%n файл","%n файла","%n файлов"),
"{dirs} and {files}" => "{dirs} и {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Закачка %n файла","Закачка %n файлов","Закачка %n файлов"),
-"'.' is an invalid file name." => "'.' - неправильное имя файла.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неправильное имя, '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.",
-"Your storage is full, files can not be updated or synced anymore!" => "Ваше дисковое пространство полностью заполнено, произведите очистку перед загрузкой новых файлов.",
+"Your storage is full, files can not be updated or synced anymore!" => "Ваше хранилище заполнено, произведите очистку перед загрузкой новых файлов.",
"Your storage is almost full ({usedSpacePercent}%)" => "Ваше хранилище почти заполнено ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Приложение для шифрования активно, но ваши ключи не инициализированы, пожалуйста, перелогиньтесь",
-"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Неверный приватный ключ для приложения шифрования. Пожалуйста, обноваите ваш приватный ключ в персональных настройках чтобы восстановить доступ к вашим зашифрованным файлам.",
-"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Шифрование было отключено, но ваши файлы все еще зашифрованы. Пожалуйста, зайдите на страницу персональных настроек для того, чтобы расшифровать ваши файлы.",
-"Your download is being prepared. This might take some time if the files are big." => "Загрузка началась. Это может потребовать много времени, если файл большого размера.",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Шифрование было отключено, но ваши файлы остались зашифрованными. Зайдите на страницу личных настроек для того, чтобы расшифровать их.",
+"Your download is being prepared. This might take some time if the files are big." => "Идёт подготовка к скачиванию. Это может занять некоторое время, если файлы большого размера.",
"Error moving file" => "Ошибка при перемещении файла",
"Error" => "Ошибка",
"Name" => "Имя",
"Size" => "Размер",
-"Modified" => "Изменён",
+"Modified" => "Дата изменения",
"Invalid folder name. Usage of 'Shared' is reserved." => "Неправильное имя каталога. Имя 'Shared' зарезервировано.",
"%s could not be renamed" => "%s не может быть переименован",
"Upload" => "Загрузка",
@@ -70,26 +66,25 @@ $TRANSLATIONS = array(
"Maximum upload size" => "Максимальный размер загружаемого файла",
"max. possible: " => "макс. возможно: ",
"Needed for multi-file and folder downloads." => "Требуется для скачивания нескольких файлов и папок",
-"Enable ZIP-download" => "Включить ZIP-скачивание",
+"Enable ZIP-download" => "Включить скачивание в виде архивов ZIP",
"0 is unlimited" => "0 - без ограничений",
"Maximum input size for ZIP files" => "Максимальный исходный размер для ZIP файлов",
"Save" => "Сохранить",
"New" => "Новый",
"New text file" => "Новый текстовый файл",
"Text file" => "Текстовый файл",
-"New folder" => "Новая папка",
-"Folder" => "Папка",
-"From link" => "Из ссылки",
+"New folder" => "Новый каталог",
+"Folder" => "Каталог",
+"From link" => "Объект по ссылке",
"Deleted files" => "Удалённые файлы",
-"Cancel upload" => "Отмена загрузки",
-"You don’t have permission to upload or create files here" => "У вас недостаточно прав для загрузки или создания файлов отсюда.",
+"Cancel upload" => "Отменить загрузку",
+"You don’t have permission to upload or create files here" => "У вас нет прав для загрузки или создания файлов здесь.",
"Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!",
"Download" => "Скачать",
"Delete" => "Удалить",
"Upload too large" => "Файл слишком велик",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файлы, которые вы пытаетесь загрузить, превышают лимит для файлов на этом сервере.",
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.",
"Files are being scanned, please wait." => "Подождите, файлы сканируются.",
-"Current scanning" => "Текущее сканирование",
-"Upgrading filesystem cache..." => "Обновление кэша файловой системы..."
+"Current scanning" => "Текущее сканирование"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php
index 2d0eb25f622..e80ca0186cb 100644
--- a/apps/files/l10n/sk_SK.php
+++ b/apps/files/l10n/sk_SK.php
@@ -3,13 +3,13 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Nie je možné presunúť %s - súbor s týmto menom už existuje",
"Could not move %s" => "Nie je možné presunúť %s",
"File name cannot be empty." => "Meno súboru nemôže byť prázdne",
-"File name must not contain \"/\". Please choose a different name." => "Názov súboru nesmie obsahovať \"/\". Prosím zvoľte iný názov.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty.",
"The name %s is already used in the folder %s. Please choose a different name." => "Názov %s už používa priečinok s%. Prosím zvoľte iný názov.",
"Not a valid source" => "Neplatný zdroj",
+"Server is not allowed to open URLs, please check the server configuration" => "Server nie je oprávnený otvárať adresy URL. Overte nastavenia servera.",
"Error while downloading %s to %s" => "Chyba pri sťahovaní súboru %s do %s",
"Error when creating the file" => "Chyba pri vytváraní súboru",
"Folder name cannot be empty." => "Názov priečinka nemôže byť prázdny.",
-"Folder name must not contain \"/\". Please choose a different name." => "Názov priečinka nesmie obsahovať \"/\". Prosím zvoľte iný názov.",
"Error when creating the folder" => "Chyba pri vytváraní priečinka",
"Unable to set upload directory." => "Nemožno nastaviť priečinok pre nahrané súbory.",
"Invalid Token" => "Neplatný token",
@@ -22,12 +22,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Chýba dočasný priečinok",
"Failed to write to disk" => "Zápis na disk sa nepodaril",
"Not enough storage available" => "Nedostatok dostupného úložného priestoru",
-"Upload failed. Could not get file info." => "Nahrávanie zlyhalo. Nepodarilo sa získať informácie o súbore.",
"Upload failed. Could not find uploaded file" => "Nahrávanie zlyhalo. Nepodarilo sa nájsť nahrávaný súbor",
+"Upload failed. Could not get file info." => "Nahrávanie zlyhalo. Nepodarilo sa získať informácie o súbore.",
"Invalid directory." => "Neplatný priečinok.",
"Files" => "Súbory",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov",
-"Not enough space available" => "Nie je k dispozícii dostatok miesta",
"Upload cancelled." => "Odosielanie zrušené.",
"Could not get result from server." => "Nepodarilo sa dostať výsledky zo servera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.",
@@ -36,6 +35,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} už existuje",
"Could not create file" => "Nemožno vytvoriť súbor",
"Could not create folder" => "Nemožno vytvoriť priečinok",
+"Error fetching URL" => "Chyba pri načítavaní URL",
"Share" => "Zdieľať",
"Delete permanently" => "Zmazať trvalo",
"Rename" => "Premenovať",
@@ -48,8 +48,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n súbor","%n súbory","%n súborov"),
"{dirs} and {files}" => "{dirs} a {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov"),
-"'.' is an invalid file name." => "'.' je neplatné meno súboru.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty.",
"Your storage is full, files can not be updated or synced anymore!" => "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
"Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
@@ -87,7 +85,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Nahrávanie je príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
"Files are being scanned, please wait." => "Čakajte, súbory sú prehľadávané.",
-"Current scanning" => "Práve prezerané",
-"Upgrading filesystem cache..." => "Aktualizujem medzipamäť súborového systému..."
+"Current scanning" => "Práve prezerané"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php
index 037e5f6b6b0..ae54ace12da 100644
--- a/apps/files/l10n/sl.php
+++ b/apps/files/l10n/sl.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Datoteke %s ni mogoče premakniti - datoteka s tem imenom že obstaja.",
"Could not move %s" => "Datoteke %s ni mogoče premakniti",
"File name cannot be empty." => "Ime datoteke ne sme biti prazno polje.",
-"File name must not contain \"/\". Please choose a different name." => "Ime datoteke ne sme vsebovati znaka \"/\". Določiti je treba drugo ime.",
+"\"%s\" is an invalid file name." => "\"%s\" je neveljavno ime datoteke.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neveljavno ime; znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni.",
+"The target folder has been moved or deleted." => "Ciljna mapa je premaknjena ali izbrisana.",
"The name %s is already used in the folder %s. Please choose a different name." => "Ime %s je že v mapi %s že v uporabi. Izbrati je treba drugo ime.",
"Not a valid source" => "Vir ni veljaven",
"Server is not allowed to open URLs, please check the server configuration" => "Odpiranje naslovov URL preko strežnika ni dovoljeno. Preverite nastavitve strežnika.",
"Error while downloading %s to %s" => "Napaka med prejemanjem %s v mapo %s",
"Error when creating the file" => "Napaka med ustvarjanjem datoteke",
"Folder name cannot be empty." => "Ime mape ne more biti prazna vrednost.",
-"Folder name must not contain \"/\". Please choose a different name." => "Ime mape ne sme vsebovati znaka \"/\". Določiti je treba drugo ime.",
"Error when creating the folder" => "Napaka med ustvarjanjem mape",
"Unable to set upload directory." => "Mapo, v katero boste prenašali dokumente, ni mogoče določiti",
"Invalid Token" => "Neveljaven žeton",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manjka začasna mapa",
"Failed to write to disk" => "Pisanje na disk je spodletelo",
"Not enough storage available" => "Na voljo ni dovolj prostora",
-"Upload failed. Could not get file info." => "Pošiljanje je spodletelo. Ni mogoče pridobiti podrobnosti datoteke.",
"Upload failed. Could not find uploaded file" => "Pošiljanje je spodletelo. Ni mogoče najti poslane datoteke.",
+"Upload failed. Could not get file info." => "Pošiljanje je spodletelo. Ni mogoče pridobiti podrobnosti datoteke.",
"Invalid directory." => "Neveljavna mapa.",
"Files" => "Datoteke",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Ni mogoče poslati datoteke {filename}, saj je to ali mapa ali pa je velikost datoteke 0 bajtov.",
-"Not enough space available" => "Na voljo ni dovolj prostora.",
+"Total file size {size1} exceeds upload limit {size2}" => "Skupna velikost {size1} presega omejitev velikosti {size2}",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Na voljo ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je je {size2}.",
"Upload cancelled." => "Pošiljanje je preklicano.",
"Could not get result from server." => "Ni mogoče pridobiti podatkov s strežnika.",
"File upload is in progress. Leaving the page now will cancel the upload." => "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n datoteka","%n datoteki","%n datoteke","%n datotek"),
"{dirs} and {files}" => "{dirs} in {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Posodabljanje %n datoteke","Posodabljanje %n datotek","Posodabljanje %n datotek","Posodabljanje %n datotek"),
-"'.' is an invalid file name." => "'.' je neveljavno ime datoteke.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Neveljavno ime; znaki '\\', '/', '<', '>', ':', '\"', '|', '?' in '*' niso dovoljeni.",
+"\"{name}\" is an invalid file name." => "\"{name}\" je neveljavno ime datoteke.",
"Your storage is full, files can not be updated or synced anymore!" => "Shramba je povsem napolnjena. Datotek ni več mogoče posodabljati in usklajevati!",
"Your storage is almost full ({usedSpacePercent}%)" => "Prostor za shranjevanje je skoraj do konca zaseden ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Program za šifriranje je omogočen, vendar ni začet. Odjavite se in nato ponovno prijavite.",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Prekoračenje omejitve velikosti",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.",
"Files are being scanned, please wait." => "Poteka preučevanje datotek, počakajte ...",
-"Current scanning" => "Trenutno poteka preučevanje",
-"Upgrading filesystem cache..." => "Nadgrajevanje predpomnilnika datotečnega sistema ..."
+"Current scanning" => "Trenutno poteka preučevanje"
);
$PLURAL_FORMS = "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);";
diff --git a/apps/files/l10n/sq.php b/apps/files/l10n/sq.php
index a06b6821afe..073f2def624 100644
--- a/apps/files/l10n/sq.php
+++ b/apps/files/l10n/sq.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "E pa mundur zhvendosja e %s - ekziston nje skedar me te njetin emer",
"Could not move %s" => "Nuk mund të zhvendoset %s",
"File name cannot be empty." => "Emri i skedarit nuk mund të jetë bosh.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Emër jo i vlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.",
"Unable to set upload directory." => "E pa mundur të vendoset dosja e ngarkimit",
"Invalid Token" => "Shenjë e gabuar",
"No file was uploaded. Unknown error" => "Asnjë skedar nuk u dërgua. Gabim i pa njohur",
@@ -16,10 +17,11 @@ $TRANSLATIONS = array(
"Not enough storage available" => "Hapsira e arkivimit e pamjaftueshme",
"Invalid directory." => "Dosje e pavlefshme",
"Files" => "Skedarë",
-"Not enough space available" => "Nuk ka hapsirë të nevojshme",
"Upload cancelled." => "Ngarkimi u anullua",
"File upload is in progress. Leaving the page now will cancel the upload." => "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin",
+"URL cannot be empty" => "URL-i nuk mund të jetë bosh",
"{new_name} already exists" => "{new_name} është ekzistues ",
+"Could not create folder" => "I pamundur krijimi i kartelës",
"Share" => "Ndaj",
"Delete permanently" => "Fshi përfundimisht",
"Rename" => "Riemëro",
@@ -30,12 +32,11 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n skedar","%n skedarë"),
"{dirs} and {files}" => "{dirs} dhe {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Po ngarkoj %n skedar","Po ngarkoj %n skedarë"),
-"'.' is an invalid file name." => "'.' nuk është skedar i vlefshem.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Emër jo i vlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.",
"Your storage is full, files can not be updated or synced anymore!" => "Hapsira juaj e arkivimit është plot, skedarët nuk mund të përditësohen ose sinkronizohen!",
"Your storage is almost full ({usedSpacePercent}%)" => "Hapsira juaj e arkivimit është pothuajse në fund ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kodifikimi u çaktivizua por skedarët tuaj vazhdojnë të jenë të kodifikuar. Ju lutem shkoni tek parametrat personale për të dekodifikuar skedarët tuaj.",
"Your download is being prepared. This might take some time if the files are big." => "Shkarkimi juaj është duke u përgatitur. Kjo mund të kërkojë kohë nëse skedarët janë të mëdhenj.",
+"Error moving file" => "Gabim lëvizjen dokumentave",
"Error" => "Gabim",
"Name" => "Emri",
"Size" => "Madhësia",
@@ -52,6 +53,7 @@ $TRANSLATIONS = array(
"Save" => "Ruaj",
"New" => "E re",
"Text file" => "Skedar tekst",
+"New folder" => "Dosje e're",
"Folder" => "Dosje",
"From link" => "Nga lidhja",
"Deleted files" => "Skedarë të fshirë ",
@@ -62,7 +64,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Ngarkimi shumë i madh",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.",
"Files are being scanned, please wait." => "Skanerizimi i skedarit në proces. Ju lutem prisni.",
-"Current scanning" => "Skanimi aktual",
-"Upgrading filesystem cache..." => "Përditësimi i cache-se së sistemit në procesim..."
+"Current scanning" => "Skanimi aktual"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php
index e383b66e078..2a1b478b2ae 100644
--- a/apps/files/l10n/sr.php
+++ b/apps/files/l10n/sr.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Не могу да преместим %s – датотека с овим именом већ постоји",
"Could not move %s" => "Не могу да преместим %s",
"File name cannot be empty." => "Име датотеке не може бити празно.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неисправан назив. Следећи знакови нису дозвољени: \\, /, <, >, :, \", |, ? и *.",
"No file was uploaded. Unknown error" => "Ниједна датотека није отпремљена услед непознате грешке",
"There is no error, the file uploaded with success" => "Није дошло до грешке. Датотека је успешно отпремљена.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Отпремљена датотека прелази смерницу upload_max_filesize у датотеци php.ini:",
@@ -14,7 +15,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "Нема довољно простора",
"Invalid directory." => "неисправна фасцикла.",
"Files" => "Датотеке",
-"Not enough space available" => "Нема довољно простора",
"Upload cancelled." => "Отпремање је прекинуто.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање.",
"{new_name} already exists" => "{new_name} већ постоји",
@@ -27,8 +27,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"'.' is an invalid file name." => "Датотека „.“ је неисправног имена.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Неисправан назив. Следећи знакови нису дозвољени: \\, /, <, >, :, \", |, ? и *.",
"Your storage is full, files can not be updated or synced anymore!" => "Ваше складиште је пуно. Датотеке више не могу бити ажуриране ни синхронизоване.",
"Your storage is almost full ({usedSpacePercent}%)" => "Ваше складиште је скоро па пуно ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "Припремам преузимање. Ово може да потраје ако су датотеке велике.",
@@ -57,7 +55,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Датотека је превелика",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеке које желите да отпремите прелазе ограничење у величини.",
"Files are being scanned, please wait." => "Скенирам датотеке…",
-"Current scanning" => "Тренутно скенирање",
-"Upgrading filesystem cache..." => "Дограђујем кеш система датотека…"
+"Current scanning" => "Тренутно скенирање"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php
index 13ce5ec8b3e..67bf30d8606 100644
--- a/apps/files/l10n/sr@latin.php
+++ b/apps/files/l10n/sr@latin.php
@@ -7,6 +7,7 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nedostaje privremena fascikla",
"Files" => "Fajlovi",
"Share" => "Podeli",
+"Rename" => "Preimenij",
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
diff --git a/apps/files/l10n/su.php b/apps/files/l10n/su.php
new file mode 100644
index 00000000000..70ab6572ba4
--- /dev/null
+++ b/apps/files/l10n/su.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%n folder_::_%n folders_" => array(""),
+"_%n file_::_%n files_" => array(""),
+"_Uploading %n file_::_Uploading %n files_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php
index 9e1b8110d48..fa88a1e966d 100644
--- a/apps/files/l10n/sv.php
+++ b/apps/files/l10n/sv.php
@@ -3,13 +3,12 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Kunde inte flytta %s - Det finns redan en fil med detta namn",
"Could not move %s" => "Kan inte flytta %s",
"File name cannot be empty." => "Filnamn kan inte vara tomt.",
-"File name must not contain \"/\". Please choose a different name." => "Filnamnet får ej innehålla \"/\". Välj ett annat namn.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.",
"The name %s is already used in the folder %s. Please choose a different name." => "Namnet %s används redan i katalogen %s. Välj ett annat namn.",
"Not a valid source" => "Inte en giltig källa",
"Error while downloading %s to %s" => "Fel under nerladdning från %s till %s",
"Error when creating the file" => "Fel under skapande utav filen",
"Folder name cannot be empty." => "Katalognamn kan ej vara tomt.",
-"Folder name must not contain \"/\". Please choose a different name." => "Katalog namnet får ej innehålla \"/\". Välj ett annat namn.",
"Error when creating the folder" => "Fel under skapande utav en katalog",
"Unable to set upload directory." => "Kan inte sätta mapp för uppladdning.",
"Invalid Token" => "Ogiltig token",
@@ -22,12 +21,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "En temporär mapp saknas",
"Failed to write to disk" => "Misslyckades spara till disk",
"Not enough storage available" => "Inte tillräckligt med lagringsutrymme tillgängligt",
-"Upload failed. Could not get file info." => "Uppladdning misslyckades. Gick inte att hämta filinformation.",
"Upload failed. Could not find uploaded file" => "Uppladdning misslyckades. Kunde inte hitta den uppladdade filen",
+"Upload failed. Could not get file info." => "Uppladdning misslyckades. Gick inte att hämta filinformation.",
"Invalid directory." => "Felaktig mapp.",
"Files" => "Filer",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.",
-"Not enough space available" => "Inte tillräckligt med utrymme tillgängligt",
"Upload cancelled." => "Uppladdning avbruten.",
"Could not get result from server." => "Gick inte att hämta resultat från server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.",
@@ -48,8 +46,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n fil","%n filer"),
"{dirs} and {files}" => "{dirs} och {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Laddar upp %n fil","Laddar upp %n filer"),
-"'.' is an invalid file name." => "'.' är ett ogiltigt filnamn.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.",
"Your storage is full, files can not be updated or synced anymore!" => "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
"Your storage is almost full ({usedSpacePercent}%)" => "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen",
@@ -86,7 +82,6 @@ $TRANSLATIONS = array(
"Upload too large" => "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
"Files are being scanned, please wait." => "Filer skannas, var god vänta",
-"Current scanning" => "Aktuell skanning",
-"Upgrading filesystem cache..." => "Uppgraderar filsystemets cache..."
+"Current scanning" => "Aktuell skanning"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php
index f91a74ee9bd..c0589feecea 100644
--- a/apps/files/l10n/ta_LK.php
+++ b/apps/files/l10n/ta_LK.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "செல்லுபடியற்ற பெயர்,'\\', '/', '<', '>', ':', '\"', '|', '?' மற்றும் '*' ஆகியன அனுமதிக்கப்படமாட்டாது.",
"No file was uploaded. Unknown error" => "ஒரு கோப்பும் பதிவேற்றப்படவில்லை. அறியப்படாத வழு",
"There is no error, the file uploaded with success" => "இங்கு வழு இல்லை, கோப்பு வெற்றிகரமாக பதிவேற்றப்பட்டது",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "பதிவேற்றப்பட்ட கோப்பானது HTML படிவத்தில் குறிப்பிடப்பட்டுள்ள MAX_FILE_SIZE directive ஐ விட கூடியது",
@@ -19,7 +20,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "செல்லுபடியற்ற பெயர்,'\\', '/', '<', '>', ':', '\"', '|', '?' மற்றும் '*' ஆகியன அனுமதிக்கப்படமாட்டாது.",
"Error" => "வழு",
"Name" => "பெயர்",
"Size" => "அளவு",
diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php
index 38a67c50679..110b84cad5e 100644
--- a/apps/files/l10n/th_TH.php
+++ b/apps/files/l10n/th_TH.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "ไม่สามารถย้าย %s ได้ - ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้ว",
"Could not move %s" => "ไม่สามารถย้าย %s ได้",
"File name cannot be empty." => "ชื่อไฟล์ไม่สามารถเว้นว่างได้",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง, '\\', '/', '<', '>', ':', '\"', '|', '?' และ '*' ไม่ได้รับอนุญาตให้ใช้งานได้",
"No file was uploaded. Unknown error" => "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ",
"There is no error, the file uploaded with success" => "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "ขนาดไฟล์ที่อัพโหลดมีขนาดเกิน upload_max_filesize ที่ระบุไว้ใน php.ini",
@@ -14,7 +15,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน",
"Invalid directory." => "ไดเร็กทอรี่ไม่ถูกต้อง",
"Files" => "ไฟล์",
-"Not enough space available" => "มีพื้นที่เหลือไม่เพียงพอ",
"Upload cancelled." => "การอัพโหลดถูกยกเลิก",
"File upload is in progress. Leaving the page now will cancel the upload." => "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"{new_name} already exists" => "{new_name} มีอยู่แล้วในระบบ",
@@ -26,8 +26,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
-"'.' is an invalid file name." => "'.' เป็นชื่อไฟล์ที่ไม่ถูกต้อง",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง, '\\', '/', '<', '>', ':', '\"', '|', '?' และ '*' ไม่ได้รับอนุญาตให้ใช้งานได้",
"Your storage is full, files can not be updated or synced anymore!" => "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัพเดทหรือผสานไฟล์ต่างๆได้อีกต่อไป",
"Your storage is almost full ({usedSpacePercent}%)" => "พื้นที่จัดเก็บข้อมูลของคุณใกล้เต็มแล้ว ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "กำลังเตรียมดาวน์โหลดข้อมูล หากไฟล์มีขนาดใหญ่ อาจใช้เวลาสักครู่",
@@ -46,6 +44,7 @@ $TRANSLATIONS = array(
"Save" => "บันทึก",
"New" => "อัพโหลดไฟล์ใหม่",
"Text file" => "ไฟล์ข้อความ",
+"New folder" => "โฟลเดอร์ใหม่",
"Folder" => "แฟ้มเอกสาร",
"From link" => "จากลิงก์",
"Cancel upload" => "ยกเลิกการอัพโหลด",
@@ -55,7 +54,6 @@ $TRANSLATIONS = array(
"Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
"Files are being scanned, please wait." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
-"Current scanning" => "ไฟล์ที่กำลังสแกนอยู่ขณะนี้",
-"Upgrading filesystem cache..." => "กำลังอัพเกรดหน่วยความจำแคชของระบบไฟล์..."
+"Current scanning" => "ไฟล์ที่กำลังสแกนอยู่ขณะนี้"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php
index 90b16922a76..a2570e002ac 100644
--- a/apps/files/l10n/tr.php
+++ b/apps/files/l10n/tr.php
@@ -3,14 +3,15 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s taşınamadı - Bu isimde dosya zaten var",
"Could not move %s" => "%s taşınamadı",
"File name cannot be empty." => "Dosya adı boş olamaz.",
-"File name must not contain \"/\". Please choose a different name." => "Dosya adı \"/\" içermemelidir. Lütfen farklı bir isim seçin.",
+"\"%s\" is an invalid file name." => "'%s' geçersiz bir dosya adı.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Geçersiz isim, '\\', '/', '<', '>', ':', '\"', '|', '?' ve '*' karakterlerine izin verilmemektedir.",
+"The target folder has been moved or deleted." => "Hedef klasör taşındı veya silindi.",
"The name %s is already used in the folder %s. Please choose a different name." => "%s ismi zaten %s klasöründe kullanılıyor. Lütfen farklı bir isim seçin.",
"Not a valid source" => "Geçerli bir kaynak değil",
"Server is not allowed to open URLs, please check the server configuration" => "Sunucunun adresleri açma izi yok, lütfen sunucu yapılandırmasını denetleyin",
"Error while downloading %s to %s" => "%s, %s içine indirilirken hata",
"Error when creating the file" => "Dosya oluşturulurken hata",
"Folder name cannot be empty." => "Klasör adı boş olamaz.",
-"Folder name must not contain \"/\". Please choose a different name." => "Klasör adı \"/\" içermemelidir. Lütfen farklı bir isim seçin.",
"Error when creating the folder" => "Klasör oluşturulurken hata",
"Unable to set upload directory." => "Yükleme dizini tanımlanamadı.",
"Invalid Token" => "Geçersiz Simge",
@@ -23,12 +24,13 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Geçici dizin eksik",
"Failed to write to disk" => "Diske yazılamadı",
"Not enough storage available" => "Yeterli disk alanı yok",
-"Upload failed. Could not get file info." => "Yükleme başarısız. Dosya bilgisi alınamadı.",
"Upload failed. Could not find uploaded file" => "Yükleme başarısız. Yüklenen dosya bulunamadı",
+"Upload failed. Could not get file info." => "Yükleme başarısız. Dosya bilgisi alınamadı.",
"Invalid directory." => "Geçersiz dizin.",
"Files" => "Dosyalar",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Bir dizin veya 0 bayt olduğundan {filename} yüklenemedi",
-"Not enough space available" => "Yeterli disk alanı yok",
+"Total file size {size1} exceeds upload limit {size2}" => "Toplam dosya boyutu {size1} gönderme sınırını {size2} aşıyor",
+"Not enough free space, you are uploading {size1} but only {size2} is left" => "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut",
"Upload cancelled." => "Yükleme iptal edildi.",
"Could not get result from server." => "Sunucudan sonuç alınamadı.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur.",
@@ -50,8 +52,7 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n dosya","%n dosya"),
"{dirs} and {files}" => "{dirs} ve {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n dosya yükleniyor","%n dosya yükleniyor"),
-"'.' is an invalid file name." => "'.' geçersiz bir dosya adı.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Geçersiz isim, '\\', '/', '<', '>', ':', '\"', '|', '?' ve '*' karakterlerine izin verilmemektedir.",
+"\"{name}\" is an invalid file name." => "\"{name}\" geçersiz bir dosya adı.",
"Your storage is full, files can not be updated or synced anymore!" => "Depolama alanınız dolu, artık dosyalar güncellenmeyecek veya eşitlenmeyecek.",
"Your storage is almost full ({usedSpacePercent}%)" => "Depolama alanınız neredeyse dolu ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Şifreleme Uygulaması etkin ancak anahtarlarınız başlatılmamış. Lütfen oturumu kapatıp yeniden açın",
@@ -89,7 +90,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Yükleme çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor.",
"Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.",
-"Current scanning" => "Güncel tarama",
-"Upgrading filesystem cache..." => "Sistem dosyası önbelleği güncelleniyor"
+"Current scanning" => "Güncel tarama"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files/l10n/ug.php b/apps/files/l10n/ug.php
index 45458c51af0..ee188d927ef 100644
--- a/apps/files/l10n/ug.php
+++ b/apps/files/l10n/ug.php
@@ -7,7 +7,6 @@ $TRANSLATIONS = array(
"Failed to write to disk" => "دىسكىغا يازالمىدى",
"Not enough storage available" => "يېتەرلىك ساقلاش بوشلۇقى يوق",
"Files" => "ھۆججەتلەر",
-"Not enough space available" => "يېتەرلىك بوشلۇق يوق",
"Upload cancelled." => "يۈكلەشتىن ۋاز كەچتى.",
"File upload is in progress. Leaving the page now will cancel the upload." => "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.",
"{new_name} already exists" => "{new_name} مەۋجۇت",
@@ -34,7 +33,6 @@ $TRANSLATIONS = array(
"Nothing in here. Upload something!" => "بۇ جايدا ھېچنېمە يوق. Upload something!",
"Download" => "چۈشۈر",
"Delete" => "ئۆچۈر",
-"Upload too large" => "يۈكلەندىغىنى بەك چوڭ",
-"Upgrading filesystem cache..." => "ھۆججەت سىستېما غەملىكىنى يۈكسەلدۈرۈۋاتىدۇ…"
+"Upload too large" => "يۈكلەندىغىنى بەك چوڭ"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php
index 1e37d3d77d4..b74126c446d 100644
--- a/apps/files/l10n/uk.php
+++ b/apps/files/l10n/uk.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Не вдалося перемістити %s - Файл з таким ім'ям вже існує",
"Could not move %s" => "Не вдалося перемістити %s",
"File name cannot be empty." => " Ім'я файлу не може бути порожнім.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені.",
"Folder name cannot be empty." => "Ім'я теки не може бути порожнім.",
"Unable to set upload directory." => "Не вдалося встановити каталог завантаження.",
"No file was uploaded. Unknown error" => "Не завантажено жодного файлу. Невідома помилка",
@@ -16,7 +17,6 @@ $TRANSLATIONS = array(
"Not enough storage available" => "Місця більше немає",
"Invalid directory." => "Невірний каталог.",
"Files" => "Файли",
-"Not enough space available" => "Місця більше немає",
"Upload cancelled." => "Завантаження перервано.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.",
"URL cannot be empty" => "URL не може бути порожнім",
@@ -33,8 +33,6 @@ $TRANSLATIONS = array(
"_%n folder_::_%n folders_" => array("%n тека","%n тека","%n теки"),
"_%n file_::_%n files_" => array("%n файл","%n файлів","%n файли"),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
-"'.' is an invalid file name." => "'.' це невірне ім'я файлу.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Невірне ім'я, '\\', '/', '<', '>', ':', '\"', '|', '?' та '*' не дозволені.",
"Your storage is full, files can not be updated or synced anymore!" => "Ваше сховище переповнене, файли більше не можуть бути оновлені або синхронізовані !",
"Your storage is almost full ({usedSpacePercent}%)" => "Ваше сховище майже повне ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "Ваше завантаження готується. Це може зайняти деякий час, якщо файли завеликі.",
@@ -66,7 +64,6 @@ $TRANSLATIONS = array(
"Upload too large" => "Файл занадто великий",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері.",
"Files are being scanned, please wait." => "Файли скануються, зачекайте, будь-ласка.",
-"Current scanning" => "Поточне сканування",
-"Upgrading filesystem cache..." => "Оновлення кеша файлової системи..."
+"Current scanning" => "Поточне сканування"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php
index 8236d5e7efe..8812bb1b209 100644
--- a/apps/files/l10n/vi.php
+++ b/apps/files/l10n/vi.php
@@ -3,6 +3,16 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "Không thể di chuyển %s - Đã có tên tập tin này trên hệ thống",
"Could not move %s" => "Không thể di chuyển %s",
"File name cannot be empty." => "Tên file không được rỗng",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Tên không hợp lệ, '\\', '/', '<', '>', ':', '\"', '|', '?' và '*' thì không được phép dùng.",
+"The name %s is already used in the folder %s. Please choose a different name." => "Tên %s đã được sử dụng trong thư mục %s. Hãy chọn tên khác.",
+"Not a valid source" => "Nguồn không hợp lệ",
+"Server is not allowed to open URLs, please check the server configuration" => "Server cấm mở URLs, vui lòng kiểm tra lại cấu hình server",
+"Error while downloading %s to %s" => "Lỗi trong trong quá trình tải %s từ %s",
+"Error when creating the file" => "Lỗi khi tạo file",
+"Folder name cannot be empty." => "Tên thư mục không thể để trống",
+"Error when creating the folder" => "Lỗi khi tạo thư mục",
+"Unable to set upload directory." => "Không thể thiết lập thư mục tải lên.",
+"Invalid Token" => "Xác thực không hợp lệ",
"No file was uploaded. Unknown error" => "Không có tập tin nào được tải lên. Lỗi không xác định",
"There is no error, the file uploaded with success" => "Không có lỗi, các tập tin đã được tải lên thành công",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "The uploaded file exceeds the upload_max_filesize directive in php.ini: ",
@@ -12,30 +22,41 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Không tìm thấy thư mục tạm",
"Failed to write to disk" => "Không thể ghi ",
"Not enough storage available" => "Không đủ không gian lưu trữ",
+"Upload failed. Could not find uploaded file" => "Tải lên thất bại. Không thể tìm thấy tập tin được tải lên",
+"Upload failed. Could not get file info." => "Tải lên thất bại. Không thể có được thông tin tập tin.",
"Invalid directory." => "Thư mục không hợp lệ",
"Files" => "Tập tin",
-"Not enough space available" => "Không đủ chỗ trống cần thiết",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte",
"Upload cancelled." => "Hủy tải lên",
+"Could not get result from server." => "Không thể nhận được kết quả từ máy chủ.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.",
+"URL cannot be empty" => "URL không thể để trống",
"{new_name} already exists" => "{new_name} đã tồn tại",
+"Could not create file" => "Không thể tạo file",
+"Could not create folder" => "Không thể tạo thư mục",
"Share" => "Chia sẻ",
"Delete permanently" => "Xóa vĩnh vễn",
"Rename" => "Sửa tên",
"Pending" => "Đang chờ",
+"Could not rename file" => "Không thể đổi tên file",
"replaced {new_name} with {old_name}" => "đã thay thế {new_name} bằng {old_name}",
"undo" => "lùi lại",
-"_%n folder_::_%n folders_" => array(""),
-"_%n file_::_%n files_" => array(""),
-"_Uploading %n file_::_Uploading %n files_" => array(""),
-"'.' is an invalid file name." => "'.' là một tên file không hợp lệ",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Tên không hợp lệ, '\\', '/', '<', '>', ':', '\"', '|', '?' và '*' thì không được phép dùng.",
+"Error deleting file." => "Lỗi xóa file,",
+"_%n folder_::_%n folders_" => array("%n thư mục"),
+"_%n file_::_%n files_" => array("%n tập tin"),
+"{dirs} and {files}" => "{dirs} và {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("Đang tải lên %n tập tin"),
"Your storage is full, files can not be updated or synced anymore!" => "Your storage is full, files can not be updated or synced anymore!",
"Your storage is almost full ({usedSpacePercent}%)" => "Your storage is almost full ({usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Ứng dụng mã hóa đã được kích hoạt nhưng bạn chưa khởi tạo khóa. Vui lòng đăng xuất ra và đăng nhập lại",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Mã hóa đã bị vô hiệu nhưng những tập tin của bạn vẫn được mã hóa. Vui lòng vào phần thiết lập cá nhân để giải mã chúng.",
"Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.",
+"Error moving file" => "Lỗi di chuyển tập tin",
"Error" => "Lỗi",
"Name" => "Tên",
"Size" => "Kích cỡ",
"Modified" => "Thay đổi",
+"%s could not be renamed" => "%s không thể đổi tên",
"Upload" => "Tải lên",
"File handling" => "Xử lý tập tin",
"Maximum upload size" => "Kích thước tối đa ",
@@ -45,20 +66,21 @@ $TRANSLATIONS = array(
"0 is unlimited" => "0 là không giới hạn",
"Maximum input size for ZIP files" => "Kích thước tối đa cho các tập tin ZIP",
"Save" => "Lưu",
-"New" => "Mới",
+"New" => "Tạo mới",
+"New text file" => "File text mới",
"Text file" => "Tập tin văn bản",
"New folder" => "Tạo thư mục",
"Folder" => "Thư mục",
"From link" => "Từ liên kết",
"Deleted files" => "File đã bị xóa",
"Cancel upload" => "Hủy upload",
+"You don’t have permission to upload or create files here" => "Bạn không có quyền upload hoặc tạo files ở đây",
"Nothing in here. Upload something!" => "Không có gì ở đây .Hãy tải lên một cái gì đó !",
"Download" => "Tải về",
"Delete" => "Xóa",
"Upload too large" => "Tập tin tải lên quá lớn",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
"Files are being scanned, please wait." => "Tập tin đang được quét ,vui lòng chờ.",
-"Current scanning" => "Hiện tại đang quét",
-"Upgrading filesystem cache..." => "Đang nâng cấp bộ nhớ đệm cho tập tin hệ thống..."
+"Current scanning" => "Hiện tại đang quét"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php
index effcb0225ca..87f8138697e 100644
--- a/apps/files/l10n/zh_CN.php
+++ b/apps/files/l10n/zh_CN.php
@@ -3,6 +3,14 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "无法移动 %s - 同名文件已存在",
"Could not move %s" => "无法移动 %s",
"File name cannot be empty." => "文件名不能为空。",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。",
+"The name %s is already used in the folder %s. Please choose a different name." => "文件名 %s 是已经在 %s 中存在的名称。请使用其他名称。",
+"Not a valid source" => "不是一个可用的源",
+"Server is not allowed to open URLs, please check the server configuration" => "服务器没有允许打开URL网址,请检查服务器配置",
+"Error while downloading %s to %s" => "当下载 %s 到 %s 时出错",
+"Error when creating the file" => "当创建文件是出错",
+"Folder name cannot be empty." => "文件夹名称不能为空",
+"Error when creating the folder" => "创建文件夹出错",
"Unable to set upload directory." => "无法设置上传文件夹。",
"Invalid Token" => "无效密匙",
"No file was uploaded. Unknown error" => "没有文件被上传。未知错误",
@@ -14,30 +22,44 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "缺少临时目录",
"Failed to write to disk" => "写入磁盘失败",
"Not enough storage available" => "没有足够的存储空间",
+"Upload failed. Could not find uploaded file" => "上传失败。不能发现上传的文件",
+"Upload failed. Could not get file info." => "上传失败。不能获取文件信息。",
"Invalid directory." => "无效文件夹。",
"Files" => "文件",
-"Not enough space available" => "没有足够可用空间",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "不能上传文件 {filename} ,由于它是一个目录或者为0字节",
"Upload cancelled." => "上传已取消",
+"Could not get result from server." => "不能从服务器得到结果",
"File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传中。现在离开此页会导致上传动作被取消。",
+"URL cannot be empty" => "URL不能为空",
+"In the home folder 'Shared' is a reserved filename" => "主目录里 'Shared' 是系统预留目录名",
"{new_name} already exists" => "{new_name} 已存在",
+"Could not create file" => "不能创建文件",
+"Could not create folder" => "不能创建文件夹",
+"Error fetching URL" => "获取URL出错",
"Share" => "分享",
"Delete permanently" => "永久删除",
"Rename" => "重命名",
"Pending" => "等待",
+"Could not rename file" => "不能重命名文件",
"replaced {new_name} with {old_name}" => "已将 {old_name}替换成 {new_name}",
"undo" => "撤销",
+"Error deleting file." => "删除文件出错。",
"_%n folder_::_%n folders_" => array("%n 文件夹"),
"_%n file_::_%n files_" => array("%n个文件"),
-"_Uploading %n file_::_Uploading %n files_" => array(""),
-"'.' is an invalid file name." => "'.' 是一个无效的文件名。",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。",
+"{dirs} and {files}" => "{dirs} 和 {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("上传 %n 个文件"),
"Your storage is full, files can not be updated or synced anymore!" => "您的存储空间已满,文件将无法更新或同步!",
"Your storage is almost full ({usedSpacePercent}%)" => "您的存储空间即将用完 ({usedSpacePercent}%)",
+"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。",
+"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "无效的私有密钥。请到您的个人配置里去更新私有密钥,来恢复对加密文件的访问。",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "加密是被禁用的,但是您的文件还是被加密了。请到您的个人配置里设置文件加密选项。",
"Your download is being prepared. This might take some time if the files are big." => "下载正在准备中。如果文件较大可能会花费一些时间。",
+"Error moving file" => "移动文件错误",
"Error" => "错误",
"Name" => "名称",
"Size" => "大小",
"Modified" => "修改日期",
+"Invalid folder name. Usage of 'Shared' is reserved." => "无效的文件夹名。”Shared“ 是 Owncloud 预留的文件夹",
"%s could not be renamed" => "%s 不能被重命名",
"Upload" => "上传",
"File handling" => "文件处理",
@@ -49,19 +71,20 @@ $TRANSLATIONS = array(
"Maximum input size for ZIP files" => "ZIP 文件的最大输入大小",
"Save" => "保存",
"New" => "新建",
+"New text file" => "创建文本文件",
"Text file" => "文本文件",
"New folder" => "添加文件夹",
"Folder" => "文件夹",
"From link" => "来自链接",
"Deleted files" => "已删除文件",
"Cancel upload" => "取消上传",
+"You don’t have permission to upload or create files here" => "您没有权限来上传湖州哦和创建文件",
"Nothing in here. Upload something!" => "这里还什么都没有。上传些东西吧!",
"Download" => "下载",
"Delete" => "删除",
"Upload too large" => "上传文件过大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
"Files are being scanned, please wait." => "文件正在被扫描,请稍候。",
-"Current scanning" => "当前扫描",
-"Upgrading filesystem cache..." => "正在更新文件系统缓存..."
+"Current scanning" => "当前扫描"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php
index dd9cbfdf1a9..caf8b184a35 100644
--- a/apps/files/l10n/zh_TW.php
+++ b/apps/files/l10n/zh_TW.php
@@ -3,13 +3,12 @@ $TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "無法移動 %s ,同名的檔案已經存在",
"Could not move %s" => "無法移動 %s",
"File name cannot be empty." => "檔名不能為空",
-"File name must not contain \"/\". Please choose a different name." => "檔名不能包含 \"/\" ,請選其他名字",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "檔名不合法,不允許 \\ / < > : \" | ? * 字元",
"The name %s is already used in the folder %s. Please choose a different name." => "%s 已經被使用於資料夾 %s ,請換一個名字",
"Not a valid source" => "不是有效的來源",
"Error while downloading %s to %s" => "下載 %s 到 %s 失敗",
"Error when creating the file" => "建立檔案失敗",
"Folder name cannot be empty." => "資料夾名稱不能留空",
-"Folder name must not contain \"/\". Please choose a different name." => "資料夾名稱不能包含 \"/\" ,請選其他名字",
"Error when creating the folder" => "建立資料夾失敗",
"Unable to set upload directory." => "無法設定上傳目錄",
"Invalid Token" => "無效的 token",
@@ -22,12 +21,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "找不到暫存資料夾",
"Failed to write to disk" => "寫入硬碟失敗",
"Not enough storage available" => "儲存空間不足",
-"Upload failed. Could not get file info." => "上傳失敗,無法取得檔案資訊",
"Upload failed. Could not find uploaded file" => "上傳失敗,找不到上傳的檔案",
+"Upload failed. Could not get file info." => "上傳失敗,無法取得檔案資訊",
"Invalid directory." => "無效的資料夾",
"Files" => "檔案",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "因為 {filename} 是個目錄或是大小為零,所以無法上傳",
-"Not enough space available" => "沒有足夠的可用空間",
"Upload cancelled." => "上傳已取消",
"Could not get result from server." => "無法從伺服器取回結果",
"File upload is in progress. Leaving the page now will cancel the upload." => "檔案上傳中,離開此頁面將會取消上傳。",
@@ -47,8 +45,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("%n 個檔案"),
"{dirs} and {files}" => "{dirs} 和 {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n 個檔案正在上傳"),
-"'.' is an invalid file name." => "'.' 是不合法的檔名",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "檔名不合法,不允許 \\ / < > : \" | ? * 字元",
"Your storage is full, files can not be updated or synced anymore!" => "您的儲存空間已滿,沒有辦法再更新或是同步檔案!",
"Your storage is almost full ({usedSpacePercent}%)" => "您的儲存空間快要滿了 ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
@@ -84,7 +80,6 @@ $TRANSLATIONS = array(
"Upload too large" => "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您試圖上傳的檔案大小超過伺服器的限制。",
"Files are being scanned, please wait." => "正在掃描檔案,請稍等。",
-"Current scanning" => "正在掃描",
-"Upgrading filesystem cache..." => "正在升級檔案系統快取…"
+"Current scanning" => "正在掃描"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index 21d1f50e587..c41e2d15581 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -5,14 +5,14 @@ namespace OCA\Files;
class Helper
{
public static function buildFileStorageStatistics($dir) {
+ // information about storage capacities
+ $storageInfo = \OC_Helper::getStorageInfo($dir);
+
$l = new \OC_L10N('files');
- $maxUploadFilesize = \OCP\Util::maxUploadFilesize($dir);
+ $maxUploadFilesize = \OCP\Util::maxUploadFilesize($dir, $storageInfo['free']);
$maxHumanFilesize = \OCP\Util::humanFileSize($maxUploadFilesize);
$maxHumanFilesize = $l->t('Upload') . ' max. ' . $maxHumanFilesize;
- // information about storage capacities
- $storageInfo = \OC_Helper::getStorageInfo($dir);
-
return array('uploadMaxFilesize' => $maxUploadFilesize,
'maxHumanFilesize' => $maxHumanFilesize,
'freeSpace' => $storageInfo['free'],
@@ -22,6 +22,7 @@ class Helper
public static function determineIcon($file) {
if($file['type'] === 'dir') {
$dir = $file['directory'];
+ $icon = \OC_Helper::mimetypeIcon('dir');
$absPath = \OC\Files\Filesystem::getView()->getAbsolutePath($dir.'/'.$file['name']);
$mount = \OC\Files\Filesystem::getMountManager()->find($absPath);
if (!is_null($mount)) {
@@ -29,37 +30,41 @@ class Helper
if (!is_null($sid)) {
$sid = explode(':', $sid);
if ($sid[0] === 'shared') {
- return \OC_Helper::mimetypeIcon('dir-shared');
+ $icon = \OC_Helper::mimetypeIcon('dir-shared');
}
if ($sid[0] !== 'local' and $sid[0] !== 'home') {
- return \OC_Helper::mimetypeIcon('dir-external');
+ $icon = \OC_Helper::mimetypeIcon('dir-external');
}
}
}
- return \OC_Helper::mimetypeIcon('dir');
+ }else{
+ if($file['isPreviewAvailable']) {
+ $pathForPreview = $file['directory'] . '/' . $file['name'];
+ return \OC_Helper::previewIcon($pathForPreview) . '&c=' . $file['etag'];
+ }
+ $icon = \OC_Helper::mimetypeIcon($file['mimetype']);
}
- if($file['isPreviewAvailable']) {
- $pathForPreview = $file['directory'] . '/' . $file['name'];
- return \OC_Helper::previewIcon($pathForPreview) . '&c=' . $file['etag'];
- }
- return \OC_Helper::mimetypeIcon($file['mimetype']);
+ return substr($icon, 0, -3) . 'svg';
}
/**
* Comparator function to sort files alphabetically and have
* the directories appear first
- * @param array $a file
- * @param array $b file
- * @return -1 if $a must come before $b, 1 otherwise
+ *
+ * @param \OCP\Files\FileInfo $a file
+ * @param \OCP\Files\FileInfo $b file
+ * @return int -1 if $a must come before $b, 1 otherwise
*/
public static function fileCmp($a, $b) {
- if ($a['type'] === 'dir' and $b['type'] !== 'dir') {
+ $aType = $a->getType();
+ $bType = $b->getType();
+ if ($aType === 'dir' and $bType !== 'dir') {
return -1;
- } elseif ($a['type'] !== 'dir' and $b['type'] === 'dir') {
+ } elseif ($aType !== 'dir' and $bType === 'dir') {
return 1;
} else {
- return strnatcasecmp($a['name'], $b['name']);
+ return strnatcasecmp($a->getName(), $b->getName());
}
}
@@ -112,26 +117,4 @@ class Helper
}
return $breadcrumb;
}
-
- /**
- * Returns the numeric permissions for the given directory.
- * @param string $dir directory without trailing slash
- * @return numeric permissions
- */
- public static function getDirPermissions($dir){
- $permissions = \OCP\PERMISSION_READ;
- if (\OC\Files\Filesystem::isCreatable($dir . '/')) {
- $permissions |= \OCP\PERMISSION_CREATE;
- }
- if (\OC\Files\Filesystem::isUpdatable($dir . '/')) {
- $permissions |= \OCP\PERMISSION_UPDATE;
- }
- if (\OC\Files\Filesystem::isDeletable($dir . '/')) {
- $permissions |= \OCP\PERMISSION_DELETE;
- }
- if (\OC\Files\Filesystem::isSharable($dir . '/')) {
- $permissions |= \OCP\PERMISSION_SHARE;
- }
- return $permissions;
- }
}
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 939043b2c9f..5b0bad7f341 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -5,12 +5,17 @@
<div id="new" class="button">
<a><?php p($l->t('New'));?></a>
<ul>
- <li style="background-image:url('<?php p(OCP\mimetype_icon('text/plain')) ?>')"
- data-type='file' data-newname='<?php p($l->t('New text file')) ?>.txt'><p><?php p($l->t('Text file'));?></p></li>
- <li style="background-image:url('<?php p(OCP\mimetype_icon('dir')) ?>')"
- data-type='folder' data-newname='<?php p($l->t('New folder')) ?>'><p><?php p($l->t('Folder'));?></p></li>
- <li style="background-image:url('<?php p(OCP\image_path('core', 'places/link.svg')) ?>')"
- data-type='web'><p><?php p($l->t('From link'));?></p></li>
+ <li class="icon-filetype-text"
+ data-type="file" data-newname="<?php p($l->t('New text file')) ?>.txt">
+ <p><?php p($l->t('Text file'));?></p>
+ </li>
+ <li class="icon-filetype-folder"
+ data-type="folder" data-newname="<?php p($l->t('New folder')) ?>">
+ <p><?php p($l->t('Folder'));?></p>
+ </li>
+ <li class="icon-link" data-type="web">
+ <p><?php p($l->t('From link'));?></p>
+ </li>
</ul>
</div>
<?php endif;?>
@@ -30,7 +35,7 @@
<input type="hidden" name="dir" value="<?php p($_['dir']) ?>" id="dir">
<input type="file" id="file_upload_start" name='files[]'
data-url="<?php print_unescaped(OCP\Util::linkTo('files', 'ajax/upload.php')); ?>" />
- <a href="#" class="svg icon icon-upload"></a>
+ <a href="#" class="svg icon-upload"></a>
</div>
<?php if ($_['trash']): ?>
<input id="trash" type="button" value="<?php p($l->t('Deleted files'));?>" class="button" <?php $_['trashEmpty'] ? p('disabled') : '' ?> />
@@ -61,7 +66,7 @@
<input type="checkbox" id="select_all" />
<label for="select_all"></label>
<span class="name"><?php p($l->t( 'Name' )); ?></span>
- <span class="selectedActions">
+ <span id="selectedActionsList" class="selectedActions">
<?php if($_['allowZipDownload']) : ?>
<a href="" class="download">
<img class="svg" alt="Download"
diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php
index f4fb96a7a7c..8a7a1e370eb 100644
--- a/apps/files/templates/part.list.php
+++ b/apps/files/templates/part.list.php
@@ -17,7 +17,13 @@ $totalsize = 0; ?>
data-mime="<?php p($file['mimetype'])?>"
data-size="<?php p($file['size']);?>"
data-etag="<?php p($file['etag']);?>"
- data-permissions="<?php p($file['permissions']); ?>">
+ data-permissions="<?php p($file['permissions']); ?>"
+
+ <?php if(isset($file['displayname_owner'])): ?>
+ data-share-owner="<?php p($file['displayname_owner']) ?>"
+ <?php endif; ?>
+ >
+
<?php if(isset($file['isPreviewAvailable']) and $file['isPreviewAvailable']): ?>
<td class="filename svg preview-icon"
<?php else: ?>
@@ -34,17 +40,15 @@ $totalsize = 0; ?>
<span class="nametext">
<?php print_unescaped(htmlspecialchars($file['name']));?>
</span>
+ <span class="uploadtext" currentUploads="0">
+ </span>
+ </a>
<?php else: ?>
<a class="name" href="<?php p(rtrim($_['downloadURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>">
<label class="filetext" title="" for="select-<?php p($file['fileid']); ?>"></label>
<span class="nametext"><?php print_unescaped(htmlspecialchars($file['basename']));?><span class='extension'><?php p($file['extension']);?></span></span>
</a>
<?php endif; ?>
- <?php if($file['type'] == 'dir'):?>
- <span class="uploadtext" currentUploads="0">
- </span>
- <?php endif;?>
- </a>
</td>
<td class="filesize"
style="color:rgb(<?php p($simple_size_color.','.$simple_size_color.','.$simple_size_color) ?>)">
diff --git a/apps/files/templates/upgrade.php b/apps/files/templates/upgrade.php
deleted file mode 100644
index e03f086e47d..00000000000
--- a/apps/files/templates/upgrade.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<div id="upgrade">
- <?php p($l->t('Upgrading filesystem cache...'));?>
- <div id="progressbar" />
-</div>
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php
index a1a5c8983ba..e53c0fb3dd1 100644
--- a/apps/files/tests/ajax_rename.php
+++ b/apps/files/tests/ajax_rename.php
@@ -110,7 +110,9 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
$this->assertEquals('/test', $result['data']['directory']);
$this->assertEquals(18, $result['data']['size']);
$this->assertEquals('httpd/unix-directory', $result['data']['mime']);
- $this->assertEquals(\OC_Helper::mimetypeIcon('dir'), $result['data']['icon']);
+ $icon = \OC_Helper::mimetypeIcon('dir');
+ $icon = substr($icon, 0, -3) . 'svg';
+ $this->assertEquals($icon, $result['data']['icon']);
$this->assertFalse($result['data']['isPreviewAvailable']);
}
@@ -165,7 +167,9 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
$this->assertEquals(18, $result['data']['size']);
$this->assertEquals('httpd/unix-directory', $result['data']['mime']);
$this->assertEquals('abcdef', $result['data']['etag']);
- $this->assertEquals(\OC_Helper::mimetypeIcon('dir'), $result['data']['icon']);
+ $icon = \OC_Helper::mimetypeIcon('dir');
+ $icon = substr($icon, 0, -3) . 'svg';
+ $this->assertEquals($icon, $result['data']['icon']);
$this->assertFalse($result['data']['isPreviewAvailable']);
}
diff --git a/apps/files/tests/js/fileUploadSpec.js b/apps/files/tests/js/fileUploadSpec.js
new file mode 100644
index 00000000000..2b4341ef1c3
--- /dev/null
+++ b/apps/files/tests/js/fileUploadSpec.js
@@ -0,0 +1,127 @@
+/**
+* ownCloud
+*
+* @author Vincent Petry
+* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/* global OC */
+describe('OC.Upload tests', function() {
+ var $dummyUploader;
+ var testFile;
+
+ beforeEach(function() {
+ testFile = {
+ name: 'test.txt',
+ size: 5000, // 5 KB
+ type: 'text/plain',
+ lastModifiedDate: new Date()
+ };
+ // need a dummy button because file-upload checks on it
+ $('#testArea').append(
+ '<input type="file" id="file_upload_start" name="files[]" multiple="multiple">' +
+ '<input type="hidden" id="upload_limit" name="upload_limit" value="10000000">' + // 10 MB
+ '<input type="hidden" id="free_space" name="free_space" value="50000000">' // 50 MB
+ );
+ $dummyUploader = $('#file_upload_start');
+ });
+ afterEach(function() {
+ delete window.file_upload_param;
+ $dummyUploader = undefined;
+ });
+ describe('Adding files for upload', function() {
+ var params;
+ var failStub;
+
+ beforeEach(function() {
+ params = OC.Upload.init();
+ failStub = sinon.stub();
+ $dummyUploader.on('fileuploadfail', failStub);
+ });
+ afterEach(function() {
+ params = undefined;
+ failStub = undefined;
+ });
+
+ /**
+ * Add file for upload
+ * @param file file data
+ */
+ function addFile(file) {
+ return params.add.call(
+ $dummyUploader[0],
+ {},
+ {
+ originalFiles: {},
+ files: [file]
+ });
+ }
+
+ it('adds file when size is below limits', function() {
+ var result = addFile(testFile);
+ expect(result).toEqual(true);
+ });
+ it('adds file when free space is unknown', function() {
+ var result;
+ $('#free_space').val(-2);
+
+ result = addFile(testFile);
+
+ expect(result).toEqual(true);
+ expect(failStub.notCalled).toEqual(true);
+ });
+ it('does not add file if it exceeds upload limit', function() {
+ var result;
+ $('#upload_limit').val(1000);
+
+ result = addFile(testFile);
+
+ expect(result).toEqual(false);
+ expect(failStub.calledOnce).toEqual(true);
+ expect(failStub.getCall(0).args[1].textStatus).toEqual('sizeexceedlimit');
+ expect(failStub.getCall(0).args[1].errorThrown).toEqual(
+ 'Total file size 5 kB exceeds upload limit 1000 B'
+ );
+ });
+ it('does not add file if it exceeds free space', function() {
+ var result;
+ $('#free_space').val(1000);
+
+ result = addFile(testFile);
+
+ expect(result).toEqual(false);
+ expect(failStub.calledOnce).toEqual(true);
+ expect(failStub.getCall(0).args[1].textStatus).toEqual('notenoughspace');
+ expect(failStub.getCall(0).args[1].errorThrown).toEqual(
+ 'Not enough free space, you are uploading 5 kB but only 1000 B is left'
+ );
+ });
+ it('does not add file if it has invalid characters', function() {
+ var result;
+ testFile.name = 'stars*stars.txt';
+
+ result = addFile(testFile);
+
+ expect(result).toEqual(false);
+ expect(failStub.calledOnce).toEqual(true);
+ expect(failStub.getCall(0).args[1].textStatus).toEqual('invalidcharacters');
+ expect(failStub.getCall(0).args[1].errorThrown.substr(0, 12)).toEqual(
+ 'Invalid name'
+ );
+ });
+ });
+});
diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js
index 8bbc1d3d141..ef7ddcb874a 100644
--- a/apps/files/tests/js/fileactionsSpec.js
+++ b/apps/files/tests/js/fileactionsSpec.js
@@ -69,7 +69,7 @@ describe('FileActions tests', function() {
$tr.find('.action[data-action=Download]').click();
expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?files=test%20download%20File.txt&dir=%2Fsubdir&download');
+ expect(redirectStub.getCall(0).args[0]).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=test%20download%20File.txt');
redirectStub.restore();
});
});
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index c26e65fc4de..8f4cb86ab4a 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -58,8 +58,15 @@ describe('FileList tests', function() {
expect($tr.attr('data-permissions')).toEqual('31');
//expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
});
- it('returns correct download URL', function() {
- expect(FileList.getDownloadUrl('some file.txt')).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?files=some%20file.txt&dir=%2Fsubdir&download');
- expect(FileList.getDownloadUrl('some file.txt', '/anotherpath/abc')).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?files=some%20file.txt&dir=%2Fanotherpath%2Fabc&download');
+ describe('Download Url', function() {
+ it('returns correct download URL for single files', function() {
+ expect(FileList.getDownloadUrl('some file.txt')).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=some%20file.txt');
+ expect(FileList.getDownloadUrl('some file.txt', '/anotherpath/abc')).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fanotherpath%2Fabc&files=some%20file.txt');
+ $('#dir').val('/');
+ expect(FileList.getDownloadUrl('some file.txt')).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=some%20file.txt');
+ });
+ it('returns correct download URL for multiple files', function() {
+ expect(FileList.getDownloadUrl(['a b c.txt', 'd e f.txt'])).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22a%20b%20c.txt%22%2C%22d%20e%20f.txt%22%5D');
+ });
});
});
diff --git a/apps/files/tests/js/filesSpec.js b/apps/files/tests/js/filesSpec.js
index 018c8ef0f3c..95bf87e03ec 100644
--- a/apps/files/tests/js/filesSpec.js
+++ b/apps/files/tests/js/filesSpec.js
@@ -48,6 +48,41 @@ describe('Files tests', function() {
expect(error).toEqual(false);
}
});
+ it('Validates correct file names do not create Shared folder in root', function() {
+ // create shared file in subfolder
+ var error = false;
+ try {
+ expect(Files.isFileNameValid('shared', '/foo')).toEqual(true);
+ expect(Files.isFileNameValid('Shared', '/foo')).toEqual(true);
+ }
+ catch (e) {
+ error = e;
+ }
+ expect(error).toEqual(false);
+
+ // create shared file in root
+ var threwException = false;
+ try {
+ Files.isFileNameValid('Shared', '/');
+ console.error('Invalid file name not detected');
+ }
+ catch (e) {
+ threwException = true;
+ }
+ expect(threwException).toEqual(true);
+
+ // create shared file in root
+ var threwException = false;
+ try {
+ Files.isFileNameValid('shared', '/');
+ console.error('Invalid file name not detected');
+ }
+ catch (e) {
+ threwException = true;
+ }
+ expect(threwException).toEqual(true);
+
+ });
it('Detects invalid file names', function() {
var fileNames = [
'',
diff --git a/apps/files_encryption/ajax/adminrecovery.php b/apps/files_encryption/ajax/adminrecovery.php
index 6a0186d5a9b..61e43acc2c3 100644
--- a/apps/files_encryption/ajax/adminrecovery.php
+++ b/apps/files_encryption/ajax/adminrecovery.php
@@ -18,7 +18,7 @@ $l = OC_L10N::get('files_encryption');
$return = false;
// Enable recoveryAdmin
-$recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
+$recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId');
if (isset($_POST['adminEnableRecovery']) && $_POST['adminEnableRecovery'] === '1') {
diff --git a/apps/files_encryption/ajax/getMigrationStatus.php b/apps/files_encryption/ajax/getMigrationStatus.php
index 17469a1af0c..7c9e0dcc51c 100644
--- a/apps/files_encryption/ajax/getMigrationStatus.php
+++ b/apps/files_encryption/ajax/getMigrationStatus.php
@@ -13,16 +13,14 @@ use OCA\Encryption\Util;
$loginname = isset($_POST['user']) ? $_POST['user'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
-$migrationCompleted = true;
+$migrationStatus = Util::MIGRATION_COMPLETED;
if ($loginname !== '' && $password !== '') {
$username = \OCP\User::checkPassword($loginname, $password);
if ($username) {
$util = new Util(new \OC_FilesystemView('/'), $username);
- if ($util->getMigrationStatus() !== Util::MIGRATION_COMPLETED) {
- $migrationCompleted = false;
- }
+ $migrationStatus = $util->getMigrationStatus();
}
}
-\OCP\JSON::success(array('data' => array('migrationCompleted' => $migrationCompleted)));
+\OCP\JSON::success(array('data' => array('migrationStatus' => $migrationStatus)));
diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php
index fd9aa429b01..21de421c195 100644
--- a/apps/files_encryption/appinfo/app.php
+++ b/apps/files_encryption/appinfo/app.php
@@ -10,6 +10,7 @@ OC::$CLASSPATH['OCA\Encryption\Session'] = 'files_encryption/lib/session.php';
OC::$CLASSPATH['OCA\Encryption\Capabilities'] = 'files_encryption/lib/capabilities.php';
OC::$CLASSPATH['OCA\Encryption\Helper'] = 'files_encryption/lib/helper.php';
+\OCP\Util::addscript('files_encryption', 'encryption');
\OCP\Util::addscript('files_encryption', 'detect-migration');
if (!OC_Config::getValue('maintenance', false)) {
diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml
index b6d9d6bb0a3..ab47de828b9 100644
--- a/apps/files_encryption/appinfo/info.xml
+++ b/apps/files_encryption/appinfo/info.xml
@@ -2,7 +2,7 @@
<info>
<id>files_encryption</id>
<name>Encryption</name>
- <description>The ownCloud files encryption system provides server side-encryption. After the app was enabled you need to re-login to initialize your encryption keys.</description>
+ <description>The ownCloud files encryption system provides server side-encryption. After the app was enabled you need to re-login to initialize your encryption keys. Please note that server side encryption requires that the ownCloud server admin can be trusted. The main purpose of this app is the encryption of files that are stored on externally mounted storages.</description>
<licence>AGPL</licence>
<author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
<require>4</require>
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php
index 4c4b3f2040f..0b6c5adf3fb 100644
--- a/apps/files_encryption/hooks/hooks.php
+++ b/apps/files_encryption/hooks/hooks.php
@@ -80,8 +80,14 @@ class Hooks {
// Check if first-run file migration has already been performed
$ready = false;
- if ($util->getMigrationStatus() === Util::MIGRATION_OPEN) {
+ $migrationStatus = $util->getMigrationStatus();
+ if ($migrationStatus === Util::MIGRATION_OPEN) {
$ready = $util->beginMigration();
+ } elseif ($migrationStatus === Util::MIGRATION_IN_PROGRESS) {
+ // refuse login as long as the initial encryption is running
+ sleep(5);
+ \OCP\User::logout();
+ return false;
}
// If migration not yet done
@@ -102,21 +108,27 @@ class Hooks {
}
- // Encrypt existing user files:
- if (
- $util->encryptAll('/' . $params['uid'] . '/' . 'files', $session->getLegacyKey(), $params['password'])
- ) {
+ // Encrypt existing user files
+ try {
+ $result = $util->encryptAll('/' . $params['uid'] . '/' . 'files', $session->getLegacyKey(), $params['password']);
+ } catch (\Exception $ex) {
+ \OCP\Util::writeLog('Encryption library', 'Initial encryption failed! Error: ' . $ex->getMessage(), \OCP\Util::FATAL);
+ $util->resetMigrationStatus();
+ \OCP\User::logout();
+ $result = false;
+ }
+
+ if ($result) {
\OC_Log::write(
'Encryption library', 'Encryption of existing files belonging to "' . $params['uid'] . '" completed'
, \OC_Log::INFO
);
- }
-
- // Register successful migration in DB
- $util->finishMigration();
+ // Register successful migration in DB
+ $util->finishMigration();
+ }
}
return true;
@@ -489,11 +501,20 @@ class Hooks {
* @param array $params with the old path and the new path
*/
public static function preRename($params) {
- $util = new Util(new \OC_FilesystemView('/'), \OCP\User::getUser());
+ $user = \OCP\User::getUser();
+ $view = new \OC_FilesystemView('/');
+ $util = new Util($view, $user);
list($ownerOld, $pathOld) = $util->getUidAndFilename($params['oldpath']);
- self::$renamedFiles[$params['oldpath']] = array(
- 'uid' => $ownerOld,
- 'path' => $pathOld);
+
+ // we only need to rename the keys if the rename happens on the same mountpoint
+ // otherwise we perform a stream copy, so we get a new set of keys
+ $mp1 = $view->getMountPoint('/' . $user . '/files/' . $params['oldpath']);
+ $mp2 = $view->getMountPoint('/' . $user . '/files/' . $params['newpath']);
+ if ($mp1 === $mp2) {
+ self::$renamedFiles[$params['oldpath']] = array(
+ 'uid' => $ownerOld,
+ 'path' => $pathOld);
+ }
}
/**
@@ -635,7 +656,7 @@ class Hooks {
/**
* @brief if the file was really deleted we remove the encryption keys
* @param array $params
- * @return boolean
+ * @return boolean|null
*/
public static function postDelete($params) {
@@ -675,7 +696,7 @@ class Hooks {
/**
* @brief remember the file which should be deleted and it's owner
* @param array $params
- * @return boolean
+ * @return boolean|null
*/
public static function preDelete($params) {
$path = $params[\OC\Files\Filesystem::signal_param_path];
diff --git a/apps/files_encryption/js/detect-migration.js b/apps/files_encryption/js/detect-migration.js
index 301e77f24f7..f5627edf4e4 100644
--- a/apps/files_encryption/js/detect-migration.js
+++ b/apps/files_encryption/js/detect-migration.js
@@ -17,10 +17,14 @@ $(document).ready(function(){
data: {user: user, password: password},
async: false,
success: function(response) {
- if (response.data.migrationCompleted === false) {
+ if (response.data.migrationStatus === OC.Encryption.MIGRATION_OPEN) {
var message = t('files_encryption', 'Initial encryption started... This can take some time. Please wait.');
$('#messageText').text(message);
$('#message').removeClass('hidden').addClass('update');
+ } else if (response.data.migrationStatus === OC.Encryption.MIGRATION_IN_PROGRESS) {
+ var message = t('files_encryption', 'Initial encryption running... Please try again later.');
+ $('#messageText').text(message);
+ $('#message').removeClass('hidden').addClass('update');
}
}
});
diff --git a/apps/files_encryption/js/encryption.js b/apps/files_encryption/js/encryption.js
new file mode 100644
index 00000000000..65ffabe55e6
--- /dev/null
+++ b/apps/files_encryption/js/encryption.js
@@ -0,0 +1,12 @@
+/**
+ * Copyright (c) 2014
+ * Bjoern Schiessle <schiessle@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or later.
+ * See the COPYING-README file.
+ */
+
+OC.Encryption={
+ MIGRATION_OPEN:0,
+ MIGRATION_COMPLETED:1,
+ MIGRATION_IN_PROGRESS:-1,
+};
diff --git a/apps/files_encryption/js/settings-admin.js b/apps/files_encryption/js/settings-admin.js
index c2140a6f1eb..785d02002fa 100644
--- a/apps/files_encryption/js/settings-admin.js
+++ b/apps/files_encryption/js/settings-admin.js
@@ -7,28 +7,6 @@
* See the COPYING-README file.
*/
-OC.msg={
- startSaving:function(selector){
- $(selector)
- .html( t('settings', 'Saving...') )
- .removeClass('success')
- .removeClass('error')
- .stop(true, true)
- .show();
- },
- finishedSaving:function(selector, data){
- if( data.status === "success" ){
- $(selector).html( data.data.message )
- .addClass('success')
- .stop(true, true)
- .delay(3000)
- .fadeOut(900);
- }else{
- $(selector).html( data.data.message ).addClass('error');
- }
- }
-};
-
$(document).ready(function(){
// Trigger ajax on recoveryAdmin status change
var enabledStatus = $('#adminEnableRecovery').val();
diff --git a/apps/files_encryption/l10n/ar.php b/apps/files_encryption/l10n/ar.php
index 45a0c4616f4..345c01a0d4a 100644
--- a/apps/files_encryption/l10n/ar.php
+++ b/apps/files_encryption/l10n/ar.php
@@ -1,6 +1,44 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "جاري الحفظ...",
-"Encryption" => "التشفير"
+"Recovery key successfully enabled" => "تم بنجاح تفعيل مفتاح الاستعادة",
+"Could not enable recovery key. Please check your recovery key password!" => "لا يمكن تفعيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
+"Recovery key successfully disabled" => "تم تعطيل مفتاح الاستعادة بنجاح",
+"Could not disable recovery key. Please check your recovery key password!" => "لا يمكن تعطيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
+"Password successfully changed." => "تم تغيير كلمة المرور بنجاح.",
+"Could not change the password. Maybe the old password was not correct." => "تعذر تغيير كلمة المرور. من الممكن ان كلمة المرور القديمة غير صحيحة.",
+"Private key password successfully updated." => "تم تحديث كلمة المرور للمفتاح الخاص بنجاح.",
+"Could not update the private key password. Maybe the old password was not correct." => "لا يمكن تحديث كلمة مرور المفتاح الخاص. من الممكن ان كلمة المرور القديمة غير صحيحة.",
+"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "برنامج التشفير لم يتم تهيئتة ! من الممكن ان برنامج التشفير تم اعادة تفعيلة خلال الجلسة. يرجى تسجيل الخروج ومن ثم تسجيل الدخول مجددا لتهيئة برنامج التشفير.",
+"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "مفتاحك الخاص غير صالح! ربما تم تغيير كلمة المرور خارج %s (مثل:مجلد شركتك). يمكنك تحديث كلمة المرور في الاعدادات الشخصية لإستعادة الوصول الى ملفاتك المشفرة.",
+"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "لا يمكن فك التشفير من هذا الملف, من الممكن ان يكون هذا الملف مُشارك. يرجى سؤال صاحب الملف لإعادة مشاركتة معك.",
+"Unknown error please check your system settings or contact your administrator" => "خطا غير معروف يرجى التاكد من اعدادات نظامك او تواصل مع المدير.",
+"Missing requirements." => "متطلبات ناقصة.",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "يرجى التاكد من ان اصدار PHP 5.3.3 او احدث , مثبت و التاكد من ان OpenSSL مفعل و مهيئ بشكل صحيح. حتى الان برنامج التتشفير تم تعطيلة.",
+"Following users are not set up for encryption:" => "المستخدمين التاليين لم يتم تعيين لهم التشفيير:",
+"Initial encryption started... This can take some time. Please wait." => "بدأ التشفير... من الممكن ان ياخذ بعض الوقت. يرجى الانتظار.",
+"Initial encryption running... Please try again later." => "جاري تفعيل التشفير المبدئي ، الرجاء المحاولة لاحقا",
+"Go directly to your " => "انتقل مباشرة الى ",
+"personal settings" => "اعدادات شخصية",
+"Encryption" => "التشفير",
+"Enable recovery key (allow to recover users files in case of password loss):" => "تفعيل استعادة المفتاح (سوف يمكنك من استعادة ملفات المستخدمين في حال فقدان كلمة المرور):",
+"Recovery key password" => "استعادة كلمة مرور المفتاح",
+"Repeat Recovery key password" => "كرر كلمة المرور لـ استعادة المفتاح",
+"Enabled" => "مفعلة",
+"Disabled" => "معطلة",
+"Change recovery key password:" => "تعديل كلمة المرور استعادة المفتاح:",
+"Old Recovery key password" => "كلمة المرور القديمة لـ استعامة المفتاح",
+"New Recovery key password" => "تعيين كلمة مرور جديدة لـ استعادة المفتاح",
+"Repeat New Recovery key password" => "كرر كلمة المرور لـ استعادة المفتاح من جديد",
+"Change Password" => "عدل كلمة السر",
+"Your private key password no longer match your log-in password:" => "كلمة مرور مفتاحك الخاص لا تتطابق مع كلمة المرور الخاصة الدخول:",
+"Set your old private key password to your current log-in password." => "تعيين كلمة المرور القديمة لـ المفتاح الخاص الى كلمة المرور الخاصة بالدخول الحالية.",
+" If you don't remember your old password you can ask your administrator to recover your files." => "اذا كنت لاتتذكر كلمة السر تستطيع ان تطلب من المدير ان يستعيد ملفاتك.",
+"Old log-in password" => "كلمة المرور القديمة الخاصة بالدخول",
+"Current log-in password" => "كلمة المرور الحالية الخاصة بالدخول",
+"Update Private Key Password" => "تحديث كلمة المرور لـ المفتاح الخاص",
+"Enable password recovery:" => "تفعيل استعادة كلمة المرور:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "تفعيل هذا الخيار يمكنك من اعادة الوصول الى ملفاتك المشفرة عند فقدان كلمة المرور",
+"File recovery settings updated" => "اعدادات ملف الاستعادة تم تحديثه",
+"Could not update file recovery" => "تعذر تحديث ملف الاستعادة"
);
$PLURAL_FORMS = "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;";
diff --git a/apps/files_encryption/l10n/bg_BG.php b/apps/files_encryption/l10n/bg_BG.php
index 9060c92ed43..a40781125dd 100644
--- a/apps/files_encryption/l10n/bg_BG.php
+++ b/apps/files_encryption/l10n/bg_BG.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Записване...",
"Encryption" => "Криптиране"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/bn_BD.php b/apps/files_encryption/l10n/bn_BD.php
index 5fc4f6a13f3..63e335bd2b9 100644
--- a/apps/files_encryption/l10n/bn_BD.php
+++ b/apps/files_encryption/l10n/bn_BD.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "সংরক্ষণ করা হচ্ছে..",
"Encryption" => "সংকেতায়ন"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/ca.php b/apps/files_encryption/l10n/ca.php
index 33d2754483c..3414796f62b 100644
--- a/apps/files_encryption/l10n/ca.php
+++ b/apps/files_encryption/l10n/ca.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Assegureu-vos que teniu instal·lat PHP 5.3.3 o una versió superior i que està activat Open SSL i habilitada i configurada correctament l'extensió de PHP. De moment, l'aplicació d'encriptació s'ha desactivat.",
"Following users are not set up for encryption:" => "Els usuaris següents no estan configurats per a l'encriptació:",
"Initial encryption started... This can take some time. Please wait." => "La encriptació inicial ha començat... Pot trigar una estona, espereu.",
-"Saving..." => "Desant...",
+"Initial encryption running... Please try again later." => "encriptació inicial en procés... Proveu-ho més tard.",
"Go directly to your " => "Vés directament a",
"personal settings" => "arranjament personal",
"Encryption" => "Xifrat",
diff --git a/apps/files_encryption/l10n/cs_CZ.php b/apps/files_encryption/l10n/cs_CZ.php
index cf2776371df..18848978a8a 100644
--- a/apps/files_encryption/l10n/cs_CZ.php
+++ b/apps/files_encryption/l10n/cs_CZ.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Ujistěte se prosím, že máte nainstalované PHP 5.3.3 nebo novější a že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Prozatím byla aplikace pro šifrování vypnuta.",
"Following users are not set up for encryption:" => "Následující uživatelé nemají nastavené šifrování:",
"Initial encryption started... This can take some time. Please wait." => "Počáteční šifrování zahájeno... Toto může chvíli trvat. Počkejte prosím.",
-"Saving..." => "Ukládám...",
"Go directly to your " => "Běžte přímo do vašeho",
"personal settings" => "osobní nastavení",
"Encryption" => "Šifrování",
diff --git a/apps/files_encryption/l10n/cy_GB.php b/apps/files_encryption/l10n/cy_GB.php
index ea8b19963b0..6d3b898d002 100644
--- a/apps/files_encryption/l10n/cy_GB.php
+++ b/apps/files_encryption/l10n/cy_GB.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Yn cadw...",
"Encryption" => "Amgryptiad"
);
$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/files_encryption/l10n/da.php b/apps/files_encryption/l10n/da.php
index 9e4290534c0..f0f15800498 100644
--- a/apps/files_encryption/l10n/da.php
+++ b/apps/files_encryption/l10n/da.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Sørg for at PHP 5.3.3 eller nyere er installeret og at OpenSSL sammen med PHP-udvidelsen er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.",
"Following users are not set up for encryption:" => "Følgende brugere er ikke sat op til kryptering:",
"Initial encryption started... This can take some time. Please wait." => "Førstegangskryptering er påbegyndt... Dette kan tage nogen tid. Vent venligst.",
-"Saving..." => "Gemmer...",
+"Initial encryption running... Please try again later." => "Kryptering foretages... Prøv venligst igen senere.",
"Go directly to your " => "Gå direkte til din ",
"personal settings" => "Personlige indstillinger",
"Encryption" => "Kryptering",
diff --git a/apps/files_encryption/l10n/de.php b/apps/files_encryption/l10n/de.php
index 3ba50f074b9..38bfa7f0249 100644
--- a/apps/files_encryption/l10n/de.php
+++ b/apps/files_encryption/l10n/de.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stelle sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.",
"Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
"Initial encryption started... This can take some time. Please wait." => "Initialverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.",
-"Saving..." => "Speichern...",
+"Initial encryption running... Please try again later." => "Initiale Verschlüsselung läuft... Bitte versuche es später wieder.",
"Go directly to your " => "Direkt wechseln zu Deinem",
"personal settings" => "Private Einstellungen",
"Encryption" => "Verschlüsselung",
diff --git a/apps/files_encryption/l10n/de_CH.php b/apps/files_encryption/l10n/de_CH.php
index a31e82a666f..875efa84f27 100644
--- a/apps/files_encryption/l10n/de_CH.php
+++ b/apps/files_encryption/l10n/de_CH.php
@@ -11,7 +11,6 @@ $TRANSLATIONS = array(
"Missing requirements." => "Fehlende Voraussetzungen",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.",
"Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
-"Saving..." => "Speichern...",
"personal settings" => "Persönliche Einstellungen",
"Encryption" => "Verschlüsselung",
"Enable recovery key (allow to recover users files in case of password loss):" => "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht).",
diff --git a/apps/files_encryption/l10n/de_DE.php b/apps/files_encryption/l10n/de_DE.php
index 6184fd8a898..13f7718b93c 100644
--- a/apps/files_encryption/l10n/de_DE.php
+++ b/apps/files_encryption/l10n/de_DE.php
@@ -15,8 +15,8 @@ $TRANSLATIONS = array(
"Missing requirements." => "Fehlende Voraussetzungen",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.",
"Following users are not set up for encryption:" => "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
-"Initial encryption started... This can take some time. Please wait." => "Initialverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.",
-"Saving..." => "Speichern...",
+"Initial encryption started... This can take some time. Please wait." => "Anfangsverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.",
+"Initial encryption running... Please try again later." => "Anfangsverschlüsselung läuft... Bitte versuchen Sie es später wieder.",
"Go directly to your " => "Direkt wechseln zu Ihrem",
"personal settings" => "Persönliche Einstellungen",
"Encryption" => "Verschlüsselung",
diff --git a/apps/files_encryption/l10n/el.php b/apps/files_encryption/l10n/el.php
index 22c1095e284..ad8617bc6d2 100644
--- a/apps/files_encryption/l10n/el.php
+++ b/apps/files_encryption/l10n/el.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Παρακαλώ επιβεβαιώστε ότι η PHP 5.3.3 ή νεότερη είναι εγκατεστημένη και ότι το OpenSSL μαζί με το PHP extension είναι ενεργοποιήμένο και έχει ρυθμιστεί σωστά. Προς το παρόν, η εφαρμογή κρυπτογράφησης είναι απενεργοποιημένη.",
"Following users are not set up for encryption:" => "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:",
"Initial encryption started... This can take some time. Please wait." => "Η αρχική κρυπτογράφηση άρχισε... Αυτό μπορεί να πάρει κάποια ώρα. Παρακαλώ περιμένετε.",
-"Saving..." => "Γίνεται αποθήκευση...",
"Go directly to your " => "Πηγαίνε απευθείας στο ",
"personal settings" => "προσωπικές ρυθμίσεις",
"Encryption" => "Κρυπτογράφηση",
diff --git a/apps/files_encryption/l10n/en_GB.php b/apps/files_encryption/l10n/en_GB.php
index 55d56b9533e..2087ea4b8b1 100644
--- a/apps/files_encryption/l10n/en_GB.php
+++ b/apps/files_encryption/l10n/en_GB.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.",
"Following users are not set up for encryption:" => "Following users are not set up for encryption:",
"Initial encryption started... This can take some time. Please wait." => "Initial encryption started... This can take some time. Please wait.",
-"Saving..." => "Saving...",
+"Initial encryption running... Please try again later." => "Initial encryption running... Please try again later.",
"Go directly to your " => "Go directly to your ",
"personal settings" => "personal settings",
"Encryption" => "Encryption",
diff --git a/apps/files_encryption/l10n/eo.php b/apps/files_encryption/l10n/eo.php
index e14c7cd7ac9..05d30f2f6c4 100644
--- a/apps/files_encryption/l10n/eo.php
+++ b/apps/files_encryption/l10n/eo.php
@@ -4,7 +4,6 @@ $TRANSLATIONS = array(
"Could not change the password. Maybe the old password was not correct." => "Ne eblis ŝanĝi la pasvorton. Eble la malnova pasvorto malĝustis.",
"Private key password successfully updated." => "La pasvorto de la malpublika klavo sukcese ĝisdatiĝis.",
"Missing requirements." => "Mankas neproj.",
-"Saving..." => "Konservante...",
"Go directly to your " => "Iri direkte al via",
"personal settings" => "persona agordo",
"Encryption" => "Ĉifrado",
diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php
index 53453986883..cf45437c0e2 100644
--- a/apps/files_encryption/l10n/es.php
+++ b/apps/files_encryption/l10n/es.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.",
"Following users are not set up for encryption:" => "Los siguientes usuarios no han sido configurados para el cifrado:",
"Initial encryption started... This can take some time. Please wait." => "Encriptación iniciada..... Esto puede tomar un tiempo. Por favor espere.",
-"Saving..." => "Guardando...",
+"Initial encryption running... Please try again later." => "Cifrado inicial en curso... Inténtelo más tarde.",
"Go directly to your " => "Ir directamente a su",
"personal settings" => "opciones personales",
"Encryption" => "Cifrado",
diff --git a/apps/files_encryption/l10n/es_AR.php b/apps/files_encryption/l10n/es_AR.php
index df5bd649d67..bc1eedbf5eb 100644
--- a/apps/files_encryption/l10n/es_AR.php
+++ b/apps/files_encryption/l10n/es_AR.php
@@ -8,19 +8,26 @@ $TRANSLATIONS = array(
"Could not change the password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Comprobá que la contraseña actual sea correcta.",
"Private key password successfully updated." => "Contraseña de clave privada actualizada con éxito.",
"Could not update the private key password. Maybe the old password was not correct." => "No fue posible actualizar la contraseña de clave privada. Tal vez la contraseña anterior no es correcta.",
+"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "¡La aplicación de encriptación no está inicializada! Es probable que la aplicación fue re-habilitada durante tu sesión. Intenta salir y iniciar sesión para volverla a iniciar.",
+"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "¡Tu llave privada no es válida! Aparenta que tu clave fue cambiada fuera de %s (de tus directorios). Puedes actualizar la contraseña de tu clave privadaen las configuraciones personales para recobrar el acceso a tus archivos encriptados.",
+"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "No se puede descibrar este archivo, probablemente sea un archivo compartido. Por favor pídele al dueño que recomparta el archivo contigo.",
+"Unknown error please check your system settings or contact your administrator" => "Error desconocido, por favor chequea la configuración de tu sistema o contacte a su administrador",
"Missing requirements." => "Requisitos incompletos.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o una versión más reciente esté instalado y que OpenSSL junto con la extensión PHP esté habilitado y configurado apropiadamente. Por ahora, la aplicación de encriptación ha sido deshabilitada.",
"Following users are not set up for encryption:" => "Los siguientes usuarios no fueron configurados para encriptar:",
-"Saving..." => "Guardando...",
+"Initial encryption started... This can take some time. Please wait." => "Encriptación inicial comenzada... Esto puede durar un tiempo. Por favor espere.",
+"Go directly to your " => "Ve directamente a tu",
"personal settings" => "Configuración personal",
"Encryption" => "Encriptación",
"Enable recovery key (allow to recover users files in case of password loss):" => "Habilitar clave de recuperación (te permite recuperar los archivos de usuario en el caso que pierdas la contraseña):",
"Recovery key password" => "Contraseña de recuperación de clave",
+"Repeat Recovery key password" => "Repetir la contraseña de la clave de recuperación",
"Enabled" => "Habilitado",
"Disabled" => "Deshabilitado",
"Change recovery key password:" => "Cambiar contraseña para recuperar la clave:",
"Old Recovery key password" => "Contraseña antigua de recuperación de clave",
"New Recovery key password" => "Nueva contraseña de recuperación de clave",
+"Repeat New Recovery key password" => "Repetir Nueva contraseña para la clave de recuperación",
"Change Password" => "Cambiar contraseña",
"Your private key password no longer match your log-in password:" => "Tu contraseña de clave privada ya no coincide con la contraseña de ingreso:",
"Set your old private key password to your current log-in password." => "Usá tu contraseña de clave privada antigua para tu contraseña de ingreso actual.",
diff --git a/apps/files_encryption/l10n/es_MX.php b/apps/files_encryption/l10n/es_MX.php
index 3906e3cacbe..e2915f8e715 100644
--- a/apps/files_encryption/l10n/es_MX.php
+++ b/apps/files_encryption/l10n/es_MX.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.",
"Following users are not set up for encryption:" => "Los siguientes usuarios no han sido configurados para el cifrado:",
"Initial encryption started... This can take some time. Please wait." => "Encriptación iniciada... Esto puede tomar un tiempo. Por favor espere.",
-"Saving..." => "Guardando...",
"Go directly to your " => "Ir directamente a su",
"personal settings" => "opciones personales",
"Encryption" => "Cifrado",
diff --git a/apps/files_encryption/l10n/et_EE.php b/apps/files_encryption/l10n/et_EE.php
index 9182c5ef196..dcf035289fa 100644
--- a/apps/files_encryption/l10n/et_EE.php
+++ b/apps/files_encryption/l10n/et_EE.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Palun veendu, et on paigaldatud PHP 5.3.3 või uuem ning PHP OpenSSL laiendus on lubatud ning seadistatud korrektselt. Hetkel krüpteerimise rakendus on peatatud.",
"Following users are not set up for encryption:" => "Järgmised kasutajad pole seadistatud krüpteeringuks:",
"Initial encryption started... This can take some time. Please wait." => "Algne krüpteerimine käivitati... See võib võtta natuke aega. Palun oota.",
-"Saving..." => "Salvestamine...",
"Go directly to your " => "Liigu otse oma",
"personal settings" => "isiklikes seadetes",
"Encryption" => "Krüpteerimine",
diff --git a/apps/files_encryption/l10n/eu.php b/apps/files_encryption/l10n/eu.php
index 6b1bafdda1a..9d51ebba2bf 100644
--- a/apps/files_encryption/l10n/eu.php
+++ b/apps/files_encryption/l10n/eu.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Mesedez ziurtatu PHP 5.3.3 edo berriago bat instalatuta dagoela eta OpenSSL PHP hedapenarekin gaitua eta ongi konfiguratuta dagoela. Oraingoz, enkriptazio aplikazioa desgaituta dago.",
"Following users are not set up for encryption:" => "Hurrengo erabiltzaileak ez daude enktriptatzeko konfiguratutak:",
"Initial encryption started... This can take some time. Please wait." => "Hasierako enkriptazioa hasi da... Honek denbora har dezake. Mesedez itxaron.",
-"Saving..." => "Gordetzen...",
"Go directly to your " => "Joan zuzenean zure",
"personal settings" => "ezarpen pertsonalak",
"Encryption" => "Enkriptazioa",
diff --git a/apps/files_encryption/l10n/fa.php b/apps/files_encryption/l10n/fa.php
index ed044a4158e..3f8d631e106 100644
--- a/apps/files_encryption/l10n/fa.php
+++ b/apps/files_encryption/l10n/fa.php
@@ -9,7 +9,6 @@ $TRANSLATIONS = array(
"Private key password successfully updated." => "رمزعبور کلید خصوصی با موفقیت به روز شد.",
"Could not update the private key password. Maybe the old password was not correct." => "رمزعبور کلید خصوصی را نمی تواند به روز کند. شاید رمزعبور قدیمی صحیح نمی باشد.",
"Missing requirements." => "نیازمندی های گمشده",
-"Saving..." => "در حال ذخیره سازی...",
"personal settings" => "تنظیمات شخصی",
"Encryption" => "رمزگذاری",
"Enable recovery key (allow to recover users files in case of password loss):" => "فعال کردن کلید بازیابی(اجازه بازیابی فایل های کاربران در صورت از دست دادن رمزعبور):",
diff --git a/apps/files_encryption/l10n/fi_FI.php b/apps/files_encryption/l10n/fi_FI.php
index b3df41b1f42..6a0025cd980 100644
--- a/apps/files_encryption/l10n/fi_FI.php
+++ b/apps/files_encryption/l10n/fi_FI.php
@@ -3,8 +3,8 @@ $TRANSLATIONS = array(
"Recovery key successfully enabled" => "Palautusavain kytketty päälle onnistuneesti",
"Password successfully changed." => "Salasana vaihdettiin onnistuneesti.",
"Could not change the password. Maybe the old password was not correct." => "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.",
+"Private key password successfully updated." => "Yksityisen avaimen salasana päivitetty onnistuneesti.",
"Following users are not set up for encryption:" => "Seuraavat käyttäjät eivät ole määrittäneet salausta:",
-"Saving..." => "Tallennetaan...",
"personal settings" => "henkilökohtaiset asetukset",
"Encryption" => "Salaus",
"Recovery key password" => "Palautusavaimen salasana",
diff --git a/apps/files_encryption/l10n/fr.php b/apps/files_encryption/l10n/fr.php
index dbccbf74dcd..a68b6a71326 100644
--- a/apps/files_encryption/l10n/fr.php
+++ b/apps/files_encryption/l10n/fr.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Veuillez vous assurer qu'une version de PHP 5.3.3 ou supérieure est installée et qu'OpenSSL et son extension PHP sont activés et configurés correctement. En attendant, l'application de chiffrement été désactivée.",
"Following users are not set up for encryption:" => "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :",
"Initial encryption started... This can take some time. Please wait." => "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.",
-"Saving..." => "Enregistrement...",
+"Initial encryption running... Please try again later." => "Chiffrement initial en cours... Veuillez re-essayer ultérieurement.",
"Go directly to your " => "Allez directement à votre",
"personal settings" => "paramètres personnel",
"Encryption" => "Chiffrement",
diff --git a/apps/files_encryption/l10n/gl.php b/apps/files_encryption/l10n/gl.php
index 7b3c899d1f5..08567ef2763 100644
--- a/apps/files_encryption/l10n/gl.php
+++ b/apps/files_encryption/l10n/gl.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivado o aplicativo de cifrado.",
"Following users are not set up for encryption:" => "Os seguintes usuarios non teñen configuración para o cifrado:",
"Initial encryption started... This can take some time. Please wait." => "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.",
-"Saving..." => "Gardando...",
+"Initial encryption running... Please try again later." => "O cifrado inicial está en execución... Tenteo máis tarde.",
"Go directly to your " => "Vaia directamente ao seu",
"personal settings" => "axustes persoais",
"Encryption" => "Cifrado",
diff --git a/apps/files_encryption/l10n/he.php b/apps/files_encryption/l10n/he.php
index cdf29c9b0ac..ca8783d1964 100644
--- a/apps/files_encryption/l10n/he.php
+++ b/apps/files_encryption/l10n/he.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "שמירה…",
"Encryption" => "הצפנה"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/hu_HU.php b/apps/files_encryption/l10n/hu_HU.php
index 163011ff80b..a80c8d6f36d 100644
--- a/apps/files_encryption/l10n/hu_HU.php
+++ b/apps/files_encryption/l10n/hu_HU.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Kérem gondoskodjon arról, hogy PHP 5.3.3 vagy annál frissebb legyen telepítve, továbbá az OpenSSL a megfelelő PHP-bővítménnyel együtt rendelkezésre álljon és helyesen legyen konfigurálva! A titkosító modul egyelőre kikapcsolásra került.",
"Following users are not set up for encryption:" => "A következő felhasználók nem állították be a titkosítást:",
"Initial encryption started... This can take some time. Please wait." => "A titkosítási folyamat megkezdődött... Ez hosszabb ideig is eltarthat. Kérem várjon.",
-"Saving..." => "Mentés...",
"Go directly to your " => "Ugrás ide:",
"personal settings" => "személyes beállítások",
"Encryption" => "Titkosítás",
diff --git a/apps/files_encryption/l10n/id.php b/apps/files_encryption/l10n/id.php
index a719d445820..a4c3ae547c2 100644
--- a/apps/files_encryption/l10n/id.php
+++ b/apps/files_encryption/l10n/id.php
@@ -13,7 +13,6 @@ $TRANSLATIONS = array(
"Missing requirements." => "Persyaratan yang hilang.",
"Following users are not set up for encryption:" => "Pengguna berikut belum diatur untuk enkripsi:",
"Initial encryption started... This can take some time. Please wait." => "Inisial enskripsi dijalankan... Ini dapat memakan waktu. Silakan tunggu.",
-"Saving..." => "Menyimpan...",
"Go directly to your " => "Langsung ke anda",
"personal settings" => "pengaturan pribadi",
"Encryption" => "Enkripsi",
diff --git a/apps/files_encryption/l10n/is.php b/apps/files_encryption/l10n/is.php
index 27c0904a532..7b7a403b460 100644
--- a/apps/files_encryption/l10n/is.php
+++ b/apps/files_encryption/l10n/is.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Er að vista ...",
"Encryption" => "Dulkóðun"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/it.php b/apps/files_encryption/l10n/it.php
index fc1aaffc025..42ee846a768 100644
--- a/apps/files_encryption/l10n/it.php
+++ b/apps/files_encryption/l10n/it.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Assicurati che sia installato PHP 5.3.3 o versioni successive e che l'estensione OpenSSL di PHP sia abilitata e configurata correttamente. Per ora, l'applicazione di cifratura è disabilitata.",
"Following users are not set up for encryption:" => "I seguenti utenti non sono configurati per la cifratura:",
"Initial encryption started... This can take some time. Please wait." => "Cifratura iniziale avviata... Potrebbe richiedere del tempo. Attendi.",
-"Saving..." => "Salvataggio in corso...",
+"Initial encryption running... Please try again later." => "Cifratura iniziale in esecuzione... Riprova più tardi.",
"Go directly to your " => "Passa direttamente a",
"personal settings" => "impostazioni personali",
"Encryption" => "Cifratura",
diff --git a/apps/files_encryption/l10n/ja.php b/apps/files_encryption/l10n/ja.php
new file mode 100644
index 00000000000..476566e00f4
--- /dev/null
+++ b/apps/files_encryption/l10n/ja.php
@@ -0,0 +1,44 @@
+<?php
+$TRANSLATIONS = array(
+"Recovery key successfully enabled" => "リカバリ用のキーを正常に有効にしました",
+"Could not enable recovery key. Please check your recovery key password!" => "リカバリ用のキーを有効にできませんでした。リカバリ用のキーのパスワードを確認してください!",
+"Recovery key successfully disabled" => "リカバリ用のキーを正常に無効化しました",
+"Could not disable recovery key. Please check your recovery key password!" => "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認してください!",
+"Password successfully changed." => "パスワードを変更できました。",
+"Could not change the password. Maybe the old password was not correct." => "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
+"Private key password successfully updated." => "秘密鍵のパスワードが正常に更新されました。",
+"Could not update the private key password. Maybe the old password was not correct." => "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。",
+"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。",
+"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。",
+"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
+"Unknown error please check your system settings or contact your administrator" => "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
+"Missing requirements." => "必要要件が満たされていません。",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。",
+"Following users are not set up for encryption:" => "以下のユーザーは、暗号化設定がされていません:",
+"Initial encryption started... This can take some time. Please wait." => "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。お待ちください。",
+"Initial encryption running... Please try again later." => "初期暗号化実行中... 後でもう一度お試しください。",
+"Go directly to your " => "あなたのディレクトリへ",
+"personal settings" => "秘密鍵をアンロックできます",
+"Encryption" => "暗号化",
+"Enable recovery key (allow to recover users files in case of password loss):" => "リカバリキーを有効にする (パスワードを忘れた場合にユーザーのファイルを回復できます):",
+"Recovery key password" => "リカバリキーのパスワード",
+"Repeat Recovery key password" => "リカバリキーのパスワードをもう一度入力",
+"Enabled" => "有効",
+"Disabled" => "無効",
+"Change recovery key password:" => "リカバリキーのパスワードを変更:",
+"Old Recovery key password" => "古いリカバリキーのパスワード",
+"New Recovery key password" => "新しいリカバリキーのパスワード",
+"Repeat New Recovery key password" => "新しいリカバリキーのパスワードをもう一度入力",
+"Change Password" => "パスワードを変更",
+"Your private key password no longer match your log-in password:" => "もはや秘密鍵はログインパスワードと一致しません:",
+"Set your old private key password to your current log-in password." => "古い秘密鍵のパスワードを現在のログインパスワードに設定する。",
+" If you don't remember your old password you can ask your administrator to recover your files." => "古いパスワードを覚えていない場合、管理者に尋ねてファイルを回復することができます。",
+"Old log-in password" => "古いログインパスワード",
+"Current log-in password" => "現在のログインパスワード",
+"Update Private Key Password" => "秘密鍵のパスワードを更新",
+"Enable password recovery:" => "パスワードリカバリを有効に:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。",
+"File recovery settings updated" => "ファイルリカバリ設定を更新しました",
+"Could not update file recovery" => "ファイルリカバリを更新できませんでした"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/ja_JP.php b/apps/files_encryption/l10n/ja_JP.php
index 1206969746b..476566e00f4 100644
--- a/apps/files_encryption/l10n/ja_JP.php
+++ b/apps/files_encryption/l10n/ja_JP.php
@@ -1,34 +1,34 @@
<?php
$TRANSLATIONS = array(
-"Recovery key successfully enabled" => "リカバリ用のキーは正常に有効化されました",
-"Could not enable recovery key. Please check your recovery key password!" => "リカバリ用のキーを有効にできませんでした。リカバリ用のキーのパスワードを確認して下さい!",
+"Recovery key successfully enabled" => "リカバリ用のキーを正常に有効にしました",
+"Could not enable recovery key. Please check your recovery key password!" => "リカバリ用のキーを有効にできませんでした。リカバリ用のキーのパスワードを確認してください!",
"Recovery key successfully disabled" => "リカバリ用のキーを正常に無効化しました",
-"Could not disable recovery key. Please check your recovery key password!" => "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認して下さい!",
+"Could not disable recovery key. Please check your recovery key password!" => "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認してください!",
"Password successfully changed." => "パスワードを変更できました。",
"Could not change the password. Maybe the old password was not correct." => "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
"Private key password successfully updated." => "秘密鍵のパスワードが正常に更新されました。",
"Could not update the private key password. Maybe the old password was not correct." => "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。",
-"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "暗号化アプリが初期化されていません。暗号化アプリが接続中に再度有効かされた可能性があります。暗号化アプリを初期化する為に、1回ログアウトしてログインしなおしてください。",
+"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
"Unknown error please check your system settings or contact your administrator" => "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
"Missing requirements." => "必要要件が満たされていません。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。",
"Following users are not set up for encryption:" => "以下のユーザーは、暗号化設定がされていません:",
-"Initial encryption started... This can take some time. Please wait." => "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。今しばらくお待ちください。",
-"Saving..." => "保存中...",
+"Initial encryption started... This can take some time. Please wait." => "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。お待ちください。",
+"Initial encryption running... Please try again later." => "初期暗号化実行中... 後でもう一度お試しください。",
"Go directly to your " => "あなたのディレクトリへ",
"personal settings" => "秘密鍵をアンロックできます",
"Encryption" => "暗号化",
-"Enable recovery key (allow to recover users files in case of password loss):" => "復旧キーを有効化 (万一パスワードを亡くした場合もユーザーのファイルを回復できる):",
-"Recovery key password" => "復旧キーのパスワード",
-"Repeat Recovery key password" => "復旧キーのパスワードをもう一度入力",
+"Enable recovery key (allow to recover users files in case of password loss):" => "リカバリキーを有効にする (パスワードを忘れた場合にユーザーのファイルを回復できます):",
+"Recovery key password" => "リカバリキーのパスワード",
+"Repeat Recovery key password" => "リカバリキーのパスワードをもう一度入力",
"Enabled" => "有効",
"Disabled" => "無効",
-"Change recovery key password:" => "復旧キーのパスワードを変更:",
-"Old Recovery key password" => "古い復旧キーのパスワード",
-"New Recovery key password" => "新しい復旧キーのパスワード",
-"Repeat New Recovery key password" => "新しい復旧キーのパスワードをもう一度入力",
+"Change recovery key password:" => "リカバリキーのパスワードを変更:",
+"Old Recovery key password" => "古いリカバリキーのパスワード",
+"New Recovery key password" => "新しいリカバリキーのパスワード",
+"Repeat New Recovery key password" => "新しいリカバリキーのパスワードをもう一度入力",
"Change Password" => "パスワードを変更",
"Your private key password no longer match your log-in password:" => "もはや秘密鍵はログインパスワードと一致しません:",
"Set your old private key password to your current log-in password." => "古い秘密鍵のパスワードを現在のログインパスワードに設定する。",
@@ -36,9 +36,9 @@ $TRANSLATIONS = array(
"Old log-in password" => "古いログインパスワード",
"Current log-in password" => "現在のログインパスワード",
"Update Private Key Password" => "秘密鍵のパスワードを更新",
-"Enable password recovery:" => "パスワード復旧を有効化:",
+"Enable password recovery:" => "パスワードリカバリを有効に:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。",
-"File recovery settings updated" => "ファイル復旧設定が更新されました",
-"Could not update file recovery" => "ファイル復旧を更新できませんでした"
+"File recovery settings updated" => "ファイルリカバリ設定を更新しました",
+"Could not update file recovery" => "ファイルリカバリを更新できませんでした"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/ka_GE.php b/apps/files_encryption/l10n/ka_GE.php
index bbabd449648..d0634634778 100644
--- a/apps/files_encryption/l10n/ka_GE.php
+++ b/apps/files_encryption/l10n/ka_GE.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "შენახვა...",
"Encryption" => "ენკრიპცია"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/ko.php b/apps/files_encryption/l10n/ko.php
index d91e861ca5d..41168a340c0 100644
--- a/apps/files_encryption/l10n/ko.php
+++ b/apps/files_encryption/l10n/ko.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "PHP 5.3.3 이상 설치 여부, PHP의 OpenSSL 확장 기능 활성화 및 설정 여부를 확인하십시오. 암호화 앱이 비활성화 되었습니다.",
"Following users are not set up for encryption:" => "다음 사용자는 암호화를 사용할 수 없습니다:",
"Initial encryption started... This can take some time. Please wait." => "초기 암호화가 시작되었습니다... 시간이 걸릴 수도 있으니 기다려 주십시오.",
-"Saving..." => "저장 중...",
"Go directly to your " => "다음으로 바로 가기: ",
"personal settings" => "개인 설정",
"Encryption" => "암호화",
diff --git a/apps/files_encryption/l10n/ku_IQ.php b/apps/files_encryption/l10n/ku_IQ.php
index d971350b4c7..d7b10d1df62 100644
--- a/apps/files_encryption/l10n/ku_IQ.php
+++ b/apps/files_encryption/l10n/ku_IQ.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "پاشکه‌وتده‌کات...",
"Encryption" => "نهێنیکردن"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/lt_LT.php b/apps/files_encryption/l10n/lt_LT.php
index 993e03388d9..dd8a0d7633c 100644
--- a/apps/files_encryption/l10n/lt_LT.php
+++ b/apps/files_encryption/l10n/lt_LT.php
@@ -9,12 +9,13 @@ $TRANSLATIONS = array(
"Private key password successfully updated." => "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.",
"Could not update the private key password. Maybe the old password was not correct." => "Nepavyko atnaujinti privataus rakto slaptažodžio. Gali būti, kad buvo neteisingai suvestas senasis.",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Šifravimo programa nepaleista! Galbūt šifravimo programa buvo įjungta dar kartą Jūsų sesijos metu. Prašome atsijungti ir vėl prisijungti, kad paleisti šifravimo programą.",
+"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Jūsų privatus raktas yra netinkamas! Panašu, kad Jūsų slaptažodis buvo pakeistas už %s (pvz. Jūsų organizacijos kataloge). Galite atnaujinti savo privataus rakto slaptažodį savo asmeniniuose nustatymuose, kad atkurti prieigą prie savo šifruotų failų.",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Failo iššifruoti nepavyko, gali būti jog jis yra pasidalintas su jumis. Paprašykite failo savininko, kad jums iš naujo pateiktų šį failą.",
"Unknown error please check your system settings or contact your administrator" => "Neatpažinta klaida, patikrinkite sistemos nustatymus arba kreipkitės į savo sistemos aministratorių",
"Missing requirements." => "Trūkstami laukai.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Prašome įsitikinti, kad PHP 5.3.3 ar naujesnė yra įdiegta ir kad OpenSSL kartu su PHP plėtiniu yra šjungti ir teisingai sukonfigūruoti. Kol kas šifravimo programa bus išjungta.",
"Following users are not set up for encryption:" => "Sekantys naudotojai nenustatyti šifravimui:",
-"Saving..." => "Saugoma...",
+"Initial encryption started... This can take some time. Please wait." => "Pradėtas pirminis šifravimas... Tai gali užtrukti. Prašome palaukti.",
"Go directly to your " => "Eiti tiesiai į Jūsų",
"personal settings" => "asmeniniai nustatymai",
"Encryption" => "Šifravimas",
diff --git a/apps/files_encryption/l10n/lv.php b/apps/files_encryption/l10n/lv.php
index b8414174a74..cbf8b7cbdaf 100644
--- a/apps/files_encryption/l10n/lv.php
+++ b/apps/files_encryption/l10n/lv.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Saglabā...",
"Encryption" => "Šifrēšana"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);";
diff --git a/apps/files_encryption/l10n/mk.php b/apps/files_encryption/l10n/mk.php
index 098f4d635ba..b13d2c28ce5 100644
--- a/apps/files_encryption/l10n/mk.php
+++ b/apps/files_encryption/l10n/mk.php
@@ -3,7 +3,6 @@ $TRANSLATIONS = array(
"Password successfully changed." => "Лозинката е успешно променета.",
"Could not change the password. Maybe the old password was not correct." => "Лозинката не можеше да се промени. Можеби старата лозинка не беше исправна.",
"Missing requirements." => "Барања кои недостасуваат.",
-"Saving..." => "Снимам...",
"Go directly to your " => "Одете директно на вашиот",
"personal settings" => "лични подесувања",
"Encryption" => "Енкрипција",
diff --git a/apps/files_encryption/l10n/nb_NO.php b/apps/files_encryption/l10n/nb_NO.php
index 26956c410a3..f7484c0e154 100644
--- a/apps/files_encryption/l10n/nb_NO.php
+++ b/apps/files_encryption/l10n/nb_NO.php
@@ -1,6 +1,43 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Lagrer...",
-"Encryption" => "Kryptering"
+"Recovery key successfully enabled" => "Gjenopprettingsnøkkel aktivert",
+"Could not enable recovery key. Please check your recovery key password!" => "Klarte ikke å aktivere gjenopprettingsnøkkel. Sjekk passordet for gjenopprettingsnøkkelen.",
+"Recovery key successfully disabled" => "Gjenopprettingsnøkkel ble deaktivert",
+"Could not disable recovery key. Please check your recovery key password!" => "Klarte ikke å deaktivere gjenopprettingsnøkkel. Sjekk passordet for gjenopprettingsnøkkelen.",
+"Password successfully changed." => "Passordet ble endret.",
+"Could not change the password. Maybe the old password was not correct." => "Klarte ikke å endre passordet. Kanskje gammelt passord ikke var korrekt.",
+"Private key password successfully updated." => "Passord for privat nøkkel ble oppdatert.",
+"Could not update the private key password. Maybe the old password was not correct." => "Klarte ikke å oppdatere passord for privat nøkkel. Kanskje gammelt passord ikke var korrekt.",
+"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Krypterings-app ikke initialisert! Kanskje krypterings-appen ble aktivert på nytt i løpet av økten din. Prøv å logge ut og logge inn igjen for å initialisere krypterings-appen.",
+"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Din private nøkkel er ikke gyldig! Sannsynligvis ble passordet ditt endret utenfor %s. (f.eks. din bedriftskatalog). Du kan oppdatere passordet for din private nøkkel i dine personlige innstillinger for å gjenvinne tilgang til de krypterte filene dine.",
+"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Kan ikke dekryptere denne filen. Dette er sannsynligvis en delt fil. Spør eieren av filen om å dele den med deg på nytt.",
+"Unknown error please check your system settings or contact your administrator" => "Ukjent feil. Sjekk systeminnstillingene dine eller kontakt administratoren",
+"Missing requirements." => "Manglende krav.",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Vennligst se til at PHP 5.3.3 eller nyere er installert og at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Enn så lenge er krypterings-appen deaktivert.",
+"Following users are not set up for encryption:" => "Følgende brukere er ikke satt opp for kryptering:",
+"Initial encryption started... This can take some time. Please wait." => "Første gangs kryptering startet... Dette kan ta litt tid. Vennligst vent.",
+"Go directly to your " => "Gå direkte til din",
+"personal settings" => "personlige innstillinger",
+"Encryption" => "Kryptering",
+"Enable recovery key (allow to recover users files in case of password loss):" => "Aktiver gjenopprettingsnøkkel (tillat å gjenopprette brukerfiler i tilfelle tap av passord):",
+"Recovery key password" => "Passord for gjenopprettingsnøkkel",
+"Repeat Recovery key password" => "Gjenta passord for gjenopprettingsnøkkel",
+"Enabled" => "Aktiv",
+"Disabled" => "Inaktiv",
+"Change recovery key password:" => "Endre passord for gjenopprettingsnøkkel:",
+"Old Recovery key password" => "Gammelt passord for gjenopprettingsnøkkel",
+"New Recovery key password" => "Nytt passord for gjenopprettingsnøkkel",
+"Repeat New Recovery key password" => "Gjenta nytt passord for gjenopprettingsnøkkel",
+"Change Password" => "Endre passord",
+"Your private key password no longer match your log-in password:" => "Ditt passord for privat nøkkel stemmer ikke med påloggingspassordet ditt lenger:",
+"Set your old private key password to your current log-in password." => "Sett ditt gamle passord for privat nøkkel til ditt nåværende påloggingspassord.",
+" If you don't remember your old password you can ask your administrator to recover your files." => "Hvis du ikke husker det gamle passordet ditt kan du spørre administratoren om å gjenopprette filene dine.",
+"Old log-in password" => "Gammelt påloggingspassord",
+"Current log-in password" => "Nåværende påloggingspassord",
+"Update Private Key Password" => "Oppdater passord for privat nøkkel",
+"Enable password recovery:" => "Aktiver gjenoppretting av passord:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Aktivering av dette valget tillater deg å gjenerobre tilgang til dine krypterte filer i tilfelle du mister passordet ditt.",
+"File recovery settings updated" => "Innstillinger for gjenoppretting av filer ble oppdatert",
+"Could not update file recovery" => "Klarte ikke å oppdatere gjenoppretting av filer"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/nl.php b/apps/files_encryption/l10n/nl.php
index 081e46a785c..e878fc6c12e 100644
--- a/apps/files_encryption/l10n/nl.php
+++ b/apps/files_encryption/l10n/nl.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Wees er zeker van dat PHP5.3.3 of nieuwer is geïstalleerd en dat de OpenSSL PHP extensie is ingeschakeld en correct geconfigureerd. De versleutel-app is voorlopig uitgeschakeld.",
"Following users are not set up for encryption:" => "De volgende gebruikers hebben geen configuratie voor encryptie:",
"Initial encryption started... This can take some time. Please wait." => "initiële versleuteling gestart... Dit kan even duren, geduld a.u.b.",
-"Saving..." => "Opslaan",
+"Initial encryption running... Please try again later." => "Initiële versleuteling bezig... Probeer het later opnieuw.",
"Go directly to your " => "Ga meteen naar uw",
"personal settings" => "persoonlijke instellingen",
"Encryption" => "Versleuteling",
diff --git a/apps/files_encryption/l10n/nn_NO.php b/apps/files_encryption/l10n/nn_NO.php
index bb30d69c592..c472655c8b0 100644
--- a/apps/files_encryption/l10n/nn_NO.php
+++ b/apps/files_encryption/l10n/nn_NO.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Lagrar …",
"Encryption" => "Kryptering"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/pl.php b/apps/files_encryption/l10n/pl.php
index b768bd46f8c..db2a02cec9a 100644
--- a/apps/files_encryption/l10n/pl.php
+++ b/apps/files_encryption/l10n/pl.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Proszę upewnić się, że PHP 5.3.3 lub nowszy jest zainstalowany i że OpenSSL oraz rozszerzenie PHP jest włączone i poprawnie skonfigurowane. Obecnie szyfrowanie aplikacji zostało wyłączone.",
"Following users are not set up for encryption:" => "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:",
"Initial encryption started... This can take some time. Please wait." => "Rozpoczęto szyfrowanie... To może chwilę potrwać. Proszę czekać.",
-"Saving..." => "Zapisywanie...",
+"Initial encryption running... Please try again later." => "Trwa szyfrowanie początkowe...Spróbuj ponownie.",
"Go directly to your " => "Przejdź bezpośrednio do",
"personal settings" => "Ustawienia osobiste",
"Encryption" => "Szyfrowanie",
diff --git a/apps/files_encryption/l10n/pt_BR.php b/apps/files_encryption/l10n/pt_BR.php
index 2fce7fd13a5..204311658ac 100644
--- a/apps/files_encryption/l10n/pt_BR.php
+++ b/apps/files_encryption/l10n/pt_BR.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Por favor, certifique-se que o PHP 5.3.3 ou mais recente está instalado e que a extensão PHP OpenSSL está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.",
"Following users are not set up for encryption:" => "Seguintes usuários não estão configurados para criptografia:",
"Initial encryption started... This can take some time. Please wait." => "Criptografia inicial inicializada... Isto pode tomar algum tempo. Por favor espere.",
-"Saving..." => "Salvando...",
+"Initial encryption running... Please try again later." => "Criptografia inicial em execução ... Por favor, tente novamente mais tarde.",
"Go directly to your " => "Ir diretamente para o seu",
"personal settings" => "configurações pessoais.",
"Encryption" => "Criptografia",
diff --git a/apps/files_encryption/l10n/pt_PT.php b/apps/files_encryption/l10n/pt_PT.php
index 77424005c3e..d6d3c260363 100644
--- a/apps/files_encryption/l10n/pt_PT.php
+++ b/apps/files_encryption/l10n/pt_PT.php
@@ -9,7 +9,6 @@ $TRANSLATIONS = array(
"Could not update the private key password. Maybe the old password was not correct." => "Não foi possível alterar a chave. Possivelmente a password antiga não está correcta.",
"Missing requirements." => "Faltam alguns requisitos.",
"Following users are not set up for encryption:" => "Os utilizadores seguintes não estão marcados para cifragem:",
-"Saving..." => "A guardar...",
"personal settings" => "configurações personalizadas ",
"Encryption" => "Encriptação",
"Enable recovery key (allow to recover users files in case of password loss):" => "Active a chave de recuperação (permite recuperar os ficheiros no caso de perda da password):",
diff --git a/apps/files_encryption/l10n/ro.php b/apps/files_encryption/l10n/ro.php
index 3dcdce32418..5aabc498642 100644
--- a/apps/files_encryption/l10n/ro.php
+++ b/apps/files_encryption/l10n/ro.php
@@ -1,6 +1,20 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Se salvează...",
-"Encryption" => "Încriptare"
+"Recovery key successfully enabled" => "Cheia de recupeare a fost activata cu succes",
+"Could not enable recovery key. Please check your recovery key password!" => "Nu s-a putut activa cheia de recuperare. Verifica parola de recuperare!",
+"Recovery key successfully disabled" => "Cheia de recuperare dezactivata cu succes",
+"Could not disable recovery key. Please check your recovery key password!" => "Nu am putut dezactiva cheia de recuperare. Verifica parola de recuperare!",
+"Password successfully changed." => "Parola a fost modificată cu succes.",
+"Could not change the password. Maybe the old password was not correct." => "Parola nu a putut fi schimbata. Poate ca parola veche este incorecta.",
+"Private key password successfully updated." => "Cheia privata a fost actualizata cu succes",
+"Could not update the private key password. Maybe the old password was not correct." => "Nu am putut actualiza parola pentru cheia privata. Poate ca parola veche este incorecta.",
+"personal settings" => "setari personale",
+"Encryption" => "Încriptare",
+"Enabled" => "Activat",
+"Disabled" => "Dezactivat",
+"Change Password" => "Schimbă parola",
+"Your private key password no longer match your log-in password:" => "Parola cheii private nu se mai potriveste cu parola ta de logare:",
+"File recovery settings updated" => "Setarile pentru recuperarea fisierelor au fost actualizate",
+"Could not update file recovery" => "Nu am putut actualiza recuperarea de fisiere"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/files_encryption/l10n/ru.php b/apps/files_encryption/l10n/ru.php
index e9744b3db4d..bce245ce680 100644
--- a/apps/files_encryption/l10n/ru.php
+++ b/apps/files_encryption/l10n/ru.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Пожалуйста, убедитесь, что версия PHP 5.3.3 или новее, а также, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования отключено.",
"Following users are not set up for encryption:" => "Для следующих пользователей шифрование не настроено:",
"Initial encryption started... This can take some time. Please wait." => "Начато начальное шифрование... Это может занять какое-то время. Пожалуйста, подождите.",
-"Saving..." => "Сохранение...",
"Go directly to your " => "Перейти прямо в",
"personal settings" => "персональные настройки",
"Encryption" => "Шифрование",
diff --git a/apps/files_encryption/l10n/si_LK.php b/apps/files_encryption/l10n/si_LK.php
index 5f5330df547..4c7dc957bfe 100644
--- a/apps/files_encryption/l10n/si_LK.php
+++ b/apps/files_encryption/l10n/si_LK.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "සුරැකෙමින් පවතී...",
"Encryption" => "ගුප්ත කේතනය"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/sk_SK.php b/apps/files_encryption/l10n/sk_SK.php
index 9e2c01eba33..5fcd0a9f060 100644
--- a/apps/files_encryption/l10n/sk_SK.php
+++ b/apps/files_encryption/l10n/sk_SK.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Prosím uistite sa, že PHP verzie 5.3.3 alebo novšej je nainštalované a tiež, že OpenSSL knižnica spolu z PHP rozšírením je povolená a konfigurovaná správne. Nateraz bola aplikácia šifrovania zablokovaná.",
"Following users are not set up for encryption:" => "Nasledujúci používatelia nie sú nastavení pre šifrovanie:",
"Initial encryption started... This can take some time. Please wait." => "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.",
-"Saving..." => "Ukladám...",
"Go directly to your " => "Choďte priamo do vášho",
"personal settings" => "osobné nastavenia",
"Encryption" => "Šifrovanie",
diff --git a/apps/files_encryption/l10n/sl.php b/apps/files_encryption/l10n/sl.php
index 60faf34cf88..e581f9323c2 100644
--- a/apps/files_encryption/l10n/sl.php
+++ b/apps/files_encryption/l10n/sl.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Preverite, ali je na strežniku nameščen paket PHP 5.3.3 ali novejši, da je omogočen in pravilno nastavljen PHP OpenSSL. Z obstoječimi možnostmi šifriranje ni mogoče.",
"Following users are not set up for encryption:" => "Navedeni uporabniki še nimajo nastavljenega šifriranja:",
"Initial encryption started... This can take some time. Please wait." => "Začetno šifriranje je začeto ... Opravilo je lahko dolgotrajno.",
-"Saving..." => "Poteka shranjevanje ...",
+"Initial encryption running... Please try again later." => "Začetno šifriranje je v teku ... Poskusite kasneje.",
"Go directly to your " => "Skočite neposredno na",
"personal settings" => "osebne nastavitve",
"Encryption" => "Šifriranje",
diff --git a/apps/files_encryption/l10n/sr.php b/apps/files_encryption/l10n/sr.php
index cbf87dcf4d2..8a291faed23 100644
--- a/apps/files_encryption/l10n/sr.php
+++ b/apps/files_encryption/l10n/sr.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Чување у току...",
"Encryption" => "Шифровање"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_encryption/l10n/sv.php b/apps/files_encryption/l10n/sv.php
index 1e509ea08e7..90a9bd73a6f 100644
--- a/apps/files_encryption/l10n/sv.php
+++ b/apps/files_encryption/l10n/sv.php
@@ -15,7 +15,6 @@ $TRANSLATIONS = array(
"Missing requirements." => "Krav som saknas",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Kontrollera att PHP 5.3.3 eller senare är installerad och att tillägget OpenSSL PHP är aktiverad och korrekt konfigurerad. Kryptering är tillsvidare inaktiverad.",
"Following users are not set up for encryption:" => "Följande användare har inte aktiverat kryptering:",
-"Saving..." => "Sparar...",
"Go directly to your " => "Gå direkt till din",
"personal settings" => "personliga inställningar",
"Encryption" => "Kryptering",
diff --git a/apps/files_encryption/l10n/ta_LK.php b/apps/files_encryption/l10n/ta_LK.php
index 9dec6de3acb..327102b5df6 100644
--- a/apps/files_encryption/l10n/ta_LK.php
+++ b/apps/files_encryption/l10n/ta_LK.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "சேமிக்கப்படுகிறது...",
"Encryption" => "மறைக்குறியீடு"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_encryption/l10n/th_TH.php b/apps/files_encryption/l10n/th_TH.php
index 7bf3e2765aa..cc670e425a6 100644
--- a/apps/files_encryption/l10n/th_TH.php
+++ b/apps/files_encryption/l10n/th_TH.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "กำลังบันทึกข้อมูล...",
"Encryption" => "การเข้ารหัส"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/tr.php b/apps/files_encryption/l10n/tr.php
index b8289ab71f9..85e35f5dddf 100644
--- a/apps/files_encryption/l10n/tr.php
+++ b/apps/files_encryption/l10n/tr.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "PHP 5.3.3 veya daha sürümü ile birlikte OpenSSL ve OpenSSL PHP uzantısının birlikte etkin olduğunu ve doğru bir şekilde yapılandırıldığından emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı",
"Following users are not set up for encryption:" => "Aşağıdaki kullanıcılar şifreleme için ayarlanmadılar:",
"Initial encryption started... This can take some time. Please wait." => "İlk şifreleme başladı... Bu biraz zaman alabilir. Lütfen bekleyin.",
-"Saving..." => "Kaydediliyor...",
+"Initial encryption running... Please try again later." => "İlk şifreleme çalışıyor... Lütfen daha sonra tekrar deneyin.",
"Go directly to your " => "Doğrudan şuraya gidin:",
"personal settings" => "kişisel ayarlar",
"Encryption" => "Şifreleme",
diff --git a/apps/files_encryption/l10n/ug.php b/apps/files_encryption/l10n/ug.php
index 25b3f68634b..da9144bb930 100644
--- a/apps/files_encryption/l10n/ug.php
+++ b/apps/files_encryption/l10n/ug.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "ساقلاۋاتىدۇ…",
"Encryption" => "شىفىرلاش"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/uk.php b/apps/files_encryption/l10n/uk.php
index 5260dd3f2f7..e406c092280 100644
--- a/apps/files_encryption/l10n/uk.php
+++ b/apps/files_encryption/l10n/uk.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Saving..." => "Зберігаю...",
"personal settings" => "особисті налаштування",
"Encryption" => "Шифрування",
"Change Password" => "Змінити Пароль"
diff --git a/apps/files_encryption/l10n/vi.php b/apps/files_encryption/l10n/vi.php
index 18882be63a1..c752f0af224 100644
--- a/apps/files_encryption/l10n/vi.php
+++ b/apps/files_encryption/l10n/vi.php
@@ -1,11 +1,27 @@
<?php
$TRANSLATIONS = array(
+"Recovery key successfully enabled" => "Khóa khôi phục kích hoạt thành công",
+"Could not enable recovery key. Please check your recovery key password!" => "Không thể kích hoạt khóa khôi phục. Vui lòng kiểm tra mật khẩu khóa khôi phục!",
+"Recovery key successfully disabled" => "Vô hiệu hóa khóa khôi phục thành công",
+"Could not disable recovery key. Please check your recovery key password!" => "Không thể vô hiệu hóa khóa khôi phục. Vui lòng kiểm tra mật khẩu khóa khôi phục!",
"Password successfully changed." => "Đã đổi mật khẩu.",
"Could not change the password. Maybe the old password was not correct." => "Không thể đổi mật khẩu. Có lẽ do mật khẩu cũ không đúng.",
-"Saving..." => "Đang lưu...",
+"Private key password successfully updated." => "Cập nhật thành công mật khẩu khóa cá nhân",
+"Could not update the private key password. Maybe the old password was not correct." => "Không thể cập nhật mật khẩu khóa cá nhân. Có thể mật khẩu cũ không đúng",
+"personal settings" => "Thiết lập cá nhân",
"Encryption" => "Mã hóa",
"Enabled" => "Bật",
"Disabled" => "Tắt",
-"Change Password" => "Đổi Mật khẩu"
+"Change Password" => "Đổi Mật khẩu",
+"Your private key password no longer match your log-in password:" => "Mật khẩu khóa cá nhân không còn phù hợp với mật khẩu đăng nhập:",
+"Set your old private key password to your current log-in password." => "Thiết lập mật khẩu khóa cá nhân cũ đến mật khẩu đăng nhập hiện tại.",
+" If you don't remember your old password you can ask your administrator to recover your files." => "Nếu bạn không nhớ mật khẩu cũ, bạn có thể yêu cầu quản trị viên khôi phục tập tin của bạn.",
+"Old log-in password" => "Mật khẩu đăng nhập cũ",
+"Current log-in password" => "Mật khẩu đăng nhập hiện tại",
+"Update Private Key Password" => "Cập nhật mật khẩu khóa cá nhân",
+"Enable password recovery:" => "Kích hoạt khôi phục mật khẩu:",
+"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Tùy chọn này sẽ cho phép bạn tái truy cập đến các tập tin mã hóa trong trường hợp mất mật khẩu",
+"File recovery settings updated" => "Đã cập nhật thiết lập khôi phục tập tin ",
+"Could not update file recovery" => "Không thể cập nhật khôi phục tập tin"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/zh_CN.php b/apps/files_encryption/l10n/zh_CN.php
index a51856aec94..4d277e9b174 100644
--- a/apps/files_encryption/l10n/zh_CN.php
+++ b/apps/files_encryption/l10n/zh_CN.php
@@ -8,7 +8,6 @@ $TRANSLATIONS = array(
"Could not change the password. Maybe the old password was not correct." => "不能修改密码。旧密码可能不正确。",
"Private key password successfully updated." => "私钥密码成功更新。",
"Could not update the private key password. Maybe the old password was not correct." => "无法更新私钥密码。可能旧密码不正确。",
-"Saving..." => "保存中",
"personal settings" => "个人设置",
"Encryption" => "加密",
"Enable recovery key (allow to recover users files in case of password loss):" => "启用恢复密钥(允许你在密码丢失后恢复文件):",
diff --git a/apps/files_encryption/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php
index 8972490ea5a..390e6aff8c6 100644
--- a/apps/files_encryption/l10n/zh_TW.php
+++ b/apps/files_encryption/l10n/zh_TW.php
@@ -15,7 +15,6 @@ $TRANSLATIONS = array(
"Missing requirements." => "遺失必要條件。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。",
"Following users are not set up for encryption:" => "以下的使用者無法設定加密:",
-"Saving..." => "儲存中...",
"Go directly to your " => "直接到您的",
"personal settings" => "個人設定",
"Encryption" => "加密",
diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php
index 9155d238c77..caca13acece 100755
--- a/apps/files_encryption/lib/crypt.php
+++ b/apps/files_encryption/lib/crypt.php
@@ -182,6 +182,7 @@ class Crypt {
* @param $data
* @param string $relPath The path of the file, relative to user/data;
* e.g. filename or /Docs/filename, NOT admin/files/filename
+ * @param boolean $isCatFileContent
* @return boolean
*/
public static function isLegacyEncryptedContent($isCatFileContent, $relPath) {
@@ -209,8 +210,8 @@ class Crypt {
/**
* @brief Symmetrically encrypt a string
- * @param $plainContent
- * @param $iv
+ * @param string $plainContent
+ * @param string $iv
* @param string $passphrase
* @return string encrypted file content
*/
@@ -229,9 +230,9 @@ class Crypt {
/**
* @brief Symmetrically decrypt a string
- * @param $encryptedContent
- * @param $iv
- * @param $passphrase
+ * @param string $encryptedContent
+ * @param string $iv
+ * @param string $passphrase
* @throws \Exception
* @return string decrypted file content
*/
@@ -292,8 +293,7 @@ class Crypt {
* @brief Symmetrically encrypts a string and returns keyfile content
* @param string $plainContent content to be encrypted in keyfile
* @param string $passphrase
- * @return bool|string
- * @return string encrypted content combined with IV
+ * @return false|string encrypted content combined with IV
* @note IV need not be specified, as it will be stored in the returned keyfile
* and remain accessible therein.
*/
@@ -326,7 +326,7 @@ class Crypt {
* @param $keyfileContent
* @param string $passphrase
* @throws \Exception
- * @return bool|string
+ * @return string|false
* @internal param string $source
* @internal param string $target
* @internal param string $key the decryption key
@@ -438,7 +438,7 @@ class Crypt {
* @param $encryptedContent
* @param $shareKey
* @param $privateKey
- * @return bool
+ * @return false|string
* @internal param string $plainContent content to be encrypted
* @returns string $plainContent decrypted string
* @note symmetricDecryptFileContent() can be used to decrypt files created using this method
diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php
index bb06a57c714..8cbbe8a45a6 100755
--- a/apps/files_encryption/lib/helper.php
+++ b/apps/files_encryption/lib/helper.php
@@ -103,7 +103,7 @@ class Helper {
* @brief enable recovery
*
* @param $recoveryKeyId
- * @param $recoveryPassword
+ * @param string $recoveryPassword
* @internal param \OCA\Encryption\Util $util
* @internal param string $password
* @return bool
@@ -111,10 +111,11 @@ class Helper {
public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) {
$view = new \OC\Files\View('/');
+ $appConfig = \OC::$server->getAppConfig();
if ($recoveryKeyId === null) {
$recoveryKeyId = 'recovery_' . substr(md5(time()), 0, 8);
- \OC_Appconfig::setValue('files_encryption', 'recoveryKeyId', $recoveryKeyId);
+ $appConfig->setValue('files_encryption', 'recoveryKeyId', $recoveryKeyId);
}
if (!$view->is_dir('/owncloud_private_key')) {
@@ -147,7 +148,7 @@ class Helper {
\OC_FileProxy::$enabled = true;
// Set recoveryAdmin as enabled
- \OC_Appconfig::setValue('files_encryption', 'recoveryAdminEnabled', 1);
+ $appConfig->setValue('files_encryption', 'recoveryAdminEnabled', 1);
$return = true;
@@ -155,7 +156,7 @@ class Helper {
$util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), \OCP\User::getUser());
$return = $util->checkRecoveryPassword($recoveryPassword);
if ($return) {
- \OC_Appconfig::setValue('files_encryption', 'recoveryAdminEnabled', 1);
+ $appConfig->setValue('files_encryption', 'recoveryAdminEnabled', 1);
}
}
@@ -209,7 +210,7 @@ class Helper {
/**
* @brief disable recovery
*
- * @param $recoveryPassword
+ * @param string $recoveryPassword
* @return bool
*/
public static function adminDisableRecovery($recoveryPassword) {
@@ -218,7 +219,7 @@ class Helper {
if ($return) {
// Set recoveryAdmin as disabled
- \OC_Appconfig::setValue('files_encryption', 'recoveryAdminEnabled', 0);
+ \OC::$server->getAppConfig()->setValue('files_encryption', 'recoveryAdminEnabled', 0);
}
return $return;
@@ -344,6 +345,7 @@ class Helper {
/**
* @brief redirect to a error page
+ * @param Session $session
*/
public static function redirectToErrorPage($session, $errorCode = null) {
@@ -365,9 +367,14 @@ class Helper {
$post = 0;
if(count($_POST) > 0) {
$post = 1;
- }
- header('Location: ' . $location . '?p=' . $post . '&errorCode=' . $errorCode);
- exit();
+ }
+
+ if(defined('PHPUNIT_RUN') and PHPUNIT_RUN) {
+ throw new \Exception("Encryption error: $errorCode");
+ }
+
+ header('Location: ' . $location . '?p=' . $post . '&errorCode=' . $errorCode);
+ exit();
}
/**
@@ -422,8 +429,8 @@ class Helper {
/**
* @brief glob uses different pattern than regular expressions, escape glob pattern only
- * @param unescaped path
- * @return escaped path
+ * @param string $path unescaped path
+ * @return string path
*/
public static function escapeGlobPattern($path) {
return preg_replace('/(\*|\?|\[)/', '[$1]', $path);
@@ -441,7 +448,7 @@ class Helper {
/**
* @brief get the path of the original file
* @param string $tmpFile path of the tmp file
- * @return mixed path of the original file or false
+ * @return string|false path of the original file or false
*/
public static function getPathFromTmpFile($tmpFile) {
if (isset(self::$tmpFileMapping[$tmpFile])) {
diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php
index 7abc565f609..cb9f5e64af3 100755
--- a/apps/files_encryption/lib/keymanager.php
+++ b/apps/files_encryption/lib/keymanager.php
@@ -170,7 +170,7 @@ class Keymanager {
* @brief retrieve keyfile for an encrypted file
* @param \OC_FilesystemView $view
* @param \OCA\Encryption\Util $util
- * @param $filePath
+ * @param string|false $filePath
* @internal param \OCA\Encryption\file $string name
* @return string file key or false
* @note The keyfile returned is asymmetrically encrypted. Decryption
@@ -513,6 +513,8 @@ class Keymanager {
/**
* @brief Make preparations to vars and filesystem for saving a keyfile
+ * @param string|boolean $path
+ * @param string $basePath
*/
public static function keySetPreparation(\OC_FilesystemView $view, $path, $basePath, $userId) {
@@ -542,7 +544,7 @@ class Keymanager {
/**
* @brief extract filename from share key name
* @param string $shareKey (filename.userid.sharekey)
- * @return mixed filename or false
+ * @return string|false filename or false
*/
protected static function getFilenameFromShareKey($shareKey) {
$parts = explode('.', $shareKey);
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
index 11048005969..bae1fded53d 100644
--- a/apps/files_encryption/lib/proxy.php
+++ b/apps/files_encryption/lib/proxy.php
@@ -38,6 +38,7 @@ class Proxy extends \OC_FileProxy {
private static $blackList = null; //mimetypes blacklisted from encryption
private static $unencryptedSizes = array(); // remember unencrypted size
+ private static $fopenMode = array(); // remember the fopen mode
/**
* Check if a file requires encryption
@@ -146,7 +147,7 @@ class Proxy extends \OC_FileProxy {
if ( isset(self::$unencryptedSizes[$normalizedPath]) ) {
$view = new \OC_FilesystemView('/');
$view->putFileInfo($normalizedPath,
- array('encrypted' => true, 'encrypted_size' => self::$unencryptedSizes[$normalizedPath]));
+ array('encrypted' => true, 'unencrypted_size' => self::$unencryptedSizes[$normalizedPath]));
unset(self::$unencryptedSizes[$normalizedPath]);
}
@@ -214,6 +215,16 @@ class Proxy extends \OC_FileProxy {
}
/**
+ * @brief remember initial fopen mode because sometimes it gets changed during the request
+ * @param string $path path
+ * @param string $mode type of access
+ */
+ public function preFopen($path, $mode) {
+ self::$fopenMode[$path] = $mode;
+ }
+
+
+ /**
* @param $path
* @param $result
* @return resource
@@ -240,7 +251,15 @@ class Proxy extends \OC_FileProxy {
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
- $meta = stream_get_meta_data($result);
+ // if we remember the mode from the pre proxy we re-use it
+ // oterwise we fall back to stream_get_meta_data()
+ if (isset(self::$fopenMode[$path])) {
+ $mode = self::$fopenMode[$path];
+ unset(self::$fopenMode[$path]);
+ } else {
+ $meta = stream_get_meta_data($result);
+ $mode = $meta['mode'];
+ }
$view = new \OC_FilesystemView('');
@@ -258,14 +277,15 @@ class Proxy extends \OC_FileProxy {
// Open the file using the crypto stream wrapper
// protocol and let it do the decryption work instead
- $result = fopen('crypt://' . $path, $meta['mode']);
+ $result = fopen('crypt://' . $path, $mode);
} elseif (
- self::shouldEncrypt($path)
- and $meta ['mode'] !== 'r'
- and $meta['mode'] !== 'rb'
+ self::shouldEncrypt($path)
+ and $mode !== 'r'
+ and $mode !== 'rb'
+
) {
- $result = fopen('crypt://' . $path, $meta['mode']);
+ $result = fopen('crypt://' . $path, $mode);
}
// Re-enable the proxy
@@ -283,7 +303,7 @@ class Proxy extends \OC_FileProxy {
public function postGetFileInfo($path, $data) {
// if path is a folder do nothing
- if (\OCP\App::isEnabled('files_encryption') && is_array($data) && array_key_exists('size', $data)) {
+ if (\OCP\App::isEnabled('files_encryption') && $data !== false && array_key_exists('size', $data)) {
// Disable encryption proxy to prevent recursive calls
$proxyStatus = \OC_FileProxy::$enabled;
@@ -320,6 +340,13 @@ class Proxy extends \OC_FileProxy {
// if path is a folder do nothing
if ($view->is_dir($path)) {
+ $proxyState = \OC_FileProxy::$enabled;
+ \OC_FileProxy::$enabled = false;
+ $fileInfo = $view->getFileInfo($path);
+ \OC_FileProxy::$enabled = $proxyState;
+ if (isset($fileInfo['unencrypted_size']) && $fileInfo['unencrypted_size'] > 0) {
+ return $fileInfo['unencrypted_size'];
+ }
return $size;
}
@@ -341,7 +368,7 @@ class Proxy extends \OC_FileProxy {
}
// if file is encrypted return real file size
- if (is_array($fileInfo) && $fileInfo['encrypted'] === true) {
+ if ($fileInfo && $fileInfo['encrypted'] === true) {
// try to fix unencrypted file size if it doesn't look plausible
if ((int)$fileInfo['size'] > 0 && (int)$fileInfo['unencrypted_size'] === 0 ) {
$fixSize = $util->getFileSize($path);
@@ -354,7 +381,7 @@ class Proxy extends \OC_FileProxy {
$size = $fileInfo['unencrypted_size'];
} else {
// self healing if file was removed from file cache
- if (!is_array($fileInfo)) {
+ if (!$fileInfo) {
$fileInfo = array();
}
diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php
index 25f2198181f..3daaa06425f 100644
--- a/apps/files_encryption/lib/session.php
+++ b/apps/files_encryption/lib/session.php
@@ -51,11 +51,13 @@ class Session {
}
- $publicShareKeyId = \OC_Appconfig::getValue('files_encryption', 'publicShareKeyId');
+ $appConfig = \OC::$server->getAppConfig();
+
+ $publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId');
if ($publicShareKeyId === null) {
$publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
- \OC_Appconfig::setValue('files_encryption', 'publicShareKeyId', $publicShareKeyId);
+ $appConfig->setValue('files_encryption', 'publicShareKeyId', $publicShareKeyId);
}
if (
@@ -132,6 +134,14 @@ class Session {
}
+ /**
+ * @brief remove encryption keys and init status from session
+ */
+ public function closeSession() {
+ \OC::$session->remove('encryptionInitialized');
+ \OC::$session->remove('privateKey');
+ }
+
/**
* @brief Gets status if we already tried to initialize the encryption app
@@ -195,7 +205,7 @@ class Session {
/**
* @brief Sets user legacy key to session
- * @param $legacyKey
+ * @param string $legacyKey
* @return bool
*/
public function setLegacyKey($legacyKey) {
diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php
index b3bf34ddb82..58ac03373a7 100644
--- a/apps/files_encryption/lib/stream.php
+++ b/apps/files_encryption/lib/stream.php
@@ -167,6 +167,9 @@ class Stream {
} else {
$this->meta = stream_get_meta_data($this->handle);
+ // sometimes fopen changes the mode, e.g. for a url "r" convert to "r+"
+ // but we need to remember the original access type
+ $this->meta['mode'] = $mode;
}
@@ -567,7 +570,7 @@ class Stream {
// get file info
$fileInfo = $this->rootView->getFileInfo($path);
- if (is_array($fileInfo)) {
+ if ($fileInfo) {
// set encryption data
$fileInfo['encrypted'] = true;
$fileInfo['size'] = $this->size;
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index ae3e2a2e15a..3db5a423478 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -63,8 +63,10 @@ class Util {
$this->client = $client;
$this->userId = $userId;
- $this->publicShareKeyId = \OC_Appconfig::getValue('files_encryption', 'publicShareKeyId');
- $this->recoveryKeyId = \OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
+ $appConfig = \OC::$server->getAppConfig();
+
+ $this->publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId');
+ $this->recoveryKeyId = $appConfig->getValue('files_encryption', 'recoveryKeyId');
$this->userDir = '/' . $this->userId;
$this->fileFolderName = 'files';
@@ -133,7 +135,6 @@ class Util {
// Set directories to check / create
$setUpDirs = array(
$this->userDir,
- $this->userFilesDir,
$this->publicKeyDir,
$this->encryptionDir,
$this->keyfilesPath,
@@ -316,7 +317,8 @@ class Util {
$found = array(
'plain' => array(),
'encrypted' => array(),
- 'legacy' => array()
+ 'legacy' => array(),
+ 'broken' => array(),
);
}
@@ -327,10 +329,7 @@ class Util {
if(is_resource($handle)) {
while (false !== ($file = readdir($handle))) {
- if (
- $file !== "."
- && $file !== ".."
- ) {
+ if ($file !== "." && $file !== "..") {
$filePath = $directory . '/' . $this->view->getRelativePath('/' . $file);
$relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath);
@@ -357,15 +356,23 @@ class Util {
// NOTE: This is inefficient;
// scanning every file like this
// will eat server resources :(
- if (
- Keymanager::getFileKey($this->view, $this, $relPath)
- && $isEncryptedPath
- ) {
-
- $found['encrypted'][] = array(
- 'name' => $file,
- 'path' => $filePath
- );
+ if ($isEncryptedPath) {
+
+ $fileKey = Keymanager::getFileKey($this->view, $this, $relPath);
+ $shareKey = Keymanager::getShareKey($this->view, $this->userId, $this, $relPath);
+ // if file is encrypted but now file key is available, throw exception
+ if ($fileKey === false || $shareKey === false) {
+ \OCP\Util::writeLog('encryption library', 'No keys available to decrypt the file: ' . $filePath, \OCP\Util::ERROR);
+ $found['broken'][] = array(
+ 'name' => $file,
+ 'path' => $filePath,
+ );
+ } else {
+ $found['encrypted'][] = array(
+ 'name' => $file,
+ 'path' => $filePath,
+ );
+ }
// If the file uses old
// encryption system
@@ -563,7 +570,7 @@ class Util {
/**
- * @param $path
+ * @param string $path
* @return bool
*/
public function isSharedPath($path) {
@@ -771,6 +778,12 @@ class Util {
$successful = false;
}
+ // if there are broken encrypted files than the complete decryption
+ // was not successful
+ if (!empty($found['broken'])) {
+ $successful = false;
+ }
+
if ($successful) {
$this->view->deleteAll($this->keyfilesPath);
$this->view->deleteAll($this->shareKeysPath);
@@ -1031,7 +1044,7 @@ class Util {
* @brief Decrypt a keyfile
* @param string $filePath
* @param string $privateKey
- * @return bool|string
+ * @return false|string
*/
private function decryptKeyfile($filePath, $privateKey) {
@@ -1110,12 +1123,15 @@ class Util {
/**
* @brief Find, sanitise and format users sharing a file
* @note This wraps other methods into a portable bundle
+ * @param boolean $sharingEnabled
*/
public function getSharingUsersArray($sharingEnabled, $filePath, $currentUserId = false) {
+ $appConfig = \OC::$server->getAppConfig();
+
// Check if key recovery is enabled
if (
- \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled')
+ $appConfig->getValue('files_encryption', 'recoveryAdminEnabled')
&& $this->recoveryEnabledForUser()
) {
$recoveryEnabled = true;
@@ -1144,7 +1160,7 @@ class Util {
// Admin UID to list of users to share to
if ($recoveryEnabled) {
// Find recoveryAdmin user ID
- $recoveryKeyId = \OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
+ $recoveryKeyId = $appConfig->getValue('files_encryption', 'recoveryKeyId');
// Add recoveryAdmin to list of users sharing
$userIds[] = $recoveryKeyId;
}
@@ -1186,26 +1202,48 @@ class Util {
}
/**
- * @brief start migration mode to initially encrypt users data
+ * @brief set migration status
+ * @param int $status
* @return boolean
*/
- public function beginMigration() {
-
- $return = false;
+ private function setMigrationStatus($status) {
- $sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ? and `migration_status` = ?';
- $args = array(self::MIGRATION_IN_PROGRESS, $this->userId, self::MIGRATION_OPEN);
+ $sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ?';
+ $args = array($status, $this->userId);
$query = \OCP\DB::prepare($sql);
$manipulatedRows = $query->execute($args);
if ($manipulatedRows === 1) {
- $return = true;
+ $result = true;
+ \OCP\Util::writeLog('Encryption library', "Migration status set to " . self::MIGRATION_OPEN, \OCP\Util::INFO);
+ } else {
+ $result = false;
+ \OCP\Util::writeLog('Encryption library', "Could not set migration status to " . self::MIGRATION_OPEN, \OCP\Util::WARN);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @brief start migration mode to initially encrypt users data
+ * @return boolean
+ */
+ public function beginMigration() {
+
+ $result = $this->setMigrationStatus(self::MIGRATION_IN_PROGRESS);
+
+ if ($result) {
\OCP\Util::writeLog('Encryption library', "Start migration to encryption mode for " . $this->userId, \OCP\Util::INFO);
} else {
\OCP\Util::writeLog('Encryption library', "Could not activate migration mode for " . $this->userId . ". Probably another process already started the initial encryption", \OCP\Util::WARN);
}
- return $return;
+ return $result;
+ }
+
+ public function resetMigrationStatus() {
+ return $this->setMigrationStatus(self::MIGRATION_OPEN);
+
}
/**
@@ -1213,22 +1251,15 @@ class Util {
* @return boolean
*/
public function finishMigration() {
+ $result = $this->setMigrationStatus(self::MIGRATION_COMPLETED);
- $return = false;
-
- $sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ? and `migration_status` = ?';
- $args = array(self::MIGRATION_COMPLETED, $this->userId, self::MIGRATION_IN_PROGRESS);
- $query = \OCP\DB::prepare($sql);
- $manipulatedRows = $query->execute($args);
-
- if ($manipulatedRows === 1) {
- $return = true;
+ if ($result) {
\OCP\Util::writeLog('Encryption library', "Finish migration successfully for " . $this->userId, \OCP\Util::INFO);
} else {
\OCP\Util::writeLog('Encryption library', "Could not deactivate migration mode for " . $this->userId, \OCP\Util::WARN);
}
- return $return;
+ return $result;
}
/**
@@ -1740,4 +1771,12 @@ class Util {
return $session;
}
+ /*
+ * @brief remove encryption related keys from the session
+ */
+ public function closeEncryptionSession() {
+ $session = new \OCA\Encryption\Session($this->view);
+ $session->closeSession();
+ }
+
}
diff --git a/apps/files_encryption/settings-admin.php b/apps/files_encryption/settings-admin.php
index 9ad9bfb8877..88e06613997 100644
--- a/apps/files_encryption/settings-admin.php
+++ b/apps/files_encryption/settings-admin.php
@@ -11,7 +11,7 @@
$tmpl = new OCP\Template('files_encryption', 'settings-admin');
// Check if an adminRecovery account is enabled for recovering files after lost pwd
-$recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled', '0');
+$recoveryAdminEnabled = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled', '0');
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
diff --git a/apps/files_encryption/settings-personal.php b/apps/files_encryption/settings-personal.php
index ffcb99602e2..09e9df05352 100644
--- a/apps/files_encryption/settings-personal.php
+++ b/apps/files_encryption/settings-personal.php
@@ -20,7 +20,7 @@ $privateKeySet = $session->getPrivateKey() !== false;
// did we tried to initialize the keys for this session?
$initialized = $session->getInitialized();
-$recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled');
+$recoveryAdminEnabled = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled');
$recoveryEnabledForUser = $util->recoveryEnabledForUser();
$result = false;
diff --git a/apps/files_encryption/tests/crypt.php b/apps/files_encryption/tests/crypt.php
index 388980ad4fd..123943ea26a 100755
--- a/apps/files_encryption/tests/crypt.php
+++ b/apps/files_encryption/tests/crypt.php
@@ -661,7 +661,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
/**
* @brief encryption using legacy blowfish method
- * @param $data string data to encrypt
+ * @param string $data data to encrypt
* @param $passwd string password
* @return string
*/
diff --git a/apps/files_encryption/tests/hooks.php b/apps/files_encryption/tests/hooks.php
index c26cba6406d..d0e4b5f732e 100644
--- a/apps/files_encryption/tests/hooks.php
+++ b/apps/files_encryption/tests/hooks.php
@@ -36,8 +36,8 @@ use OCA\Encryption;
*/
class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
- const TEST_ENCRYPTION_HOOKS_USER1 = "test-proxy-user1";
- const TEST_ENCRYPTION_HOOKS_USER2 = "test-proxy-user2";
+ const TEST_ENCRYPTION_HOOKS_USER1 = "test-encryption-hooks-user1";
+ const TEST_ENCRYPTION_HOOKS_USER2 = "test-encryption-hooks-user2";
/**
* @var \OC_FilesystemView
@@ -47,6 +47,7 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
public $rootView; // view on /data/user
public $data;
public $filename;
+ public $folder;
public static function setUpBeforeClass() {
// reset backend
@@ -89,6 +90,7 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
// init short data
$this->data = 'hats';
$this->filename = 'enc_hooks_tests-' . uniqid() . '.txt';
+ $this->folder = 'enc_hooks_tests_folder-' . uniqid();
}
@@ -203,7 +205,7 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
$fileInfo = $this->user1View->getFileInfo($this->filename);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// share the file with user2
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2, OCP\PERMISSION_ALL);
@@ -268,4 +270,57 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase {
}
}
+ /**
+ * @brief test rename operation
+ */
+ function testRenameHook() {
+
+ // save file with content
+ $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->filename, $this->data);
+
+ // test that data was successfully written
+ $this->assertTrue(is_int($cryptedFile));
+
+ // check if keys exists
+ $this->assertTrue($this->rootView->file_exists(
+ '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+ . $this->filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+
+ $this->assertTrue($this->rootView->file_exists(
+ '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/'
+ . $this->filename . '.key'));
+
+ // make subfolder
+ $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder);
+
+ $this->assertTrue($this->rootView->is_dir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder));
+
+ // move the file out of the shared folder
+ $root = $this->rootView->getRoot();
+ $this->rootView->chroot('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/');
+ $this->rootView->rename($this->filename, '/' . $this->folder . '/' . $this->filename);
+ $this->rootView->chroot($root);
+
+ $this->assertFalse($this->rootView->file_exists('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->filename));
+ $this->assertTrue($this->rootView->file_exists('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->filename));
+
+ // keys should be renamed too
+ $this->assertFalse($this->rootView->file_exists(
+ '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/'
+ . $this->filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+ $this->assertFalse($this->rootView->file_exists(
+ '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/'
+ . $this->filename . '.key'));
+
+ $this->assertTrue($this->rootView->file_exists(
+ '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' . $this->folder . '/'
+ . $this->filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
+ $this->assertTrue($this->rootView->file_exists(
+ '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->folder . '/'
+ . $this->filename . '.key'));
+
+ // cleanup
+ $this->rootView->unlink('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder);
+ }
+
}
diff --git a/apps/files_encryption/tests/keymanager.php b/apps/files_encryption/tests/keymanager.php
index 6f32c50743c..0caf12e91a3 100644
--- a/apps/files_encryption/tests/keymanager.php
+++ b/apps/files_encryption/tests/keymanager.php
@@ -250,6 +250,10 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
* dummy class to access protected methods of \OCA\Encryption\Keymanager for testing
*/
class TestProtectedKeymanagerMethods extends \OCA\Encryption\Keymanager {
+
+ /**
+ * @param string $sharekey
+ */
public static function testGetFilenameFromShareKey($sharekey) {
return self::getFilenameFromShareKey($sharekey);
}
diff --git a/apps/files_encryption/tests/proxy.php b/apps/files_encryption/tests/proxy.php
index 51cc0b795e3..647ee955eb1 100644
--- a/apps/files_encryption/tests/proxy.php
+++ b/apps/files_encryption/tests/proxy.php
@@ -112,4 +112,24 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
}
+ function testPostFileSizeWithDirectory() {
+
+ $this->view->file_put_contents($this->filename, $this->data);
+
+ \OC_FileProxy::$enabled = false;
+
+ // get root size, must match the file's unencrypted size
+ $unencryptedSize = $this->view->filesize('');
+
+ \OC_FileProxy::$enabled = true;
+
+ $encryptedSize = $this->view->filesize('');
+
+ $this->assertTrue($encryptedSize !== $unencryptedSize);
+
+ // cleanup
+ $this->view->unlink($this->filename);
+
+ }
+
}
diff --git a/apps/files_encryption/tests/share.php b/apps/files_encryption/tests/share.php
index acf408a07f0..be56968ac09 100755
--- a/apps/files_encryption/tests/share.php
+++ b/apps/files_encryption/tests/share.php
@@ -61,7 +61,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
\OC_User::useBackend('database');
// enable resharing
- \OC_Appconfig::setValue('core', 'shareapi_allow_resharing', 'yes');
+ \OC::$server->getAppConfig()->setValue('core', 'shareapi_allow_resharing', 'yes');
// clear share hooks
\OC_Hook::clear('OCP\\Share');
@@ -127,6 +127,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
\OC_User::deleteUser(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4);
}
+
/**
* @medium
* @param bool $withTeardown
@@ -150,7 +151,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// check if the unencrypted file size is stored
$this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
@@ -310,7 +311,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// re-enable the file proxy
\OC_FileProxy::$enabled = $proxyStatus;
@@ -388,7 +389,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
. $this->subfolder);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfoSubFolder));
+ $this->assertTrue($fileInfoSubFolder instanceof \OC\Files\FileInfo);
// re-enable the file proxy
\OC_FileProxy::$enabled = $proxyStatus;
@@ -422,7 +423,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
. $this->subsubfolder . '/' . $this->filename);
// check if we have fileInfos
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// share the file with user3
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4, OCP\PERMISSION_ALL);
@@ -498,6 +499,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
}
}
+
function testPublicShareFile() {
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@@ -517,7 +519,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// check if the unencrypted file size is stored
$this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
@@ -531,7 +533,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
- $publicShareKeyId = \OC_Appconfig::getValue('files_encryption', 'publicShareKeyId');
+ $publicShareKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'publicShareKeyId');
// check if share key for public exists
$this->assertTrue($this->view->file_exists(
@@ -595,7 +597,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// check if the unencrypted file size is stored
$this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
@@ -662,7 +664,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
- $recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
+ $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId');
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@@ -755,7 +757,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$this->assertTrue(\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'));
$this->assertTrue(\OCA\Encryption\Helper::adminDisableRecovery('test123'));
- $this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'));
+ $this->assertEquals(0, \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled'));
}
/**
@@ -769,7 +771,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$result = \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
$this->assertTrue($result);
- $recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
+ $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId');
// login as user2
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2);
@@ -863,7 +865,14 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$this->assertTrue($util->setRecoveryForUser(0));
\OCA\Encryption\Helper::adminDisableRecovery('test123');
- $this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'));
+ $this->assertEquals(0, \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled'));
+
+ //clean up, reset passwords
+ \OC_User::setPassword(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, 'test123');
+ $params = array('uid' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2,
+ 'password' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2,
+ 'recoveryPassword' => 'test123');
+ \OCA\Encryption\Hooks::setPassphrase($params);
}
/**
@@ -888,7 +897,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
'/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
// check if we have a valid file info
- $this->assertTrue(is_array($fileInfo));
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
// check if the unencrypted file size is stored
$this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
@@ -947,4 +956,65 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$this->view->chroot('/');
}
+
+ /**
+ * @brief test moving a shared file out of the Shared folder
+ */
+ function testRename() {
+
+ // login as admin
+ \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
+
+ // save file with content
+ $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
+
+ // test that data was successfully written
+ $this->assertTrue(is_int($cryptedFile));
+
+ // get the file info from previous created file
+ $fileInfo = $this->view->getFileInfo(
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+
+ // check if we have a valid file info
+ $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
+
+ // share the file
+ \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL);
+
+ // check if share key for user2exists
+ $this->assertTrue($this->view->file_exists(
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/'
+ . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
+
+
+ // login as user2
+ \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2);
+
+ $this->assertTrue($this->view->file_exists('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename));
+
+ // get file contents
+ $retrievedCryptedFile = $this->view->file_get_contents(
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename);
+
+ // check if data is the same as we previously written
+ $this->assertEquals($this->dataShort, $retrievedCryptedFile);
+
+ // move the file out of the shared folder
+ $this->view->rename('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/Shared/' . $this->filename,
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+
+ // check if we can read the moved file
+ $retrievedRenamedFile = $this->view->file_get_contents(
+ '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+
+ // check if data is the same as we previously written
+ $this->assertEquals($this->dataShort, $retrievedRenamedFile);
+
+ // the owners file should be deleted
+ $this->assertFalse($this->view->file_exists('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename));
+
+ // cleanup
+ $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
+ }
+
}
diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php
index 97e3c518dac..203ba55dbfd 100755
--- a/apps/files_encryption/tests/util.php
+++ b/apps/files_encryption/tests/util.php
@@ -64,6 +64,8 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
function setUp() {
+ // login user
+ \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1);
\OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1);
$this->userId = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1;
$this->pass = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1;
@@ -328,7 +330,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$fileInfoUnencrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
- $this->assertTrue(is_array($fileInfoUnencrypted));
+ $this->assertTrue($fileInfoUnencrypted instanceof \OC\Files\FileInfo);
// enable file encryption again
\OC_App::enable('files_encryption');
@@ -338,11 +340,11 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$fileInfoEncrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
- $this->assertTrue(is_array($fileInfoEncrypted));
+ $this->assertTrue($fileInfoEncrypted instanceof \OC\Files\FileInfo);
// check if mtime and etags unchanged
$this->assertEquals($fileInfoEncrypted['mtime'], $fileInfoUnencrypted['mtime']);
- $this->assertEquals($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']);
+ $this->assertSame($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']);
$this->view->unlink($this->userId . '/files/' . $filename);
}
@@ -357,23 +359,98 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$fileInfoEncrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
- $this->assertTrue(is_array($fileInfoEncrypted));
+ $this->assertTrue($fileInfoEncrypted instanceof \OC\Files\FileInfo);
+ $this->assertEquals($fileInfoEncrypted['encrypted'], 1);
- // encrypt all unencrypted files
- $util->decryptAll('/' . $this->userId . '/' . 'files');
+ // decrypt all encrypted files
+ $result = $util->decryptAll('/' . $this->userId . '/' . 'files');
+
+ $this->assertTrue($result);
$fileInfoUnencrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
- $this->assertTrue(is_array($fileInfoUnencrypted));
+ $this->assertTrue($fileInfoUnencrypted instanceof \OC\Files\FileInfo);
// check if mtime and etags unchanged
$this->assertEquals($fileInfoEncrypted['mtime'], $fileInfoUnencrypted['mtime']);
- $this->assertEquals($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']);
+ $this->assertSame($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']);
+ // file should no longer be encrypted
+ $this->assertEquals(0, $fileInfoUnencrypted['encrypted']);
$this->view->unlink($this->userId . '/files/' . $filename);
}
+ function testDescryptAllWithBrokenFiles() {
+
+ $file1 = "/decryptAll1" . uniqid() . ".txt";
+ $file2 = "/decryptAll2" . uniqid() . ".txt";
+
+ $util = new Encryption\Util($this->view, $this->userId);
+
+ $this->view->file_put_contents($this->userId . '/files/' . $file1, $this->dataShort);
+ $this->view->file_put_contents($this->userId . '/files/' . $file2, $this->dataShort);
+
+ $fileInfoEncrypted1 = $this->view->getFileInfo($this->userId . '/files/' . $file1);
+ $fileInfoEncrypted2 = $this->view->getFileInfo($this->userId . '/files/' . $file2);
+
+ $this->assertTrue($fileInfoEncrypted1 instanceof \OC\Files\FileInfo);
+ $this->assertTrue($fileInfoEncrypted2 instanceof \OC\Files\FileInfo);
+ $this->assertEquals($fileInfoEncrypted1['encrypted'], 1);
+ $this->assertEquals($fileInfoEncrypted2['encrypted'], 1);
+
+ // rename keyfile for file1 so that the decryption for file1 fails
+ // Expected behaviour: decryptAll() returns false, file2 gets decrypted anyway
+ $this->view->rename($this->userId . '/files_encryption/keyfiles/' . $file1 . '.key',
+ $this->userId . '/files_encryption/keyfiles/' . $file1 . '.key.moved');
+
+ // decrypt all encrypted files
+ $result = $util->decryptAll('/' . $this->userId . '/' . 'files');
+
+ $this->assertFalse($result);
+
+ $fileInfoUnencrypted1 = $this->view->getFileInfo($this->userId . '/files/' . $file1);
+ $fileInfoUnencrypted2 = $this->view->getFileInfo($this->userId . '/files/' . $file2);
+
+ $this->assertTrue($fileInfoUnencrypted1 instanceof \OC\Files\FileInfo);
+ $this->assertTrue($fileInfoUnencrypted2 instanceof \OC\Files\FileInfo);
+
+ // file1 should be still encrypted; file2 should be decrypted
+ $this->assertEquals(1, $fileInfoUnencrypted1['encrypted']);
+ $this->assertEquals(0, $fileInfoUnencrypted2['encrypted']);
+
+ // keyfiles and share keys should still exist
+ $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/keyfiles/'));
+ $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/share-keys/'));
+
+ // rename the keyfile for file1 back
+ $this->view->rename($this->userId . '/files_encryption/keyfiles/' . $file1 . '.key.moved',
+ $this->userId . '/files_encryption/keyfiles/' . $file1 . '.key');
+
+ // try again to decrypt all encrypted files
+ $result = $util->decryptAll('/' . $this->userId . '/' . 'files');
+
+ $this->assertTrue($result);
+
+ $fileInfoUnencrypted1 = $this->view->getFileInfo($this->userId . '/files/' . $file1);
+ $fileInfoUnencrypted2 = $this->view->getFileInfo($this->userId . '/files/' . $file2);
+
+ $this->assertTrue($fileInfoUnencrypted1 instanceof \OC\Files\FileInfo);
+ $this->assertTrue($fileInfoUnencrypted2 instanceof \OC\Files\FileInfo);
+
+ // now both files should be decrypted
+ $this->assertEquals(0, $fileInfoUnencrypted1['encrypted']);
+ $this->assertEquals(0, $fileInfoUnencrypted2['encrypted']);
+
+ // keyfiles and share keys should be deleted
+ $this->assertFalse($this->view->is_dir($this->userId . '/files_encryption/keyfiles/'));
+ $this->assertFalse($this->view->is_dir($this->userId . '/files_encryption/share-keys/'));
+
+ $this->view->unlink($this->userId . '/files/' . $file1);
+ $this->view->unlink($this->userId . '/files/' . $file2);
+
+ }
+
/**
* @large
*/
@@ -461,7 +538,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
* helper function to set migration status to the right value
* to be able to test the migration path
*
- * @param $status needed migration status for test
+ * @param integer $status needed migration status for test
* @param $user for which user the status should be set
* @return boolean
*/
diff --git a/apps/files_external/3rdparty/smb4php/smb.php b/apps/files_external/3rdparty/smb4php/smb.php
index 622942b052a..656930514f0 100644
--- a/apps/files_external/3rdparty/smb4php/smb.php
+++ b/apps/files_external/3rdparty/smb4php/smb.php
@@ -20,6 +20,7 @@
# GNU General Public License for more details.
#
# Addition 17/12/2012 Frank Karlitschek (frank@owncloud.org)
+# Addition 17/03/2014 Robin McCorkell (rmccorkell@karoshi.org.uk)
# On the official website http://www.phpclasses.org/smb4php the
# license is listed as LGPL so we assume that this is
# dual-licensed GPL/LGPL
@@ -238,17 +239,10 @@ class smb {
trigger_error ("url_stat(): list failed for host '{$pu['host']}'", E_USER_WARNING);
break;
case 'share':
- if ($o = smb::look ($pu)) {
- $found = FALSE;
- $lshare = strtolower ($pu['share']); # fix by Eric Leung
- foreach ($o['disk'] as $s) if ($lshare == strtolower($s)) {
- $found = TRUE;
- $stat = stat ("/tmp");
- break;
- }
- if (! $found)
- trigger_error ("url_stat(): disk resource '{$lshare}' not found in '{$pu['host']}'", E_USER_WARNING);
- }
+ if (smb::execute("ls", $pu))
+ $stat = stat ("/tmp");
+ else
+ trigger_error ("url_stat(): disk resource '{$pu['share']}' not found in '{$pu['host']}'", E_USER_WARNING);
break;
case 'path':
if ($o = smb::execute ('dir "'.$pu['path'].'"', $pu)) {
diff --git a/apps/files_external/ajax/addRootCertificate.php b/apps/files_external/ajax/addRootCertificate.php
index ae349bfcd3a..fcd3a617ada 100644
--- a/apps/files_external/ajax/addRootCertificate.php
+++ b/apps/files_external/ajax/addRootCertificate.php
@@ -4,7 +4,7 @@ OCP\JSON::checkAppEnabled('files_external');
OCP\JSON::callCheck();
if ( ! ($filename = $_FILES['rootcert_import']['name']) ) {
- header("Location: settings/personal.php");
+ header('Location:' . OCP\Util::linkToRoute( "settings_personal" ));
exit;
}
diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index 5b1cd86a170..0e83660f845 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -25,5 +25,6 @@ if (OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') == '
}
// connecting hooks
-OCP\Util::connectHook( 'OC_User', 'post_login', 'OC\Files\Storage\iRODS', 'login' );
+OCP\Util::connectHook('OC_Filesystem', 'post_initMountPoints', '\OC_Mount_Config', 'initMountPointsHook');
+OCP\Util::connectHook('OC_User', 'post_login', 'OC\Files\Storage\iRODS', 'login');
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index 895f97bd2c3..cd2a3103eb7 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -264,7 +264,7 @@ $(document).ready(function() {
OC.MountConfig.saveStorage($(this).parent().parent());
});
- $('#sslCertificate').on('click', 'td.remove>img', function() {
+ $('#sslCertificate').on('click', 'td.remove>img', function() {
var $tr = $(this).parent().parent();
var row = this.parentNode.parentNode;
$.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), {cert: row.id});
@@ -302,13 +302,23 @@ $(document).ready(function() {
});
$('#allowUserMounting').bind('change', function() {
+ OC.msg.startSaving('#userMountingMsg');
if (this.checked) {
OC.AppConfig.setValue('files_external', 'allow_user_mounting', 'yes');
+ $('#userMountingBackups').removeClass('hidden');
} else {
OC.AppConfig.setValue('files_external', 'allow_user_mounting', 'no');
+ $('#userMountingBackups').addClass('hidden');
}
+ OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('settings', 'Saved')}});
});
+ $('input[name="allowUserMountingBackends\\[\\]"]').bind('change', function() {
+ OC.msg.startSaving('#userMountingMsg');
+ var user_mounting_backends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){return $(this).val();}).get();
+ OC.AppConfig.setValue('files_external', 'user_mounting_backends', user_mounting_backends.join());
+ OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('settings', 'Saved')}});
+ });
});
})();
diff --git a/apps/files_external/l10n/ar.php b/apps/files_external/l10n/ar.php
index 338526d2afd..5fd4e4c398c 100644
--- a/apps/files_external/l10n/ar.php
+++ b/apps/files_external/l10n/ar.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Saved" => "حفظ",
"Folder name" => "اسم المجلد",
"Options" => "خيارات",
"All Users" => "كل المستخدمين",
diff --git a/apps/files_external/l10n/bg_BG.php b/apps/files_external/l10n/bg_BG.php
index 17665d22286..d59a4b8c80b 100644
--- a/apps/files_external/l10n/bg_BG.php
+++ b/apps/files_external/l10n/bg_BG.php
@@ -13,7 +13,6 @@ $TRANSLATIONS = array(
"Users" => "Потребители",
"Delete" => "Изтриване",
"Enable User External Storage" => "Вкл. на поддръжка за външно потр. хранилище",
-"Allow users to mount their own external storage" => "Позволено е на потребителите да ползват тяхно лично външно хранилище",
"SSL root certificates" => "SSL основни сертификати",
"Import Root Certificate" => "Импортиране на основен сертификат"
);
diff --git a/apps/files_external/l10n/bn_BD.php b/apps/files_external/l10n/bn_BD.php
index 0591dbba55c..065d61acfca 100644
--- a/apps/files_external/l10n/bn_BD.php
+++ b/apps/files_external/l10n/bn_BD.php
@@ -15,7 +15,6 @@ $TRANSLATIONS = array(
"Users" => "ব্যবহারকারী",
"Delete" => "মুছে",
"Enable User External Storage" => "ব্যবহারকারীর বাহ্যিক সংরক্ষণাগার সক্রিয় কর",
-"Allow users to mount their own external storage" => "ব্যবহারকারীদেরকে তাদের নিজস্ব বাহ্যিক সংরক্ষনাগার সাউন্ট করতে অনুমোদন দাও",
"SSL root certificates" => "SSL রুট সনদপত্র",
"Import Root Certificate" => "রুট সনদপত্রটি আমদানি করুন"
);
diff --git a/apps/files_external/l10n/ca.php b/apps/files_external/l10n/ca.php
index c1d6ec077b4..3e722046296 100644
--- a/apps/files_external/l10n/ca.php
+++ b/apps/files_external/l10n/ca.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Concedeix accés",
"Please provide a valid Dropbox app key and secret." => "Proporcioneu una clau d'aplicació i secret vàlids per a Dropbox",
"Error configuring Google Drive storage" => "Error en configurar l'emmagatzemament Google Drive",
+"Saved" => "Desat",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Avís:</b> \"smbclient\" no està instal·lat. No es pot muntar la compartició CIFS/SMB. Demaneu a l'administrador del sistema que l'instal·li.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Avís:</b> El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar la compartició FTP. Demaneu a l'administrador del sistema que l'instal·li.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Avís:</b>El suport Curl de PHP no està activat o instal·lat. No es pot muntar ownCloud / WebDAV o GoogleDrive. Demaneu a l'administrador que l'instal·li.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Usuaris",
"Delete" => "Esborra",
"Enable User External Storage" => "Habilita l'emmagatzemament extern d'usuari",
-"Allow users to mount their own external storage" => "Permet als usuaris muntar el seu emmagatzemament extern propi",
+"Allow users to mount the following external storage" => "Permet als usuaris muntar els dispositius externs següents",
"SSL root certificates" => "Certificats SSL root",
"Import Root Certificate" => "Importa certificat root"
);
diff --git a/apps/files_external/l10n/cs_CZ.php b/apps/files_external/l10n/cs_CZ.php
index a574e0506cf..2f7bbd0c4a3 100644
--- a/apps/files_external/l10n/cs_CZ.php
+++ b/apps/files_external/l10n/cs_CZ.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Povolit přístup",
"Please provide a valid Dropbox app key and secret." => "Zadejte, prosím, platný klíč a bezpečnostní frázi aplikace Dropbox.",
"Error configuring Google Drive storage" => "Chyba při nastavení úložiště Google Drive",
+"Saved" => "Uloženo",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Varování:</b> není nainstalován program \"smbclient\". Není možné připojení oddílů CIFS/SMB. Prosím požádejte svého správce systému ať jej nainstaluje.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Varování:</b> podpora FTP v PHP není povolena nebo není nainstalována. Není možné připojení oddílů FTP. Prosím požádejte svého správce systému ať ji nainstaluje.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Varování:</b> podpora CURL v PHP není povolena nebo není nainstalována. Není možné připojení oddílů ownCloud, WebDAV, či GoogleDrive. Prosím požádejte svého správce systému ať ji nainstaluje.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Uživatelé",
"Delete" => "Smazat",
"Enable User External Storage" => "Zapnout externí uživatelské úložiště",
-"Allow users to mount their own external storage" => "Povolit uživatelům připojení jejich vlastních externích úložišť",
+"Allow users to mount the following external storage" => "Povolit uživatelů připojit externí úložiště",
"SSL root certificates" => "Kořenové certifikáty SSL",
"Import Root Certificate" => "Importovat kořenového certifikátu"
);
diff --git a/apps/files_external/l10n/da.php b/apps/files_external/l10n/da.php
index 3a25142b36d..f3ac35e42e0 100644
--- a/apps/files_external/l10n/da.php
+++ b/apps/files_external/l10n/da.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Godkend adgang",
"Please provide a valid Dropbox app key and secret." => "Angiv venligst en valid Dropbox app nøgle og hemmelighed",
"Error configuring Google Drive storage" => "Fejl ved konfiguration af Google Drive plads",
+"Saved" => "Gemt",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b> Advarsel: </ b> \"smbclient\" ikke er installeret. Montering af CIFS / SMB delinger er ikke muligt. Spørg din systemadministrator om at installere det.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b> Advarsel: </ b> FTP-understøttelse i PHP ikke er aktiveret eller installeret. Montering af FTP delinger er ikke muligt. Spørg din systemadministrator om at installere det.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Advarsel:</b> Understøttelsen for Curl i PHP er enten ikke aktiveret eller ikke installeret. Det er ikke muligt, at montere ownCloud / WebDAV eller GoogleDrive. Spørg din system administrator om at installere det. ",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Brugere",
"Delete" => "Slet",
"Enable User External Storage" => "Aktiver ekstern opbevaring for brugere",
-"Allow users to mount their own external storage" => "Tillad brugere at montere deres egne eksterne opbevaring",
+"Allow users to mount the following external storage" => "Tillad brugere at montere følgende som eksternt lager",
"SSL root certificates" => "SSL-rodcertifikater",
"Import Root Certificate" => "Importer rodcertifikat"
);
diff --git a/apps/files_external/l10n/de.php b/apps/files_external/l10n/de.php
index b2c72f76889..a78728b4c20 100644
--- a/apps/files_external/l10n/de.php
+++ b/apps/files_external/l10n/de.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Zugriff gestatten",
"Please provide a valid Dropbox app key and secret." => "Bitte trage einen gültigen Dropbox-App-Key mit Secret ein.",
"Error configuring Google Drive storage" => "Fehler beim Einrichten von Google Drive",
+"Saved" => "Gespeichert",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Warnung:</b> \"smbclient\" ist nicht installiert. Das Einhängen von CIFS/SMB-Freigaben ist nicht möglich. Bitte Deinen System-Administrator, dies zu installieren.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Warnung::</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Bitte wende Dich an Deinen Systemadministrator.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Warnung:</b> Die Curl-Unterstützung in PHP ist nicht aktiviert oder installiert. Das Einbinden von ownCloud / WebDav der GoogleDrive-Freigaben ist nicht möglich. Bitte Deinen Systemadminstrator um die Installation. ",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Benutzer",
"Delete" => "Löschen",
"Enable User External Storage" => "Externen Speicher für Benutzer aktivieren",
-"Allow users to mount their own external storage" => "Erlaubt Benutzern ihre eigenen externen Speicher einzubinden",
+"Allow users to mount the following external storage" => "Erlaube es Benutzern, den folgenden externen Speicher einzubinden",
"SSL root certificates" => "SSL-Root-Zertifikate",
"Import Root Certificate" => "Root-Zertifikate importieren"
);
diff --git a/apps/files_external/l10n/de_AT.php b/apps/files_external/l10n/de_AT.php
new file mode 100644
index 00000000000..afa3eff001c
--- /dev/null
+++ b/apps/files_external/l10n/de_AT.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Delete" => "Löschen"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/de_CH.php b/apps/files_external/l10n/de_CH.php
index 85e2f2d91fd..8a13c7cdd57 100644
--- a/apps/files_external/l10n/de_CH.php
+++ b/apps/files_external/l10n/de_CH.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Benutzer",
"Delete" => "Löschen",
"Enable User External Storage" => "Externen Speicher für Benutzer aktivieren",
-"Allow users to mount their own external storage" => "Erlaubt Benutzern, ihre eigenen externen Speicher einzubinden",
"SSL root certificates" => "SSL-Root-Zertifikate",
"Import Root Certificate" => "Root-Zertifikate importieren"
);
diff --git a/apps/files_external/l10n/de_DE.php b/apps/files_external/l10n/de_DE.php
index 8f6a25cb522..5ffe946c699 100644
--- a/apps/files_external/l10n/de_DE.php
+++ b/apps/files_external/l10n/de_DE.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Zugriff gestatten",
"Please provide a valid Dropbox app key and secret." => "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein.",
"Error configuring Google Drive storage" => "Fehler beim Einrichten von Google Drive",
+"Saved" => "Gespeichert",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Warnung:</b> \"smbclient\" ist nicht installiert. Das Einhängen von CIFS/SMB-Freigaben ist nicht möglich. Bitten Sie Ihren Systemadministrator, dies zu installieren.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Warnung::</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Bitte wenden Sie sich an Ihren Systemadministrator.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Achtung:</b> Die Curl-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Laden von ownCloud / WebDAV oder GoogleDrive Freigaben ist nicht möglich. Bitte Sie Ihren Systemadministrator, das Modul zu installieren.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Benutzer",
"Delete" => "Löschen",
"Enable User External Storage" => "Externen Speicher für Benutzer aktivieren",
-"Allow users to mount their own external storage" => "Erlaubt Benutzern, ihre eigenen externen Speicher einzubinden",
+"Allow users to mount the following external storage" => "Erlauben Sie Benutzern, folgende externe Speicher einzubinden",
"SSL root certificates" => "SSL-Root-Zertifikate",
"Import Root Certificate" => "Root-Zertifikate importieren"
);
diff --git a/apps/files_external/l10n/el.php b/apps/files_external/l10n/el.php
index 0161c0901d6..4dcd93d7ac8 100644
--- a/apps/files_external/l10n/el.php
+++ b/apps/files_external/l10n/el.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Παροχή πρόσβασης",
"Please provide a valid Dropbox app key and secret." => "Παρακαλούμε δώστε έγκυρο κλειδί Dropbox και μυστικό.",
"Error configuring Google Drive storage" => "Σφάλμα ρυθμίζωντας αποθήκευση Google Drive ",
+"Saved" => "Αποθηκεύτηκαν",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Προσοχή:</b> Ο \"smbclient\" δεν εγκαταστάθηκε. Δεν είναι δυνατή η προσάρτηση CIFS/SMB. Παρακαλώ ενημερώστε τον διαχειριστή συστήματος να το εγκαταστήσει.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Προσοχή:</b> Η υποστήριξη FTP στην PHP δεν ενεργοποιήθηκε ή εγκαταστάθηκε. Δεν είναι δυνατή η προσάρτηση FTP. Παρακαλώ ενημερώστε τον διαχειριστή συστήματος να το εγκαταστήσει.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<Προειδοποίηση </b> Η υποστήριξη του συστήματος Curl στο PHP δεν είναι ενεργοποιημένη ή εγκαταστημένη. Η αναπαραγωγή του ownCloud/WebDAV ή GoogleDrive δεν είναι δυνατή. Παρακαλώ ρωτήστε τον διαχειριστλη του συστήματος για την εγκατάσταση. ",
@@ -21,7 +22,6 @@ $TRANSLATIONS = array(
"Users" => "Χρήστες",
"Delete" => "Διαγραφή",
"Enable User External Storage" => "Ενεργοποίηση Εξωτερικού Αποθηκευτικού Χώρου Χρήστη",
-"Allow users to mount their own external storage" => "Να επιτρέπεται στους χρήστες να προσαρτούν δικό τους εξωτερικό αποθηκευτικό χώρο",
"SSL root certificates" => "Πιστοποιητικά SSL root",
"Import Root Certificate" => "Εισαγωγή Πιστοποιητικού Root"
);
diff --git a/apps/files_external/l10n/en_GB.php b/apps/files_external/l10n/en_GB.php
index 8adca794dda..f7fdbf2f0d1 100644
--- a/apps/files_external/l10n/en_GB.php
+++ b/apps/files_external/l10n/en_GB.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Grant access",
"Please provide a valid Dropbox app key and secret." => "Please provide a valid Dropbox app key and secret.",
"Error configuring Google Drive storage" => "Error configuring Google Drive storage",
+"Saved" => "Saved",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Users",
"Delete" => "Delete",
"Enable User External Storage" => "Enable User External Storage",
-"Allow users to mount their own external storage" => "Allow users to mount their own external storage",
+"Allow users to mount the following external storage" => "Allow users to mount the following external storage",
"SSL root certificates" => "SSL root certificates",
"Import Root Certificate" => "Import Root Certificate"
);
diff --git a/apps/files_external/l10n/eo.php b/apps/files_external/l10n/eo.php
index 5697221cac0..aba16e2efa8 100644
--- a/apps/files_external/l10n/eo.php
+++ b/apps/files_external/l10n/eo.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Users" => "Uzantoj",
"Delete" => "Forigi",
"Enable User External Storage" => "Kapabligi malenan memorilon de uzanto",
-"Allow users to mount their own external storage" => "Permesi al uzantoj surmeti siajn proprajn malenajn memorilojn",
"SSL root certificates" => "Radikaj SSL-atestoj",
"Import Root Certificate" => "Enporti radikan ateston"
);
diff --git a/apps/files_external/l10n/es.php b/apps/files_external/l10n/es.php
index 5179d9329a5..ea831c947f4 100644
--- a/apps/files_external/l10n/es.php
+++ b/apps/files_external/l10n/es.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Conceder acceso",
"Please provide a valid Dropbox app key and secret." => "Por favor, proporcione un una clave válida de la app Dropbox y una clave secreta.",
"Error configuring Google Drive storage" => "Error configurando el almacenamiento de Google Drive",
+"Saved" => "Guardado",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El soporte de Curl en PHP no está activado ni instalado. El montado de ownCloud, WebDAV o GoogleDrive no es posible. Pida al administrador de su sistema que lo instale.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Usuarios",
"Delete" => "Eliminar",
"Enable User External Storage" => "Habilitar almacenamiento externo de usuario",
-"Allow users to mount their own external storage" => "Permitir a los usuarios montar su propio almacenamiento externo",
+"Allow users to mount the following external storage" => "Permitir a los usuarios montar el siguiente almacenamiento externo",
"SSL root certificates" => "Certificados raíz SSL",
"Import Root Certificate" => "Importar certificado raíz"
);
diff --git a/apps/files_external/l10n/es_AR.php b/apps/files_external/l10n/es_AR.php
index a0bb3a8dfea..05204b748c4 100644
--- a/apps/files_external/l10n/es_AR.php
+++ b/apps/files_external/l10n/es_AR.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Usuarios",
"Delete" => "Borrar",
"Enable User External Storage" => "Habilitar almacenamiento de usuario externo",
-"Allow users to mount their own external storage" => "Permitir a los usuarios montar su propio almacenamiento externo",
"SSL root certificates" => "certificados SSL raíz",
"Import Root Certificate" => "Importar certificado raíz"
);
diff --git a/apps/files_external/l10n/es_MX.php b/apps/files_external/l10n/es_MX.php
index b508df8476a..5d3fd44bec6 100644
--- a/apps/files_external/l10n/es_MX.php
+++ b/apps/files_external/l10n/es_MX.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Usuarios",
"Delete" => "Eliminar",
"Enable User External Storage" => "Habilitar almacenamiento externo de usuario",
-"Allow users to mount their own external storage" => "Permitir a los usuarios montar su propio almacenamiento externo",
"SSL root certificates" => "Certificados raíz SSL",
"Import Root Certificate" => "Importar certificado raíz"
);
diff --git a/apps/files_external/l10n/et_EE.php b/apps/files_external/l10n/et_EE.php
index a7e623eb7da..c6450f95e18 100644
--- a/apps/files_external/l10n/et_EE.php
+++ b/apps/files_external/l10n/et_EE.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Kasutajad",
"Delete" => "Kustuta",
"Enable User External Storage" => "Luba kasutajatele väline salvestamine",
-"Allow users to mount their own external storage" => "Luba kasutajatel ühendada külge nende enda välised salvestusseadmed",
"SSL root certificates" => "SSL root sertifikaadid",
"Import Root Certificate" => "Impordi root sertifikaadid"
);
diff --git a/apps/files_external/l10n/eu.php b/apps/files_external/l10n/eu.php
index db92e2f001c..bdc5cf56760 100644
--- a/apps/files_external/l10n/eu.php
+++ b/apps/files_external/l10n/eu.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Erabiltzaileak",
"Delete" => "Ezabatu",
"Enable User External Storage" => "Gaitu erabiltzaileentzako Kanpo Biltegiratzea",
-"Allow users to mount their own external storage" => "Baimendu erabiltzaileak bere kanpo biltegiratzeak muntatzen",
"SSL root certificates" => "SSL erro ziurtagiriak",
"Import Root Certificate" => "Inportatu Erro Ziurtagiria"
);
diff --git a/apps/files_external/l10n/eu_ES.php b/apps/files_external/l10n/eu_ES.php
new file mode 100644
index 00000000000..8612c8609bb
--- /dev/null
+++ b/apps/files_external/l10n/eu_ES.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Delete" => "Ezabatu"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/fa.php b/apps/files_external/l10n/fa.php
index 216893811cb..544b8a14d5c 100644
--- a/apps/files_external/l10n/fa.php
+++ b/apps/files_external/l10n/fa.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "کاربران",
"Delete" => "حذف",
"Enable User External Storage" => "فعال سازی حافظه خارجی کاربر",
-"Allow users to mount their own external storage" => "اجازه به کاربران برای متصل کردن منابع ذخیره ی خارجی خودشان",
"SSL root certificates" => "گواهی های اصلی SSL ",
"Import Root Certificate" => "وارد کردن گواهی اصلی"
);
diff --git a/apps/files_external/l10n/fi_FI.php b/apps/files_external/l10n/fi_FI.php
index 9632aa255ea..d2f9d1a73a5 100644
--- a/apps/files_external/l10n/fi_FI.php
+++ b/apps/files_external/l10n/fi_FI.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Salli pääsy",
"Please provide a valid Dropbox app key and secret." => "Anna kelvollinen Dropbox-sovellusavain ja salainen vastaus.",
"Error configuring Google Drive storage" => "Virhe Google Drive levyn asetuksia tehtäessä",
+"Saved" => "Tallennettu",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Varoitus:</b> \"smbclient\" ei ole asennettuna. CIFS-/SMB-jakojen liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää asentamaan smbclient.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Varoitus:</b> PHP:n FTP-tuki ei ole käytössä tai sitä ei ole asennettu. FTP-jakojen liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan FTP-tuki käyttöön.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Varoitus:</b> PHP:n Curl-tuki ei ole käytössä tai sitä ei ole lainkaan asennettu. ownCloudin, WebDAV:in tai Google Driven liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan Curl-tuki käyttöön.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Käyttäjät",
"Delete" => "Poista",
"Enable User External Storage" => "Ota käyttöön ulkopuoliset tallennuspaikat",
-"Allow users to mount their own external storage" => "Salli käyttäjien liittää omia erillisiä tallennusvälineitä",
+"Allow users to mount the following external storage" => "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet",
"SSL root certificates" => "SSL-juurivarmenteet",
"Import Root Certificate" => "Tuo juurivarmenne"
);
diff --git a/apps/files_external/l10n/fr.php b/apps/files_external/l10n/fr.php
index f6b1a75200c..4b8e2b905b6 100644
--- a/apps/files_external/l10n/fr.php
+++ b/apps/files_external/l10n/fr.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Autoriser l'accès",
"Please provide a valid Dropbox app key and secret." => "Veuillez fournir une clé d'application (app key) ainsi qu'un mot de passe valides.",
"Error configuring Google Drive storage" => "Erreur lors de la configuration du support de stockage Google Drive",
+"Saved" => "Sauvegarder",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Attention : </b> \"smbclient\" n'est pas installé. Le montage des partages CIFS/SMB n'est pas disponible. Contactez votre administrateur système pour l'installer.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Attention : </b> Le support FTP de PHP n'est pas activé ou installé. Le montage des partages FTP n'est pas disponible. Contactez votre administrateur système pour l'installer.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Attention :</b> Le support de Curl n'est pas activé ou installé dans PHP. Le montage de ownCloud / WebDAV ou GoogleDrive n'est pas possible. Contactez votre administrateur système pour l'installer.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Utilisateurs",
"Delete" => "Supprimer",
"Enable User External Storage" => "Activer le stockage externe pour les utilisateurs",
-"Allow users to mount their own external storage" => "Autoriser les utilisateurs à monter leur propre stockage externe",
+"Allow users to mount the following external storage" => "Autorise les utilisateurs à monter les stockage externes suivants",
"SSL root certificates" => "Certificats racine SSL",
"Import Root Certificate" => "Importer un certificat racine"
);
diff --git a/apps/files_external/l10n/gl.php b/apps/files_external/l10n/gl.php
index 3dda999dd18..ec13fe241f6 100644
--- a/apps/files_external/l10n/gl.php
+++ b/apps/files_external/l10n/gl.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Permitir o acceso",
"Please provide a valid Dropbox app key and secret." => "Forneza unha chave correcta e segreda do Dropbox.",
"Error configuring Google Drive storage" => "Produciuse un erro ao configurar o almacenamento en Google Drive",
+"Saved" => "Gardado",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Aviso:</b> «smbclient» non está instalado. Non é posibel a montaxe de comparticións CIFS/SMB. Consulte co administrador do sistema para instalalo.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Aviso:</b> A compatibilidade de FTP en PHP non está activada ou instalada. Non é posibel a montaxe de comparticións FTP. Consulte co administrador do sistema para instalalo.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Aviso:</ b> A compatibilidade de Curl en PHP non está activada ou instalada. Non é posíbel a montaxe de ownCloud / WebDAV ou GoogleDrive. Consulte co administrador do sistema para instalala.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Usuarios",
"Delete" => "Eliminar",
"Enable User External Storage" => "Activar o almacenamento externo do usuario",
-"Allow users to mount their own external storage" => "Permitir aos usuarios montar os seus propios almacenamentos externos",
+"Allow users to mount the following external storage" => "Permitirlle aos usuarios montar o seguinte almacenamento externo",
"SSL root certificates" => "Certificados SSL root",
"Import Root Certificate" => "Importar o certificado root"
);
diff --git a/apps/files_external/l10n/he.php b/apps/files_external/l10n/he.php
index e99c9f5193d..6aec07e78cf 100644
--- a/apps/files_external/l10n/he.php
+++ b/apps/files_external/l10n/he.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Users" => "משתמשים",
"Delete" => "מחיקה",
"Enable User External Storage" => "הפעלת אחסון חיצוני למשתמשים",
-"Allow users to mount their own external storage" => "יאפשר למשתמשים לעגן את האחסון החיצוני שלהם",
"SSL root certificates" => "שורש אישורי אבטחת SSL ",
"Import Root Certificate" => "ייבוא אישור אבטחת שורש"
);
diff --git a/apps/files_external/l10n/hu_HU.php b/apps/files_external/l10n/hu_HU.php
index 23fe916eba6..60661380433 100644
--- a/apps/files_external/l10n/hu_HU.php
+++ b/apps/files_external/l10n/hu_HU.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Felhasználók",
"Delete" => "Törlés",
"Enable User External Storage" => "Külső tárolók engedélyezése a felhasználók részére",
-"Allow users to mount their own external storage" => "Lehetővé teszi, hogy a felhasználók külső tárolási szolgáltatásokat csatoljanak be a saját területükre",
"SSL root certificates" => "SSL tanúsítványok",
"Import Root Certificate" => "SSL tanúsítványok importálása"
);
diff --git a/apps/files_external/l10n/id.php b/apps/files_external/l10n/id.php
index 53ab79ae7ee..9f91fdf992f 100644
--- a/apps/files_external/l10n/id.php
+++ b/apps/files_external/l10n/id.php
@@ -20,7 +20,6 @@ $TRANSLATIONS = array(
"Users" => "Pengguna",
"Delete" => "Hapus",
"Enable User External Storage" => "Aktifkan Penyimpanan Eksternal Pengguna",
-"Allow users to mount their own external storage" => "Izinkan pengguna untuk mengaitkan penyimpanan eksternal mereka",
"SSL root certificates" => "Sertifikat root SSL",
"Import Root Certificate" => "Impor Sertifikat Root"
);
diff --git a/apps/files_external/l10n/is.php b/apps/files_external/l10n/is.php
index d2229d1fcdd..e86cfa108a6 100644
--- a/apps/files_external/l10n/is.php
+++ b/apps/files_external/l10n/is.php
@@ -18,7 +18,6 @@ $TRANSLATIONS = array(
"Users" => "Notendur",
"Delete" => "Eyða",
"Enable User External Storage" => "Virkja ytra gagnasvæði notenda",
-"Allow users to mount their own external storage" => "Leyfa notendum að bæta við sínum eigin ytri gagnasvæðum",
"SSL root certificates" => "SSL rótar skilríki",
"Import Root Certificate" => "Flytja inn rótar skilríki"
);
diff --git a/apps/files_external/l10n/it.php b/apps/files_external/l10n/it.php
index b53663beb56..d62d8e97327 100644
--- a/apps/files_external/l10n/it.php
+++ b/apps/files_external/l10n/it.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Concedi l'accesso",
"Please provide a valid Dropbox app key and secret." => "Fornisci chiave di applicazione e segreto di Dropbox validi.",
"Error configuring Google Drive storage" => "Errore durante la configurazione dell'archivio Google Drive",
+"Saved" => "Salvato",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Avviso:</b> \"smbclient\" non è installato. Impossibile montare condivisioni CIFS/SMB. Chiedi all'amministratore di sistema di installarlo.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Avviso:</b> il supporto FTP di PHP non è abilitato o non è installato. Impossibile montare condivisioni FTP. Chiedi all'amministratore di sistema di installarlo.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Avviso:</b> il supporto Curl di PHP non è abilitato o non è installato. Impossibile montare condivisioni ownCloud / WebDAV o GoogleDrive. Chiedi all'amministratore di sistema di installarlo.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Utenti",
"Delete" => "Elimina",
"Enable User External Storage" => "Abilita la memoria esterna dell'utente",
-"Allow users to mount their own external storage" => "Consenti agli utenti di montare la propria memoria esterna",
+"Allow users to mount the following external storage" => "Consenti agli utenti di montare la seguente memoria esterna",
"SSL root certificates" => "Certificati SSL radice",
"Import Root Certificate" => "Importa certificato radice"
);
diff --git a/apps/files_external/l10n/ja.php b/apps/files_external/l10n/ja.php
new file mode 100644
index 00000000000..312dc85188d
--- /dev/null
+++ b/apps/files_external/l10n/ja.php
@@ -0,0 +1,29 @@
+<?php
+$TRANSLATIONS = array(
+"Access granted" => "アクセスは許可されました",
+"Error configuring Dropbox storage" => "Dropboxストレージの設定エラー",
+"Grant access" => "アクセスを許可",
+"Please provide a valid Dropbox app key and secret." => "有効なDropboxアプリのキーとパスワードを入力してください。",
+"Error configuring Google Drive storage" => "Googleドライブストレージの設定エラー",
+"Saved" => "保存されました",
+"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>警告:</b> \"smbclient\" がインストールされていません。CIFS/SMB共有のマウントはできません。システム管理者にインストールを依頼してください。",
+"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>警告:</b> PHPのFTPサポートが無効またはインストールされていません。FTP共有のマウントはできません。システム管理者にインストールを依頼してください。",
+"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>警告:</b> PHPのCurlサポートが無効またはインストールされていません。ownCloud / WebDAVまたはGoogleDriveのマウントはできません。システム管理者にインストールを依頼してください。",
+"External Storage" => "外部ストレージ",
+"Folder name" => "フォルダー名",
+"External storage" => "外部ストレージ",
+"Configuration" => "設定",
+"Options" => "オプション",
+"Applicable" => "適用範囲",
+"Add storage" => "ストレージを追加",
+"None set" => "未設定",
+"All Users" => "すべてのユーザー",
+"Groups" => "グループ",
+"Users" => "ユーザー",
+"Delete" => "削除",
+"Enable User External Storage" => "ユーザーの外部ストレージを有効にする",
+"Allow users to mount the following external storage" => "ユーザに以下の外部ストレージのマウントを許可する",
+"SSL root certificates" => "SSLルート証明書",
+"Import Root Certificate" => "ルート証明書をインポート"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_external/l10n/ja_JP.php b/apps/files_external/l10n/ja_JP.php
index fc528f035c2..312dc85188d 100644
--- a/apps/files_external/l10n/ja_JP.php
+++ b/apps/files_external/l10n/ja_JP.php
@@ -3,25 +3,26 @@ $TRANSLATIONS = array(
"Access granted" => "アクセスは許可されました",
"Error configuring Dropbox storage" => "Dropboxストレージの設定エラー",
"Grant access" => "アクセスを許可",
-"Please provide a valid Dropbox app key and secret." => "有効なDropboxアプリのキーとパスワードを入力して下さい。",
+"Please provide a valid Dropbox app key and secret." => "有効なDropboxアプリのキーとパスワードを入力してください。",
"Error configuring Google Drive storage" => "Googleドライブストレージの設定エラー",
-"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>警告:</b> \"smbclient\" はインストールされていません。CIFS/SMB 共有のマウントはできません。システム管理者にインストールをお願いして下さい。",
-"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>警告:</b> PHPのFTPサポートは無効もしくはインストールされていません。FTP共有のマウントはできません。システム管理者にインストールをお願いして下さい。",
-"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>警告:</b> PHP の Curl サポートは無効もしくはインストールされていません。ownCloud / WebDAV もしくは GoogleDrive のマウントはできません。システム管理者にインストールをお願いして下さい。",
+"Saved" => "保存されました",
+"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>警告:</b> \"smbclient\" がインストールされていません。CIFS/SMB共有のマウントはできません。システム管理者にインストールを依頼してください。",
+"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>警告:</b> PHPのFTPサポートが無効またはインストールされていません。FTP共有のマウントはできません。システム管理者にインストールを依頼してください。",
+"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>警告:</b> PHPのCurlサポートが無効またはインストールされていません。ownCloud / WebDAVまたはGoogleDriveのマウントはできません。システム管理者にインストールを依頼してください。",
"External Storage" => "外部ストレージ",
-"Folder name" => "フォルダ名",
+"Folder name" => "フォルダー名",
"External storage" => "外部ストレージ",
"Configuration" => "設定",
"Options" => "オプション",
"Applicable" => "適用範囲",
"Add storage" => "ストレージを追加",
"None set" => "未設定",
-"All Users" => "すべてのユーザ",
+"All Users" => "すべてのユーザー",
"Groups" => "グループ",
-"Users" => "ユーザ",
+"Users" => "ユーザー",
"Delete" => "削除",
-"Enable User External Storage" => "ユーザの外部ストレージを有効にする",
-"Allow users to mount their own external storage" => "ユーザに外部ストレージのマウントを許可する",
+"Enable User External Storage" => "ユーザーの外部ストレージを有効にする",
+"Allow users to mount the following external storage" => "ユーザに以下の外部ストレージのマウントを許可する",
"SSL root certificates" => "SSLルート証明書",
"Import Root Certificate" => "ルート証明書をインポート"
);
diff --git a/apps/files_external/l10n/ka_GE.php b/apps/files_external/l10n/ka_GE.php
index 445d40e7089..4953f91ce6a 100644
--- a/apps/files_external/l10n/ka_GE.php
+++ b/apps/files_external/l10n/ka_GE.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "მომხმარებელი",
"Delete" => "წაშლა",
"Enable User External Storage" => "მომხმარებლის ექსტერნალ საცავის აქტივირება",
-"Allow users to mount their own external storage" => "მიეცით მომხმარებლებს თავისი ექსტერნალ საცავის მონტირების უფლება",
"SSL root certificates" => "SSL root სერთიფიკატები",
"Import Root Certificate" => "Root სერთიფიკატის იმპორტირება"
);
diff --git a/apps/files_external/l10n/km.php b/apps/files_external/l10n/km.php
index f7d9faa38c5..4586f866a74 100644
--- a/apps/files_external/l10n/km.php
+++ b/apps/files_external/l10n/km.php
@@ -1,5 +1,8 @@
<?php
$TRANSLATIONS = array(
+"Folder name" => "ឈ្មោះ​ថត",
+"Groups" => "ក្រុ",
+"Users" => "អ្នកប្រើ",
"Delete" => "លុប"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_external/l10n/ko.php b/apps/files_external/l10n/ko.php
index 64d815a5bcb..088a419e1c1 100644
--- a/apps/files_external/l10n/ko.php
+++ b/apps/files_external/l10n/ko.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "사용자",
"Delete" => "삭제",
"Enable User External Storage" => "사용자 외부 저장소 사용",
-"Allow users to mount their own external storage" => "사용자별 외부 저장소 마운트 허용",
"SSL root certificates" => "SSL 루트 인증서",
"Import Root Certificate" => "루트 인증서 가져오기"
);
diff --git a/apps/files_external/l10n/lt_LT.php b/apps/files_external/l10n/lt_LT.php
index 57cdfe6722a..c96119c8b68 100644
--- a/apps/files_external/l10n/lt_LT.php
+++ b/apps/files_external/l10n/lt_LT.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Vartotojai",
"Delete" => "Ištrinti",
"Enable User External Storage" => "Įjungti vartotojų išorines saugyklas",
-"Allow users to mount their own external storage" => "Leisti vartotojams pridėti savo išorines saugyklas",
"SSL root certificates" => "SSL sertifikatas",
"Import Root Certificate" => "Įkelti pagrindinį sertifikatą"
);
diff --git a/apps/files_external/l10n/lv.php b/apps/files_external/l10n/lv.php
index d0db01a22b5..18e56178892 100644
--- a/apps/files_external/l10n/lv.php
+++ b/apps/files_external/l10n/lv.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Lietotāji",
"Delete" => "Dzēst",
"Enable User External Storage" => "Aktivēt lietotāja ārējo krātuvi",
-"Allow users to mount their own external storage" => "Ļaut lietotājiem montēt pašiem savu ārējo krātuvi",
"SSL root certificates" => "SSL saknes sertifikāti",
"Import Root Certificate" => "Importēt saknes sertifikātus"
);
diff --git a/apps/files_external/l10n/mk.php b/apps/files_external/l10n/mk.php
index e410b398ac9..b59bb138f1d 100644
--- a/apps/files_external/l10n/mk.php
+++ b/apps/files_external/l10n/mk.php
@@ -18,7 +18,6 @@ $TRANSLATIONS = array(
"Users" => "Корисници",
"Delete" => "Избриши",
"Enable User External Storage" => "Овозможи надворешни за корисници",
-"Allow users to mount their own external storage" => "Дозволи им на корисниците да монтираат свои надворешни дискови",
"SSL root certificates" => "SSL root сертификати",
"Import Root Certificate" => "Увези"
);
diff --git a/apps/files_external/l10n/nb_NO.php b/apps/files_external/l10n/nb_NO.php
index cb31ac89227..c103112dbe3 100644
--- a/apps/files_external/l10n/nb_NO.php
+++ b/apps/files_external/l10n/nb_NO.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Brukere",
"Delete" => "Slett",
"Enable User External Storage" => "Aktiver ekstern lagring for bruker",
-"Allow users to mount their own external storage" => "Tillat brukere å koble til egne eksterne lagringsmedium",
"SSL root certificates" => "SSL root-sertifikater",
"Import Root Certificate" => "Importer root-sertifikat"
);
diff --git a/apps/files_external/l10n/nl.php b/apps/files_external/l10n/nl.php
index 35e63b09a35..4fa579775f9 100644
--- a/apps/files_external/l10n/nl.php
+++ b/apps/files_external/l10n/nl.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Sta toegang toe",
"Please provide a valid Dropbox app key and secret." => "Geef een geldige Dropbox key en secret.",
"Error configuring Google Drive storage" => "Fout tijdens het configureren van Google Drive opslag",
+"Saved" => "Bewaard",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Waarschuwing:</b> \"smbclient\" is niet geïnstalleerd. Mounten van CIFS/SMB shares is niet mogelijk. Vraag uw beheerder om smbclient te installeren.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Waarschuwing:</b> FTP ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van FTP shares is niet mogelijk. Vraag uw beheerder FTP ondersteuning te installeren.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Waarschuwing:</b> Curl ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van ownCloud / WebDAV of GoogleDrive is niet mogelijk. Vraag uw systeembeheerder dit te installeren.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Gebruikers",
"Delete" => "Verwijder",
"Enable User External Storage" => "Externe opslag voor gebruikers activeren",
-"Allow users to mount their own external storage" => "Sta gebruikers toe om hun eigen externe opslag aan te koppelen",
+"Allow users to mount the following external storage" => "Sta gebruikers toe de volgende externe opslag aan te koppelen",
"SSL root certificates" => "SSL root certificaten",
"Import Root Certificate" => "Importeer root certificaat"
);
diff --git a/apps/files_external/l10n/pl.php b/apps/files_external/l10n/pl.php
index f5501b9755b..ece0620f754 100644
--- a/apps/files_external/l10n/pl.php
+++ b/apps/files_external/l10n/pl.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Udziel dostępu",
"Please provide a valid Dropbox app key and secret." => "Proszę podać prawidłowy klucz aplikacji Dropbox i klucz sekretny.",
"Error configuring Google Drive storage" => "Wystąpił błąd podczas konfigurowania zasobu Google Drive",
+"Saved" => "Zapisano",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Ostrzeżenie:</b> \"smbclient\" nie jest zainstalowany. Zamontowanie katalogów CIFS/SMB nie jest możliwe. Skontaktuj sie z administratorem w celu zainstalowania.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Ostrzeżenie:</b> Wsparcie dla FTP w PHP nie jest zainstalowane lub włączone. Skontaktuj sie z administratorem w celu zainstalowania lub włączenia go.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Ostrzeżenie:</b> Wsparcie dla Curl w PHP nie jest zainstalowane lub włączone. Montowanie WebDAV lub GoogleDrive nie będzie możliwe. Skontaktuj się z administratorem w celu zainstalowania lub włączenia tej opcji.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Użytkownicy",
"Delete" => "Usuń",
"Enable User External Storage" => "Włącz zewnętrzne zasoby dyskowe użytkownika",
-"Allow users to mount their own external storage" => "Zezwalaj użytkownikom na montowanie ich własnych zewnętrznych zasobów dyskowych",
+"Allow users to mount the following external storage" => "Pozwól użytkownikom montować następujące zewnętrzne zasoby dyskowe",
"SSL root certificates" => "Główny certyfikat SSL",
"Import Root Certificate" => "Importuj główny certyfikat"
);
diff --git a/apps/files_external/l10n/pt_BR.php b/apps/files_external/l10n/pt_BR.php
index f69bbc1ebe6..fbb945c5439 100644
--- a/apps/files_external/l10n/pt_BR.php
+++ b/apps/files_external/l10n/pt_BR.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Permitir acesso",
"Please provide a valid Dropbox app key and secret." => "Por favor forneça um app key e secret válido do Dropbox",
"Error configuring Google Drive storage" => "Erro ao configurar armazenamento do Google Drive",
+"Saved" => "Salvo",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Aviso:</b> \"smbclient\" não está instalado. Impossível montar compartilhamentos de CIFS/SMB. Por favor, peça ao seu administrador do sistema para instalá-lo.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Aviso:</b> O suporte para FTP do PHP não está ativado ou instalado. Impossível montar compartilhamentos FTP. Por favor, peça ao seu administrador do sistema para instalá-lo.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b> Aviso: </b> O suport a Curl em PHP não está habilitado ou instalado. A montagem do ownCloud / WebDAV ou GoogleDrive não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Usuários",
"Delete" => "Excluir",
"Enable User External Storage" => "Habilitar Armazenamento Externo do Usuário",
-"Allow users to mount their own external storage" => "Permitir usuários a montar seus próprios armazenamentos externos",
+"Allow users to mount the following external storage" => "Permitir que usuários montem o seguinte armazenamento externo",
"SSL root certificates" => "Certificados SSL raíz",
"Import Root Certificate" => "Importar Certificado Raíz"
);
diff --git a/apps/files_external/l10n/pt_PT.php b/apps/files_external/l10n/pt_PT.php
index 3f2afd33f07..e331d55726b 100644
--- a/apps/files_external/l10n/pt_PT.php
+++ b/apps/files_external/l10n/pt_PT.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Conceder acesso",
"Please provide a valid Dropbox app key and secret." => "Por favor forneça uma \"app key\" e \"secret\" do Dropbox válidas.",
"Error configuring Google Drive storage" => "Erro ao configurar o armazenamento do Google Drive",
+"Saved" => "Guardado",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Atenção:</b> O cliente \"smbclient\" não está instalado. Não é possível montar as partilhas CIFS/SMB . Peça ao seu administrador para instalar.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Aviso:</b> O suporte FTP no PHP não está activate ou instalado. Não é possível montar as partilhas FTP. Peça ao seu administrador para instalar.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Atenção:<br> O suporte PHP para o Curl não está activado ou instalado. A montagem do ownCloud/WebDav ou GoolgeDriver não é possível. Por favor contacte o administrador para o instalar.",
@@ -21,7 +22,6 @@ $TRANSLATIONS = array(
"Users" => "Utilizadores",
"Delete" => "Eliminar",
"Enable User External Storage" => "Activar Armazenamento Externo para o Utilizador",
-"Allow users to mount their own external storage" => "Permitir que os utilizadores montem o seu próprio armazenamento externo",
"SSL root certificates" => "Certificados SSL de raiz",
"Import Root Certificate" => "Importar Certificado Root"
);
diff --git a/apps/files_external/l10n/ro.php b/apps/files_external/l10n/ro.php
index 7115d09ea94..a90b0299e17 100644
--- a/apps/files_external/l10n/ro.php
+++ b/apps/files_external/l10n/ro.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Permite accesul",
"Please provide a valid Dropbox app key and secret." => "Prezintă te rog o cheie de Dropbox validă și parola",
"Error configuring Google Drive storage" => "Eroare la configurarea mediului de stocare Google Drive",
+"Saved" => "Salvat",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Atenție:</b> \"smbclient\" nu este instalat. Montarea mediilor CIFS/SMB partajate nu este posibilă. Solicită administratorului sistemului tău să îl instaleaze.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Atenție:</b> suportul pentru FTP în PHP nu este activat sau instalat. Montarea mediilor FPT partajate nu este posibilă. Solicită administratorului sistemului tău să îl instaleze.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Atentie:</b> Suportul Curl nu este pornit / instalat in configuratia PHP! Montarea ownCloud / WebDAV / GoogleDrive nu este posibila! Intrebati administratorul sistemului despre aceasta problema!",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Utilizatori",
"Delete" => "Șterge",
"Enable User External Storage" => "Permite stocare externă pentru utilizatori",
-"Allow users to mount their own external storage" => "Permite utilizatorilor să monteze stocare externă proprie",
+"Allow users to mount the following external storage" => "Permite utilizatorilor să monteze următoarea unitate de stocare",
"SSL root certificates" => "Certificate SSL root",
"Import Root Certificate" => "Importă certificat root"
);
diff --git a/apps/files_external/l10n/ru.php b/apps/files_external/l10n/ru.php
index 50c25acba06..66d6f9fa6b8 100644
--- a/apps/files_external/l10n/ru.php
+++ b/apps/files_external/l10n/ru.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Пользователи",
"Delete" => "Удалить",
"Enable User External Storage" => "Включить пользовательские внешние носители",
-"Allow users to mount their own external storage" => "Разрешить пользователям монтировать их собственные внешние носители",
"SSL root certificates" => "Корневые сертификаты SSL",
"Import Root Certificate" => "Импортировать корневые сертификаты"
);
diff --git a/apps/files_external/l10n/si_LK.php b/apps/files_external/l10n/si_LK.php
index cad928accef..ac41f596340 100644
--- a/apps/files_external/l10n/si_LK.php
+++ b/apps/files_external/l10n/si_LK.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Users" => "පරිශීලකයන්",
"Delete" => "මකා දමන්න",
"Enable User External Storage" => "පරිශීලක භාහිර ගබඩාවන් සක්‍රිය කරන්න",
-"Allow users to mount their own external storage" => "පරිශීලකයන්ට තමාගේම භාහිර ගබඩාවන් මවුන්ට් කිරීමේ අයිතිය දෙන්න",
"SSL root certificates" => "SSL මූල සහතිකයන්",
"Import Root Certificate" => "මූල සහතිකය ආයාත කරන්න"
);
diff --git a/apps/files_external/l10n/sk_SK.php b/apps/files_external/l10n/sk_SK.php
index 664d97c43b2..aa288982576 100644
--- a/apps/files_external/l10n/sk_SK.php
+++ b/apps/files_external/l10n/sk_SK.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Používatelia",
"Delete" => "Zmazať",
"Enable User External Storage" => "Povoliť externé úložisko",
-"Allow users to mount their own external storage" => "Povoliť používateľom pripojiť si vlastné externé úložisko",
"SSL root certificates" => "Koreňové SSL certifikáty",
"Import Root Certificate" => "Importovať koreňový certifikát"
);
diff --git a/apps/files_external/l10n/sl.php b/apps/files_external/l10n/sl.php
index b0fcbf9eb69..05e626fcf83 100644
--- a/apps/files_external/l10n/sl.php
+++ b/apps/files_external/l10n/sl.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Odobri dostop",
"Please provide a valid Dropbox app key and secret." => "Vpisati je treba veljaven ključ programa in kodo za Dropbox",
"Error configuring Google Drive storage" => "Napaka nastavljanja shrambe Google Drive",
+"Saved" => "Shranjeno",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Opozorilo:</b> paket \"smbclient\" ni nameščen. Priklapljanje pogonov CIFS/SMB ne bo mogoče.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Opozorilo:</b> podpora FTP v PHP ni omogočena ali pa ni nameščena. Priklapljanje pogonov FTP zato ne bo mogoče.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Opozorilo:</b> podpora za Curl v PHP ni omogočena ali pa ni nameščena. Priklapljanje točke ownCloud / WebDAV ali GoogleDrive zato ne bo mogoče. Zahtevane pakete je treba pred uporabo namestiti.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Uporabniki",
"Delete" => "Izbriši",
"Enable User External Storage" => "Omogoči zunanjo uporabniško podatkovno shrambo",
-"Allow users to mount their own external storage" => "Dovoli uporabnikom priklop lastne zunanje podatkovne shrambe",
+"Allow users to mount the following external storage" => "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb.",
"SSL root certificates" => "Korenska potrdila SSL",
"Import Root Certificate" => "Uvozi korensko potrdilo"
);
diff --git a/apps/files_external/l10n/sv.php b/apps/files_external/l10n/sv.php
index 2c0b0ab69e4..183df674b9d 100644
--- a/apps/files_external/l10n/sv.php
+++ b/apps/files_external/l10n/sv.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Användare",
"Delete" => "Radera",
"Enable User External Storage" => "Aktivera extern lagring för användare",
-"Allow users to mount their own external storage" => "Tillåt användare att montera egen extern lagring",
"SSL root certificates" => "SSL rotcertifikat",
"Import Root Certificate" => "Importera rotcertifikat"
);
diff --git a/apps/files_external/l10n/ta_LK.php b/apps/files_external/l10n/ta_LK.php
index bb663a4fcb6..94ddaf9c5e1 100644
--- a/apps/files_external/l10n/ta_LK.php
+++ b/apps/files_external/l10n/ta_LK.php
@@ -16,7 +16,6 @@ $TRANSLATIONS = array(
"Users" => "பயனாளர்",
"Delete" => "நீக்குக",
"Enable User External Storage" => "பயனாளர் வெளி சேமிப்பை இயலுமைப்படுத்துக",
-"Allow users to mount their own external storage" => "பயனாளர் அவர்களுடைய சொந்த வெளியக சேமிப்பை ஏற்ற அனுமதிக்க",
"SSL root certificates" => "SSL வேர் சான்றிதழ்கள்",
"Import Root Certificate" => "வேர் சான்றிதழை இறக்குமதி செய்க"
);
diff --git a/apps/files_external/l10n/th_TH.php b/apps/files_external/l10n/th_TH.php
index f2ea35f10f4..a1a56a4d2e4 100644
--- a/apps/files_external/l10n/th_TH.php
+++ b/apps/files_external/l10n/th_TH.php
@@ -18,7 +18,6 @@ $TRANSLATIONS = array(
"Users" => "ผู้ใช้งาน",
"Delete" => "ลบ",
"Enable User External Storage" => "เปิดให้มีการใช้พื้นที่จัดเก็บข้อมูลของผู้ใช้งานจากภายนอกได้",
-"Allow users to mount their own external storage" => "อนุญาตให้ผู้ใช้งานสามารถชี้ตำแหน่งไปที่พื้นที่จัดเก็บข้อมูลภายนอกของตนเองได้",
"SSL root certificates" => "ใบรับรองความปลอดภัยด้วยระบบ SSL จาก Root",
"Import Root Certificate" => "นำเข้าข้อมูลใบรับรองความปลอดภัยจาก Root"
);
diff --git a/apps/files_external/l10n/tr.php b/apps/files_external/l10n/tr.php
index 5d5e2b726a9..a835d6f174a 100644
--- a/apps/files_external/l10n/tr.php
+++ b/apps/files_external/l10n/tr.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Grant access" => "Erişim sağlandı",
"Please provide a valid Dropbox app key and secret." => "Lütfen Dropbox app key ve secret temin ediniz",
"Error configuring Google Drive storage" => "Google Drive depo yapılandırma hatası",
+"Saved" => "Kaydedildi",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Uyarı:</b> \"smbclient\" kurulu değil. CIFS/SMB paylaşımlarını bağlama işlemi mümkün olmadı. Lütfen kurulumu için sistem yöneticinize danışın.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Uyarı:</b> PHP içerisinde FTP desteği etkin veya yüklü değil. FTP paylaşımlarını bağlama işlemi mümkün olmadı. Lütfen kurulumu için sistem yöneticinize danışın.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Uyarı:</b> PHP içerisinde Curl desteği etkin veya yüklü değil. OwnCloud / WebDAV veya GoogleDrive bağlama işlemi mümkün olmadı. Lütfen kurulumu için sistem yöneticinizde danışın.",
@@ -21,7 +22,7 @@ $TRANSLATIONS = array(
"Users" => "Kullanıcılar",
"Delete" => "Sil",
"Enable User External Storage" => "Kullanıcılar için Harici Depolamayı Etkinleştir",
-"Allow users to mount their own external storage" => "Kullanıcıların kendi harici depolamalarını bağlamalarına izin ver",
+"Allow users to mount the following external storage" => "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver",
"SSL root certificates" => "SSL kök sertifikaları",
"Import Root Certificate" => "Kök Sertifikalarını İçe Aktar"
);
diff --git a/apps/files_external/l10n/uk.php b/apps/files_external/l10n/uk.php
index e535b455d10..a7c028aa935 100644
--- a/apps/files_external/l10n/uk.php
+++ b/apps/files_external/l10n/uk.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Користувачі",
"Delete" => "Видалити",
"Enable User External Storage" => "Активувати користувацькі зовнішні сховища",
-"Allow users to mount their own external storage" => "Дозволити користувачам монтувати власні зовнішні сховища",
"SSL root certificates" => "SSL корневі сертифікати",
"Import Root Certificate" => "Імпортувати корневі сертифікати"
);
diff --git a/apps/files_external/l10n/vi.php b/apps/files_external/l10n/vi.php
index da8ac419cda..5fd00dc2bf5 100644
--- a/apps/files_external/l10n/vi.php
+++ b/apps/files_external/l10n/vi.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "Người dùng",
"Delete" => "Xóa",
"Enable User External Storage" => "Kích hoạt tính năng lưu trữ ngoài",
-"Allow users to mount their own external storage" => "Cho phép người dùng kết nối với lưu trữ riêng bên ngoài của họ",
"SSL root certificates" => "Chứng chỉ SSL root",
"Import Root Certificate" => "Nhập Root Certificate"
);
diff --git a/apps/files_external/l10n/zh_CN.php b/apps/files_external/l10n/zh_CN.php
index 5e2c2e4fe0c..bb85d0e4f49 100644
--- a/apps/files_external/l10n/zh_CN.php
+++ b/apps/files_external/l10n/zh_CN.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "用户",
"Delete" => "删除",
"Enable User External Storage" => "启用用户外部存储",
-"Allow users to mount their own external storage" => "允许用户挂载自有外部存储",
"SSL root certificates" => "SSL根证书",
"Import Root Certificate" => "导入根证书"
);
diff --git a/apps/files_external/l10n/zh_TW.php b/apps/files_external/l10n/zh_TW.php
index d85d18a1c32..7c256cd2ab7 100644
--- a/apps/files_external/l10n/zh_TW.php
+++ b/apps/files_external/l10n/zh_TW.php
@@ -21,7 +21,6 @@ $TRANSLATIONS = array(
"Users" => "使用者",
"Delete" => "刪除",
"Enable User External Storage" => "啓用使用者外部儲存",
-"Allow users to mount their own external storage" => "允許使用者自行掛載他們的外部儲存",
"SSL root certificates" => "SSL 根憑證",
"Import Root Certificate" => "匯入根憑證"
);
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php
index 00baacd488c..06ccd5d16fa 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/amazons3.php
@@ -54,6 +54,9 @@ class AmazonS3 extends \OC\Files\Storage\Common {
*/
private $timeout = 15;
+ /**
+ * @param string $path
+ */
private function normalizePath($path) {
$path = trim($path, '/');
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 01d588b3721..ffbab7bca80 100755
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -4,6 +4,7 @@
*
* @author Michael Gapczynski
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
+* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
@@ -19,15 +20,24 @@
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
+set_include_path(
+ get_include_path() . PATH_SEPARATOR .
+ \OC_App::getAppPath('files_external') . '/3rdparty/phpseclib/phpseclib'
+);
+
/**
-* Class to configure the config/mount.php and data/$user/mount.php files
-*/
+ * Class to configure mount.json globally and for users
+ */
class OC_Mount_Config {
+ // TODO: make this class non-static and give it a proper namespace
const MOUNT_TYPE_GLOBAL = 'global';
const MOUNT_TYPE_GROUP = 'group';
const MOUNT_TYPE_USER = 'user';
+ // whether to skip backend test (for unit tests, as this static class is not mockable)
+ public static $skipTest = false;
+
/**
* Get details on each of the external storage backends, used for the mount config UI
* If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded
@@ -35,17 +45,18 @@ class OC_Mount_Config {
* If the configuration parameter is a boolean, add a '!' to the beginning of the value
* If the configuration parameter is optional, add a '&' to the beginning of the value
* If the configuration parameter is hidden, add a '#' to the beginning of the value
- * @return array
+ * @return string
*/
public static function getBackends() {
+ // FIXME: do not rely on php key order for the options order in the UI
$backends['\OC\Files\Storage\Local']=array(
'backend' => 'Local',
'configuration' => array(
'datadir' => 'Location'));
$backends['\OC\Files\Storage\AmazonS3']=array(
- 'backend' => 'Amazon S3',
+ 'backend' => 'Amazon S3 and compliant',
'configuration' => array(
'key' => 'Access Key',
'secret' => '*Secret Key',
@@ -61,7 +72,7 @@ class OC_Mount_Config {
'configuration' => array(
'configured' => '#configured',
'app_key' => 'App key',
- 'app_secret' => 'App secret',
+ 'app_secret' => '*App secret',
'token' => '#token',
'token_secret' => '#token_secret'),
'custom' => 'dropbox');
@@ -69,7 +80,7 @@ class OC_Mount_Config {
if(OC_Mount_Config::checkphpftp()) $backends['\OC\Files\Storage\FTP']=array(
'backend' => 'FTP',
'configuration' => array(
- 'host' => 'URL',
+ 'host' => 'Hostname',
'user' => 'Username',
'password' => '*Password',
'root' => '&Root',
@@ -80,7 +91,7 @@ class OC_Mount_Config {
'configuration' => array(
'configured' => '#configured',
'client_id' => 'Client ID',
- 'client_secret' => 'Client secret',
+ 'client_secret' => '*Client secret',
'token' => '#token'),
'custom' => 'google');
@@ -156,6 +167,125 @@ class OC_Mount_Config {
}
/**
+ * Hook that mounts the given user's visible mount points
+ * @param array $data
+ */
+ public static function initMountPointsHook($data) {
+ $mountPoints = self::getAbsoluteMountPoints($data['user']);
+ foreach ($mountPoints as $mountPoint => $options) {
+ \OC\Files\Filesystem::mount($options['class'], $options['options'], $mountPoint);
+ }
+ }
+
+ /**
+ * Returns the mount points for the given user.
+ * The mount point is relative to the data directory.
+ *
+ * @param string $user user
+ * @return array of mount point string as key, mountpoint config as value
+ */
+ public static function getAbsoluteMountPoints($user) {
+ $mountPoints = array();
+
+ $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
+ $mount_file = \OC_Config::getValue("mount_file", $datadir . "/mount.json");
+
+ //move config file to it's new position
+ if (is_file(\OC::$SERVERROOT . '/config/mount.json')) {
+ rename(\OC::$SERVERROOT . '/config/mount.json', $mount_file);
+ }
+
+ // Load system mount points
+ $mountConfig = self::readData(false);
+ if (isset($mountConfig[self::MOUNT_TYPE_GLOBAL])) {
+ foreach ($mountConfig[self::MOUNT_TYPE_GLOBAL] as $mountPoint => $options) {
+ $options['options'] = self::decryptPasswords($options['options']);
+ $mountPoints[$mountPoint] = $options;
+ }
+ }
+ if (isset($mountConfig[self::MOUNT_TYPE_GROUP])) {
+ foreach ($mountConfig[self::MOUNT_TYPE_GROUP] as $group => $mounts) {
+ if (\OC_Group::inGroup($user, $group)) {
+ foreach ($mounts as $mountPoint => $options) {
+ $mountPoint = self::setUserVars($user, $mountPoint);
+ foreach ($options as &$option) {
+ $option = self::setUserVars($user, $option);
+ }
+ $options['options'] = self::decryptPasswords($options['options']);
+ $mountPoints[$mountPoint] = $options;
+ }
+ }
+ }
+ }
+ if (isset($mountConfig[self::MOUNT_TYPE_USER])) {
+ foreach ($mountConfig[self::MOUNT_TYPE_USER] as $mountUser => $mounts) {
+ if ($mountUser === 'all' or strtolower($mountUser) === strtolower($user)) {
+ foreach ($mounts as $mountPoint => $options) {
+ $mountPoint = self::setUserVars($user, $mountPoint);
+ foreach ($options as &$option) {
+ $option = self::setUserVars($user, $option);
+ }
+ $options['options'] = self::decryptPasswords($options['options']);
+ $mountPoints[$mountPoint] = $options;
+ }
+ }
+ }
+ }
+
+ // Load personal mount points
+ $mountConfig = self::readData(true);
+ if (isset($mountConfig[self::MOUNT_TYPE_USER][$user])) {
+ foreach ($mountConfig[self::MOUNT_TYPE_USER][$user] as $mountPoint => $options) {
+ $options['options'] = self::decryptPasswords($options['options']);
+ $mountPoints[$mountPoint] = $options;
+ }
+ }
+
+ return $mountPoints;
+ }
+
+ /**
+ * fill in the correct values for $user
+ *
+ * @param string $user
+ * @param string $input
+ * @return string
+ */
+ private static function setUserVars($user, $input) {
+ return str_replace('$user', $user, $input);
+ }
+
+
+ /**
+ * Get details on each of the external storage backends, used for the mount config UI
+ * Some backends are not available as a personal backend, f.e. Local and such that have
+ * been disabled by the admin.
+ *
+ * If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded
+ * If the configuration parameter should be secret, add a '*' to the beginning of the value
+ * If the configuration parameter is a boolean, add a '!' to the beginning of the value
+ * If the configuration parameter is optional, add a '&' to the beginning of the value
+ * If the configuration parameter is hidden, add a '#' to the beginning of the value
+ * @return array
+ */
+ public static function getPersonalBackends() {
+
+ $backends = self::getBackends();
+
+ // Remove local storage and other disabled storages
+ unset($backends['\OC\Files\Storage\Local']);
+
+ $allowed_backends = explode(',', OCP\Config::getAppValue('files_external', 'user_mounting_backends', ''));
+ foreach ($backends as $backend => $null) {
+ if (!in_array($backend, $allowed_backends)) {
+ unset($backends[$backend]);
+ }
+ }
+
+ return $backends;
+ }
+
+ /**
* Get the system mount points
* The returned array is not in the same format as getUserMountPoints()
* @return array
@@ -171,6 +301,7 @@ class OC_Mount_Config {
if (strpos($mount['class'], 'OC_Filestorage_') !== false) {
$mount['class'] = '\OC\Files\Storage\\'.substr($mount['class'], 15);
}
+ $mount['options'] = self::decryptPasswords($mount['options']);
// Remove '/$user/files/' from mount point
$mountPoint = substr($mountPoint, 13);
// Merge the mount point into the current mount points
@@ -196,6 +327,7 @@ class OC_Mount_Config {
if (strpos($mount['class'], 'OC_Filestorage_') !== false) {
$mount['class'] = '\OC\Files\Storage\\'.substr($mount['class'], 15);
}
+ $mount['options'] = self::decryptPasswords($mount['options']);
// Remove '/$user/files/' from mount point
$mountPoint = substr($mountPoint, 13);
// Merge the mount point into the current mount points
@@ -233,6 +365,7 @@ class OC_Mount_Config {
if (strpos($mount['class'], 'OC_Filestorage_') !== false) {
$mount['class'] = '\OC\Files\Storage\\'.substr($mount['class'], 15);
}
+ $mount['options'] = self::decryptPasswords($mount['options']);
// Remove '/uid/files/' from mount point
$personal[substr($mountPoint, strlen($uid) + 8)] = array(
'class' => $mount['class'],
@@ -245,9 +378,18 @@ class OC_Mount_Config {
return $personal;
}
+ /**
+ * Test connecting using the given backend configuration
+ * @param string $class backend class name
+ * @param array $options backend configuration options
+ * @return bool true if the connection succeeded, false otherwise
+ */
private static function getBackendStatus($class, $options) {
+ if (self::$skipTest) {
+ return true;
+ }
foreach ($options as &$option) {
- $option = str_replace('$user', OCP\User::getUser(), $option);
+ $option = self::setUserVars(OCP\User::getUser(), $option);
}
if (class_exists($class)) {
try {
@@ -263,13 +405,13 @@ class OC_Mount_Config {
/**
* Add a mount point to the filesystem
- * @param string Mount point
- * @param string Backend class
+ * @param string $mountPoint Mount point
+ * @param string $class Backend class
* @param array Backend parameters for the class
- * @param string MOUNT_TYPE_GROUP | MOUNT_TYPE_USER
- * @param string User or group to apply mount to
+ * @param string $mountType MOUNT_TYPE_GROUP | MOUNT_TYPE_USER
+ * @param string $applicable User or group to apply mount to
* @param bool Personal or system mount point i.e. is this being called from the personal or admin page
- * @return bool
+ * @return boolean
*/
public static function addMountPoint($mountPoint,
$class,
@@ -277,22 +419,35 @@ class OC_Mount_Config {
$mountType,
$applicable,
$isPersonal = false) {
+ $backends = self::getBackends();
$mountPoint = OC\Files\Filesystem::normalizePath($mountPoint);
if ($mountPoint === '' || $mountPoint === '/' || $mountPoint == '/Shared') {
// can't mount at root or "Shared" folder
return false;
}
+
+ if (!isset($backends[$class])) {
+ // invalid backend
+ return false;
+ }
if ($isPersonal) {
// Verify that the mount point applies for the current user
- // Prevent non-admin users from mounting local storage
- if ($applicable != OCP\User::getUser() || $class == '\OC\Files\Storage\Local') {
+ // Prevent non-admin users from mounting local storage and other disabled backends
+ $allowed_backends = self::getPersonalBackends();
+ if ($applicable != OCP\User::getUser() || !isset($allowed_backends[$class])) {
return false;
}
$mountPoint = '/'.$applicable.'/files/'.ltrim($mountPoint, '/');
} else {
$mountPoint = '/$user/files/'.ltrim($mountPoint, '/');
}
- $mount = array($applicable => array($mountPoint => array('class' => $class, 'options' => $classOptions)));
+
+ $mount = array($applicable => array(
+ $mountPoint => array(
+ 'class' => $class,
+ 'options' => self::encryptPasswords($classOptions))
+ )
+ );
$mountPoints = self::readData($isPersonal);
// Merge the new mount point into the current mount points
if (isset($mountPoints[$mountType])) {
@@ -343,7 +498,7 @@ class OC_Mount_Config {
/**
* Read the mount points in the config file into an array
- * @param bool Personal or system config file
+ * @param boolean $isPersonal Personal or system config file
* @return array
*/
private static function readData($isPersonal) {
@@ -352,9 +507,9 @@ class OC_Mount_Config {
$phpFile = OC_User::getHome(OCP\User::getUser()).'/mount.php';
$jsonFile = OC_User::getHome(OCP\User::getUser()).'/mount.json';
} else {
- $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
$phpFile = OC::$SERVERROOT.'/config/mount.php';
- $jsonFile = $datadir . '/mount.json';
+ $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/');
+ $jsonFile = \OC_Config::getValue('mount_file', $datadir . '/mount.json');
}
if (is_file($jsonFile)) {
$mountPoints = json_decode(file_get_contents($jsonFile), true);
@@ -374,13 +529,14 @@ class OC_Mount_Config {
* Write the mount points to the config file
* @param bool Personal or system config file
* @param array Mount points
+ * @param boolean $isPersonal
*/
private static function writeData($isPersonal, $data) {
if ($isPersonal) {
$file = OC_User::getHome(OCP\User::getUser()).'/mount.json';
} else {
- $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
- $file = $datadir . '/mount.json';
+ $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/');
+ $file = \OC_Config::getValue('mount_file', $datadir . '/mount.json');
}
$content = json_encode($data);
@file_put_contents($file, $content);
@@ -439,7 +595,7 @@ class OC_Mount_Config {
*/
public static function checksmbclient() {
if(function_exists('shell_exec')) {
- $output=shell_exec('which smbclient 2> /dev/null');
+ $output=shell_exec('command -v smbclient 2> /dev/null');
return !empty($output);
}else{
return false;
@@ -484,4 +640,71 @@ class OC_Mount_Config {
return $txt;
}
+
+ /**
+ * Encrypt passwords in the given config options
+ * @param array $options mount options
+ * @return array updated options
+ */
+ private static function encryptPasswords($options) {
+ if (isset($options['password'])) {
+ $options['password_encrypted'] = self::encryptPassword($options['password']);
+ // do not unset the password, we want to keep the keys order
+ // on load... because that's how the UI currently works
+ $options['password'] = '';
+ }
+ return $options;
+ }
+
+ /**
+ * Decrypt passwords in the given config options
+ * @param array $options mount options
+ * @return array updated options
+ */
+ private static function decryptPasswords($options) {
+ // note: legacy options might still have the unencrypted password in the "password" field
+ if (isset($options['password_encrypted'])) {
+ $options['password'] = self::decryptPassword($options['password_encrypted']);
+ unset($options['password_encrypted']);
+ }
+ return $options;
+ }
+
+ /**
+ * Encrypt a single password
+ * @param string $password plain text password
+ * @return encrypted password
+ */
+ private static function encryptPassword($password) {
+ $cipher = self::getCipher();
+ $iv = \OCP\Util::generateRandomBytes(16);
+ $cipher->setIV($iv);
+ return base64_encode($iv . $cipher->encrypt($password));
+ }
+
+ /**
+ * Decrypts a single password
+ * @param string $encryptedPassword encrypted password
+ * @return plain text password
+ */
+ private static function decryptPassword($encryptedPassword) {
+ $cipher = self::getCipher();
+ $binaryPassword = base64_decode($encryptedPassword);
+ $iv = substr($binaryPassword, 0, 16);
+ $cipher->setIV($iv);
+ $binaryPassword = substr($binaryPassword, 16);
+ return $cipher->decrypt($binaryPassword);
+ }
+
+ /**
+ * Returns the encryption cipher
+ */
+ private static function getCipher() {
+ if (!class_exists('Crypt_AES', false)) {
+ include('Crypt/AES.php');
+ }
+ $cipher = new Crypt_AES(CRYPT_AES_MODE_CBC);
+ $cipher->setKey(\OCP\Config::getSystemValue('passwordsalt'));
+ return $cipher;
+ }
}
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index f7d8d98cf03..0214e18020c 100755
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -50,6 +50,9 @@ class Dropbox extends \OC\Files\Storage\Common {
}
}
+ /**
+ * @param string $path
+ */
private function deleteMetaData($path) {
$path = $this->root.$path;
if (isset($this->metaData[$path])) {
@@ -61,7 +64,7 @@ class Dropbox extends \OC\Files\Storage\Common {
/**
* @brief Returns the path's metadata
- * @param $path path for which to return the metadata
+ * @param string $path path for which to return the metadata
* @param $list if true, also return the directory's contents
* @return directory contents if $list is true, file metadata if $list is
* false, null if the file doesn't exist or "false" if the operation failed
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index 426caf008ec..35457f68528 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -67,7 +67,7 @@ class Google extends \OC\Files\Storage\Common {
/**
* Get the Google_DriveFile object for the specified path
* @param string $path
- * @return Google_DriveFile
+ * @return string
*/
private function getDriveFile($path) {
// Remove leading and trailing slashes
@@ -524,6 +524,7 @@ class Google extends \OC\Files\Storage\Common {
}
public function hasUpdated($path, $time) {
+ $appConfig = \OC::$server->getAppConfig();
if ($this->is_file($path)) {
return parent::hasUpdated($path, $time);
} else {
@@ -533,7 +534,7 @@ class Google extends \OC\Files\Storage\Common {
if ($folder) {
$result = false;
$folderId = $folder->getId();
- $startChangeId = \OC_Appconfig::getValue('files_external', $this->getId().'cId');
+ $startChangeId = $appConfig->getValue('files_external', $this->getId().'cId');
$params = array(
'includeDeleted' => true,
'includeSubscribed' => true,
@@ -578,7 +579,7 @@ class Google extends \OC\Files\Storage\Common {
break;
}
}
- \OC_Appconfig::setValue('files_external', $this->getId().'cId', $largestChangeId);
+ $appConfig->setValue('files_external', $this->getId().'cId', $largestChangeId);
return $result;
}
}
diff --git a/apps/files_external/lib/irods.php b/apps/files_external/lib/irods.php
index 6d4f66e856e..7a7e900fbf0 100644
--- a/apps/files_external/lib/irods.php
+++ b/apps/files_external/lib/irods.php
@@ -134,6 +134,7 @@ class iRODS extends \OC\Files\Storage\StreamWrapper{
/**
* get the best guess for the modification time of an iRODS collection
+ * @param string $path
*/
private function collectionMTime($path) {
$dh = $this->opendir($path);
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php
index cd8a0e78864..a0816e2870d 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/sftp.php
@@ -75,6 +75,9 @@ class SFTP extends \OC\Files\Storage\Common {
return 'sftp::' . $this->user . '@' . $this->host . '/' . $this->root;
}
+ /**
+ * @param string $path
+ */
private function absPath($path) {
return $this->root . $this->cleanPath($path);
}
@@ -277,6 +280,9 @@ class SFTP extends \OC\Files\Storage\Common {
}
}
+ /**
+ * @param string $path
+ */
public function constructUrl($path) {
$url = 'sftp://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path;
return $url;
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index c5fba92ee68..f3f3b3ed7f3 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -37,7 +37,7 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
$this->share = substr($this->share, 0, -1);
}
} else {
- throw new \Exception();
+ throw new \Exception('Invalid configuration');
}
}
diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php
index e484325e2fb..44bd9a0161a 100644
--- a/apps/files_external/lib/streamwrapper.php
+++ b/apps/files_external/lib/streamwrapper.php
@@ -9,6 +9,11 @@
namespace OC\Files\Storage;
abstract class StreamWrapper extends Common {
+
+ /**
+ * @param string $path
+ * @return string|null
+ */
abstract public function constructUrl($path);
public function mkdir($path) {
@@ -76,10 +81,17 @@ abstract class StreamWrapper extends Common {
}
}
+ /**
+ * @param string $path
+ * @param string $target
+ */
public function getFile($path, $target) {
return copy($this->constructUrl($path), $target);
}
+ /**
+ * @param string $target
+ */
public function uploadFile($path, $target) {
return copy($path, $this->constructUrl($target));
}
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php
index b615d24ce76..7a56fcfc8b7 100644
--- a/apps/files_external/lib/swift.php
+++ b/apps/files_external/lib/swift.php
@@ -52,6 +52,9 @@ class Swift extends \OC\Files\Storage\Common {
*/
private static $tmpFiles = array();
+ /**
+ * @param string $path
+ */
private function normalizePath($path) {
$path = trim($path, '/');
@@ -62,6 +65,9 @@ class Swift extends \OC\Files\Storage\Common {
return $path;
}
+ /**
+ * @param string $path
+ */
private function doesObjectExist($path) {
try {
$object = $this->container->DataObject($path);
diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php
index f6f4cb16e87..279ae716935 100644
--- a/apps/files_external/lib/webdav.php
+++ b/apps/files_external/lib/webdav.php
@@ -8,7 +8,7 @@
namespace OC\Files\Storage;
-class DAV extends \OC\Files\Storage\Common{
+class DAV extends \OC\Files\Storage\Common {
private $password;
private $user;
private $host;
@@ -21,7 +21,7 @@ class DAV extends \OC\Files\Storage\Common{
*/
private $client;
- private static $tempFiles=array();
+ private static $tempFiles = array();
public function __construct($params) {
if (isset($params['host']) && isset($params['user']) && isset($params['password'])) {
@@ -29,9 +29,9 @@ class DAV extends \OC\Files\Storage\Common{
//remove leading http[s], will be generated in createBaseUri()
if (substr($host, 0, 8) == "https://") $host = substr($host, 8);
else if (substr($host, 0, 7) == "http://") $host = substr($host, 7);
- $this->host=$host;
- $this->user=$params['user'];
- $this->password=$params['password'];
+ $this->host = $host;
+ $this->user = $params['user'];
+ $this->password = $params['password'];
if (isset($params['secure'])) {
if (is_string($params['secure'])) {
$this->secure = ($params['secure'] === 'true');
@@ -42,25 +42,25 @@ class DAV extends \OC\Files\Storage\Common{
$this->secure = false;
}
if ($this->secure === true) {
- $certPath=\OC_User::getHome(\OC_User::getUser()) . '/files_external/rootcerts.crt';
+ $certPath = \OC_User::getHome(\OC_User::getUser()) . '/files_external/rootcerts.crt';
if (file_exists($certPath)) {
- $this->certPath=$certPath;
+ $this->certPath = $certPath;
}
}
- $this->root=isset($params['root'])?$params['root']:'/';
- if ( ! $this->root || $this->root[0]!='/') {
- $this->root='/'.$this->root;
+ $this->root = isset($params['root']) ? $params['root'] : '/';
+ if (!$this->root || $this->root[0] != '/') {
+ $this->root = '/' . $this->root;
}
- if (substr($this->root, -1, 1)!='/') {
- $this->root.='/';
+ if (substr($this->root, -1, 1) != '/') {
+ $this->root .= '/';
}
} else {
throw new \Exception();
}
}
- private function init(){
- if($this->ready) {
+ private function init() {
+ if ($this->ready) {
return;
}
$this->ready = true;
@@ -78,59 +78,64 @@ class DAV extends \OC\Files\Storage\Common{
}
}
- public function getId(){
+ public function getId() {
return 'webdav::' . $this->user . '@' . $this->host . '/' . $this->root;
}
protected function createBaseUri() {
- $baseUri='http';
+ $baseUri = 'http';
if ($this->secure) {
- $baseUri.='s';
+ $baseUri .= 's';
}
- $baseUri.='://'.$this->host.$this->root;
+ $baseUri .= '://' . $this->host . $this->root;
return $baseUri;
}
public function mkdir($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
return $this->simpleResponse('MKCOL', $path, null, 201);
}
public function rmdir($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path) . '/';
+ // FIXME: some WebDAV impl return 403 when trying to DELETE
+ // a non-empty folder
return $this->simpleResponse('DELETE', $path, null, 204);
}
public function opendir($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $response=$this->client->propfind($path, array(), 1);
- $id=md5('webdav'.$this->root.$path);
+ $response = $this->client->propfind($this->encodePath($path), array(), 1);
+ $id = md5('webdav' . $this->root . $path);
$content = array();
- $files=array_keys($response);
- array_shift($files);//the first entry is the current directory
+ $files = array_keys($response);
+ array_shift($files); //the first entry is the current directory
foreach ($files as $file) {
$file = urldecode(basename($file));
- $content[]=$file;
+ $content[] = $file;
}
\OC\Files\Stream\Dir::register($id, $content);
- return opendir('fakedir://'.$id);
- } catch(\Exception $e) {
+ return opendir('fakedir://' . $id);
+ } catch (\Exception $e) {
return false;
}
}
public function filetype($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $response=$this->client->propfind($path, array('{DAV:}resourcetype'));
- $responseType=$response["{DAV:}resourcetype"]->resourceType;
- return (count($responseType)>0 and $responseType[0]=="{DAV:}collection")?'dir':'file';
- } catch(\Exception $e) {
+ $response = $this->client->propfind($this->encodePath($path), array('{DAV:}resourcetype'));
+ $responseType = array();
+ if (isset($response["{DAV:}resourcetype"])) {
+ $responseType = $response["{DAV:}resourcetype"]->resourceType;
+ }
+ return (count($responseType) > 0 and $responseType[0] == "{DAV:}collection") ? 'dir' : 'file';
+ } catch (\Exception $e) {
error_log($e->getMessage());
\OCP\Util::writeLog("webdav client", \OCP\Util::sanitizeHTML($e->getMessage()), \OCP\Util::ERROR);
return false;
@@ -139,11 +144,11 @@ class DAV extends \OC\Files\Storage\Common{
public function file_exists($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $this->client->propfind($path, array('{DAV:}resourcetype'));
- return true;//no 404 exception
- } catch(\Exception $e) {
+ $this->client->propfind($this->encodePath($path), array('{DAV:}resourcetype'));
+ return true; //no 404 exception
+ } catch (\Exception $e) {
return false;
}
}
@@ -155,30 +160,34 @@ class DAV extends \OC\Files\Storage\Common{
public function fopen($path, $mode) {
$this->init();
- $path=$this->cleanPath($path);
- switch($mode) {
+ $path = $this->cleanPath($path);
+ switch ($mode) {
case 'r':
case 'rb':
- if ( ! $this->file_exists($path)) {
+ if (!$this->file_exists($path)) {
return false;
}
//straight up curl instead of sabredav here, sabredav put's the entire get result in memory
$curl = curl_init();
$fp = fopen('php://temp', 'r+');
- curl_setopt($curl, CURLOPT_USERPWD, $this->user.':'.$this->password);
- curl_setopt($curl, CURLOPT_URL, $this->createBaseUri().str_replace(' ', '%20', $path));
+ curl_setopt($curl, CURLOPT_USERPWD, $this->user . ':' . $this->password);
+ curl_setopt($curl, CURLOPT_URL, $this->createBaseUri() . $this->encodePath($path));
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
if ($this->secure === true) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
- if($this->certPath){
+ if ($this->certPath) {
curl_setopt($curl, CURLOPT_CAINFO, $this->certPath);
}
}
-
- curl_exec ($curl);
- curl_close ($curl);
+
+ curl_exec($curl);
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ if ($statusCode !== 200) {
+ \OCP\Util::writeLog("webdav client", 'curl GET ' . curl_getinfo($curl, CURLINFO_EFFECTIVE_URL) . ' returned status code ' . $statusCode, \OCP\Util::ERROR);
+ }
+ curl_close($curl);
rewind($fp);
return $fp;
case 'w':
@@ -194,18 +203,19 @@ class DAV extends \OC\Files\Storage\Common{
case 'c':
case 'c+':
//emulate these
- if (strrpos($path, '.')!==false) {
- $ext=substr($path, strrpos($path, '.'));
+ if (strrpos($path, '.') !== false) {
+ $ext = substr($path, strrpos($path, '.'));
} else {
- $ext='';
+ $ext = '';
}
- $tmpFile = \OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
- if($this->file_exists($path)) {
- $this->getFile($path, $tmpFile);
+ if ($this->file_exists($path)) {
+ $tmpFile = $this->getCachedFile($path);
+ } else {
+ $tmpFile = \OCP\Files::tmpFile($ext);
}
- self::$tempFiles[$tmpFile]=$path;
- return fopen('close://'.$tmpFile, $mode);
+ \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
+ self::$tempFiles[$tmpFile] = $path;
+ return fopen('close://' . $tmpFile, $mode);
}
}
@@ -218,48 +228,46 @@ class DAV extends \OC\Files\Storage\Common{
public function free_space($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $response=$this->client->propfind($path, array('{DAV:}quota-available-bytes'));
+ $response = $this->client->propfind($this->encodePath($path), array('{DAV:}quota-available-bytes'));
if (isset($response['{DAV:}quota-available-bytes'])) {
return (int)$response['{DAV:}quota-available-bytes'];
} else {
return \OC\Files\SPACE_UNKNOWN;
}
- } catch(\Exception $e) {
+ } catch (\Exception $e) {
return \OC\Files\SPACE_UNKNOWN;
}
}
- public function touch($path, $mtime=null) {
+ public function touch($path, $mtime = null) {
$this->init();
if (is_null($mtime)) {
- $mtime=time();
+ $mtime = time();
}
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
// if file exists, update the mtime, else create a new empty file
if ($this->file_exists($path)) {
- $this->client->proppatch($path, array('{DAV:}lastmodified' => $mtime));
+ try {
+ $this->client->proppatch($this->encodePath($path), array('{DAV:}lastmodified' => $mtime));
+ } catch (\Sabre_DAV_Exception_NotImplemented $e) {
+ return false;
+ }
} else {
$this->file_put_contents($path, '');
}
return true;
}
- public function getFile($path, $target) {
- $this->init();
- $source=$this->fopen($path, 'r');
- file_put_contents($target, $source);
- }
-
- public function uploadFile($path, $target) {
+ protected function uploadFile($path, $target) {
$this->init();
- $source=fopen($path, 'r');
+ $source = fopen($path, 'r');
$curl = curl_init();
- curl_setopt($curl, CURLOPT_USERPWD, $this->user.':'.$this->password);
- curl_setopt($curl, CURLOPT_URL, $this->createBaseUri().str_replace(' ', '%20', $target));
+ curl_setopt($curl, CURLOPT_USERPWD, $this->user . ':' . $this->password);
+ curl_setopt($curl, CURLOPT_URL, $this->createBaseUri() . str_replace(' ', '%20', $target));
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_INFILE, $source); // file pointer
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($path));
@@ -267,83 +275,113 @@ class DAV extends \OC\Files\Storage\Common{
if ($this->secure === true) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
- if($this->certPath){
+ if ($this->certPath) {
curl_setopt($curl, CURLOPT_CAINFO, $this->certPath);
}
}
- curl_exec ($curl);
- curl_close ($curl);
+ curl_exec($curl);
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ if ($statusCode !== 200) {
+ \OCP\Util::writeLog("webdav client", 'curl GET ' . curl_getinfo($curl, CURLINFO_EFFECTIVE_URL) . ' returned status code ' . $statusCode, \OCP\Util::ERROR);
+ }
+ curl_close($curl);
+ $this->removeCachedFile($target);
}
public function rename($path1, $path2) {
$this->init();
- $path1=$this->cleanPath($path1);
- $path2=$this->createBaseUri().$this->cleanPath($path2);
+ $path1 = $this->encodePath($this->cleanPath($path1));
+ $path2 = $this->createBaseUri() . $this->encodePath($this->cleanPath($path2));
try {
- $this->client->request('MOVE', $path1, null, array('Destination'=>$path2));
+ $this->client->request('MOVE', $path1, null, array('Destination' => $path2));
+ $this->removeCachedFile($path1);
+ $this->removeCachedFile($path2);
return true;
- } catch(\Exception $e) {
+ } catch (\Exception $e) {
return false;
}
}
public function copy($path1, $path2) {
$this->init();
- $path1=$this->cleanPath($path1);
- $path2=$this->createBaseUri().$this->cleanPath($path2);
+ $path1 = $this->encodePath($this->cleanPath($path1));
+ $path2 = $this->createBaseUri() . $this->encodePath($this->cleanPath($path2));
try {
- $this->client->request('COPY', $path1, null, array('Destination'=>$path2));
+ $this->client->request('COPY', $path1, null, array('Destination' => $path2));
+ $this->removeCachedFile($path2);
return true;
- } catch(\Exception $e) {
+ } catch (\Exception $e) {
return false;
}
}
public function stat($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $response=$this->client->propfind($path, array('{DAV:}getlastmodified', '{DAV:}getcontentlength'));
+ $response = $this->client->propfind($this->encodePath($path), array('{DAV:}getlastmodified', '{DAV:}getcontentlength'));
return array(
- 'mtime'=>strtotime($response['{DAV:}getlastmodified']),
- 'size'=>(int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0,
+ 'mtime' => strtotime($response['{DAV:}getlastmodified']),
+ 'size' => (int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0,
);
- } catch(\Exception $e) {
+ } catch (\Exception $e) {
return array();
}
}
public function getMimeType($path) {
$this->init();
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $response=$this->client->propfind($path, array('{DAV:}getcontenttype', '{DAV:}resourcetype'));
- $responseType=$response["{DAV:}resourcetype"]->resourceType;
- $type=(count($responseType)>0 and $responseType[0]=="{DAV:}collection")?'dir':'file';
- if ($type=='dir') {
+ $response = $this->client->propfind($this->encodePath($path), array('{DAV:}getcontenttype', '{DAV:}resourcetype'));
+ $responseType = array();
+ if (isset($response["{DAV:}resourcetype"])) {
+ $responseType = $response["{DAV:}resourcetype"]->resourceType;
+ }
+ $type = (count($responseType) > 0 and $responseType[0] == "{DAV:}collection") ? 'dir' : 'file';
+ if ($type == 'dir') {
return 'httpd/unix-directory';
} elseif (isset($response['{DAV:}getcontenttype'])) {
return $response['{DAV:}getcontenttype'];
} else {
return false;
}
- } catch(\Exception $e) {
+ } catch (\Exception $e) {
return false;
}
}
+ /**
+ * @param string $path
+ */
public function cleanPath($path) {
$path = \OC\Files\Filesystem::normalizePath($path);
// remove leading slash
return substr($path, 1);
}
+ /**
+ * URL encodes the given path but keeps the slashes
+ *
+ * @param string $path to encode
+ * @return string encoded path
+ */
+ private function encodePath($path) {
+ // slashes need to stay
+ return str_replace('%2F', '/', rawurlencode($path));
+ }
+
+ /**
+ * @param string $method
+ * @param string $path
+ * @param integer $expected
+ */
private function simpleResponse($method, $path, $body, $expected) {
- $path=$this->cleanPath($path);
+ $path = $this->cleanPath($path);
try {
- $response=$this->client->request($method, $path, $body);
- return $response['statusCode']==$expected;
- } catch(\Exception $e) {
+ $response = $this->client->request($method, $this->encodePath($path), $body);
+ return $response['statusCode'] == $expected;
+ } catch (\Exception $e) {
return false;
}
}
diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php
index 90f5e159535..90d7afed28b 100755
--- a/apps/files_external/personal.php
+++ b/apps/files_external/personal.php
@@ -22,9 +22,8 @@
OCP\Util::addScript('files_external', 'settings');
OCP\Util::addStyle('files_external', 'settings');
-$backends = OC_Mount_Config::getBackends();
-// Remove local storage
-unset($backends['\OC\Files\Storage\Local']);
+$backends = OC_Mount_Config::getPersonalBackends();
+
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('isAdminPage', false);
$tmpl->assign('mounts', OC_Mount_Config::getPersonalMountPoints());
diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php
index 31183409e39..5b62b542200 100644
--- a/apps/files_external/settings.php
+++ b/apps/files_external/settings.php
@@ -26,10 +26,26 @@ OCP\Util::addScript('files_external', 'settings');
OCP\Util::addscript('3rdparty', 'chosen/chosen.jquery.min');
OCP\Util::addStyle('files_external', 'settings');
OCP\Util::addStyle('3rdparty', 'chosen/chosen');
+
+$backends = OC_Mount_Config::getBackends();
+$personal_backends = array();
+$enabled_backends = explode(',', OCP\Config::getAppValue('files_external', 'user_mounting_backends', ''));
+foreach ($backends as $class => $backend)
+{
+ if ($class != '\OC\Files\Storage\Local')
+ {
+ $personal_backends[$class] = array(
+ 'backend' => $backend['backend'],
+ 'enabled' => in_array($class, $enabled_backends),
+ );
+ }
+}
+
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('isAdminPage', true);
$tmpl->assign('mounts', OC_Mount_Config::getSystemMountPoints());
-$tmpl->assign('backends', OC_Mount_Config::getBackends());
+$tmpl->assign('backends', $backends);
+$tmpl->assign('personal_backends', $personal_backends);
$tmpl->assign('groups', OC_Group::getGroups());
$tmpl->assign('users', OCP\User::getUsers());
$tmpl->assign('userDisplayNames', OC_User::getDisplayNames());
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 3ca16c3c7a8..de44d3c8644 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -122,12 +122,18 @@
<?php if ($_['isAdminPage']): ?>
<br />
- <input type="checkbox"
- name="allowUserMounting"
- id="allowUserMounting"
- value="1" <?php if ($_['allowUserMounting'] == 'yes') print_unescaped(' checked="checked"'); ?> />
- <label for="allowUserMounting"><?php p($l->t('Enable User External Storage')); ?></label><br/>
- <em><?php p($l->t('Allow users to mount their own external storage')); ?></em>
+ <input type="checkbox" name="allowUserMounting" id="allowUserMounting"
+ value="1" <?php if ($_['allowUserMounting'] == 'yes') print_unescaped(' checked="checked"'); ?> />
+ <label for="allowUserMounting"><?php p($l->t('Enable User External Storage')); ?></label> <span id="userMountingMsg" class="msg"></span>
+
+ <p id="userMountingBackups"<?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 ($_['personal_backends'] as $class => $backend): ?>
+ <input type="checkbox" id="allowUserMountingBackends<?php p($i); ?>" name="allowUserMountingBackends[]" value="<?php p($class); ?>" <?php if ($backend['enabled']) print_unescaped(' checked="checked"'); ?> />
+ <label for="allowUserMountingBackends<?php p($i); ?>"><?php p($backend['backend']); ?></label> <br />
+ <?php $i++; ?>
+ <?php endforeach; ?>
+ </p>
<?php endif; ?>
</fieldset>
</form>
diff --git a/apps/files_external/tests/config.php b/apps/files_external/tests/config.php
index e296bfcb5b2..767c0adf58e 100644
--- a/apps/files_external/tests/config.php
+++ b/apps/files_external/tests/config.php
@@ -21,7 +21,11 @@ return array(
'host'=>'localhost',
'user'=>'test',
'password'=>'test',
- 'root'=>'/owncloud/files/webdav.php',
+ 'root'=>'',
+ // wait delay in seconds after write operations
+ // (only in tests)
+ // set to higher value for lighttpd webdav
+ 'wait'=> 0
),
'owncloud'=>array(
'run'=>true,
diff --git a/apps/files_external/tests/mountconfig.php b/apps/files_external/tests/mountconfig.php
index 941aec680bb..bf43bb31c38 100644
--- a/apps/files_external/tests/mountconfig.php
+++ b/apps/files_external/tests/mountconfig.php
@@ -34,6 +34,90 @@ class Test_Mount_Config_Dummy_Storage {
* Class Test_Mount_Config
*/
class Test_Mount_Config extends \PHPUnit_Framework_TestCase {
+
+ private $dataDir;
+ private $userHome;
+ private $oldAllowedBackends;
+ private $allBackends;
+
+ const TEST_USER1 = 'user1';
+ const TEST_USER2 = 'user2';
+ const TEST_GROUP1 = 'group1';
+ const TEST_GROUP2 = 'group2';
+
+ public function setUp() {
+ \OC_User::createUser(self::TEST_USER1, self::TEST_USER1);
+ \OC_User::createUser(self::TEST_USER2, self::TEST_USER2);
+
+ \OC_Group::createGroup(self::TEST_GROUP1);
+ \OC_Group::addToGroup(self::TEST_USER1, self::TEST_GROUP1);
+ \OC_Group::createGroup(self::TEST_GROUP2);
+ \OC_Group::addToGroup(self::TEST_USER2, self::TEST_GROUP2);
+
+ \OC_User::setUserId(self::TEST_USER1);
+ $this->userHome = \OC_User::getHome(self::TEST_USER1);
+ mkdir($this->userHome);
+
+ $this->dataDir = \OC_Config::getValue(
+ 'datadirectory',
+ \OC::$SERVERROOT . '/data/'
+ );
+ $this->oldAllowedBackends = OCP\Config::getAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ ''
+ );
+ $this->allBackends = OC_Mount_Config::getBackends();
+ OCP\Config::setAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ implode(',', array_keys($this->allBackends))
+ );
+
+ OC_Mount_Config::$skipTest = true;
+ }
+
+ public function tearDown() {
+ OC_Mount_Config::$skipTest = false;
+
+ \OC_User::deleteUser(self::TEST_USER2);
+ \OC_User::deleteUser(self::TEST_USER1);
+ \OC_Group::deleteGroup(self::TEST_GROUP1);
+ \OC_Group::deleteGroup(self::TEST_GROUP2);
+
+ @unlink($this->dataDir . '/mount.json');
+
+ OCP\Config::setAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ $this->oldAllowedBackends
+ );
+ }
+
+ /**
+ * Reads the global config, for checking
+ */
+ private function readGlobalConfig() {
+ $configFile = $this->dataDir . '/mount.json';
+ return json_decode(file_get_contents($configFile), true);
+ }
+
+ /**
+ * Reads the user config, for checking
+ */
+ private function readUserConfig() {
+ $configFile = $this->userHome . '/mount.json';
+ return json_decode(file_get_contents($configFile), true);
+ }
+
+ /**
+ * Write the user config, to simulate existing files
+ */
+ private function writeUserConfig($config) {
+ $configFile = $this->userHome . '/mount.json';
+ file_put_contents($configFile, json_encode($config));
+ }
+
/**
* Test mount point validation
*/
@@ -42,10 +126,353 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase {
$mountType = 'user';
$applicable = 'all';
$isPersonal = false;
- $this->assertEquals(false, OC_Mount_Config::addMountPoint('', $storageClass, array(), $mountType, $applicable, $isPersonal));
- $this->assertEquals(false, OC_Mount_Config::addMountPoint('/', $storageClass, array(), $mountType, $applicable, $isPersonal));
- $this->assertEquals(false, OC_Mount_Config::addMountPoint('Shared', $storageClass, array(), $mountType, $applicable, $isPersonal));
- $this->assertEquals(false, OC_Mount_Config::addMountPoint('/Shared', $storageClass, array(), $mountType, $applicable, $isPersonal));
+ $this->assertFalse(OC_Mount_Config::addMountPoint('', $storageClass, array(), $mountType, $applicable, $isPersonal));
+ $this->assertFalse(OC_Mount_Config::addMountPoint('/', $storageClass, array(), $mountType, $applicable, $isPersonal));
+ $this->assertFalse(OC_Mount_Config::addMountPoint('Shared', $storageClass, array(), $mountType, $applicable, $isPersonal));
+ $this->assertFalse(OC_Mount_Config::addMountPoint('/Shared', $storageClass, array(), $mountType, $applicable, $isPersonal));
+
+ }
+
+ /**
+ * Test adding a global mount point
+ */
+ public function testAddGlobalMountPoint() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = 'all';
+ $isPersonal = false;
+
+ $this->assertEquals(true, OC_Mount_Config::addMountPoint('/ext', '\OC\Files\Storage\SFTP', array(), $mountType, $applicable, $isPersonal));
+
+ $config = $this->readGlobalConfig();
+ $this->assertEquals(1, count($config));
+ $this->assertTrue(isset($config[$mountType]));
+ $this->assertTrue(isset($config[$mountType][$applicable]));
+ $this->assertTrue(isset($config[$mountType][$applicable]['/$user/files/ext']));
+ $this->assertEquals(
+ '\OC\Files\Storage\SFTP',
+ $config[$mountType][$applicable]['/$user/files/ext']['class']
+ );
+ }
+
+ /**
+ * Test adding a personal mount point
+ */
+ public function testAddMountPointSingleUser() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = self::TEST_USER1;
+ $isPersonal = true;
+
+ $this->assertEquals(true, OC_Mount_Config::addMountPoint('/ext', '\OC\Files\Storage\SFTP', array(), $mountType, $applicable, $isPersonal));
+
+ $config = $this->readUserConfig();
+ $this->assertEquals(1, count($config));
+ $this->assertTrue(isset($config[$mountType]));
+ $this->assertTrue(isset($config[$mountType][$applicable]));
+ $this->assertTrue(isset($config[$mountType][$applicable]['/' . self::TEST_USER1 . '/files/ext']));
+ $this->assertEquals(
+ '\OC\Files\Storage\SFTP',
+ $config[$mountType][$applicable]['/' . self::TEST_USER1 . '/files/ext']['class']
+ );
+ }
+
+ /**
+ * Test adding a personal mount point using disallowed backend
+ */
+ public function testAddDisallowedBackendMountPointSingleUser() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = self::TEST_USER1;
+ $isPersonal = true;
+
+ // local
+ $this->assertFalse(OC_Mount_Config::addMountPoint('/ext', '\OC\Files\storage\local', array(), $mountType, $applicable, $isPersonal));
+
+ unset($this->allBackends['\OC\Files\Storage\SFTP']);
+ OCP\Config::setAppValue(
+ 'files_external',
+ 'user_mounting_backends',
+ implode(',', array_keys($this->allBackends))
+ );
+
+ // non-local but forbidden
+ $this->assertFalse(OC_Mount_Config::addMountPoint('/ext', '\OC\Files\Storage\SFTP', array(), $mountType, $applicable, $isPersonal));
+
+ $this->assertFalse(file_exists($this->userHome . '/mount.json'));
+ }
+
+ /**
+ * Test adding a mount point with an non-existant backend
+ */
+ public function testAddMountPointUnexistClass() {
+ $storageClass = 'Unexist_Storage';
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = self::TEST_USER1;
+ $isPersonal = false;
+ $this->assertFalse(OC_Mount_Config::addMountPoint('/ext', $storageClass, array(), $mountType, $applicable, $isPersonal));
+
+ }
+
+ /**
+ * Test reading and writing global config
+ */
+ public function testReadWriteGlobalConfig() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = 'all';
+ $isPersonal = false;
+ $mountConfig = array(
+ 'host' => 'smbhost',
+ 'user' => 'smbuser',
+ 'password' => 'smbpassword',
+ 'share' => 'smbshare',
+ 'root' => 'smbroot'
+ );
+
+ // write config
+ $this->assertTrue(
+ OC_Mount_Config::addMountPoint(
+ '/ext',
+ '\OC\Files\Storage\SMB',
+ $mountConfig,
+ $mountType,
+ $applicable,
+ $isPersonal
+ )
+ );
+
+ // re-read config
+ $config = OC_Mount_Config::getSystemMountPoints();
+ $this->assertEquals(1, count($config));
+ $this->assertTrue(isset($config['ext']));
+ $this->assertEquals('\OC\Files\Storage\SMB', $config['ext']['class']);
+ $savedMountConfig = $config['ext']['configuration'];
+ $this->assertEquals($mountConfig, $savedMountConfig);
+ // key order needs to be preserved for the UI...
+ $this->assertEquals(array_keys($mountConfig), array_keys($savedMountConfig));
+ }
+
+ /**
+ * Test reading and writing config
+ */
+ public function testReadWritePersonalConfig() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = self::TEST_USER1;
+ $isPersonal = true;
+ $mountConfig = array(
+ 'host' => 'smbhost',
+ 'user' => 'smbuser',
+ 'password' => 'smbpassword',
+ 'share' => 'smbshare',
+ 'root' => 'smbroot'
+ );
+
+ // write config
+ $this->assertTrue(
+ OC_Mount_Config::addMountPoint(
+ '/ext',
+ '\OC\Files\Storage\SMB',
+ $mountConfig,
+ $mountType,
+ $applicable,
+ $isPersonal
+ )
+ );
+
+ // re-read config
+ $config = OC_Mount_Config::getPersonalMountPoints();
+ $this->assertEquals(1, count($config));
+ $this->assertTrue(isset($config['ext']));
+ $this->assertEquals('\OC\Files\Storage\SMB', $config['ext']['class']);
+ $savedMountConfig = $config['ext']['configuration'];
+ $this->assertEquals($mountConfig, $savedMountConfig);
+ // key order needs to be preserved for the UI...
+ $this->assertEquals(array_keys($mountConfig), array_keys($savedMountConfig));
+ }
+
+ /**
+ * Test password obfuscation
+ */
+ public function testPasswordObfuscation() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = self::TEST_USER1;
+ $isPersonal = true;
+ $mountConfig = array(
+ 'host' => 'smbhost',
+ 'user' => 'smbuser',
+ 'password' => 'smbpassword',
+ 'share' => 'smbshare',
+ 'root' => 'smbroot'
+ );
+
+ // write config
+ $this->assertTrue(
+ OC_Mount_Config::addMountPoint(
+ '/ext',
+ '\OC\Files\Storage\SMB',
+ $mountConfig,
+ $mountType,
+ $applicable,
+ $isPersonal
+ )
+ );
+
+ // note: password re-reading is covered by testReadWritePersonalConfig
+
+ // check that password inside the file is NOT in plain text
+ $config = $this->readUserConfig();
+ $savedConfig = $config[$mountType][$applicable]['/' . self::TEST_USER1 . '/files/ext']['options'];
+
+ // no more clear text password in file (kept because of key order)
+ $this->assertEquals('', $savedConfig['password']);
+
+ // encrypted password is present
+ $this->assertNotEquals($mountConfig['password'], $savedConfig['password_encrypted']);
+ }
+
+ /**
+ * Test read legacy passwords
+ */
+ public function testReadLegacyPassword() {
+ $mountType = OC_Mount_Config::MOUNT_TYPE_USER;
+ $applicable = self::TEST_USER1;
+ $isPersonal = true;
+ $mountConfig = array(
+ 'host' => 'smbhost',
+ 'user' => 'smbuser',
+ 'password' => 'smbpassword',
+ 'share' => 'smbshare',
+ 'root' => 'smbroot'
+ );
+
+ // write config
+ $this->assertTrue(
+ OC_Mount_Config::addMountPoint(
+ '/ext',
+ '\OC\Files\Storage\SMB',
+ $mountConfig,
+ $mountType,
+ $applicable,
+ $isPersonal
+ )
+ );
+
+ $config = $this->readUserConfig();
+ // simulate non-encrypted password situation
+ $config[$mountType][$applicable]['/' . self::TEST_USER1 . '/files/ext']['options']['password'] = 'smbpasswd';
+
+ $this->writeUserConfig($config);
+
+ // re-read config, password was read correctly
+ $config = OC_Mount_Config::getPersonalMountPoints();
+ $savedMountConfig = $config['ext']['configuration'];
+ $this->assertEquals($mountConfig, $savedMountConfig);
+ }
+
+ public function mountDataProvider() {
+ return array(
+ // Tests for visible mount points
+ // system mount point for all users
+ array(
+ false,
+ OC_Mount_Config::MOUNT_TYPE_USER,
+ 'all',
+ self::TEST_USER1,
+ true,
+ ),
+ // system mount point for a specific user
+ array(
+ false,
+ OC_Mount_Config::MOUNT_TYPE_USER,
+ self::TEST_USER1,
+ self::TEST_USER1,
+ true,
+ ),
+ // system mount point for a specific group
+ array(
+ false,
+ OC_Mount_Config::MOUNT_TYPE_GROUP,
+ self::TEST_GROUP1,
+ self::TEST_USER1,
+ true,
+ ),
+ // user mount point
+ array(
+ true,
+ OC_Mount_Config::MOUNT_TYPE_USER,
+ self::TEST_USER1,
+ self::TEST_USER1,
+ true,
+ ),
+
+ // Tests for non-visible mount points
+ // system mount point for another user
+ array(
+ false,
+ OC_Mount_Config::MOUNT_TYPE_USER,
+ self::TEST_USER2,
+ self::TEST_USER1,
+ false,
+ ),
+ // system mount point for a specific group
+ array(
+ false,
+ OC_Mount_Config::MOUNT_TYPE_GROUP,
+ self::TEST_GROUP2,
+ self::TEST_USER1,
+ false,
+ ),
+ // user mount point
+ array(
+ true,
+ OC_Mount_Config::MOUNT_TYPE_USER,
+ self::TEST_USER1,
+ self::TEST_USER2,
+ false,
+ ),
+ );
+ }
+
+ /**
+ * Test mount points used at mount time, making sure
+ * the configuration is prepared properly.
+ *
+ * @dataProvider mountDataProvider
+ * @param bool $isPersonal true for personal mount point, false for system mount point
+ * @param string $mountType mount type
+ * @param string $applicable target user/group or "all"
+ * @param string $testUser user for which to retrieve the mount points
+ * @param bool $expectVisible whether to expect the mount point to be visible for $testUser
+ */
+ public function testMount($isPersonal, $mountType, $applicable, $testUser, $expectVisible) {
+ $mountConfig = array(
+ 'host' => 'someost',
+ 'user' => 'someuser',
+ 'password' => 'somepassword',
+ 'root' => 'someroot'
+ );
+
+ // add mount point as "test" user
+ $this->assertTrue(
+ OC_Mount_Config::addMountPoint(
+ '/ext',
+ '\OC\Files\Storage\SMB',
+ $mountConfig,
+ $mountType,
+ $applicable,
+ $isPersonal
+ )
+ );
+
+ // check mount points in the perspective of user $testUser
+ \OC_User::setUserId($testUser);
+ $mountPoints = OC_Mount_Config::getAbsoluteMountPoints($testUser);
+ if ($expectVisible) {
+ $this->assertEquals(1, count($mountPoints));
+ $this->assertTrue(isset($mountPoints['/' . self::TEST_USER1 . '/files/ext']));
+ $this->assertEquals('\OC\Files\Storage\SMB', $mountPoints['/' . self::TEST_USER1 . '/files/ext']['class']);
+ $this->assertEquals($mountConfig, $mountPoints['/' . self::TEST_USER1 . '/files/ext']['options']);
+ }
+ else {
+ $this->assertEquals(0, count($mountPoints));
+ }
}
}
diff --git a/apps/files_external/tests/webdav.php b/apps/files_external/tests/webdav.php
index 1f9b767eca6..74e905ccc89 100644
--- a/apps/files_external/tests/webdav.php
+++ b/apps/files_external/tests/webdav.php
@@ -18,6 +18,9 @@ class DAV extends Storage {
if ( ! is_array($this->config) or ! isset($this->config['webdav']) or ! $this->config['webdav']['run']) {
$this->markTestSkipped('WebDAV backend not configured');
}
+ if (isset($this->config['webdav']['wait'])) {
+ $this->waitDelay = $this->config['webdav']['wait'];
+ }
$this->config['webdav']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
$this->instance = new \OC\Files\Storage\DAV($this->config['webdav']);
$this->instance->mkdir('/');
diff --git a/apps/files_sharing/ajax/publicpreview.php b/apps/files_sharing/ajax/publicpreview.php
index a52f522afac..d12d212a2e6 100644
--- a/apps/files_sharing/ajax/publicpreview.php
+++ b/apps/files_sharing/ajax/publicpreview.php
@@ -11,7 +11,7 @@ if(!\OC_App::isEnabled('files_sharing')){
\OC_User::setIncognitoMode(true);
-$file = array_key_exists('file', $_GET) ? (string) urldecode($_GET['file']) : '';
+$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';
$scalingUp = array_key_exists('scalingup', $_GET) ? (bool) $_GET['scalingup'] : true;
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 3469829b6f7..06e454b7d77 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -1,4 +1,5 @@
<?php
+/** @var $this \OCP\Route\IRouter */
$this->create('core_ajax_public_preview', '/publicpreview.png')->action(
function() {
require_once __DIR__ . '/../ajax/publicpreview.php';
diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css
index 21f0c82b829..5246a4b2fec 100644
--- a/apps/files_sharing/css/public.css
+++ b/apps/files_sharing/css/public.css
@@ -66,7 +66,8 @@ p.info a {
margin:0 auto;
}
-#imgframe img {
+#imgframe img,
+#imgframe video {
max-height:100%;
max-width:100%;
}
@@ -76,6 +77,8 @@ p.info a {
margin-top: 10%;
}
+
+
thead {
padding-left: 0 !important; /* fixes multiselect bar offset on shared page */
}
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index c1b7eee3fb7..06c168969de 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -1,3 +1,15 @@
+/*
+ * Copyright (c) 2014
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+/* global OC, FileList, FileActions */
+
// Override download path to files_sharing/public.php
function fileDownloadPath(dir, file) {
var url = $('#downloadURL').val();
@@ -28,12 +40,20 @@ $(document).ready(function() {
// override since the format is different
FileList.getDownloadUrl = function(filename, dir) {
- // we use this because we need the service and token attributes
- var tr = FileList.findFileEl(filename);
- if (tr.length > 0) {
- return $(tr).find('a.name').attr('href') + '&download';
+ if ($.isArray(filename)) {
+ filename = JSON.stringify(filename);
+ }
+ var path = dir || FileList.getCurrentDirectory();
+ var params = {
+ service: 'files',
+ t: $('#sharingToken').val(),
+ path: path,
+ download: null
+ };
+ if (filename) {
+ params.files = filename;
}
- return null;
+ return OC.filePath('', '', 'public.php') + '?' + OC.buildQueryString(params);
};
}
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 36de452a55e..9f0ed12f935 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -5,6 +5,14 @@ $(document).ready(function() {
if (typeof OC.Share !== 'undefined' && typeof FileActions !== 'undefined' && !disableSharing) {
$('#fileList').on('fileActionsReady',function(){
+
+ var allShared = $('#fileList').find('[data-share-owner]').find('[data-Action="Share"]');
+ allShared.addClass('permanent');
+ allShared.find('span').text(function(){
+ $owner = $(this).closest('tr').attr('data-share-owner');
+ return ' ' + t('files_sharing', 'Shared by {owner}', {owner: $owner});
+ });
+
if (!sharesLoaded){
OC.Share.loadIcons('file');
// assume that we got all shares, so switching directories
@@ -17,16 +25,15 @@ $(document).ready(function() {
});
FileActions.register('all', 'Share', OC.PERMISSION_READ, OC.imagePath('core', 'actions/share'), function(filename) {
- if ($('#dir').val() == '/') {
- var item = $('#dir').val() + filename;
- } else {
- var item = $('#dir').val() + '/' + filename;
+ var dir = $('#dir').val();
+ var item = dir + '/' + filename;
+ if (dir == '/') {
+ item = dir + filename;
}
var tr = FileList.findFileEl(filename);
+ var itemType = 'file';
if ($(tr).data('type') == 'dir') {
- var itemType = 'folder';
- } else {
- var itemType = 'file';
+ itemType = 'folder';
}
var possiblePermissions = $(tr).data('permissions');
var appendTo = $(tr).find('td.filename');
diff --git a/apps/files_sharing/l10n/ar.php b/apps/files_sharing/l10n/ar.php
index 2625af1cc00..e5f919aac3f 100644
--- a/apps/files_sharing/l10n/ar.php
+++ b/apps/files_sharing/l10n/ar.php
@@ -1,11 +1,7 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "مشاركة بواسطة المالك {owner}",
"Password" => "كلمة المرور",
-"%s shared the folder %s with you" => "%s شارك المجلد %s معك",
-"%s shared the file %s with you" => "%s شارك الملف %s معك",
-"Download" => "تحميل",
-"Upload" => "رفع",
-"Cancel upload" => "إلغاء رفع الملفات",
-"No preview available for" => "لا يوجد عرض مسبق لـ"
+"shared by %s" => "مشاركة من قبل %s"
);
$PLURAL_FORMS = "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;";
diff --git a/apps/files_sharing/l10n/bg_BG.php b/apps/files_sharing/l10n/bg_BG.php
index f4b9e2dd5fc..4fe5ba6b16f 100644
--- a/apps/files_sharing/l10n/bg_BG.php
+++ b/apps/files_sharing/l10n/bg_BG.php
@@ -1,11 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Парола",
-"%s shared the folder %s with you" => "%s сподели папката %s с Вас",
-"%s shared the file %s with you" => "%s сподели файла %s с Вас",
-"Download" => "Изтегляне",
-"Upload" => "Качване",
-"Cancel upload" => "Спри качването",
-"No preview available for" => "Няма наличен преглед за"
+"Password" => "Парола"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/bn_BD.php b/apps/files_sharing/l10n/bn_BD.php
index aaed904d9d7..1d737247d8a 100644
--- a/apps/files_sharing/l10n/bn_BD.php
+++ b/apps/files_sharing/l10n/bn_BD.php
@@ -1,11 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "কূটশব্দ",
-"%s shared the folder %s with you" => "%s আপনার সাথে %s ফোল্ডারটি ভাগাভাগি করেছেন",
-"%s shared the file %s with you" => "%s আপনার সাথে %s ফাইলটি ভাগাভাগি করেছেন",
-"Download" => "ডাউনলোড",
-"Upload" => "আপলোড",
-"Cancel upload" => "আপলোড বাতিল কর",
-"No preview available for" => "এর জন্য কোন প্রাকবীক্ষণ সুলভ নয়"
+"Password" => "কূটশব্দ"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/ca.php b/apps/files_sharing/l10n/ca.php
index 96e59992967..6432219650b 100644
--- a/apps/files_sharing/l10n/ca.php
+++ b/apps/files_sharing/l10n/ca.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Compartits per {owner}",
"This share is password-protected" => "Aquest compartit està protegit amb contrasenya",
"The password is wrong. Try again." => "la contrasenya és incorrecta. Intenteu-ho de nou.",
"Password" => "Contrasenya",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "l'enllaç ha vençut",
"sharing is disabled" => "s'ha desactivat la compartició",
"For more info, please ask the person who sent this link." => "Per més informació contacteu amb qui us ha enviat l'enllaç.",
-"%s shared the folder %s with you" => "%s ha compartit la carpeta %s amb vós",
-"%s shared the file %s with you" => "%s ha compartit el fitxer %s amb vós",
-"Download" => "Baixa",
-"Upload" => "Puja",
-"Cancel upload" => "Cancel·la la pujada",
-"No preview available for" => "No hi ha vista prèvia disponible per a",
+"shared by %s" => "compartit per %s",
+"Download %s" => "Baixa %s",
"Direct link" => "Enllaç directe"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/cs_CZ.php b/apps/files_sharing/l10n/cs_CZ.php
index adf099a6d94..5d50ff41316 100644
--- a/apps/files_sharing/l10n/cs_CZ.php
+++ b/apps/files_sharing/l10n/cs_CZ.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Sdílí {owner}",
"This share is password-protected" => "Toto sdílení je chráněno heslem",
"The password is wrong. Try again." => "Heslo není správné. Zkuste to znovu.",
"Password" => "Heslo",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "platnost odkazu vypršela",
"sharing is disabled" => "sdílení je zakázané",
"For more info, please ask the person who sent this link." => "Pro více informací kontaktujte osobu, která vám zaslala tento odkaz.",
-"%s shared the folder %s with you" => "%s s Vámi sdílí složku %s",
-"%s shared the file %s with you" => "%s s Vámi sdílí soubor %s",
-"Download" => "Stáhnout",
-"Upload" => "Odeslat",
-"Cancel upload" => "Zrušit odesílání",
-"No preview available for" => "Náhled není dostupný pro",
+"shared by %s" => "sdíleno %s",
+"Download %s" => "Stáhnout %s",
"Direct link" => "Přímý odkaz"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files_sharing/l10n/cy_GB.php b/apps/files_sharing/l10n/cy_GB.php
index d2ae28141d4..bf05f890a94 100644
--- a/apps/files_sharing/l10n/cy_GB.php
+++ b/apps/files_sharing/l10n/cy_GB.php
@@ -1,11 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Cyfrinair",
-"%s shared the folder %s with you" => "Rhannodd %s blygell %s â chi",
-"%s shared the file %s with you" => "Rhannodd %s ffeil %s â chi",
-"Download" => "Llwytho i lawr",
-"Upload" => "Llwytho i fyny",
-"Cancel upload" => "Diddymu llwytho i fyny",
-"No preview available for" => "Does dim rhagolwg ar gael ar gyfer"
+"Password" => "Cyfrinair"
);
$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/files_sharing/l10n/da.php b/apps/files_sharing/l10n/da.php
index 849b0e28d30..6aae750cb78 100644
--- a/apps/files_sharing/l10n/da.php
+++ b/apps/files_sharing/l10n/da.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Delt af {owner}",
"This share is password-protected" => "Delingen er beskyttet af kodeord",
"The password is wrong. Try again." => "Kodeordet er forkert. Prøv igen.",
"Password" => "Kodeord",
@@ -9,12 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "linket udløb",
"sharing is disabled" => "deling er deaktiveret",
"For more info, please ask the person who sent this link." => "For yderligere information, kontakt venligst personen der sendte linket. ",
-"%s shared the folder %s with you" => "%s delte mappen %s med dig",
-"%s shared the file %s with you" => "%s delte filen %s med dig",
-"Download" => "Download",
-"Upload" => "Upload",
-"Cancel upload" => "Fortryd upload",
-"No preview available for" => "Forhåndsvisning ikke tilgængelig for",
+"shared by %s" => "delt af %s",
"Direct link" => "Direkte link"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/de.php b/apps/files_sharing/l10n/de.php
index d7879833ca9..a9248818444 100644
--- a/apps/files_sharing/l10n/de.php
+++ b/apps/files_sharing/l10n/de.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Geteilt von {owner}",
"This share is password-protected" => "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." => "Bitte überprüfe Dein Passwort und versuche es erneut.",
"Password" => "Passwort",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "Der Link ist abgelaufen",
"sharing is disabled" => "Teilen ist deaktiviert",
"For more info, please ask the person who sent this link." => "Für mehr Informationen, frage bitte die Person, die Dir diesen Link geschickt hat.",
-"%s shared the folder %s with you" => "%s hat den Ordner %s mit Dir geteilt",
-"%s shared the file %s with you" => "%s hat die Datei %s mit Dir geteilt",
-"Download" => "Download",
-"Upload" => "Upload",
-"Cancel upload" => "Upload abbrechen",
-"No preview available for" => "Es ist keine Vorschau verfügbar für",
+"shared by %s" => "Freigegeben von %s",
+"Download %s" => "Download %s",
"Direct link" => "Direkter Link"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/de_AT.php b/apps/files_sharing/l10n/de_AT.php
new file mode 100644
index 00000000000..142892bc9a9
--- /dev/null
+++ b/apps/files_sharing/l10n/de_AT.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Password" => "Passwort"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/de_CH.php b/apps/files_sharing/l10n/de_CH.php
index f63714b902f..6ea0a4654c6 100644
--- a/apps/files_sharing/l10n/de_CH.php
+++ b/apps/files_sharing/l10n/de_CH.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Geteilt von {owner}",
"The password is wrong. Try again." => "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" => "Passwort",
"Sorry, this link doesn’t seem to work anymore." => "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
@@ -7,12 +8,6 @@ $TRANSLATIONS = array(
"the item was removed" => "Das Element wurde entfernt",
"the link expired" => "Der Link ist abgelaufen",
"sharing is disabled" => "Teilen ist deaktiviert",
-"For more info, please ask the person who sent this link." => "Für mehr Informationen, fragen Sie bitte die Person, die Ihnen diesen Link geschickt hat.",
-"%s shared the folder %s with you" => "%s hat den Ordner %s mit Ihnen geteilt",
-"%s shared the file %s with you" => "%s hat die Datei %s mit Ihnen geteilt",
-"Download" => "Herunterladen",
-"Upload" => "Hochladen",
-"Cancel upload" => "Upload abbrechen",
-"No preview available for" => "Es ist keine Vorschau verfügbar für"
+"For more info, please ask the person who sent this link." => "Für mehr Informationen, fragen Sie bitte die Person, die Ihnen diesen Link geschickt hat."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/de_DE.php b/apps/files_sharing/l10n/de_DE.php
index 3ab95b6690d..e7bd75a2e0a 100644
--- a/apps/files_sharing/l10n/de_DE.php
+++ b/apps/files_sharing/l10n/de_DE.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Geteilt von {owner}",
"This share is password-protected" => "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." => "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" => "Passwort",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "Der Link ist abgelaufen",
"sharing is disabled" => "Teilen ist deaktiviert",
"For more info, please ask the person who sent this link." => "Für mehr Informationen, fragen Sie bitte die Person, die Ihnen diesen Link geschickt hat.",
-"%s shared the folder %s with you" => "%s hat den Ordner %s mit Ihnen geteilt",
-"%s shared the file %s with you" => "%s hat die Datei %s mit Ihnen geteilt",
-"Download" => "Herunterladen",
-"Upload" => "Hochladen",
-"Cancel upload" => "Upload abbrechen",
-"No preview available for" => "Es ist keine Vorschau verfügbar für",
+"shared by %s" => "Geteilt von %s",
+"Download %s" => "Download %s",
"Direct link" => "Direkte Verlinkung"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/el.php b/apps/files_sharing/l10n/el.php
index 3ea666504b1..10ff594c98d 100644
--- a/apps/files_sharing/l10n/el.php
+++ b/apps/files_sharing/l10n/el.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Διαμοιράστηκε από τον {owner}",
"This share is password-protected" => "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό",
"The password is wrong. Try again." => "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά.",
"Password" => "Κωδικός πρόσβασης",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "ο σύνδεσμος έληξε",
"sharing is disabled" => "ο διαμοιρασμός απενεργοποιήθηκε",
"For more info, please ask the person who sent this link." => "Για περισσότερες πληροφορίες, παρακαλώ ρωτήστε το άτομο που σας έστειλε αυτόν τον σύνδεσμο.",
-"%s shared the folder %s with you" => "Ο %s μοιράστηκε τον φάκελο %s μαζί σας",
-"%s shared the file %s with you" => "Ο %s μοιράστηκε το αρχείο %s μαζί σας",
-"Download" => "Λήψη",
-"Upload" => "Μεταφόρτωση",
-"Cancel upload" => "Ακύρωση μεταφόρτωσης",
-"No preview available for" => "Δεν υπάρχει διαθέσιμη προεπισκόπηση για",
+"shared by %s" => "διαμοιράστηκε από %s",
+"Download %s" => "Λήψη %s",
"Direct link" => "Άμεσος σύνδεσμος"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/en@pirate.php b/apps/files_sharing/l10n/en@pirate.php
index cd3c00d29d2..ab628e1717e 100644
--- a/apps/files_sharing/l10n/en@pirate.php
+++ b/apps/files_sharing/l10n/en@pirate.php
@@ -1,9 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Secret Code",
-"%s shared the folder %s with you" => "%s shared the folder %s with you",
-"%s shared the file %s with you" => "%s shared the file %s with you",
-"Download" => "Download",
-"No preview available for" => "No preview available for"
+"Password" => "Secret Code"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/en_GB.php b/apps/files_sharing/l10n/en_GB.php
index 3e04d120beb..02663f96b8e 100644
--- a/apps/files_sharing/l10n/en_GB.php
+++ b/apps/files_sharing/l10n/en_GB.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Shared by {owner}",
"This share is password-protected" => "This share is password-protected",
"The password is wrong. Try again." => "The password is wrong. Try again.",
"Password" => "Password",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "the link expired",
"sharing is disabled" => "sharing is disabled",
"For more info, please ask the person who sent this link." => "For more info, please ask the person who sent this link.",
-"%s shared the folder %s with you" => "%s shared the folder %s with you",
-"%s shared the file %s with you" => "%s shared the file %s with you",
-"Download" => "Download",
-"Upload" => "Upload",
-"Cancel upload" => "Cancel upload",
-"No preview available for" => "No preview available for",
+"shared by %s" => "shared by %s",
+"Download %s" => "Download %s",
"Direct link" => "Direct link"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/eo.php b/apps/files_sharing/l10n/eo.php
index 891b3db9aa8..1148d516972 100644
--- a/apps/files_sharing/l10n/eo.php
+++ b/apps/files_sharing/l10n/eo.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Kunhavigita de {owner}",
"This share is password-protected" => "Ĉi tiu kunhavigo estas protektata per pasvorto",
"Password" => "Pasvorto",
"Sorry, this link doesn’t seem to work anymore." => "Pardonu, ĉi tiu ligilo ŝajne ne plu funkcias.",
@@ -8,12 +9,6 @@ $TRANSLATIONS = array(
"the link expired" => "la ligilo eksvalidiĝis",
"sharing is disabled" => "kunhavigo malkapablas",
"For more info, please ask the person who sent this link." => "Por plia informo, bonvolu peti al la persono, kiu sendis ĉi tiun ligilon.",
-"%s shared the folder %s with you" => "%s kunhavigis la dosierujon %s kun vi",
-"%s shared the file %s with you" => "%s kunhavigis la dosieron %s kun vi",
-"Download" => "Elŝuti",
-"Upload" => "Alŝuti",
-"Cancel upload" => "Nuligi alŝuton",
-"No preview available for" => "Ne haveblas antaŭvido por",
"Direct link" => "Direkta ligilo"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/es.php b/apps/files_sharing/l10n/es.php
index f986c29b4f7..2e3f3b85003 100644
--- a/apps/files_sharing/l10n/es.php
+++ b/apps/files_sharing/l10n/es.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Compartido por {owner}",
"This share is password-protected" => "Este elemento compartido esta protegido por contraseña",
"The password is wrong. Try again." => "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" => "Contraseña",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "el enlace expiró",
"sharing is disabled" => "compartir está desactivado",
"For more info, please ask the person who sent this link." => "Para mayor información, contacte a la persona que le envió el enlace.",
-"%s shared the folder %s with you" => "%s compartió la carpeta %s contigo",
-"%s shared the file %s with you" => "%s compartió el fichero %s contigo",
-"Download" => "Descargar",
-"Upload" => "Subir",
-"Cancel upload" => "Cancelar subida",
-"No preview available for" => "No hay vista previa disponible para",
+"shared by %s" => "Compartido por %s",
+"Download %s" => "Descargar %s",
"Direct link" => "Enlace directo"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/es_AR.php b/apps/files_sharing/l10n/es_AR.php
index 989a91a450f..95cfadc1db6 100644
--- a/apps/files_sharing/l10n/es_AR.php
+++ b/apps/files_sharing/l10n/es_AR.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Compartido por {owner}",
+"This share is password-protected" => "Esto está protegido por contraseña",
"The password is wrong. Try again." => "La contraseña no es correcta. Probá de nuevo.",
"Password" => "Contraseña",
"Sorry, this link doesn’t seem to work anymore." => "Perdón, este enlace parece no funcionar más.",
@@ -8,11 +10,6 @@ $TRANSLATIONS = array(
"the link expired" => "el enlace expiró",
"sharing is disabled" => "compartir está desactivado",
"For more info, please ask the person who sent this link." => "Para mayor información, contactá a la persona que te mandó el enlace.",
-"%s shared the folder %s with you" => "%s compartió la carpeta %s con vos",
-"%s shared the file %s with you" => "%s compartió el archivo %s con vos",
-"Download" => "Descargar",
-"Upload" => "Subir",
-"Cancel upload" => "Cancelar subida",
-"No preview available for" => "La vista preliminar no está disponible para"
+"Direct link" => "Vínculo directo"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/es_CL.php b/apps/files_sharing/l10n/es_CL.php
index 31dc045870c..42a2f066c6e 100644
--- a/apps/files_sharing/l10n/es_CL.php
+++ b/apps/files_sharing/l10n/es_CL.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Clave",
-"Upload" => "Subir"
+"Password" => "Clave"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/es_MX.php b/apps/files_sharing/l10n/es_MX.php
index 9100ef8b35f..9168e25308d 100644
--- a/apps/files_sharing/l10n/es_MX.php
+++ b/apps/files_sharing/l10n/es_MX.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Compartido por {owner}",
"This share is password-protected" => "Este elemento compartido esta protegido por contraseña",
"The password is wrong. Try again." => "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" => "Contraseña",
@@ -9,12 +10,6 @@ $TRANSLATIONS = array(
"the link expired" => "el enlace expiró",
"sharing is disabled" => "compartir está desactivado",
"For more info, please ask the person who sent this link." => "Para mayor información, contacte a la persona que le envió el enlace.",
-"%s shared the folder %s with you" => "%s compartió la carpeta %s contigo",
-"%s shared the file %s with you" => "%s compartió el archivo %s contigo",
-"Download" => "Descargar",
-"Upload" => "Subir",
-"Cancel upload" => "Cancelar subida",
-"No preview available for" => "No hay vista previa disponible para",
"Direct link" => "Enlace directo"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/et_EE.php b/apps/files_sharing/l10n/et_EE.php
index 4b7f975e83d..af5891fcc7f 100644
--- a/apps/files_sharing/l10n/et_EE.php
+++ b/apps/files_sharing/l10n/et_EE.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Jagas {owner}",
"This share is password-protected" => "See jagamine on parooliga kaitstud",
"The password is wrong. Try again." => "Parool on vale. Proovi uuesti.",
"Password" => "Parool",
@@ -9,12 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "link on aegunud",
"sharing is disabled" => "jagamine on peatatud",
"For more info, please ask the person who sent this link." => "Täpsema info saamiseks palun pöördu lingi saatnud isiku poole.",
-"%s shared the folder %s with you" => "%s jagas sinuga kausta %s",
-"%s shared the file %s with you" => "%s jagas sinuga faili %s",
-"Download" => "Lae alla",
-"Upload" => "Lae üles",
-"Cancel upload" => "Tühista üleslaadimine",
-"No preview available for" => "Eelvaadet pole saadaval",
+"shared by %s" => "jagas %s",
"Direct link" => "Otsene link"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/eu.php b/apps/files_sharing/l10n/eu.php
index 20de5a085ab..5f13a73e1ff 100644
--- a/apps/files_sharing/l10n/eu.php
+++ b/apps/files_sharing/l10n/eu.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "{owner}-k partekatuta",
"This share is password-protected" => "Elkarbanatutako hau pasahitzarekin babestuta dago",
"The password is wrong. Try again." => "Pasahitza ez da egokia. Saiatu berriro.",
"Password" => "Pasahitza",
@@ -9,12 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "lotura iraungi da",
"sharing is disabled" => "elkarbanatzea ez dago gaituta",
"For more info, please ask the person who sent this link." => "Informazio gehiagorako, mesedez eskatu lotura hau bidali zuen pertsonari",
-"%s shared the folder %s with you" => "%sk zurekin %s karpeta elkarbanatu du",
-"%s shared the file %s with you" => "%sk zurekin %s fitxategia elkarbanatu du",
-"Download" => "Deskargatu",
-"Upload" => "Igo",
-"Cancel upload" => "Ezeztatu igoera",
-"No preview available for" => "Ez dago aurrebista eskuragarririk hauentzat ",
+"shared by %s" => "%sk partekatuta",
"Direct link" => "Lotura zuzena"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/fa.php b/apps/files_sharing/l10n/fa.php
index 664338723c4..9b0a1dbc9d5 100644
--- a/apps/files_sharing/l10n/fa.php
+++ b/apps/files_sharing/l10n/fa.php
@@ -1,12 +1,7 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "اشتراک گذارنده {owner}",
"The password is wrong. Try again." => "رمزعبور اشتباه می باشد. دوباره امتحان کنید.",
-"Password" => "گذرواژه",
-"%s shared the folder %s with you" => "%sپوشه %s را با شما به اشتراک گذاشت",
-"%s shared the file %s with you" => "%sفایل %s را با شما به اشتراک گذاشت",
-"Download" => "دانلود",
-"Upload" => "بارگزاری",
-"Cancel upload" => "متوقف کردن بار گذاری",
-"No preview available for" => "هیچگونه پیش نمایشی موجود نیست"
+"Password" => "گذرواژه"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/fi_FI.php b/apps/files_sharing/l10n/fi_FI.php
index c54c822b1c4..e8ca368c717 100644
--- a/apps/files_sharing/l10n/fi_FI.php
+++ b/apps/files_sharing/l10n/fi_FI.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Jakanut {owner}",
"This share is password-protected" => "Tämä jako on suojattu salasanalla",
"The password is wrong. Try again." => "Väärä salasana. Yritä uudelleen.",
"Password" => "Salasana",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "linkki vanheni",
"sharing is disabled" => "jakaminen on poistettu käytöstä",
"For more info, please ask the person who sent this link." => "Kysy lisätietoja henkilöltä, jolta sait linkin.",
-"%s shared the folder %s with you" => "%s jakoi kansion %s kanssasi",
-"%s shared the file %s with you" => "%s jakoi tiedoston %s kanssasi",
-"Download" => "Lataa",
-"Upload" => "Lähetä",
-"Cancel upload" => "Peru lähetys",
-"No preview available for" => "Ei esikatselua kohteelle",
+"shared by %s" => "jakanut %s",
+"Download %s" => "Lataa %s",
"Direct link" => "Suora linkki"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/fr.php b/apps/files_sharing/l10n/fr.php
index b51f421fa52..8e083f4ca0e 100644
--- a/apps/files_sharing/l10n/fr.php
+++ b/apps/files_sharing/l10n/fr.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Partagé par {owner}",
"This share is password-protected" => "Ce partage est protégé par un mot de passe",
"The password is wrong. Try again." => "Le mot de passe est incorrect. Veuillez réessayer.",
"Password" => "Mot de passe",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "le lien a expiré",
"sharing is disabled" => "le partage est désactivé",
"For more info, please ask the person who sent this link." => "Pour plus d'informations, veuillez contacter la personne qui a envoyé ce lien.",
-"%s shared the folder %s with you" => "%s a partagé le répertoire %s avec vous",
-"%s shared the file %s with you" => "%s a partagé le fichier %s avec vous",
-"Download" => "Télécharger",
-"Upload" => "Envoyer",
-"Cancel upload" => "Annuler l'envoi",
-"No preview available for" => "Pas d'aperçu disponible pour",
+"shared by %s" => "partagé par %s",
+"Download %s" => "Télécharger %s",
"Direct link" => "Lien direct"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files_sharing/l10n/gl.php b/apps/files_sharing/l10n/gl.php
index 3ea3fe5f1c5..a04e8234230 100644
--- a/apps/files_sharing/l10n/gl.php
+++ b/apps/files_sharing/l10n/gl.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Compartido por {owner}",
"This share is password-protected" => "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." => "O contrasinal é incorrecto. Ténteo de novo.",
"Password" => "Contrasinal",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "a ligazón caducou",
"sharing is disabled" => "foi desactivada a compartición",
"For more info, please ask the person who sent this link." => "Para obter máis información, pregúntelle á persoa que lle enviou a ligazón.",
-"%s shared the folder %s with you" => "%s compartiu o cartafol %s con vostede",
-"%s shared the file %s with you" => "%s compartiu o ficheiro %s con vostede",
-"Download" => "Descargar",
-"Upload" => "Enviar",
-"Cancel upload" => "Cancelar o envío",
-"No preview available for" => "Sen vista previa dispoñíbel para",
+"shared by %s" => "compartido por %s",
+"Download %s" => "Descargar %s",
"Direct link" => "Ligazón directa"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/he.php b/apps/files_sharing/l10n/he.php
index 217298feddf..9ba86d07722 100644
--- a/apps/files_sharing/l10n/he.php
+++ b/apps/files_sharing/l10n/he.php
@@ -1,11 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "סיסמא",
-"%s shared the folder %s with you" => "%s שיתף עמך את התיקייה %s",
-"%s shared the file %s with you" => "%s שיתף עמך את הקובץ %s",
-"Download" => "הורדה",
-"Upload" => "העלאה",
-"Cancel upload" => "ביטול ההעלאה",
-"No preview available for" => "אין תצוגה מקדימה זמינה עבור"
+"Shared by {owner}" => "שותף בידי {owner}",
+"Password" => "סיסמא"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/hi.php b/apps/files_sharing/l10n/hi.php
index 63a5d528f3b..74a2c320438 100644
--- a/apps/files_sharing/l10n/hi.php
+++ b/apps/files_sharing/l10n/hi.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "पासवर्ड",
-"Upload" => "अपलोड "
+"Password" => "पासवर्ड"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/hr.php b/apps/files_sharing/l10n/hr.php
index 4a82dd7f71f..60c01d30b5e 100644
--- a/apps/files_sharing/l10n/hr.php
+++ b/apps/files_sharing/l10n/hr.php
@@ -1,8 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Lozinka",
-"Download" => "Preuzimanje",
-"Upload" => "Učitaj",
-"Cancel upload" => "Prekini upload"
+"Password" => "Lozinka"
);
$PLURAL_FORMS = "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;";
diff --git a/apps/files_sharing/l10n/hu_HU.php b/apps/files_sharing/l10n/hu_HU.php
index a06c51b3775..787a22fe6c0 100644
--- a/apps/files_sharing/l10n/hu_HU.php
+++ b/apps/files_sharing/l10n/hu_HU.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Megosztotta: {owner}",
"This share is password-protected" => "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." => "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" => "Jelszó",
@@ -9,12 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "lejárt a link érvényességi ideje",
"sharing is disabled" => "letiltásra került a megosztás",
"For more info, please ask the person who sent this link." => "További információért forduljon ahhoz, aki ezt a linket küldte Önnek!",
-"%s shared the folder %s with you" => "%s megosztotta Önnel ezt a mappát: %s",
-"%s shared the file %s with you" => "%s megosztotta Önnel ezt az állományt: %s",
-"Download" => "Letöltés",
-"Upload" => "Feltöltés",
-"Cancel upload" => "A feltöltés megszakítása",
-"No preview available for" => "Nem áll rendelkezésre előnézet ehhez: ",
+"shared by %s" => "Megosztotta: %s",
"Direct link" => "Közvetlen link"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/ia.php b/apps/files_sharing/l10n/ia.php
index f9d6c33a0b5..9ec82f20dfa 100644
--- a/apps/files_sharing/l10n/ia.php
+++ b/apps/files_sharing/l10n/ia.php
@@ -1,7 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Contrasigno",
-"Download" => "Discargar",
-"Upload" => "Incargar"
+"Password" => "Contrasigno"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/id.php b/apps/files_sharing/l10n/id.php
index 865a951c2d2..e4668a7fb54 100644
--- a/apps/files_sharing/l10n/id.php
+++ b/apps/files_sharing/l10n/id.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Dibagikan oleh {owner}",
"This share is password-protected" => "Berbagi ini dilindungi sandi",
"The password is wrong. Try again." => "Sandi salah. Coba lagi",
"Password" => "Sandi",
@@ -9,12 +10,6 @@ $TRANSLATIONS = array(
"the link expired" => "tautan telah kadaluarsa",
"sharing is disabled" => "berbagi dinonaktifkan",
"For more info, please ask the person who sent this link." => "Untuk info lebih lanjut, silakan tanyakan orang yang mengirim tautan ini.",
-"%s shared the folder %s with you" => "%s membagikan folder %s dengan Anda",
-"%s shared the file %s with you" => "%s membagikan berkas %s dengan Anda",
-"Download" => "Unduh",
-"Upload" => "Unggah",
-"Cancel upload" => "Batal unggah",
-"No preview available for" => "Tidak ada pratinjau yang tersedia untuk",
"Direct link" => "Tautan langsung"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/is.php b/apps/files_sharing/l10n/is.php
index 8ae8e48eff6..c4a1c589401 100644
--- a/apps/files_sharing/l10n/is.php
+++ b/apps/files_sharing/l10n/is.php
@@ -1,11 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Lykilorð",
-"%s shared the folder %s with you" => "%s deildi möppunni %s með þér",
-"%s shared the file %s with you" => "%s deildi skránni %s með þér",
-"Download" => "Niðurhal",
-"Upload" => "Senda inn",
-"Cancel upload" => "Hætta við innsendingu",
-"No preview available for" => "Yfirlit ekki í boði fyrir"
+"Password" => "Lykilorð"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/it.php b/apps/files_sharing/l10n/it.php
index 7967b50d346..7efa4584606 100644
--- a/apps/files_sharing/l10n/it.php
+++ b/apps/files_sharing/l10n/it.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Condiviso da {owner}",
"This share is password-protected" => "Questa condivione è protetta da password",
"The password is wrong. Try again." => "La password è errata. Prova ancora.",
"Password" => "Password",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "il collegamento è scaduto",
"sharing is disabled" => "la condivisione è disabilitata",
"For more info, please ask the person who sent this link." => "Per ulteriori informazioni, chiedi alla persona che ti ha inviato il collegamento.",
-"%s shared the folder %s with you" => "%s ha condiviso la cartella %s con te",
-"%s shared the file %s with you" => "%s ha condiviso il file %s con te",
-"Download" => "Scarica",
-"Upload" => "Carica",
-"Cancel upload" => "Annulla il caricamento",
-"No preview available for" => "Nessuna anteprima disponibile per",
+"shared by %s" => "condiviso da %s",
+"Download %s" => "Scarica %s",
"Direct link" => "Collegamento diretto"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/ja.php b/apps/files_sharing/l10n/ja.php
new file mode 100644
index 00000000000..7e6461c6081
--- /dev/null
+++ b/apps/files_sharing/l10n/ja.php
@@ -0,0 +1,17 @@
+<?php
+$TRANSLATIONS = array(
+"Shared by {owner}" => "{owner} と共有中",
+"This share is password-protected" => "この共有はパスワードで保護されています",
+"The password is wrong. Try again." => "パスワードが間違っています。再試行してください。",
+"Password" => "パスワード",
+"Sorry, this link doesn’t seem to work anymore." => "申し訳ございません。このリンクはもう利用できません。",
+"Reasons might be:" => "理由は以下の通りと考えられます:",
+"the item was removed" => "アイテムが削除されました",
+"the link expired" => "リンクの期限が切れています",
+"sharing is disabled" => "共有が無効になっています",
+"For more info, please ask the person who sent this link." => "不明な点は、こちらのリンクの提供者に確認をお願いします。",
+"shared by %s" => "%s で共有中",
+"Download %s" => "%s をダウンロード",
+"Direct link" => "リンク"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/ja_JP.php b/apps/files_sharing/l10n/ja_JP.php
index fe25cb5b6eb..7e6461c6081 100644
--- a/apps/files_sharing/l10n/ja_JP.php
+++ b/apps/files_sharing/l10n/ja_JP.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "{owner} と共有中",
"This share is password-protected" => "この共有はパスワードで保護されています",
"The password is wrong. Try again." => "パスワードが間違っています。再試行してください。",
"Password" => "パスワード",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "リンクの期限が切れています",
"sharing is disabled" => "共有が無効になっています",
"For more info, please ask the person who sent this link." => "不明な点は、こちらのリンクの提供者に確認をお願いします。",
-"%s shared the folder %s with you" => "%s はフォルダー %s をあなたと共有中です",
-"%s shared the file %s with you" => "%s はファイル %s をあなたと共有中です",
-"Download" => "ダウンロード",
-"Upload" => "アップロード",
-"Cancel upload" => "アップロードをキャンセル",
-"No preview available for" => "プレビューはありません",
+"shared by %s" => "%s で共有中",
+"Download %s" => "%s をダウンロード",
"Direct link" => "リンク"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/ka_GE.php b/apps/files_sharing/l10n/ka_GE.php
index 89a6800b3e4..5fc48c9fd94 100644
--- a/apps/files_sharing/l10n/ka_GE.php
+++ b/apps/files_sharing/l10n/ka_GE.php
@@ -1,11 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "პაროლი",
-"%s shared the folder %s with you" => "%s–მა გაგიზიარათ ფოლდერი %s",
-"%s shared the file %s with you" => "%s–მა გაგიზიარათ ფაილი %s",
-"Download" => "ჩამოტვირთვა",
-"Upload" => "ატვირთვა",
-"Cancel upload" => "ატვირთვის გაუქმება",
-"No preview available for" => "წინასწარი დათვალიერება შეუძლებელია"
+"Shared by {owner}" => "გაზიარდა {owner} –ის მიერ",
+"Password" => "პაროლი"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/km.php b/apps/files_sharing/l10n/km.php
new file mode 100644
index 00000000000..99b97c914e8
--- /dev/null
+++ b/apps/files_sharing/l10n/km.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"Password" => "ពាក្យសម្ងាត់",
+"shared by %s" => "បាន​ចែក​រំលែក​ដោយ %s"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/ko.php b/apps/files_sharing/l10n/ko.php
index 03c4c1aea94..a4593fbd6cb 100644
--- a/apps/files_sharing/l10n/ko.php
+++ b/apps/files_sharing/l10n/ko.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "{owner} 님이 공유함",
"This share is password-protected" => "이 공유는 암호로 보호되어 있습니다",
"The password is wrong. Try again." => "암호가 잘못되었습니다. 다시 입력해 주십시오.",
"Password" => "암호",
@@ -9,12 +10,6 @@ $TRANSLATIONS = array(
"the link expired" => "링크가 만료됨",
"sharing is disabled" => "공유가 비활성화됨",
"For more info, please ask the person who sent this link." => "자세한 정보는 링크를 보낸 사람에게 문의하십시오.",
-"%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다",
-"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다",
-"Download" => "다운로드",
-"Upload" => "업로드",
-"Cancel upload" => "업로드 취소",
-"No preview available for" => "다음 항목을 미리 볼 수 없음:",
"Direct link" => "직접 링크"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/ku_IQ.php b/apps/files_sharing/l10n/ku_IQ.php
index 6b4b7e4ba9e..d433885e672 100644
--- a/apps/files_sharing/l10n/ku_IQ.php
+++ b/apps/files_sharing/l10n/ku_IQ.php
@@ -1,10 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "وشەی تێپەربو",
-"%s shared the folder %s with you" => "%s دابه‌شی کردووه‌ بوخچه‌ی %s له‌گه‌ڵ تۆ",
-"%s shared the file %s with you" => "%s دابه‌شی کردووه‌ په‌ڕگه‌یی %s له‌گه‌ڵ تۆ",
-"Download" => "داگرتن",
-"Upload" => "بارکردن",
-"No preview available for" => "هیچ پێشبینیه‌ك ئاماده‌ نیه بۆ"
+"Password" => "وشەی تێپەربو"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/lb.php b/apps/files_sharing/l10n/lb.php
index eeb6a3e2dca..b253e795dfe 100644
--- a/apps/files_sharing/l10n/lb.php
+++ b/apps/files_sharing/l10n/lb.php
@@ -1,12 +1,6 @@
<?php
$TRANSLATIONS = array(
"The password is wrong. Try again." => "Den Passwuert ass incorrect. Probeier ed nach eng keier.",
-"Password" => "Passwuert",
-"%s shared the folder %s with you" => "%s huet den Dossier %s mad der gedeelt",
-"%s shared the file %s with you" => "%s deelt den Fichier %s mad dir",
-"Download" => "Download",
-"Upload" => "Eroplueden",
-"Cancel upload" => "Upload ofbriechen",
-"No preview available for" => "Keeng Preview do fir"
+"Password" => "Passwuert"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/lt_LT.php b/apps/files_sharing/l10n/lt_LT.php
index 3786fd08b92..5db5ae275e2 100644
--- a/apps/files_sharing/l10n/lt_LT.php
+++ b/apps/files_sharing/l10n/lt_LT.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Bendrina {owner}",
"This share is password-protected" => "Turinys apsaugotas slaptažodžiu",
"The password is wrong. Try again." => "Netinka slaptažodis: Bandykite dar kartą.",
"Password" => "Slaptažodis",
@@ -9,12 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "baigėsi nuorodos galiojimo laikas",
"sharing is disabled" => "dalinimasis yra išjungtas",
"For more info, please ask the person who sent this link." => "Dėl tikslesnės informacijos susisiekite su asmeniu atsiuntusiu nuorodą.",
-"%s shared the folder %s with you" => "%s pasidalino su jumis %s aplanku",
-"%s shared the file %s with you" => "%s pasidalino su jumis %s failu",
-"Download" => "Atsisiųsti",
-"Upload" => "Įkelti",
-"Cancel upload" => "Atšaukti siuntimą",
-"No preview available for" => "Peržiūra nėra galima",
+"shared by %s" => "pasidalino %s",
"Direct link" => "Tiesioginė nuoroda"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/lv.php b/apps/files_sharing/l10n/lv.php
index a913ba11525..834d7c17211 100644
--- a/apps/files_sharing/l10n/lv.php
+++ b/apps/files_sharing/l10n/lv.php
@@ -1,11 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Parole",
-"%s shared the folder %s with you" => "%s ar jums dalījās ar mapi %s",
-"%s shared the file %s with you" => "%s ar jums dalījās ar datni %s",
-"Download" => "Lejupielādēt",
-"Upload" => "Augšupielādēt",
-"Cancel upload" => "Atcelt augšupielādi",
-"No preview available for" => "Nav pieejams priekšskatījums priekš"
+"Shared by {owner}" => "Dalījās {owner}",
+"Password" => "Parole"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/mk.php b/apps/files_sharing/l10n/mk.php
index c132f7aa265..6afa5fc6846 100644
--- a/apps/files_sharing/l10n/mk.php
+++ b/apps/files_sharing/l10n/mk.php
@@ -1,11 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Лозинка",
-"%s shared the folder %s with you" => "%s ја сподели папката %s со Вас",
-"%s shared the file %s with you" => "%s ја сподели датотеката %s со Вас",
-"Download" => "Преземи",
-"Upload" => "Подигни",
-"Cancel upload" => "Откажи прикачување",
-"No preview available for" => "Нема достапно преглед за"
+"Shared by {owner}" => "Споделени од {owner}",
+"Password" => "Лозинка"
);
$PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;";
diff --git a/apps/files_sharing/l10n/ms_MY.php b/apps/files_sharing/l10n/ms_MY.php
index 9725dd4d1bc..89d11f49fd7 100644
--- a/apps/files_sharing/l10n/ms_MY.php
+++ b/apps/files_sharing/l10n/ms_MY.php
@@ -1,8 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Kata laluan",
-"Download" => "Muat turun",
-"Upload" => "Muat naik",
-"Cancel upload" => "Batal muat naik"
+"Password" => "Kata laluan"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/my_MM.php b/apps/files_sharing/l10n/my_MM.php
index ff92e898ed4..475d6427436 100644
--- a/apps/files_sharing/l10n/my_MM.php
+++ b/apps/files_sharing/l10n/my_MM.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "စကားဝှက်",
-"Download" => "ဒေါင်းလုတ်"
+"Password" => "စကားဝှက်"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/nb_NO.php b/apps/files_sharing/l10n/nb_NO.php
index 0452b5275c1..6427d716703 100644
--- a/apps/files_sharing/l10n/nb_NO.php
+++ b/apps/files_sharing/l10n/nb_NO.php
@@ -1,12 +1,16 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Delt av {owner}",
+"This share is password-protected" => "Denne delingen er passordbeskyttet",
"The password is wrong. Try again." => "Passordet er feil. Prøv på nytt.",
"Password" => "Passord",
-"%s shared the folder %s with you" => "%s delte mappen %s med deg",
-"%s shared the file %s with you" => "%s delte filen %s med deg",
-"Download" => "Last ned",
-"Upload" => "Last opp",
-"Cancel upload" => "Avbryt opplasting",
-"No preview available for" => "Forhåndsvisning ikke tilgjengelig for"
+"Sorry, this link doesn’t seem to work anymore." => "Beklager, denne lenken ser ikke ut til å virke lenger.",
+"Reasons might be:" => "Mulige årsaker:",
+"the item was removed" => "elementet er fjernet",
+"the link expired" => "lenken er utløpt",
+"sharing is disabled" => "deling er deaktivert",
+"For more info, please ask the person who sent this link." => "For mer informasjon, spør personen som sendte lenken.",
+"shared by %s" => "delt av %s",
+"Direct link" => "Direkte lenke"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/nl.php b/apps/files_sharing/l10n/nl.php
index 687c6e134f5..6151733f54a 100644
--- a/apps/files_sharing/l10n/nl.php
+++ b/apps/files_sharing/l10n/nl.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Gedeeld door {owner}",
"This share is password-protected" => "Deze share is met een wachtwoord beveiligd",
"The password is wrong. Try again." => "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" => "Wachtwoord",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "de link is verlopen",
"sharing is disabled" => "delen is uitgeschakeld",
"For more info, please ask the person who sent this link." => "Voor meer informatie, neem contact op met de persoon die u deze link heeft gestuurd.",
-"%s shared the folder %s with you" => "%s deelt de map %s met u",
-"%s shared the file %s with you" => "%s deelt het bestand %s met u",
-"Download" => "Downloaden",
-"Upload" => "Uploaden",
-"Cancel upload" => "Upload afbreken",
-"No preview available for" => "Geen voorbeeldweergave beschikbaar voor",
+"shared by %s" => "gedeeld door %s",
+"Download %s" => "Download %s",
"Direct link" => "Directe link"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/nn_NO.php b/apps/files_sharing/l10n/nn_NO.php
index 1f1e8001e70..6f7968e199a 100644
--- a/apps/files_sharing/l10n/nn_NO.php
+++ b/apps/files_sharing/l10n/nn_NO.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Delt av {owner}",
"The password is wrong. Try again." => "Passordet er gale. Prøv igjen.",
"Password" => "Passord",
"Sorry, this link doesn’t seem to work anymore." => "Orsak, denne lenkja fungerer visst ikkje lenger.",
@@ -7,12 +8,6 @@ $TRANSLATIONS = array(
"the item was removed" => "fila/mappa er fjerna",
"the link expired" => "lenkja har gått ut på dato",
"sharing is disabled" => "deling er slått av",
-"For more info, please ask the person who sent this link." => "Spør den som sende deg lenkje om du vil ha meir informasjon.",
-"%s shared the folder %s with you" => "%s delte mappa %s med deg",
-"%s shared the file %s with you" => "%s delte fila %s med deg",
-"Download" => "Last ned",
-"Upload" => "Last opp",
-"Cancel upload" => "Avbryt opplasting",
-"No preview available for" => "Inga førehandsvising tilgjengeleg for"
+"For more info, please ask the person who sent this link." => "Spør den som sende deg lenkje om du vil ha meir informasjon."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/oc.php b/apps/files_sharing/l10n/oc.php
index 299d98e58b4..c67cdf272f7 100644
--- a/apps/files_sharing/l10n/oc.php
+++ b/apps/files_sharing/l10n/oc.php
@@ -1,8 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Senhal",
-"Download" => "Avalcarga",
-"Upload" => "Amontcarga",
-"Cancel upload" => " Anulla l'amontcargar"
+"Password" => "Senhal"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files_sharing/l10n/pa.php b/apps/files_sharing/l10n/pa.php
index 6c14eda59df..6fee1e95f00 100644
--- a/apps/files_sharing/l10n/pa.php
+++ b/apps/files_sharing/l10n/pa.php
@@ -1,8 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "ਪਾਸਵਰ",
-"Download" => "ਡਾਊਨਲੋਡ",
-"Upload" => "ਅੱਪਲੋਡ",
-"Cancel upload" => "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ"
+"Password" => "ਪਾਸਵਰ"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/pl.php b/apps/files_sharing/l10n/pl.php
index 4c7498ee1b7..4ecdced1a1d 100644
--- a/apps/files_sharing/l10n/pl.php
+++ b/apps/files_sharing/l10n/pl.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Udostępnione przez {owner}",
"This share is password-protected" => "Udział ten jest chroniony hasłem",
"The password is wrong. Try again." => "To hasło jest niewłaściwe. Spróbuj ponownie.",
"Password" => "Hasło",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "link wygasł",
"sharing is disabled" => "Udostępnianie jest wyłączone",
"For more info, please ask the person who sent this link." => "Aby uzyskać więcej informacji proszę poprosić osobę, która wysłał ten link.",
-"%s shared the folder %s with you" => "%s współdzieli folder z tobą %s",
-"%s shared the file %s with you" => "%s współdzieli z tobą plik %s",
-"Download" => "Pobierz",
-"Upload" => "Wyślij",
-"Cancel upload" => "Anuluj wysyłanie",
-"No preview available for" => "Podgląd nie jest dostępny dla",
+"shared by %s" => "udostępniony przez %s",
+"Download %s" => "Pobierz %s",
"Direct link" => "Bezpośredni link"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/pt_BR.php b/apps/files_sharing/l10n/pt_BR.php
index ee03749795b..4cd95b09dc3 100644
--- a/apps/files_sharing/l10n/pt_BR.php
+++ b/apps/files_sharing/l10n/pt_BR.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Compartilhado por {owner}",
"This share is password-protected" => "Este compartilhamento esta protegido por senha",
"The password is wrong. Try again." => "Senha incorreta. Tente novamente.",
"Password" => "Senha",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "o link expirou",
"sharing is disabled" => "compartilhamento está desativada",
"For more info, please ask the person who sent this link." => "Para mais informações, por favor, pergunte a pessoa que enviou este link.",
-"%s shared the folder %s with you" => "%s compartilhou a pasta %s com você",
-"%s shared the file %s with you" => "%s compartilhou o arquivo %s com você",
-"Download" => "Baixar",
-"Upload" => "Upload",
-"Cancel upload" => "Cancelar upload",
-"No preview available for" => "Nenhuma visualização disponível para",
+"shared by %s" => "compartilhado por %s",
+"Download %s" => "Baixar %s",
"Direct link" => "Link direto"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files_sharing/l10n/pt_PT.php b/apps/files_sharing/l10n/pt_PT.php
index cd94211b5d3..fdcc498fc20 100644
--- a/apps/files_sharing/l10n/pt_PT.php
+++ b/apps/files_sharing/l10n/pt_PT.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Partilhado por {owner}",
"This share is password-protected" => "Esta partilha está protegida por palavra-chave",
"The password is wrong. Try again." => "Password errada, por favor tente de novo",
"Password" => "Palavra-passe",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "O link expirou",
"sharing is disabled" => "A partilha está desativada",
"For more info, please ask the person who sent this link." => "Para mais informações, por favor questione a pessoa que lhe enviou este link",
-"%s shared the folder %s with you" => "%s partilhou a pasta %s consigo",
-"%s shared the file %s with you" => "%s partilhou o ficheiro %s consigo",
-"Download" => "Transferir",
-"Upload" => "Carregar",
-"Cancel upload" => "Cancelar envio",
-"No preview available for" => "Não há pré-visualização para",
+"shared by %s" => "partilhada por %s",
+"Download %s" => "Download %s",
"Direct link" => "Link direto"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/ro.php b/apps/files_sharing/l10n/ro.php
index 54e20ed6bb4..ca0d5e077b0 100644
--- a/apps/files_sharing/l10n/ro.php
+++ b/apps/files_sharing/l10n/ro.php
@@ -1,12 +1,6 @@
<?php
$TRANSLATIONS = array(
"The password is wrong. Try again." => "Parola este incorectă. Încercaţi din nou.",
-"Password" => "Parolă",
-"%s shared the folder %s with you" => "%s a partajat directorul %s cu tine",
-"%s shared the file %s with you" => "%s a partajat fișierul %s cu tine",
-"Download" => "Descarcă",
-"Upload" => "Încărcare",
-"Cancel upload" => "Anulează încărcarea",
-"No preview available for" => "Nici o previzualizare disponibilă pentru "
+"Password" => "Parolă"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/files_sharing/l10n/ru.php b/apps/files_sharing/l10n/ru.php
index 8c48096f666..2b44e29a345 100644
--- a/apps/files_sharing/l10n/ru.php
+++ b/apps/files_sharing/l10n/ru.php
@@ -1,20 +1,16 @@
<?php
$TRANSLATIONS = array(
-"This share is password-protected" => "Эта шара защищена паролем",
+"Shared by {owner}" => "Доступ открыл {owner}",
+"This share is password-protected" => "Общий ресурс защищён паролем",
"The password is wrong. Try again." => "Неверный пароль. Попробуйте еще раз.",
"Password" => "Пароль",
"Sorry, this link doesn’t seem to work anymore." => "К сожалению, эта ссылка, похоже не будет работать больше.",
"Reasons might be:" => "Причиной может быть:",
"the item was removed" => "объект был удалён",
"the link expired" => "срок ссылки истёк",
-"sharing is disabled" => "обмен отключен",
-"For more info, please ask the person who sent this link." => "Для получения дополнительной информации, пожалуйста, спросите того кто отослал данную ссылку.",
-"%s shared the folder %s with you" => "%s открыл доступ к папке %s для Вас",
-"%s shared the file %s with you" => "%s открыл доступ к файлу %s для Вас",
-"Download" => "Скачать",
-"Upload" => "Загрузка",
-"Cancel upload" => "Отмена загрузки",
-"No preview available for" => "Предпросмотр недоступен для",
+"sharing is disabled" => "общий доступ отключён",
+"For more info, please ask the person who sent this link." => "Пожалуйста, обратитесь к отправителю данной ссылки.",
+"shared by %s" => "Поделиться с %s",
"Direct link" => "Прямая ссылка"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/si_LK.php b/apps/files_sharing/l10n/si_LK.php
index e8401385647..5d3c0d0bed1 100644
--- a/apps/files_sharing/l10n/si_LK.php
+++ b/apps/files_sharing/l10n/si_LK.php
@@ -1,11 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "මුර පදය",
-"%s shared the folder %s with you" => "%s ඔබව %s ෆෝල්ඩරයට හවුල් කරගත්තේය",
-"%s shared the file %s with you" => "%s ඔබ සමඟ %s ගොනුව බෙදාහදාගත්තේය",
-"Download" => "බාන්න",
-"Upload" => "උඩුගත කරන්න",
-"Cancel upload" => "උඩුගත කිරීම අත් හරින්න",
-"No preview available for" => "පූර්වදර්ශනයක් නොමැත"
+"Password" => "මුර පදය"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/sk_SK.php b/apps/files_sharing/l10n/sk_SK.php
index 4ea8cbdd77d..4e9856da4a7 100644
--- a/apps/files_sharing/l10n/sk_SK.php
+++ b/apps/files_sharing/l10n/sk_SK.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Zdieľa {owner}",
"This share is password-protected" => "Toto zdieľanie je chránené heslom",
"The password is wrong. Try again." => "Heslo je chybné. Skúste to znova.",
"Password" => "Heslo",
@@ -9,12 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "linke vypršala platnosť",
"sharing is disabled" => "zdieľanie je zakázané",
"For more info, please ask the person who sent this link." => "Pre viac informácií kontaktujte osobu, ktorá vám poslala tento odkaz.",
-"%s shared the folder %s with you" => "%s zdieľa s vami priečinok %s",
-"%s shared the file %s with you" => "%s zdieľa s vami súbor %s",
-"Download" => "Sťahovanie",
-"Upload" => "Nahrať",
-"Cancel upload" => "Zrušiť nahrávanie",
-"No preview available for" => "Žiaden náhľad k dispozícii pre",
+"shared by %s" => "Zdieľa %s",
"Direct link" => "Priama linka"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files_sharing/l10n/sl.php b/apps/files_sharing/l10n/sl.php
index d5ef46e180e..7c1014b0ef0 100644
--- a/apps/files_sharing/l10n/sl.php
+++ b/apps/files_sharing/l10n/sl.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Souporabo omogoča {owner}",
"This share is password-protected" => "To mesto je zaščiteno z geslom.",
"The password is wrong. Try again." => "Geslo je napačno. Poskusite znova.",
"Password" => "Geslo",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "povezava je pretekla,",
"sharing is disabled" => "souporaba je onemogočena.",
"For more info, please ask the person who sent this link." => "Za več podrobnosti stopite v stik s pošiljateljem te povezave.",
-"%s shared the folder %s with you" => "Oseba %s je določila mapo %s za souporabo",
-"%s shared the file %s with you" => "Oseba %s je določila datoteko %s za souporabo",
-"Download" => "Prejmi",
-"Upload" => "Pošlji",
-"Cancel upload" => "Prekliči pošiljanje",
-"No preview available for" => "Predogled ni na voljo za",
+"shared by %s" => "souporabp omogoča %s",
+"Download %s" => "Prejmi %s",
"Direct link" => "Neposredna povezava"
);
$PLURAL_FORMS = "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);";
diff --git a/apps/files_sharing/l10n/sq.php b/apps/files_sharing/l10n/sq.php
index 473049f75ed..b1db4d5c546 100644
--- a/apps/files_sharing/l10n/sq.php
+++ b/apps/files_sharing/l10n/sq.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"This share is password-protected" => "Kjo pjesë është e mbrojtur me fjalëkalim",
"The password is wrong. Try again." => "Kodi është i gabuar. Provojeni përsëri.",
"Password" => "Kodi",
"Sorry, this link doesn’t seem to work anymore." => "Ju kërkojmë ndjesë, kjo lidhje duket sikur nuk punon më.",
@@ -8,11 +9,6 @@ $TRANSLATIONS = array(
"the link expired" => "lidhja ka skaduar",
"sharing is disabled" => "ndarja është çaktivizuar",
"For more info, please ask the person who sent this link." => "Për më shumë informacione, ju lutem pyesni personin që iu dërgoi këtë lidhje.",
-"%s shared the folder %s with you" => "%s ndau me ju dosjen %s",
-"%s shared the file %s with you" => "%s ndau me ju skedarin %s",
-"Download" => "Shkarko",
-"Upload" => "Ngarko",
-"Cancel upload" => "Anulo ngarkimin",
-"No preview available for" => "Shikimi paraprak nuk është i mundur për"
+"Direct link" => "Lidhje direkte"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/sr.php b/apps/files_sharing/l10n/sr.php
index e484ad25eb6..bc963ac87b8 100644
--- a/apps/files_sharing/l10n/sr.php
+++ b/apps/files_sharing/l10n/sr.php
@@ -1,8 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Лозинка",
-"Download" => "Преузми",
-"Upload" => "Отпреми",
-"Cancel upload" => "Прекини отпремање"
+"Password" => "Лозинка"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/sr@latin.php b/apps/files_sharing/l10n/sr@latin.php
index 08463e15103..7d5ba12c6e7 100644
--- a/apps/files_sharing/l10n/sr@latin.php
+++ b/apps/files_sharing/l10n/sr@latin.php
@@ -1,7 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "Lozinka",
-"Download" => "Preuzmi",
-"Upload" => "Pošalji"
+"Password" => "Lozinka"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/sv.php b/apps/files_sharing/l10n/sv.php
index 055ef552d6b..2d037f9186e 100644
--- a/apps/files_sharing/l10n/sv.php
+++ b/apps/files_sharing/l10n/sv.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Delad av {owner}",
"This share is password-protected" => "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." => "Lösenordet är fel. Försök igen.",
"Password" => "Lösenord",
@@ -9,12 +10,6 @@ $TRANSLATIONS = array(
"the link expired" => "giltighet för länken har gått ut",
"sharing is disabled" => "delning är inaktiverat",
"For more info, please ask the person who sent this link." => "För mer information, kontakta den person som skickade den här länken.",
-"%s shared the folder %s with you" => "%s delade mappen %s med dig",
-"%s shared the file %s with you" => "%s delade filen %s med dig",
-"Download" => "Ladda ner",
-"Upload" => "Ladda upp",
-"Cancel upload" => "Avbryt uppladdning",
-"No preview available for" => "Ingen förhandsgranskning tillgänglig för",
"Direct link" => "Direkt länk"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/ta_LK.php b/apps/files_sharing/l10n/ta_LK.php
index 90a2fb417f4..3b944d42e64 100644
--- a/apps/files_sharing/l10n/ta_LK.php
+++ b/apps/files_sharing/l10n/ta_LK.php
@@ -1,11 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "கடவுச்சொல்",
-"%s shared the folder %s with you" => "%s கோப்புறையானது %s உடன் பகிரப்பட்டது",
-"%s shared the file %s with you" => "%s கோப்பானது %s உடன் பகிரப்பட்டது",
-"Download" => "பதிவிறக்குக",
-"Upload" => "பதிவேற்றுக",
-"Cancel upload" => "பதிவேற்றலை இரத்து செய்க",
-"No preview available for" => "அதற்கு முன்னோக்கு ஒன்றும் இல்லை"
+"Shared by {owner}" => "பகிரப்பட்டது {சொந்தகாரர்}",
+"Password" => "கடவுச்சொல்"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/th_TH.php b/apps/files_sharing/l10n/th_TH.php
index e192e0a97cd..706d0a561ed 100644
--- a/apps/files_sharing/l10n/th_TH.php
+++ b/apps/files_sharing/l10n/th_TH.php
@@ -1,11 +1,6 @@
<?php
$TRANSLATIONS = array(
-"Password" => "รหัสผ่าน",
-"%s shared the folder %s with you" => "%s ได้แชร์โฟลเดอร์ %s ให้กับคุณ",
-"%s shared the file %s with you" => "%s ได้แชร์ไฟล์ %s ให้กับคุณ",
-"Download" => "ดาวน์โหลด",
-"Upload" => "อัพโหลด",
-"Cancel upload" => "ยกเลิกการอัพโหลด",
-"No preview available for" => "ไม่สามารถดูตัวอย่างได้สำหรับ"
+"Shared by {owner}" => "ถูกแชร์โดย {owner}",
+"Password" => "รหัสผ่าน"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/tr.php b/apps/files_sharing/l10n/tr.php
index 22fe8ed0209..4177221e108 100644
--- a/apps/files_sharing/l10n/tr.php
+++ b/apps/files_sharing/l10n/tr.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "{owner} tarafından paylaşılmış",
"This share is password-protected" => "Bu paylaşım parola korumalı",
"The password is wrong. Try again." => "Parola hatalı. Yeniden deneyin.",
"Password" => "Parola",
@@ -9,12 +10,8 @@ $TRANSLATIONS = array(
"the link expired" => "bağlantı süresi dolmuş",
"sharing is disabled" => "paylaşım devre dışı",
"For more info, please ask the person who sent this link." => "Daha fazla bilgi için bu bağlantıyı aldığınız kişi ile iletişime geçin.",
-"%s shared the folder %s with you" => "%s, %s klasörünü sizinle paylaştı",
-"%s shared the file %s with you" => "%s, %s dosyasını sizinle paylaştı",
-"Download" => "İndir",
-"Upload" => "Yükle",
-"Cancel upload" => "Yüklemeyi iptal et",
-"No preview available for" => "Kullanılabilir önizleme yok",
+"shared by %s" => "paylaşan: %s",
+"Download %s" => "İndir: %s",
"Direct link" => "Doğrudan bağlantı"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files_sharing/l10n/ug.php b/apps/files_sharing/l10n/ug.php
index 6ffa02f7344..9de41786913 100644
--- a/apps/files_sharing/l10n/ug.php
+++ b/apps/files_sharing/l10n/ug.php
@@ -1,8 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "ئىم",
-"Download" => "چۈشۈر",
-"Upload" => "يۈكلە",
-"Cancel upload" => "يۈكلەشتىن ۋاز كەچ"
+"Password" => "ئىم"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/uk.php b/apps/files_sharing/l10n/uk.php
index 842b4b8d961..204b8e174a0 100644
--- a/apps/files_sharing/l10n/uk.php
+++ b/apps/files_sharing/l10n/uk.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Опублікував {owner}",
"This share is password-protected" => "Цей ресурс обміну захищений паролем",
"The password is wrong. Try again." => "Невірний пароль. Спробуйте ще раз.",
"Password" => "Пароль",
@@ -9,12 +10,6 @@ $TRANSLATIONS = array(
"the link expired" => "посилання застаріло",
"sharing is disabled" => "обмін заборонений",
"For more info, please ask the person who sent this link." => "Для отримання додаткової інформації, будь ласка, зверніться до особи, яка надіслала це посилання.",
-"%s shared the folder %s with you" => "%s опублікував каталог %s для Вас",
-"%s shared the file %s with you" => "%s опублікував файл %s для Вас",
-"Download" => "Завантажити",
-"Upload" => "Вивантажити",
-"Cancel upload" => "Перервати завантаження",
-"No preview available for" => "Попередній перегляд недоступний для",
"Direct link" => "Пряме посилання"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/vi.php b/apps/files_sharing/l10n/vi.php
index 4566d3744de..e1a65f27515 100644
--- a/apps/files_sharing/l10n/vi.php
+++ b/apps/files_sharing/l10n/vi.php
@@ -1,11 +1,7 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "Được chia sẽ bởi {owner}",
"Password" => "Mật khẩu",
-"%s shared the folder %s with you" => "%s đã chia sẻ thư mục %s với bạn",
-"%s shared the file %s with you" => "%s đã chia sẻ tập tin %s với bạn",
-"Download" => "Tải về",
-"Upload" => "Tải lên",
-"Cancel upload" => "Hủy upload",
-"No preview available for" => "Không có xem trước cho"
+"shared by %s" => " Được chia sẻ bởi %s"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/zh_CN.php b/apps/files_sharing/l10n/zh_CN.php
index 956c161b48e..8946741a30d 100644
--- a/apps/files_sharing/l10n/zh_CN.php
+++ b/apps/files_sharing/l10n/zh_CN.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "由{owner}共享",
+"This share is password-protected" => "这是一个密码保护的共享",
"The password is wrong. Try again." => "用户名或密码错误!请重试",
"Password" => "密码",
"Sorry, this link doesn’t seem to work anymore." => "抱歉,此链接已失效",
@@ -8,11 +10,7 @@ $TRANSLATIONS = array(
"the link expired" => "链接过期",
"sharing is disabled" => "共享已禁用",
"For more info, please ask the person who sent this link." => "欲知详情,请联系发给你链接的人。",
-"%s shared the folder %s with you" => "%s与您共享了%s文件夹",
-"%s shared the file %s with you" => "%s与您共享了%s文件",
-"Download" => "下载",
-"Upload" => "上传",
-"Cancel upload" => "取消上传",
-"No preview available for" => "没有预览"
+"shared by %s" => "由 %s 共享",
+"Direct link" => "直接链接"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/zh_HK.php b/apps/files_sharing/l10n/zh_HK.php
index 434420264ea..59043097490 100644
--- a/apps/files_sharing/l10n/zh_HK.php
+++ b/apps/files_sharing/l10n/zh_HK.php
@@ -1,7 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Password" => "密碼",
-"Download" => "下載",
-"Upload" => "上傳"
+"Password" => "密碼"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/zh_TW.php b/apps/files_sharing/l10n/zh_TW.php
index 3854b7ae582..eb591fa3597 100644
--- a/apps/files_sharing/l10n/zh_TW.php
+++ b/apps/files_sharing/l10n/zh_TW.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Shared by {owner}" => "由 {owner} 分享",
"This share is password-protected" => "這個分享有密碼保護",
"The password is wrong. Try again." => "請檢查您的密碼並再試一次",
"Password" => "密碼",
@@ -8,12 +9,6 @@ $TRANSLATIONS = array(
"the item was removed" => "項目已經移除",
"the link expired" => "連結過期",
"sharing is disabled" => "分享功能已停用",
-"For more info, please ask the person who sent this link." => "請詢問告訴您此連結的人以瞭解更多",
-"%s shared the folder %s with you" => "%s 和您分享了資料夾 %s ",
-"%s shared the file %s with you" => "%s 和您分享了檔案 %s",
-"Download" => "下載",
-"Upload" => "上傳",
-"Cancel upload" => "取消上傳",
-"No preview available for" => "無法預覽"
+"For more info, please ask the person who sent this link." => "請詢問告訴您此連結的人以瞭解更多"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/lib/api.php
index 061e60ad8ed..de3c1cd2630 100644
--- a/apps/files_sharing/lib/api.php
+++ b/apps/files_sharing/lib/api.php
@@ -68,7 +68,7 @@ class Api {
public static function getShare($params) {
$s = self::getShareFromId($params['id']);
- $params['itemSource'] = $s['item_source'];
+ $params['itemSource'] = $s['file_source'];
$params['itemType'] = $s['item_type'];
$params['specificShare'] = true;
@@ -98,8 +98,14 @@ class Api {
break;
}
}
+ } else {
+ $path = $params['path'];
+ foreach ($shares as $key => $share) {
+ $shares[$key]['path'] = $path;
+ }
}
+
// include also reshares in the lists. This means that the result
// will contain every user with access to the file.
if (isset($params['reshares']) && $params['reshares'] === true) {
@@ -107,8 +113,10 @@ class Api {
}
if ($receivedFrom) {
- $shares['received_from'] = $receivedFrom['uid_owner'];
- $shares['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
+ foreach ($shares as $key => $share) {
+ $shares[$key]['received_from'] = $receivedFrom['uid_owner'];
+ $shares[$key]['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
+ }
}
} else {
$shares = null;
@@ -172,12 +180,15 @@ class Api {
// workaround because folders are named 'dir' in this context
$itemType = $file['type'] === 'file' ? 'file' : 'folder';
$share = \OCP\Share::getItemShared($itemType, $file['fileid']);
- $receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']);
- if ($receivedFrom) {
- $share['received_from'] = $receivedFrom['uid_owner'];
- $share['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
- }
- if ($share) {
+ if($share) {
+ $receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']);
+ reset($share);
+ $key = key($share);
+ $share[$key]['path'] = self::correctPath($share[$key]['path'], $path);
+ if ($receivedFrom) {
+ $share[$key]['received_from'] = $receivedFrom['uid_owner'];
+ $share[$key]['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
+ }
$result = array_merge($result, $share);
}
}
@@ -218,7 +229,7 @@ class Api {
//allow password protection
$shareWith = isset($_POST['password']) ? $_POST['password'] : null;
//check public link share
- $publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
+ $publicUploadEnabled = \OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_public_upload', 'yes');
if(isset($_POST['publicUpload']) && $publicUploadEnabled !== 'yes') {
return new \OC_OCS_Result(null, 403, "public upload disabled by the administrator");
}
@@ -281,9 +292,8 @@ class Api {
public static function updateShare($params) {
$share = self::getShareFromId($params['id']);
- $itemSource = isset($share['item_source']) ? $share['item_source'] : null;
- if($itemSource === null) {
+ if(!isset($share['file_source'])) {
return new \OC_OCS_Result(null, 404, "wrong share Id, share doesn't exist.");
}
@@ -317,7 +327,7 @@ class Api {
$shareType = $share['share_type'];
$permissions = isset($params['_put']['permissions']) ? (int)$params['_put']['permissions'] : null;
- $publicUploadStatus = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
+ $publicUploadStatus = \OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_public_upload', 'yes');
$publicUploadEnabled = ($publicUploadStatus === 'yes') ? true : false;
@@ -356,7 +366,7 @@ class Api {
*/
private static function updatePublicUpload($share, $params) {
- $publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
+ $publicUploadEnabled = \OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_public_upload', 'yes');
if($publicUploadEnabled !== 'yes') {
return new \OC_OCS_Result(null, 403, "public upload disabled by the administrator");
}
@@ -431,10 +441,10 @@ class Api {
public static function deleteShare($params) {
$share = self::getShareFromId($params['id']);
- $itemSource = isset($share['item_source']) ? $share['item_source'] : null;
+ $fileSource = isset($share['file_source']) ? $share['file_source'] : null;
$itemType = isset($share['item_type']) ? $share['item_type'] : null;;
- if($itemSource === null) {
+ if($fileSource === null) {
return new \OC_OCS_Result(null, 404, "wrong share ID, share doesn't exist.");
}
@@ -448,7 +458,7 @@ class Api {
try {
$return = \OCP\Share::unshare(
$itemType,
- $itemSource,
+ $fileSource,
$shareType,
$shareWith);
} catch (\Exception $e) {
@@ -504,7 +514,7 @@ class Api {
* @return array with: item_source, share_type, share_with, item_type, permissions
*/
private static function getShareFromId($shareID) {
- $sql = 'SELECT `item_source`, `share_type`, `share_with`, `item_type`, `permissions` FROM `*PREFIX*share` WHERE `id` = ?';
+ $sql = 'SELECT `file_source`, `item_source`, `share_type`, `share_with`, `item_type`, `permissions` FROM `*PREFIX*share` WHERE `id` = ?';
$args = array($shareID);
$query = \OCP\DB::prepare($sql);
$result = $query->execute($args);
@@ -521,4 +531,15 @@ class Api {
}
+ /**
+ * @brief make sure that the path has the correct root
+ *
+ * @param string $path path returned from the share API
+ * @param string $folder current root folder
+ * @return string the correct path
+ */
+ protected static function correctPath($path, $folder) {
+ return \OC_Filesystem::normalizePath('/' . $folder . '/' . basename($path));
+ }
+
}
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 425d51113b1..10f2182655f 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -32,6 +32,9 @@ class Shared_Cache extends Cache {
private $storage;
private $files = array();
+ /**
+ * @param \OC\Files\Storage\Shared $storage
+ */
public function __construct($storage) {
$this->storage = $storage;
}
@@ -92,12 +95,11 @@ class Shared_Cache extends Cache {
} else {
$query = \OC_DB::prepare(
'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`,'
- .' `size`, `mtime`, `encrypted`'
+ .' `size`, `mtime`, `encrypted`, `unencrypted_size`'
.' FROM `*PREFIX*filecache` WHERE `fileid` = ?');
$result = $query->execute(array($file));
$data = $result->fetchRow();
$data['fileid'] = (int)$data['fileid'];
- $data['size'] = (int)$data['size'];
$data['mtime'] = (int)$data['mtime'];
$data['storage_mtime'] = (int)$data['storage_mtime'];
$data['encrypted'] = (bool)$data['encrypted'];
@@ -106,6 +108,12 @@ class Shared_Cache extends Cache {
if ($data['storage_mtime'] === 0) {
$data['storage_mtime'] = $data['mtime'];
}
+ if ($data['encrypted'] or ($data['unencrypted_size'] > 0 and $data['mimetype'] === 'httpd/unix-directory')) {
+ $data['encrypted_size'] = (int)$data['size'];
+ $data['size'] = (int)$data['unencrypted_size'];
+ } else {
+ $data['size'] = (int)$data['size'];
+ }
return $data;
}
return false;
@@ -123,19 +131,18 @@ class Shared_Cache extends Cache {
foreach ($files as &$file) {
$file['mimetype'] = $this->getMimetype($file['mimetype']);
$file['mimepart'] = $this->getMimetype($file['mimepart']);
+ $file['usersPath'] = 'files/Shared/' . ltrim($file['path'], '/');
}
return $files;
} else {
- if ($cache = $this->getSourceCache($folder)) {
+ $cache = $this->getSourceCache($folder);
+ if ($cache) {
+ $parent = $this->storage->getFile($folder);
$sourceFolderContent = $cache->getFolderContents($this->files[$folder]);
foreach ($sourceFolderContent as $key => $c) {
- $ownerPathParts = explode('/', \OC_Filesystem::normalizePath($c['path']));
- $userPathParts = explode('/', \OC_Filesystem::normalizePath($folder));
- $usersPath = 'files/Shared/'.$userPathParts[1];
- foreach (array_slice($ownerPathParts, 3) as $part) {
- $usersPath .= '/'.$part;
- }
- $sourceFolderContent[$key]['usersPath'] = $usersPath;
+ $sourceFolderContent[$key]['usersPath'] = 'files/Shared/' . $folder . '/' . $c['name'];
+ $sourceFolderContent[$key]['uid_owner'] = $parent['uid_owner'];
+ $sourceFolderContent[$key]['displayname_owner'] = $parent['uid_owner'];
}
return $sourceFolderContent;
@@ -259,17 +266,38 @@ class Shared_Cache extends Cache {
* @return array
*/
public function searchByMime($mimetype) {
-
- if (strpos($mimetype, '/')) {
- $where = '`mimetype` = ? AND ';
- } else {
- $where = '`mimepart` = ? AND ';
+ $mimepart = null;
+ if (strpos($mimetype, '/') === false) {
+ $mimepart = $mimetype;
+ $mimetype = null;
}
- $value = $this->getMimetypeId($mimetype);
-
- return $this->searchWithWhere($where, $value);
-
+ // note: searchWithWhere is currently broken as it doesn't
+ // recurse into subdirs nor returns the correct
+ // file paths, so using getFolderContents() for now
+
+ $result = array();
+ $exploreDirs = array('');
+ while (count($exploreDirs) > 0) {
+ $dir = array_pop($exploreDirs);
+ $files = $this->getFolderContents($dir);
+ // no results?
+ if (!$files) {
+ continue;
+ }
+ foreach ($files as $file) {
+ if ($file['mimetype'] === 'httpd/unix-directory') {
+ $exploreDirs[] = ltrim($dir . '/' . $file['name'], '/');
+ }
+ else if (($mimepart && $file['mimepart'] === $mimepart) || ($mimetype && $file['mimetype'] === $mimetype)) {
+ // usersPath not reliable
+ //$file['path'] = $file['usersPath'];
+ $file['path'] = ltrim($dir . '/' . $file['name'], '/');
+ $result[] = $file;
+ }
+ }
+ }
+ return $result;
}
/**
@@ -313,6 +341,12 @@ class Shared_Cache extends Cache {
}
$row['mimetype'] = $this->getMimetype($row['mimetype']);
$row['mimepart'] = $this->getMimetype($row['mimepart']);
+ if ($row['encrypted'] or ($row['unencrypted_size'] > 0 and $row['mimetype'] === 'httpd/unix-directory')) {
+ $row['encrypted_size'] = $row['size'];
+ $row['size'] = $row['unencrypted_size'];
+ } else {
+ $row['size'] = $row['size'];
+ }
$files[] = $row;
}
}
@@ -361,7 +395,7 @@ class Shared_Cache extends Cache {
* use the one with the highest id gives the best result with the background scanner, since that is most
* likely the folder where we stopped scanning previously
*
- * @return string|bool the path of the folder or false when no folder matched
+ * @return boolean the path of the folder or false when no folder matched
*/
public function getIncomplete() {
return false;
diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php
index 1dc53428a7f..31b7ac361ae 100644
--- a/apps/files_sharing/lib/permissions.php
+++ b/apps/files_sharing/lib/permissions.php
@@ -42,6 +42,10 @@ class Shared_Permissions extends Permissions {
}
}
+ /**
+ * @param integer $fileId
+ * @param string $user
+ */
private function getFile($fileId, $user) {
if ($fileId == -1) {
return \OCP\PERMISSION_READ;
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index c956c55a1df..5e00050fe1e 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -91,10 +91,20 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$file['name'] = basename($item['file_target']);
$file['mimetype'] = $item['mimetype'];
$file['mimepart'] = $item['mimepart'];
- $file['size'] = $item['size'];
$file['mtime'] = $item['mtime'];
$file['encrypted'] = $item['encrypted'];
$file['etag'] = $item['etag'];
+ $file['uid_owner'] = $item['uid_owner'];
+ $file['displayname_owner'] = $item['displayname_owner'];
+
+ $storage = \OC\Files\Filesystem::getStorage('/');
+ $cache = $storage->getCache();
+ if ($item['encrypted'] or ($item['unencrypted_size'] > 0 and $cache->getMimetype($item['mimetype']) === 'httpd/unix-directory')) {
+ $file['size'] = $item['unencrypted_size'];
+ $file['encrypted_size'] = $item['size'];
+ } else {
+ $file['size'] = $item['size'];
+ }
$files[] = $file;
}
return $files;
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index afe5dffdebd..b922654e5ec 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -41,6 +41,7 @@ class Shared extends \OC\Files\Storage\Common {
/**
* @brief Get the source file path, permissions, and owner for a shared file
* @param string Shared target file path
+ * @param string $target
* @return Returns array with the keys path, permissions, and owner or false if not found
*/
public function getFile($target) {
@@ -64,6 +65,7 @@ class Shared extends \OC\Files\Storage\Common {
/**
* @brief Get the source file path for a shared file
* @param string Shared target file path
+ * @param string $target
* @return string source file path or false if not found
*/
public function getSourcePath($target) {
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index b187da41324..fe61dd4d5a0 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -2,7 +2,9 @@
// Load other apps for file previews
OC_App::loadApps();
-if (\OC_Appconfig::getValue('core', 'shareapi_allow_links', 'yes') !== 'yes') {
+$appConfig = \OC::$server->getAppConfig();
+
+if ($appConfig->getValue('core', 'shareapi_allow_links', 'yes') !== 'yes') {
header('HTTP/1.0 404 Not Found');
$tmpl = new OCP\Template('', '404', 'guest');
$tmpl->printPage();
@@ -30,7 +32,8 @@ function determineIcon($file, $sharingRoot, $sharingToken) {
if($file['isPreviewAvailable']) {
return OCP\publicPreview_icon($relativePath, $sharingToken) . '&c=' . $file['etag'];
}
- return OCP\mimetype_icon($file['mimetype']);
+ $icon = OCP\mimetype_icon($file['mimetype']);
+ return substr($icon, 0, -3) . 'svg';
}
if (isset($_GET['t'])) {
@@ -143,29 +146,20 @@ if (isset($path)) {
OCP\Util::addScript('files', 'jquery.iframe-transport');
OCP\Util::addScript('files', 'jquery.fileupload');
$maxUploadFilesize=OCP\Util::maxUploadFilesize($path);
- $freeSpace=OCP\Util::freeSpace($dir);
- $uploadLimit=OCP\Util::uploadLimit();
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
- $tmpl->assign('uidOwner', $shareOwner);
$tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner));
$tmpl->assign('filename', $file);
$tmpl->assign('directory_path', $linkItem['file_target']);
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
- $tmpl->assign('fileTarget', basename($linkItem['file_target']));
$tmpl->assign('dirToken', $linkItem['token']);
$tmpl->assign('sharingToken', $token);
- $tmpl->assign('disableSharing', true);
$allowPublicUploadEnabled = (bool) ($linkItem['permissions'] & OCP\PERMISSION_CREATE);
- if (OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes') === 'no') {
+ if ($appConfig->getValue('core', 'shareapi_allow_public_upload', 'yes') === 'no') {
$allowPublicUploadEnabled = false;
}
if ($linkItem['item_type'] !== 'folder') {
$allowPublicUploadEnabled = false;
}
- $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
- $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
- $tmpl->assign('freeSpace', $freeSpace);
- $tmpl->assign('uploadLimit', $uploadLimit); // PHP upload limit
$urlLinkIdentifiers= (isset($token)?'&t='.$token:'')
.(isset($_GET['dir'])?'&dir='.$_GET['dir']:'')
@@ -226,6 +220,9 @@ if (isset($path)) {
$maxUploadFilesize=OCP\Util::maxUploadFilesize($path);
$fileHeader = (!isset($files) or count($files) > 0);
$emptyContent = ($allowPublicUploadEnabled and !$fileHeader);
+
+ $freeSpace=OCP\Util::freeSpace($path);
+ $uploadLimit=OCP\Util::uploadLimit();
$folder = new OCP\Template('files', 'index', '');
$folder->assign('fileList', $list->fetchPage());
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage());
@@ -238,6 +235,8 @@ if (isset($path)) {
$folder->assign('files', $files);
$folder->assign('uploadMaxFilesize', $maxUploadFilesize);
$folder->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
+ $folder->assign('freeSpace', $freeSpace);
+ $folder->assign('uploadLimit', $uploadLimit); // PHP upload limit
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
$folder->assign('usedSpacePercent', 0);
$folder->assign('fileHeader', $fileHeader);
diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php
index 928be93fc96..055329ecabf 100644
--- a/apps/files_sharing/templates/authenticate.php
+++ b/apps/files_sharing/templates/authenticate.php
@@ -8,8 +8,11 @@
<?php endif; ?>
<p class="infield">
<label for="password" class="infield"><?php p($l->t('Password')); ?></label>
- <input type="password" name="password" id="password" placeholder="" value="" autofocus />
- <input type="submit" value="" class="svg icon icon-confirm" />
+ <input type="password" name="password" id="password"
+ placeholder="" value=""
+ autocomplete="off" autocapitalize="off" autocorrect="off"
+ autofocus />
+ <input type="submit" value="" class="svg icon-confirm" />
</p>
</fieldset>
</form>
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index 3ddaf4446df..fc8d59e1e89 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -9,7 +9,7 @@
<input type="hidden" name="sharingToken" value="<?php p($_['sharingToken']) ?>" id="sharingToken">
<input type="hidden" name="filename" value="<?php p($_['filename']) ?>" id="filename">
<input type="hidden" name="mimetype" value="<?php p($_['mimetype']) ?>" id="mimetype">
-<header><div id="header" class="icon icon-noise <?php p((isset($_['folder']) ? 'share-folder' : 'share-file')) ?>">
+<header><div id="header" class="icon-noise <?php p((isset($_['folder']) ? 'share-folder' : 'share-file')) ?>">
<a href="<?php print_unescaped(link_to('', 'index.php')); ?>" title="" id="owncloud"><img class="svg"
src="<?php print_unescaped(image_path('', 'logo-wide.svg')); ?>" alt="<?php p($theme->getName()); ?>" /></a>
<div id="logo-claim" style="display:none;"><?php p($theme->getLogoClaim()); ?></div>
@@ -35,7 +35,7 @@
<?php else: ?>
<div id="imgframe">
<?php $size = \OC\Preview::isMimeSupported($_['mimetype']) ? 500 : 128 ?>
- <img src="<?php p(OCP\Util::linkToRoute( 'core_ajax_public_preview', array('x' => $size, 'y' => $size, 'file' => urlencode($_['directory_path']), 't' => $_['dirToken']))); ?>" class="publicpreview"/>
+ <img src="<?php p(OCP\Util::linkToRoute( 'core_ajax_public_preview', array('x' => $size, 'y' => $size, 'file' => $_['directory_path'], 't' => $_['dirToken']))); ?>" class="publicpreview"/>
</div>
<?php endif; ?>
<div class="directDownload">
diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php
index 1278e0c4d1f..e2bbb548182 100644
--- a/apps/files_sharing/tests/api.php
+++ b/apps/files_sharing/tests/api.php
@@ -33,13 +33,18 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
parent::setUp();
$this->folder = '/folder_share_api_test';
+ $this->subfolder = '/subfolder_share_api_test';
+ $this->subsubfolder = '/subsubfolder_share_api_test';
- $this->filename = 'share-api-test.txt';
+ $this->filename = '/share-api-test.txt';
// save file with content
$this->view->file_put_contents($this->filename, $this->data);
$this->view->mkdir($this->folder);
- $this->view->file_put_contents($this->folder.'/'.$this->filename, $this->data);
+ $this->view->mkdir($this->folder . $this->subfolder);
+ $this->view->mkdir($this->folder . $this->subfolder . $this->subsubfolder);
+ $this->view->file_put_contents($this->folder.$this->filename, $this->data);
+ $this->view->file_put_contents($this->folder . $this->subfolder . $this->filename, $this->data);
}
function tearDown() {
@@ -287,6 +292,343 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
}
/**
+ * @brief share a folder, than reshare a file within the shared folder and check if we construct the correct path
+ * @medium
+ */
+ function testGetShareFromFolderReshares() {
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo1 = $this->view->getFileInfo($this->folder);
+ $fileInfo2 = $this->view->getFileInfo($this->folder.'/'.$this->filename);
+ $fileInfo3 = $this->view->getFileInfo($this->folder.'/' . $this->subfolder . '/' .$this->filename);
+
+ // share root folder to user2
+ $result = \OCP\Share::shareItem('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ // share was successful?
+ $this->assertTrue($result);
+
+ // login as user2
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ // share file in root folder
+ $result = \OCP\Share::shareItem('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+ // share was successful?
+ $this->assertTrue(is_string($result));
+
+ // share file in subfolder
+ $result = \OCP\Share::shareItem('file', $fileInfo3['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+ // share was successful?
+ $this->assertTrue(is_string($result));
+
+ $testValues=array(
+ array('query' => 'Shared/' . $this->folder,
+ 'expectedResult' => '/Shared' . $this->folder . $this->filename),
+ array('query' => 'Shared/' . $this->folder . $this->subfolder,
+ 'expectedResult' => '/Shared' . $this->folder . $this->subfolder . $this->filename),
+ );
+ foreach ($testValues as $value) {
+
+ $_GET['path'] = $value['query'];
+ $_GET['subfiles'] = 'true';
+
+ $result = Share\Api::getAllShares(array());
+
+ $this->assertTrue($result->succeeded());
+
+ // test should return one share within $this->folder
+ $data = $result->getData();
+
+ $this->assertEquals($value['expectedResult'], $data[0]['path']);
+ }
+
+ // cleanup
+
+ \OCP\Share::unshare('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+ \OCP\Share::unshare('file', $fileInfo3['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ \OCP\Share::unshare('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+
+ }
+
+ /**
+ * @brief reshare a sub folder and check if we get the correct path
+ * @medium
+ */
+ function testGetShareFromSubFolderReShares() {
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo = $this->view->getFileInfo($this->folder . $this->subfolder);
+
+ // share sub-folder to user2
+ $result = \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ // share was successful?
+ $this->assertTrue($result);
+
+ // login as user2
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ // reshare subfolder
+ $result = \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+
+ // share was successful?
+ $this->assertTrue(is_string($result));
+
+ $_GET['path'] = '/Shared';
+ $_GET['subfiles'] = 'true';
+
+ $result = Share\Api::getAllShares(array());
+
+ $this->assertTrue($result->succeeded());
+
+ // test should return one share within $this->folder
+ $data = $result->getData();
+
+ // we should get exactly one result
+ $this->assertEquals(1, count($data));
+
+ $expectedPath = '/Shared' . $this->subfolder;
+ $this->assertEquals($expectedPath, $data[0]['path']);
+
+ // cleanup
+ $result = \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+ $this->assertTrue($result);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $result = \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->assertTrue($result);
+
+ }
+
+ /**
+ * @brief test re-re-share of folder if the path gets constructed correctly
+ * @medium
+ */
+ function testGetShareFromFolderReReShares() {
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo1 = $this->view->getFileInfo($this->folder . $this->subfolder);
+ $fileInfo2 = $this->view->getFileInfo($this->folder . $this->subfolder . $this->subsubfolder);
+
+ // share sub-folder to user2
+ $result = \OCP\Share::shareItem('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ // share was successful?
+ $this->assertTrue($result);
+
+ // login as user2
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ // reshare subsubfolder
+ $result = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, 31);
+ // share was successful?
+ $this->assertTrue($result);
+
+ // login as user3
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
+
+ $result = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+ // share was successful?
+ $this->assertTrue(is_string($result));
+
+
+ $_GET['path'] = '/Shared';
+ $_GET['subfiles'] = 'true';
+
+ $result = Share\Api::getAllShares(array());
+
+ $this->assertTrue($result->succeeded());
+
+ // test should return one share within $this->folder
+ $data = $result->getData();
+
+ // we should get exactly one result
+ $this->assertEquals(1, count($data));
+
+ $expectedPath = '/Shared' . $this->subsubfolder;
+ $this->assertEquals($expectedPath, $data[0]['path']);
+
+
+ // cleanup
+ $result = \OCP\Share::unshare('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+ $this->assertTrue($result);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+ $result = \OCP\Share::unshare('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3);
+ $this->assertTrue($result);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $result = \OCP\Share::unshare('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->assertTrue($result);
+
+ }
+
+ /**
+ * @brief test multiple shared folder if the path gets constructed correctly
+ * @medium
+ */
+ function testGetShareMultipleSharedFolder() {
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo1 = $this->view->getFileInfo($this->folder);
+ $fileInfo2 = $this->view->getFileInfo($this->folder . $this->subfolder);
+
+
+ // share sub-folder to user2
+ $result = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ // share was successful?
+ $this->assertTrue($result);
+
+ // share folder to user2
+ $result = \OCP\Share::shareItem('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ // share was successful?
+ $this->assertTrue($result);
+
+
+ // login as user2
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ $result = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+ // share was successful?
+ $this->assertTrue(is_string($result));
+
+
+ // ask for shared/subfolder
+ $expectedPath1 = '/Shared' . $this->subfolder;
+ $_GET['path'] = $expectedPath1;
+
+ $result1 = Share\Api::getAllShares(array());
+
+ $this->assertTrue($result1->succeeded());
+
+ // test should return one share within $this->folder
+ $data1 = $result1->getData();
+ $share1 = reset($data1);
+
+ // ask for shared/folder/subfolder
+ $expectedPath2 = '/Shared' . $this->folder . $this->subfolder;
+ $_GET['path'] = $expectedPath2;
+
+ $result2 = Share\Api::getAllShares(array());
+
+ $this->assertTrue($result2->succeeded());
+
+ // test should return one share within $this->folder
+ $data2 = $result2->getData();
+ $share2 = reset($data2);
+
+
+ // validate results
+ // we should get exactly one result each time
+ $this->assertEquals(1, count($data1));
+ $this->assertEquals(1, count($data2));
+
+ $this->assertEquals($expectedPath1, $share1['path']);
+ $this->assertEquals($expectedPath2, $share2['path']);
+
+
+ // cleanup
+ $result = \OCP\Share::unshare('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+ $this->assertTrue($result);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $result = \OCP\Share::unshare('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->assertTrue($result);
+ $result = \OCP\Share::unshare('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->assertTrue($result);
+
+ }
+
+ /**
+ * @brief test re-re-share of folder if the path gets constructed correctly
+ * @medium
+ */
+ function testGetShareFromFileReReShares() {
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo1 = $this->view->getFileInfo($this->folder . $this->subfolder);
+ $fileInfo2 = $this->view->getFileInfo($this->folder. $this->subfolder . $this->filename);
+
+ // share sub-folder to user2
+ $result = \OCP\Share::shareItem('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ // share was successful?
+ $this->assertTrue($result);
+
+ // login as user2
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ // reshare subsubfolder
+ $result = \OCP\Share::shareItem('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, 31);
+ // share was successful?
+ $this->assertTrue($result);
+
+ // login as user3
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
+
+ $result = \OCP\Share::shareItem('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+ // share was successful?
+ $this->assertTrue(is_string($result));
+
+
+ $_GET['path'] = '/Shared';
+ $_GET['subfiles'] = 'true';
+
+ $result = Share\Api::getAllShares(array());
+
+ $this->assertTrue($result->succeeded());
+
+ // test should return one share within $this->folder
+ $data = $result->getData();
+
+ // we should get exactly one result
+ $this->assertEquals(1, count($data));
+
+ $expectedPath = '/Shared' . $this->filename;
+ $this->assertEquals($expectedPath, $data[0]['path']);
+
+
+ // cleanup
+ $result = \OCP\Share::unshare('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+ $this->assertTrue($result);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+ $result = \OCP\Share::unshare('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3);
+ $this->assertTrue($result);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $result = \OCP\Share::unshare('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->assertTrue($result);
+
+ }
+
+ /**
* @medium
*/
function testGetShareFromUnknownId() {
@@ -491,4 +833,58 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
$this->assertTrue(empty($itemsAfterDelete));
}
+
+ /**
+ * @brief test unshare of a reshared file
+ */
+ function testDeleteReshare() {
+
+ // user 1 shares a folder with user2
+ \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
+
+ $fileInfo1 = $this->view->getFileInfo($this->folder);
+ $fileInfo2 = $this->view->getFileInfo($this->folder.'/'.$this->filename);
+
+ $result1 = \OCP\Share::shareItem('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+ $this->assertTrue($result1);
+
+ // user2 shares a file from the folder as link
+ \Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+
+ $result2 = \OCP\Share::shareItem('file', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+
+ $this->assertTrue(is_string($result2));
+
+ // test if we can unshare the link again
+ $items = \OCP\Share::getItemShared('file', null);
+ $this->assertEquals(1, count($items));
+
+ $item = reset($items);
+ $result3 = Share\Api::deleteShare(array('id' => $item['id']));
+
+ $this->assertTrue($result3->succeeded());
+
+ }
+
+ function testCorrectPath() {
+ $path = "/foo/bar/test.txt";
+ $folder = "/correct/path";
+ $expectedResult = "/correct/path/test.txt";
+
+ $shareApiDummy = new TestShareApi();
+
+ $this->assertSame($expectedResult, $shareApiDummy->correctPathTest($path, $folder));
+ }
+
+}
+
+/**
+ * @brief dumnmy class to test protected methods
+ */
+class TestShareApi extends \OCA\Files\Share\Api {
+ public function correctPathTest($path, $folder) {
+ return self::correctPath($path, $folder);
+}
}
diff --git a/apps/files_sharing/tests/base.php b/apps/files_sharing/tests/base.php
index 3e283271f5d..d44972d01f1 100644
--- a/apps/files_sharing/tests/base.php
+++ b/apps/files_sharing/tests/base.php
@@ -43,6 +43,7 @@ abstract class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase {
*/
public $view;
public $folder;
+ public $subfolder;
public static function setUpBeforeClass() {
// reset backend
diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php
new file mode 100644
index 00000000000..a75e1860527
--- /dev/null
+++ b/apps/files_sharing/tests/cache.php
@@ -0,0 +1,249 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Vincent Petry, Bjoern Schiessle
+ * @copyright 2014 Vincent Petry <pvince81@owncloud.com>
+ * 2014 Bjoern Schiessle <schiessle@owncloud.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+require_once __DIR__ . '/base.php';
+
+class Test_Files_Sharing_Cache extends Test_Files_Sharing_Base {
+
+ /**
+ * @var OC_FilesystemView
+ */
+ public $user2View;
+
+ function setUp() {
+ parent::setUp();
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $this->user2View = new \OC\Files\View('/'. self::TEST_FILES_SHARING_API_USER2 . '/files');
+
+ // prepare user1's dir structure
+ $this->view->mkdir('container');
+ $this->view->mkdir('container/shareddir');
+ $this->view->mkdir('container/shareddir/subdir');
+ $this->view->mkdir('container/shareddir/emptydir');
+
+ $textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ $this->view->file_put_contents('container/not shared.txt', $textData);
+ $this->view->file_put_contents('container/shared single file.txt', $textData);
+ $this->view->file_put_contents('container/shareddir/bar.txt', $textData);
+ $this->view->file_put_contents('container/shareddir/subdir/another.txt', $textData);
+ $this->view->file_put_contents('container/shareddir/subdir/another too.txt', $textData);
+ $this->view->file_put_contents('container/shareddir/subdir/not a text file.xml', '<xml></xml>');
+
+ list($this->ownerStorage, $internalPath) = $this->view->resolvePath('');
+ $this->ownerCache = $this->ownerStorage->getCache();
+ $this->ownerStorage->getScanner()->scan('');
+
+ // share "shareddir" with user2
+ $fileinfo = $this->view->getFileInfo('container/shareddir');
+ \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ self::TEST_FILES_SHARING_API_USER2, 31);
+
+ $fileinfo = $this->view->getFileInfo('container/shared single file.txt');
+ \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ self::TEST_FILES_SHARING_API_USER2, 31);
+
+ // login as user2
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ // retrieve the shared storage
+ $secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2);
+ list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/Shared/shareddir');
+ $this->sharedCache = $this->sharedStorage->getCache();
+ }
+
+ function tearDown() {
+ $this->sharedCache->clear();
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileinfo = $this->view->getFileInfo('container/shareddir');
+ \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ self::TEST_FILES_SHARING_API_USER2);
+
+ $fileinfo = $this->view->getFileInfo('container/shared single file.txt');
+ \OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ self::TEST_FILES_SHARING_API_USER2);
+
+ $this->view->deleteAll('container');
+
+ $this->ownerCache->clear();
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test searching by mime type
+ */
+ function testSearchByMime() {
+ $results = $this->sharedStorage->getCache()->searchByMime('text');
+ $check = array(
+ array(
+ 'name' => 'shared single file.txt',
+ 'path' => 'shared single file.txt'
+ ),
+ array(
+ 'name' => 'bar.txt',
+ 'path' => 'shareddir/bar.txt'
+ ),
+ array(
+ 'name' => 'another too.txt',
+ 'path' => 'shareddir/subdir/another too.txt'
+ ),
+ array(
+ 'name' => 'another.txt',
+ 'path' => 'shareddir/subdir/another.txt'
+ ),
+ );
+ $this->verifyFiles($check, $results);
+
+ $results2 = $this->sharedStorage->getCache()->searchByMime('text/plain');
+
+ $this->verifyFiles($check, $results);
+ }
+
+ function testGetFolderContentsInRoot() {
+ $results = $this->user2View->getDirectoryContent('/Shared/');
+
+ $this->verifyFiles(
+ array(
+ array(
+ 'name' => 'shareddir',
+ 'path' => '/shareddir',
+ 'mimetype' => 'httpd/unix-directory',
+ 'usersPath' => 'files/Shared/shareddir'
+ ),
+ array(
+ 'name' => 'shared single file.txt',
+ 'path' => '/shared single file.txt',
+ 'mimetype' => 'text/plain',
+ 'usersPath' => 'files/Shared/shared single file.txt'
+ ),
+ ),
+ $results
+ );
+ }
+
+ function testGetFolderContentsInSubdir() {
+ $results = $this->user2View->getDirectoryContent('/Shared/shareddir');
+
+ $this->verifyFiles(
+ array(
+ array(
+ 'name' => 'bar.txt',
+ 'path' => 'files/container/shareddir/bar.txt',
+ 'mimetype' => 'text/plain',
+ 'usersPath' => 'files/Shared/shareddir/bar.txt'
+ ),
+ array(
+ 'name' => 'emptydir',
+ 'path' => 'files/container/shareddir/emptydir',
+ 'mimetype' => 'httpd/unix-directory',
+ 'usersPath' => 'files/Shared/shareddir/emptydir'
+ ),
+ array(
+ 'name' => 'subdir',
+ 'path' => 'files/container/shareddir/subdir',
+ 'mimetype' => 'httpd/unix-directory',
+ 'usersPath' => 'files/Shared/shareddir/subdir'
+ ),
+ ),
+ $results
+ );
+ }
+
+ function testGetFolderContentsWhenSubSubdirShared() {
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ $fileinfo = $this->view->getFileInfo('container/shareddir/subdir');
+ \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ self::TEST_FILES_SHARING_API_USER3, 31);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
+
+ $thirdView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
+ $results = $thirdView->getDirectoryContent('/Shared/subdir');
+
+ $this->verifyFiles(
+ array(
+ array(
+ 'name' => 'another too.txt',
+ 'path' => 'files/container/shareddir/subdir/another too.txt',
+ 'mimetype' => 'text/plain',
+ 'usersPath' => 'files/Shared/subdir/another too.txt'
+ ),
+ array(
+ 'name' => 'another.txt',
+ 'path' => 'files/container/shareddir/subdir/another.txt',
+ 'mimetype' => 'text/plain',
+ 'usersPath' => 'files/Shared/subdir/another.txt'
+ ),
+ array(
+ 'name' => 'not a text file.xml',
+ 'path' => 'files/container/shareddir/subdir/not a text file.xml',
+ 'mimetype' => 'application/xml',
+ 'usersPath' => 'files/Shared/subdir/not a text file.xml'
+ ),
+ ),
+ $results
+ );
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
+ self::TEST_FILES_SHARING_API_USER3);
+ }
+
+ /**
+ * Check if 'results' contains the expected 'examples' only.
+ *
+ * @param array $examples array of example files
+ * @param array $results array of files
+ */
+ private function verifyFiles($examples, $results) {
+ $this->assertEquals(count($examples), count($results));
+
+ foreach ($examples as $example) {
+ foreach ($results as $key => $result) {
+ if ($result['name'] === $example['name']) {
+ $this->verifyKeys($example, $result);
+ unset($results[$key]);
+ break;
+ }
+ }
+ }
+ $this->assertTrue(empty($results));
+ }
+
+ /**
+ * @brief verify if each value from the result matches the expected result
+ * @param array $example array with the expected results
+ * @param array $result array with the results
+ */
+ private function verifyKeys($example, $result) {
+ foreach ($example as $key => $value) {
+ $this->assertEquals($value, $result[$key]);
+ }
+ }
+
+}
diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php
index 1a9a54cbcf8..5ab716e829f 100644
--- a/apps/files_sharing/tests/watcher.php
+++ b/apps/files_sharing/tests/watcher.php
@@ -145,6 +145,7 @@ class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
/**
* Returns the sizes of the path and its parent dirs in a hash
* where the key is the path and the value is the size.
+ * @param string $path
*/
function getOwnerDirSizes($path) {
$result = array();
diff --git a/apps/files_trashbin/ajax/delete.php b/apps/files_trashbin/ajax/delete.php
index 75d481768ad..ebabc5bc7a2 100644
--- a/apps/files_trashbin/ajax/delete.php
+++ b/apps/files_trashbin/ajax/delete.php
@@ -2,42 +2,38 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
+$folder = isset($_POST['dir']) ? $_POST['dir'] : '/';
// "empty trash" command
if (isset($_POST['allfiles']) and $_POST['allfiles'] === 'true'){
$deleteAll = true;
- $folder = isset($_POST['dir']) ? $_POST['dir'] : '/';
if ($folder === '/' || $folder === '') {
OCA\Files_Trashbin\Trashbin::deleteAll();
$list = array();
} else {
- $dirname = dirname($folder);
- if ( $dirname !== '/' && $dirname !== '.' ) {
- $dirlisting = '1';
- } else {
- $dirlisting = '0';
- }
$list[] = $folder;
+ $folder = dirname($folder);
}
}
else {
$deleteAll = false;
$files = $_POST['files'];
- $dirlisting = $_POST['dirlisting'];
$list = json_decode($files);
}
+
+$folder = rtrim($folder, '/') . '/';
$error = array();
$success = array();
$i = 0;
foreach ($list as $file) {
- if ( $dirlisting === '0') {
+ if ($folder === '/') {
$file = ltrim($file, '/');
$delimiter = strrpos($file, '.d');
$filename = substr($file, 0, $delimiter);
$timestamp = substr($file, $delimiter+2);
} else {
- $filename = $file;
+ $filename = $folder . '/' . $file;
$timestamp = null;
}
diff --git a/apps/files_trashbin/ajax/list.php b/apps/files_trashbin/ajax/list.php
index 1ade4c7933d..cec18c46525 100644
--- a/apps/files_trashbin/ajax/list.php
+++ b/apps/files_trashbin/ajax/list.php
@@ -20,9 +20,9 @@ if($doBreadcrumb) {
}
// make filelist
-$files = \OCA\Files_Trashbin\Helper::getTrashFiles($dir);
-
-if ($files === null){
+try {
+ $files = \OCA\Files_Trashbin\Helper::getTrashFiles($dir);
+} catch (Exception $e) {
header("HTTP/1.0 404 Not Found");
exit();
}
diff --git a/apps/files_trashbin/ajax/preview.php b/apps/files_trashbin/ajax/preview.php
index 44738734b19..ce64d9ecc9f 100644
--- a/apps/files_trashbin/ajax/preview.php
+++ b/apps/files_trashbin/ajax/preview.php
@@ -11,7 +11,7 @@ if(!\OC_App::isEnabled('files_trashbin')){
exit;
}
-$file = array_key_exists('file', $_GET) ? (string) urldecode($_GET['file']) : '';
+$file = array_key_exists('file', $_GET) ? (string) $_GET['file'] : '';
$maxX = array_key_exists('x', $_GET) ? (int) $_GET['x'] : '44';
$maxY = array_key_exists('y', $_GET) ? (int) $_GET['y'] : '44';
$scalingUp = array_key_exists('scalingup', $_GET) ? (bool) $_GET['scalingup'] : true;
diff --git a/apps/files_trashbin/ajax/undelete.php b/apps/files_trashbin/ajax/undelete.php
index 876ad269a70..9c3ccba7ed8 100644
--- a/apps/files_trashbin/ajax/undelete.php
+++ b/apps/files_trashbin/ajax/undelete.php
@@ -4,15 +4,36 @@ OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
$files = $_POST['files'];
-$dirlisting = $_POST['dirlisting'];
-$list = json_decode($files);
+$dir = '/';
+if (isset($_POST['dir'])) {
+ $dir = rtrim($_POST['dir'], '/'). '/';
+}
+$allFiles = false;
+if (isset($_POST['allfiles']) and $_POST['allfiles'] === 'true') {
+ $allFiles = true;
+ $list = array();
+ $dirListing = true;
+ if ($dir === '' || $dir === '/') {
+ $dirListing = false;
+ }
+ foreach (OCA\Files_Trashbin\Helper::getTrashFiles($dir) as $file) {
+ $fileName = $file['name'];
+ if (!$dirListing) {
+ $fileName .= '.d' . $file['timestamp'];
+ }
+ $list[] = $fileName;
+ }
+} else {
+ $list = json_decode($files);
+}
$error = array();
$success = array();
$i = 0;
foreach ($list as $file) {
- if ( $dirlisting === '0') {
+ $path = $dir . '/' . $file;
+ if ($dir === '/') {
$file = ltrim($file, '/');
$delimiter = strrpos($file, '.d');
$filename = substr($file, 0, $delimiter);
@@ -23,9 +44,9 @@ foreach ($list as $file) {
$timestamp = null;
}
- if ( !OCA\Files_Trashbin\Trashbin::restore($file, $filename, $timestamp) ) {
+ if ( !OCA\Files_Trashbin\Trashbin::restore($path, $filename, $timestamp) ) {
$error[] = $filename;
- OC_Log::write('trashbin','can\'t restore ' . $filename, OC_Log::ERROR);
+ OC_Log::write('trashbin', 'can\'t restore ' . $filename, OC_Log::ERROR);
} else {
$success[$i]['filename'] = $file;
$success[$i]['timestamp'] = $timestamp;
diff --git a/apps/files_trashbin/appinfo/database.xml b/apps/files_trashbin/appinfo/database.xml
index d08c3469b02..db104ee9298 100644
--- a/apps/files_trashbin/appinfo/database.xml
+++ b/apps/files_trashbin/appinfo/database.xml
@@ -49,7 +49,7 @@
<name>type</name>
<type>text</type>
<default></default>
- <notnull>true</notnull>
+ <notnull>false</notnull>
<length>4</length>
</field>
@@ -57,7 +57,7 @@
<name>mime</name>
<type>text</type>
<default></default>
- <notnull>true</notnull>
+ <notnull>false</notnull>
<length>255</length>
</field>
diff --git a/apps/files_trashbin/appinfo/update.php b/apps/files_trashbin/appinfo/update.php
index 0ca232668d7..ca7b87a8681 100644
--- a/apps/files_trashbin/appinfo/update.php
+++ b/apps/files_trashbin/appinfo/update.php
@@ -2,7 +2,7 @@
$installedVersion=OCP\Config::getAppValue('files_trashbin', 'installed_version');
-if (version_compare($installedVersion, '0.4', '<')) {
+if (version_compare($installedVersion, '0.6', '<')) {
//size of the trash bin could be incorrect, remove it for all users to
//enforce a recalculation during next usage.
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trashsize`');
diff --git a/apps/files_trashbin/appinfo/version b/apps/files_trashbin/appinfo/version
index 2eb3c4fe4ee..5a2a5806df6 100644
--- a/apps/files_trashbin/appinfo/version
+++ b/apps/files_trashbin/appinfo/version
@@ -1 +1 @@
-0.5
+0.6
diff --git a/apps/files_trashbin/index.php b/apps/files_trashbin/index.php
index 93f385dd30b..f0c5b0508b8 100644
--- a/apps/files_trashbin/index.php
+++ b/apps/files_trashbin/index.php
@@ -37,19 +37,18 @@ if ($isIE8 && isset($_GET['dir'])){
$ajaxLoad = false;
if (!$isIE8){
- $files = \OCA\Files_Trashbin\Helper::getTrashFiles($dir);
+ try {
+ $files = \OCA\Files_Trashbin\Helper::getTrashFiles($dir);
+ } catch (Exception $e) {
+ header('Location: ' . OCP\Util::linkTo('files_trashbin', 'index.php'));
+ exit();
+ }
}
else{
$files = array();
$ajaxLoad = true;
}
-// Redirect if directory does not exist
-if ($files === null){
- header('Location: ' . OCP\Util::linkTo('files_trashbin', 'index.php'));
- exit();
-}
-
$dirlisting = false;
if ($dir && $dir !== '/') {
$dirlisting = true;
diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js
index f42abb6d029..a88459b0a9a 100644
--- a/apps/files_trashbin/js/filelist.js
+++ b/apps/files_trashbin/js/filelist.js
@@ -1,3 +1,4 @@
+/* globals OC, FileList, t */
// override reload with own ajax call
FileList.reload = function(){
FileList.showMask();
@@ -17,7 +18,36 @@ FileList.reload = function(){
FileList.reloadCallback(result);
}
});
-}
+};
+
+FileList.appName = t('files_trashbin', 'Deleted files');
+
+FileList._deletedRegExp = new RegExp(/^(.+)\.d[0-9]+$/);
+
+/**
+ * Convert a file name in the format filename.d12345 to the real file name.
+ * This will use basename.
+ * The name will not be changed if it has no ".d12345" suffix.
+ * @param name file name
+ * @return converted file name
+ */
+FileList.getDeletedFileName = function(name) {
+ name = OC.basename(name);
+ var match = FileList._deletedRegExp.exec(name);
+ if (match && match.length > 1) {
+ name = match[1];
+ }
+ return name;
+};
+var oldSetCurrentDir = FileList.setCurrentDir;
+FileList.setCurrentDir = function(targetDir) {
+ oldSetCurrentDir.apply(this, arguments);
+
+ var baseDir = OC.basename(targetDir);
+ if (baseDir !== '') {
+ FileList.setPageTitle(FileList.getDeletedFileName(baseDir));
+ }
+};
FileList.linkTo = function(dir){
return OC.linkTo('files_trashbin', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
diff --git a/apps/files_trashbin/js/trash.js b/apps/files_trashbin/js/trash.js
index 46d8b56308c..6aade210505 100644
--- a/apps/files_trashbin/js/trash.js
+++ b/apps/files_trashbin/js/trash.js
@@ -1,5 +1,29 @@
+/*
+ * Copyright (c) 2014
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+/* global OC, t, FileList, FileActions */
$(document).ready(function() {
+ function removeCallback(result) {
+ if (result.status !== 'success') {
+ OC.dialogs.alert(result.data.message, t('core', 'Error'));
+ }
+
+ var files = result.data.success;
+ for (var i = 0; i < files.length; i++) {
+ FileList.findFileEl(OC.basename(files[i].filename)).remove();
+ }
+ FileList.updateFileSummary();
+ FileList.updateEmptyContent();
+ enableActions();
+ }
if (typeof FileActions !== 'undefined') {
FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename) {
@@ -7,22 +31,12 @@ $(document).ready(function() {
var deleteAction = tr.children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
disableActions();
- $.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'),
- {files: JSON.stringify([$('#dir').val() + '/' + filename]), dirlisting: tr.attr('data-dirlisting')},
- function(result) {
- for (var i = 0; i < result.data.success.length; i++) {
- var row = document.getElementById(result.data.success[i].filename);
- row.parentNode.removeChild(row);
- }
- if (result.status !== 'success') {
- OC.dialogs.alert(result.data.message, t('core', 'Error'));
- }
- enableActions();
- FileList.updateFileSummary();
- FileList.updateEmptyContent();
- }
+ $.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'), {
+ files: JSON.stringify([filename]),
+ dir: FileList.getCurrentDirectory()
+ },
+ removeCallback
);
-
});
};
@@ -34,22 +48,12 @@ $(document).ready(function() {
var deleteAction = tr.children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
disableActions();
- $.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'),
- {files: JSON.stringify([$('#dir').val() + '/' +filename]), dirlisting: tr.attr('data-dirlisting')},
- function(result) {
- for (var i = 0; i < result.data.success.length; i++) {
- var row = document.getElementById(result.data.success[i].filename);
- row.parentNode.removeChild(row);
- }
- if (result.status !== 'success') {
- OC.dialogs.alert(result.data.message, t('core', 'Error'));
- }
- enableActions();
- FileList.updateFileSummary();
- FileList.updateEmptyContent();
- }
+ $.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'), {
+ files: JSON.stringify([filename]),
+ dir: FileList.getCurrentDirectory()
+ },
+ removeCallback
);
-
});
// Sets the select_all checkbox behaviour :
@@ -68,29 +72,45 @@ $(document).ready(function() {
$('.undelete').click('click', function(event) {
event.preventDefault();
- var files = getSelectedFiles('file');
- var fileslist = JSON.stringify(files);
- var dirlisting = getSelectedFiles('dirlisting')[0];
+ var allFiles = $('#select_all').is(':checked');
+ var files = [];
+ var params = {};
disableActions();
- for (var i = 0; i < files.length; i++) {
- var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
- deleteAction.removeClass('delete-icon').addClass('progress-icon');
+ if (allFiles) {
+ FileList.showMask();
+ params = {
+ allfiles: true,
+ dir: FileList.getCurrentDirectory()
+ };
+ }
+ else {
+ files = getSelectedFiles('name');
+ for (var i = 0; i < files.length; i++) {
+ var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
+ deleteAction.removeClass('delete-icon').addClass('progress-icon');
+ }
+ params = {
+ files: JSON.stringify(files),
+ dir: FileList.getCurrentDirectory()
+ };
}
$.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'),
- {files: fileslist, dirlisting: dirlisting},
- function(result) {
- for (var i = 0; i < result.data.success.length; i++) {
- var row = document.getElementById(result.data.success[i].filename);
- row.parentNode.removeChild(row);
- }
+ params,
+ function(result) {
+ if (allFiles) {
if (result.status !== 'success') {
OC.dialogs.alert(result.data.message, t('core', 'Error'));
}
+ FileList.hideMask();
+ // simply remove all files
+ FileList.update('');
enableActions();
- FileList.updateFileSummary();
- FileList.updateEmptyContent();
}
+ else {
+ removeCallback(result);
+ }
+ }
);
});
@@ -101,17 +121,17 @@ $(document).ready(function() {
var params = {};
if (allFiles) {
params = {
- allfiles: true,
- dir: $('#dir').val()
+ allfiles: true,
+ dir: FileList.getCurrentDirectory()
};
}
else {
- files = getSelectedFiles('file');
+ files = getSelectedFiles('name');
params = {
files: JSON.stringify(files),
- dirlisting: getSelectedFiles('dirlisting')[0]
+ dir: FileList.getCurrentDirectory()
};
- };
+ }
disableActions();
if (allFiles) {
@@ -128,22 +148,17 @@ $(document).ready(function() {
params,
function(result) {
if (allFiles) {
+ if (result.status !== 'success') {
+ OC.dialogs.alert(result.data.message, t('core', 'Error'));
+ }
FileList.hideMask();
// simply remove all files
- $('#fileList').empty();
+ FileList.update('');
+ enableActions();
}
else {
- for (var i = 0; i < result.data.success.length; i++) {
- var row = document.getElementById(result.data.success[i].filename);
- row.parentNode.removeChild(row);
- }
+ removeCallback(result);
}
- if (result.status !== 'success') {
- OC.dialogs.alert(result.data.message, t('core', 'Error'));
- }
- enableActions();
- FileList.updateFileSummary();
- FileList.updateEmptyContent();
}
);
@@ -208,11 +223,9 @@ function getSelectedFiles(property){
var files=[];
elements.each(function(i,element){
var file={
- name:$(element).attr('data-filename'),
- file:$('#dir').val() + "/" + $(element).attr('data-file'),
+ name:$(element).attr('data-file'),
timestamp:$(element).attr('data-timestamp'),
- type:$(element).attr('data-type'),
- dirlisting:$(element).attr('data-dirlisting')
+ type:$(element).attr('data-type')
};
if(property){
files.push(file[property]);
diff --git a/apps/files_trashbin/l10n/ar.php b/apps/files_trashbin/l10n/ar.php
index 9733e6b100e..68c51d1cc7d 100644
--- a/apps/files_trashbin/l10n/ar.php
+++ b/apps/files_trashbin/l10n/ar.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "تعذّر حذف%s بشكل دائم",
"Couldn't restore %s" => "تعذّر استرجاع %s ",
+"Deleted files" => "حذف الملفات",
"Error" => "خطأ",
"Nothing in here. Your trash bin is empty!" => "لا يوجد شيء هنا. سلة المهملات خاليه.",
"Name" => "اسم",
diff --git a/apps/files_trashbin/l10n/ca.php b/apps/files_trashbin/l10n/ca.php
index fa3f63ddb22..c99b414c7a8 100644
--- a/apps/files_trashbin/l10n/ca.php
+++ b/apps/files_trashbin/l10n/ca.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "No s'ha pogut esborrar permanentment %s",
"Couldn't restore %s" => "No s'ha pogut restaurar %s",
+"Deleted files" => "Fitxers esborrats",
"Error" => "Error",
"restored" => "restaurat",
"Nothing in here. Your trash bin is empty!" => "La paperera està buida!",
diff --git a/apps/files_trashbin/l10n/cs_CZ.php b/apps/files_trashbin/l10n/cs_CZ.php
index ff0a69572f5..e0c46c5137d 100644
--- a/apps/files_trashbin/l10n/cs_CZ.php
+++ b/apps/files_trashbin/l10n/cs_CZ.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nelze trvale odstranit %s",
"Couldn't restore %s" => "Nelze obnovit %s",
+"Deleted files" => "Odstraněné soubory",
"Error" => "Chyba",
"restored" => "obnoveno",
"Nothing in here. Your trash bin is empty!" => "Žádný obsah. Váš koš je prázdný.",
diff --git a/apps/files_trashbin/l10n/cy_GB.php b/apps/files_trashbin/l10n/cy_GB.php
index f2eb81d67d2..bc8a318733b 100644
--- a/apps/files_trashbin/l10n/cy_GB.php
+++ b/apps/files_trashbin/l10n/cy_GB.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Methwyd dileu %s yn barhaol",
"Couldn't restore %s" => "Methwyd adfer %s",
+"Deleted files" => "Ffeiliau ddilewyd",
"Error" => "Gwall",
"Nothing in here. Your trash bin is empty!" => "Does dim byd yma. Mae eich bin sbwriel yn wag!",
"Name" => "Enw",
diff --git a/apps/files_trashbin/l10n/da.php b/apps/files_trashbin/l10n/da.php
index c396706d152..831ba6067da 100644
--- a/apps/files_trashbin/l10n/da.php
+++ b/apps/files_trashbin/l10n/da.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Kunne ikke slette %s permanent",
"Couldn't restore %s" => "Kunne ikke gendanne %s",
+"Deleted files" => "Slettede filer",
"Error" => "Fejl",
"restored" => "Gendannet",
"Nothing in here. Your trash bin is empty!" => "Intet at se her. Din papirkurv er tom!",
diff --git a/apps/files_trashbin/l10n/de.php b/apps/files_trashbin/l10n/de.php
index 2b6703dd058..fd00b4c433f 100644
--- a/apps/files_trashbin/l10n/de.php
+++ b/apps/files_trashbin/l10n/de.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Konnte %s nicht dauerhaft löschen",
"Couldn't restore %s" => "Konnte %s nicht wiederherstellen",
+"Deleted files" => "Gelöschte Dateien",
"Error" => "Fehler",
"restored" => "Wiederhergestellt",
"Nothing in here. Your trash bin is empty!" => "Nichts zu löschen, der Papierkorb ist leer!",
diff --git a/apps/files_trashbin/l10n/de_AT.php b/apps/files_trashbin/l10n/de_AT.php
index 0acad00e8b5..afa3eff001c 100644
--- a/apps/files_trashbin/l10n/de_AT.php
+++ b/apps/files_trashbin/l10n/de_AT.php
@@ -1,6 +1,5 @@
<?php
$TRANSLATIONS = array(
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("","")
+"Delete" => "Löschen"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/de_CH.php b/apps/files_trashbin/l10n/de_CH.php
index ec9f0b5309d..665be5d5ee7 100644
--- a/apps/files_trashbin/l10n/de_CH.php
+++ b/apps/files_trashbin/l10n/de_CH.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Konnte %s nicht dauerhaft löschen",
"Couldn't restore %s" => "Konnte %s nicht wiederherstellen",
+"Deleted files" => "Gelöschte Dateien",
"Error" => "Fehler",
"restored" => "Wiederhergestellt",
"Nothing in here. Your trash bin is empty!" => "Nichts zu löschen, Ihr Papierkorb ist leer!",
diff --git a/apps/files_trashbin/l10n/de_DE.php b/apps/files_trashbin/l10n/de_DE.php
index ec9f0b5309d..665be5d5ee7 100644
--- a/apps/files_trashbin/l10n/de_DE.php
+++ b/apps/files_trashbin/l10n/de_DE.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Konnte %s nicht dauerhaft löschen",
"Couldn't restore %s" => "Konnte %s nicht wiederherstellen",
+"Deleted files" => "Gelöschte Dateien",
"Error" => "Fehler",
"restored" => "Wiederhergestellt",
"Nothing in here. Your trash bin is empty!" => "Nichts zu löschen, Ihr Papierkorb ist leer!",
diff --git a/apps/files_trashbin/l10n/el.php b/apps/files_trashbin/l10n/el.php
index b4ee30c578d..567958de900 100644
--- a/apps/files_trashbin/l10n/el.php
+++ b/apps/files_trashbin/l10n/el.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Αδύνατη η μόνιμη διαγραφή του %s",
"Couldn't restore %s" => "Αδυναμία επαναφοράς %s",
+"Deleted files" => "Διαγραμμένα αρχεία",
"Error" => "Σφάλμα",
"restored" => "επαναφέρθηκαν",
"Nothing in here. Your trash bin is empty!" => "Δεν υπάρχει τίποτα εδώ. Ο κάδος σας είναι άδειος!",
diff --git a/apps/files_trashbin/l10n/en_GB.php b/apps/files_trashbin/l10n/en_GB.php
index 6b179c86532..04abf2d6f23 100644
--- a/apps/files_trashbin/l10n/en_GB.php
+++ b/apps/files_trashbin/l10n/en_GB.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Couldn't delete %s permanently",
"Couldn't restore %s" => "Couldn't restore %s",
+"Deleted files" => "Deleted files",
"Error" => "Error",
"restored" => "restored",
"Nothing in here. Your trash bin is empty!" => "Nothing in here. Your recycle bin is empty!",
diff --git a/apps/files_trashbin/l10n/eo.php b/apps/files_trashbin/l10n/eo.php
index b8f999eaafa..b3248406f52 100644
--- a/apps/files_trashbin/l10n/eo.php
+++ b/apps/files_trashbin/l10n/eo.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Ne povis foriĝi %s por ĉiam",
"Couldn't restore %s" => "Ne povis restaŭriĝi %s",
+"Deleted files" => "Forigitaj dosieroj",
"Error" => "Eraro",
"restored" => "restaŭrita",
"Nothing in here. Your trash bin is empty!" => "Nenio estas ĉi tie. Via rubujo malplenas!",
diff --git a/apps/files_trashbin/l10n/es.php b/apps/files_trashbin/l10n/es.php
index db7a617729b..79f122ad35b 100644
--- a/apps/files_trashbin/l10n/es.php
+++ b/apps/files_trashbin/l10n/es.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "No se puede eliminar %s permanentemente",
"Couldn't restore %s" => "No se puede restaurar %s",
+"Deleted files" => "Archivos eliminados",
"Error" => "Error",
"restored" => "recuperado",
"Nothing in here. Your trash bin is empty!" => "No hay nada aquí. ¡Tu papelera esta vacía!",
diff --git a/apps/files_trashbin/l10n/es_AR.php b/apps/files_trashbin/l10n/es_AR.php
index 842101d33be..50b337b8144 100644
--- a/apps/files_trashbin/l10n/es_AR.php
+++ b/apps/files_trashbin/l10n/es_AR.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "No fue posible borrar %s de manera permanente",
"Couldn't restore %s" => "No se pudo restaurar %s",
+"Deleted files" => "Archivos borrados",
"Error" => "Error",
"restored" => "recuperado",
"Nothing in here. Your trash bin is empty!" => "No hay nada acá. ¡La papelera está vacía!",
diff --git a/apps/files_trashbin/l10n/es_CL.php b/apps/files_trashbin/l10n/es_CL.php
new file mode 100644
index 00000000000..45584ff7c42
--- /dev/null
+++ b/apps/files_trashbin/l10n/es_CL.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Error" => "Error"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/es_MX.php b/apps/files_trashbin/l10n/es_MX.php
index db7a617729b..79f122ad35b 100644
--- a/apps/files_trashbin/l10n/es_MX.php
+++ b/apps/files_trashbin/l10n/es_MX.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "No se puede eliminar %s permanentemente",
"Couldn't restore %s" => "No se puede restaurar %s",
+"Deleted files" => "Archivos eliminados",
"Error" => "Error",
"restored" => "recuperado",
"Nothing in here. Your trash bin is empty!" => "No hay nada aquí. ¡Tu papelera esta vacía!",
diff --git a/apps/files_trashbin/l10n/et_EE.php b/apps/files_trashbin/l10n/et_EE.php
index 56eebc79f0b..69ed5cee767 100644
--- a/apps/files_trashbin/l10n/et_EE.php
+++ b/apps/files_trashbin/l10n/et_EE.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "%s jäädavalt kustutamine ebaõnnestus",
"Couldn't restore %s" => "%s ei saa taastada",
+"Deleted files" => "Kustutatud failid",
"Error" => "Viga",
"restored" => "taastatud",
"Nothing in here. Your trash bin is empty!" => "Siin pole midagi. Sinu prügikast on tühi!",
diff --git a/apps/files_trashbin/l10n/eu.php b/apps/files_trashbin/l10n/eu.php
index 04d92e01b36..648aaaf7383 100644
--- a/apps/files_trashbin/l10n/eu.php
+++ b/apps/files_trashbin/l10n/eu.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Ezin izan da %s betirako ezabatu",
"Couldn't restore %s" => "Ezin izan da %s berreskuratu",
+"Deleted files" => "Ezabatutako fitxategiak",
"Error" => "Errorea",
"restored" => "Berrezarrita",
"Nothing in here. Your trash bin is empty!" => "Ez dago ezer ez. Zure zakarrontzia hutsik dago!",
diff --git a/apps/files_trashbin/l10n/eu_ES.php b/apps/files_trashbin/l10n/eu_ES.php
new file mode 100644
index 00000000000..8612c8609bb
--- /dev/null
+++ b/apps/files_trashbin/l10n/eu_ES.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Delete" => "Ezabatu"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/fa.php b/apps/files_trashbin/l10n/fa.php
index 8409987b897..40cdec8a484 100644
--- a/apps/files_trashbin/l10n/fa.php
+++ b/apps/files_trashbin/l10n/fa.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "%s را نمی توان برای همیشه حذف کرد",
"Couldn't restore %s" => "%s را نمی توان بازگرداند",
+"Deleted files" => "فایل های حذف شده",
"Error" => "خطا",
"Nothing in here. Your trash bin is empty!" => "هیچ چیزی اینجا نیست. سطل زباله ی شما خالی است.",
"Name" => "نام",
diff --git a/apps/files_trashbin/l10n/fi_FI.php b/apps/files_trashbin/l10n/fi_FI.php
index b956c1c1e4c..e7b62dbb437 100644
--- a/apps/files_trashbin/l10n/fi_FI.php
+++ b/apps/files_trashbin/l10n/fi_FI.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Kohdetta %s ei voitu poistaa pysyvästi",
"Couldn't restore %s" => "Kohteen %s palautus epäonnistui",
+"Deleted files" => "Poistetut tiedostot",
"Error" => "Virhe",
"restored" => "palautettu",
"Nothing in here. Your trash bin is empty!" => "Tyhjää täynnä! Roskakorissa ei ole mitään.",
diff --git a/apps/files_trashbin/l10n/fr.php b/apps/files_trashbin/l10n/fr.php
index 593310e2c32..9e74657fc10 100644
--- a/apps/files_trashbin/l10n/fr.php
+++ b/apps/files_trashbin/l10n/fr.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Impossible d'effacer %s de façon permanente",
"Couldn't restore %s" => "Impossible de restaurer %s",
+"Deleted files" => "Fichiers supprimés",
"Error" => "Erreur",
"restored" => "restauré",
"Nothing in here. Your trash bin is empty!" => "Il n'y a rien ici. Votre corbeille est vide !",
diff --git a/apps/files_trashbin/l10n/gl.php b/apps/files_trashbin/l10n/gl.php
index ae7ef8b319b..bf26936be0b 100644
--- a/apps/files_trashbin/l10n/gl.php
+++ b/apps/files_trashbin/l10n/gl.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Non foi posíbel eliminar %s permanente",
"Couldn't restore %s" => "Non foi posíbel restaurar %s",
+"Deleted files" => "Ficheiros eliminados",
"Error" => "Erro",
"restored" => "restaurado",
"Nothing in here. Your trash bin is empty!" => "Aquí non hai nada. O cesto do lixo está baleiro!",
diff --git a/apps/files_trashbin/l10n/he.php b/apps/files_trashbin/l10n/he.php
index d0bcb327d4a..6d2d184bec2 100644
--- a/apps/files_trashbin/l10n/he.php
+++ b/apps/files_trashbin/l10n/he.php
@@ -2,7 +2,9 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "לא ניתן למחוק את %s לצמיתות",
"Couldn't restore %s" => "לא ניתן לשחזר את %s",
+"Deleted files" => "קבצים שנמחקו",
"Error" => "שגיאה",
+"restored" => "שוחזר",
"Nothing in here. Your trash bin is empty!" => "אין כאן שום דבר. סל המיחזור שלך ריק!",
"Name" => "שם",
"Restore" => "שחזור",
diff --git a/apps/files_trashbin/l10n/hu_HU.php b/apps/files_trashbin/l10n/hu_HU.php
index aa8b45a7d65..69a2f5d5d45 100644
--- a/apps/files_trashbin/l10n/hu_HU.php
+++ b/apps/files_trashbin/l10n/hu_HU.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nem sikerült %s végleges törlése",
"Couldn't restore %s" => "Nem sikerült %s visszaállítása",
+"Deleted files" => "Törölt fájlok",
"Error" => "Hiba",
"restored" => "visszaállítva",
"Nothing in here. Your trash bin is empty!" => "Itt nincs semmi. Az Ön szemetes mappája üres!",
diff --git a/apps/files_trashbin/l10n/id.php b/apps/files_trashbin/l10n/id.php
index a55520fc117..11e1675074c 100644
--- a/apps/files_trashbin/l10n/id.php
+++ b/apps/files_trashbin/l10n/id.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Tidak dapat menghapus permanen %s",
"Couldn't restore %s" => "Tidak dapat memulihkan %s",
+"Deleted files" => "Berkas yang dihapus",
"Error" => "Galat",
"Nothing in here. Your trash bin is empty!" => "Tempat sampah anda kosong!",
"Name" => "Nama",
diff --git a/apps/files_trashbin/l10n/it.php b/apps/files_trashbin/l10n/it.php
index b631e0c9e4f..739dda24564 100644
--- a/apps/files_trashbin/l10n/it.php
+++ b/apps/files_trashbin/l10n/it.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Impossibile eliminare %s definitivamente",
"Couldn't restore %s" => "Impossibile ripristinare %s",
+"Deleted files" => "File eliminati",
"Error" => "Errore",
"restored" => "ripristinati",
"Nothing in here. Your trash bin is empty!" => "Qui non c'è niente. Il tuo cestino è vuoto.",
diff --git a/apps/files_trashbin/l10n/ja.php b/apps/files_trashbin/l10n/ja.php
new file mode 100644
index 00000000000..0aab7d05754
--- /dev/null
+++ b/apps/files_trashbin/l10n/ja.php
@@ -0,0 +1,15 @@
+<?php
+$TRANSLATIONS = array(
+"Couldn't delete %s permanently" => "%s を完全に削除できませんでした",
+"Couldn't restore %s" => "%s を復元できませんでした",
+"Deleted files" => "ゴミ箱",
+"Error" => "エラー",
+"restored" => "復元済",
+"Nothing in here. Your trash bin is empty!" => "ここには何もありません。ゴミ箱は空です!",
+"Name" => "名前",
+"Restore" => "復元",
+"Deleted" => "削除済み",
+"Delete" => "削除",
+"Deleted Files" => "ゴミ箱"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/ja_JP.php b/apps/files_trashbin/l10n/ja_JP.php
index 8d896625b52..0aab7d05754 100644
--- a/apps/files_trashbin/l10n/ja_JP.php
+++ b/apps/files_trashbin/l10n/ja_JP.php
@@ -1,7 +1,8 @@
<?php
$TRANSLATIONS = array(
-"Couldn't delete %s permanently" => "%s を完全に削除出来ませんでした",
-"Couldn't restore %s" => "%s を復元出来ませんでした",
+"Couldn't delete %s permanently" => "%s を完全に削除できませんでした",
+"Couldn't restore %s" => "%s を復元できませんでした",
+"Deleted files" => "ゴミ箱",
"Error" => "エラー",
"restored" => "復元済",
"Nothing in here. Your trash bin is empty!" => "ここには何もありません。ゴミ箱は空です!",
diff --git a/apps/files_trashbin/l10n/ka_GE.php b/apps/files_trashbin/l10n/ka_GE.php
index 7440171deef..f36bbea59bc 100644
--- a/apps/files_trashbin/l10n/ka_GE.php
+++ b/apps/files_trashbin/l10n/ka_GE.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "ფაილი %s–ის სრულად წაშლა ვერ მოხერხდა",
"Couldn't restore %s" => "%s–ის აღდგენა ვერ მოხერხდა",
+"Deleted files" => "წაშლილი ფაილები",
"Error" => "შეცდომა",
"Nothing in here. Your trash bin is empty!" => "აქ არაფერი არ არის. სანაგვე ყუთი ცარიელია!",
"Name" => "სახელი",
diff --git a/apps/files_trashbin/l10n/km.php b/apps/files_trashbin/l10n/km.php
index f7d9faa38c5..1df805de2d6 100644
--- a/apps/files_trashbin/l10n/km.php
+++ b/apps/files_trashbin/l10n/km.php
@@ -1,5 +1,8 @@
<?php
$TRANSLATIONS = array(
+"Error" => "កំហុស",
+"Name" => "ឈ្មោះ",
+"Restore" => "ស្ដារ​មក​វិញ",
"Delete" => "លុប"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/l10n/ko.php b/apps/files_trashbin/l10n/ko.php
index 9c3cd2de15f..f95d1432451 100644
--- a/apps/files_trashbin/l10n/ko.php
+++ b/apps/files_trashbin/l10n/ko.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "%s을(를_ 영구적으로 삭제할 수 없습니다",
"Couldn't restore %s" => "%s을(를) 복원할 수 없습니다",
+"Deleted files" => "삭제된 파일",
"Error" => "오류",
"restored" => "복원됨",
"Nothing in here. Your trash bin is empty!" => "휴지통이 비어 있습니다!",
diff --git a/apps/files_trashbin/l10n/lt_LT.php b/apps/files_trashbin/l10n/lt_LT.php
index c4a8463fd0e..07325665d78 100644
--- a/apps/files_trashbin/l10n/lt_LT.php
+++ b/apps/files_trashbin/l10n/lt_LT.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nepavyko negrįžtamai ištrinti %s",
"Couldn't restore %s" => "Nepavyko atkurti %s",
+"Deleted files" => "Ištrinti failai",
"Error" => "Klaida",
"restored" => "atstatyta",
"Nothing in here. Your trash bin is empty!" => "Nieko nėra. Jūsų šiukšliadėžė tuščia!",
diff --git a/apps/files_trashbin/l10n/lv.php b/apps/files_trashbin/l10n/lv.php
index 5c04a0c97d1..d356b344377 100644
--- a/apps/files_trashbin/l10n/lv.php
+++ b/apps/files_trashbin/l10n/lv.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nevarēja pilnībā izdzēst %s",
"Couldn't restore %s" => "Nevarēja atjaunot %s",
+"Deleted files" => "Dzēstās datnes",
"Error" => "Kļūda",
"restored" => "atjaunots",
"Nothing in here. Your trash bin is empty!" => "Šeit nekā nav. Jūsu miskaste ir tukša!",
diff --git a/apps/files_trashbin/l10n/mk.php b/apps/files_trashbin/l10n/mk.php
index 06a9dcfb241..f025a13db1a 100644
--- a/apps/files_trashbin/l10n/mk.php
+++ b/apps/files_trashbin/l10n/mk.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Не можеше трајно да се избрише %s",
"Couldn't restore %s" => "Не можеше да се поврати %s",
+"Deleted files" => "Избришани датотеки",
"Error" => "Грешка",
"restored" => "повратени",
"Nothing in here. Your trash bin is empty!" => "Тука нема ништо. Вашата корпа за отпадоци е празна!",
diff --git a/apps/files_trashbin/l10n/nb_NO.php b/apps/files_trashbin/l10n/nb_NO.php
index eb917e3dde6..66e61ee72a1 100644
--- a/apps/files_trashbin/l10n/nb_NO.php
+++ b/apps/files_trashbin/l10n/nb_NO.php
@@ -2,12 +2,14 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Kunne ikke slette %s fullstendig",
"Couldn't restore %s" => "Kunne ikke gjenopprette %s",
+"Deleted files" => "Slettede filer",
"Error" => "Feil",
+"restored" => "gjenopprettet",
"Nothing in here. Your trash bin is empty!" => "Ingenting her. Søppelkassen din er tom!",
"Name" => "Navn",
"Restore" => "Gjenopprett",
"Deleted" => "Slettet",
"Delete" => "Slett",
-"Deleted Files" => "Slettet filer"
+"Deleted Files" => "Slettede filer"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_trashbin/l10n/nl.php b/apps/files_trashbin/l10n/nl.php
index 37a8ca65409..533571fd9e1 100644
--- a/apps/files_trashbin/l10n/nl.php
+++ b/apps/files_trashbin/l10n/nl.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Kon %s niet permanent verwijderen",
"Couldn't restore %s" => "Kon %s niet herstellen",
+"Deleted files" => "Verwijderde bestanden",
"Error" => "Fout",
"restored" => "hersteld",
"Nothing in here. Your trash bin is empty!" => "Niets te vinden. Uw prullenbak is leeg!",
diff --git a/apps/files_trashbin/l10n/nn_NO.php b/apps/files_trashbin/l10n/nn_NO.php
index 39e2d5cda91..9282d9d49d4 100644
--- a/apps/files_trashbin/l10n/nn_NO.php
+++ b/apps/files_trashbin/l10n/nn_NO.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Klarte ikkje sletta %s for godt",
"Couldn't restore %s" => "Klarte ikkje gjenoppretta %s",
+"Deleted files" => "Sletta filer",
"Error" => "Feil",
"restored" => "gjenoppretta",
"Nothing in here. Your trash bin is empty!" => "Ingenting her. Papirkorga di er tom!",
diff --git a/apps/files_trashbin/l10n/pl.php b/apps/files_trashbin/l10n/pl.php
index 961b7727824..5075dad271a 100644
--- a/apps/files_trashbin/l10n/pl.php
+++ b/apps/files_trashbin/l10n/pl.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nie można trwale usunąć %s",
"Couldn't restore %s" => "Nie można przywrócić %s",
+"Deleted files" => "Pliki usunięte",
"Error" => "Błąd",
"restored" => "przywrócony",
"Nothing in here. Your trash bin is empty!" => "Nic tu nie ma. Twój kosz jest pusty!",
diff --git a/apps/files_trashbin/l10n/pt_BR.php b/apps/files_trashbin/l10n/pt_BR.php
index c2100efe96e..300235452b4 100644
--- a/apps/files_trashbin/l10n/pt_BR.php
+++ b/apps/files_trashbin/l10n/pt_BR.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Não foi possível excluir %s permanentemente",
"Couldn't restore %s" => "Não foi possível restaurar %s",
+"Deleted files" => "Arquivos apagados",
"Error" => "Erro",
"restored" => "restaurado",
"Nothing in here. Your trash bin is empty!" => "Nada aqui. Sua lixeira está vazia!",
diff --git a/apps/files_trashbin/l10n/pt_PT.php b/apps/files_trashbin/l10n/pt_PT.php
index 89e84a84d28..69f83e8a0e4 100644
--- a/apps/files_trashbin/l10n/pt_PT.php
+++ b/apps/files_trashbin/l10n/pt_PT.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Não foi possível eliminar %s de forma permanente",
"Couldn't restore %s" => "Não foi possível restaurar %s",
+"Deleted files" => "Ficheiros eliminados",
"Error" => "Erro",
"restored" => "Restaurado",
"Nothing in here. Your trash bin is empty!" => "Não hà ficheiros. O lixo está vazio!",
diff --git a/apps/files_trashbin/l10n/ro.php b/apps/files_trashbin/l10n/ro.php
index f285dcc164e..b00f37615f8 100644
--- a/apps/files_trashbin/l10n/ro.php
+++ b/apps/files_trashbin/l10n/ro.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Deleted files" => "Sterge fisierele",
"Error" => "Eroare",
"Name" => "Nume",
"Delete" => "Șterge"
diff --git a/apps/files_trashbin/l10n/ru.php b/apps/files_trashbin/l10n/ru.php
index 06a4f864c67..3210ad7290b 100644
--- a/apps/files_trashbin/l10n/ru.php
+++ b/apps/files_trashbin/l10n/ru.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "%s не может быть удалён навсегда",
"Couldn't restore %s" => "%s не может быть восстановлен",
+"Deleted files" => "Удалённые файлы",
"Error" => "Ошибка",
"restored" => "восстановлен",
"Nothing in here. Your trash bin is empty!" => "Здесь ничего нет. Ваша корзина пуста!",
diff --git a/apps/files_trashbin/l10n/sk_SK.php b/apps/files_trashbin/l10n/sk_SK.php
index b23383c1214..6bb39bb89dd 100644
--- a/apps/files_trashbin/l10n/sk_SK.php
+++ b/apps/files_trashbin/l10n/sk_SK.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nemožno zmazať %s navždy",
"Couldn't restore %s" => "Nemožno obnoviť %s",
+"Deleted files" => "Zmazané súbory",
"Error" => "Chyba",
"restored" => "obnovené",
"Nothing in here. Your trash bin is empty!" => "Žiadny obsah. Kôš je prázdny!",
diff --git a/apps/files_trashbin/l10n/sl.php b/apps/files_trashbin/l10n/sl.php
index 9f164ae709c..ca69c8d2784 100644
--- a/apps/files_trashbin/l10n/sl.php
+++ b/apps/files_trashbin/l10n/sl.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Datoteke %s ni mogoče trajno izbrisati.",
"Couldn't restore %s" => "Ni mogoče obnoviti %s",
+"Deleted files" => "Izbrisane datoteke",
"Error" => "Napaka",
"restored" => "obnovljeno",
"Nothing in here. Your trash bin is empty!" => "Mapa smeti je prazna.",
diff --git a/apps/files_trashbin/l10n/sq.php b/apps/files_trashbin/l10n/sq.php
index 63957080f37..10354e45408 100644
--- a/apps/files_trashbin/l10n/sq.php
+++ b/apps/files_trashbin/l10n/sq.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Nuk munda ta eliminoj përfundimisht %s",
"Couldn't restore %s" => "Nuk munda ta rivendos %s",
+"Deleted files" => "Skedarë të fshirë ",
"Error" => "Veprim i gabuar",
"restored" => "rivendosur",
"Nothing in here. Your trash bin is empty!" => "Këtu nuk ka asgjë. Koshi juaj është bosh!",
diff --git a/apps/files_trashbin/l10n/sr.php b/apps/files_trashbin/l10n/sr.php
index c893dba118b..7fb4c85ab63 100644
--- a/apps/files_trashbin/l10n/sr.php
+++ b/apps/files_trashbin/l10n/sr.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Deleted files" => "Обрисане датотеке",
"Error" => "Грешка",
"Nothing in here. Your trash bin is empty!" => "Овде нема ништа. Корпа за отпатке је празна.",
"Name" => "Име",
diff --git a/apps/files_trashbin/l10n/sv.php b/apps/files_trashbin/l10n/sv.php
index 21d4d15e9cc..ec9de3acaa2 100644
--- a/apps/files_trashbin/l10n/sv.php
+++ b/apps/files_trashbin/l10n/sv.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Kunde inte radera %s permanent",
"Couldn't restore %s" => "Kunde inte återställa %s",
+"Deleted files" => "Raderade filer",
"Error" => "Fel",
"restored" => "återställd",
"Nothing in here. Your trash bin is empty!" => "Ingenting här. Din papperskorg är tom!",
diff --git a/apps/files_trashbin/l10n/tr.php b/apps/files_trashbin/l10n/tr.php
index 00a3b4d32a5..c1234cdfb0c 100644
--- a/apps/files_trashbin/l10n/tr.php
+++ b/apps/files_trashbin/l10n/tr.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "%s alıcı olarak silinemedi",
"Couldn't restore %s" => "%s eri yüklenemedi",
+"Deleted files" => "Silinmiş dosyalar",
"Error" => "Hata",
"restored" => "geri yüklendi",
"Nothing in here. Your trash bin is empty!" => "Burada hiçbir şey yok. Çöp kutunuz tamamen boş!",
diff --git a/apps/files_trashbin/l10n/ug.php b/apps/files_trashbin/l10n/ug.php
index 54c040c88a7..f52f28db49b 100644
--- a/apps/files_trashbin/l10n/ug.php
+++ b/apps/files_trashbin/l10n/ug.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Deleted files" => "ئۆچۈرۈلگەن ھۆججەتلەر",
"Error" => "خاتالىق",
"Nothing in here. Your trash bin is empty!" => "بۇ جايدا ھېچنېمە يوق. Your trash bin is empty!",
"Name" => "ئاتى",
diff --git a/apps/files_trashbin/l10n/uk.php b/apps/files_trashbin/l10n/uk.php
index c54d45aaa82..19d4bda97c7 100644
--- a/apps/files_trashbin/l10n/uk.php
+++ b/apps/files_trashbin/l10n/uk.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Неможливо видалити %s назавжди",
"Couldn't restore %s" => "Неможливо відновити %s",
+"Deleted files" => "Видалено файлів",
"Error" => "Помилка",
"restored" => "відновлено",
"Nothing in here. Your trash bin is empty!" => "Нічого немає. Ваший кошик для сміття пустий!",
diff --git a/apps/files_trashbin/l10n/vi.php b/apps/files_trashbin/l10n/vi.php
index c5e899392bf..81a0cf14bcc 100644
--- a/apps/files_trashbin/l10n/vi.php
+++ b/apps/files_trashbin/l10n/vi.php
@@ -1,8 +1,10 @@
<?php
$TRANSLATIONS = array(
-"Couldn't delete %s permanently" => "Không thể óa %s vĩnh viễn",
+"Couldn't delete %s permanently" => "Không thể xóa %s vĩnh viễn",
"Couldn't restore %s" => "Không thể khôi phục %s",
+"Deleted files" => "File đã bị xóa",
"Error" => "Lỗi",
+"restored" => "khôi phục",
"Nothing in here. Your trash bin is empty!" => "Không có gì ở đây. Thùng rác của bạn rỗng!",
"Name" => "Tên",
"Restore" => "Khôi phục",
diff --git a/apps/files_trashbin/l10n/zh_CN.php b/apps/files_trashbin/l10n/zh_CN.php
index 24d9002adcb..4c61aef33b1 100644
--- a/apps/files_trashbin/l10n/zh_CN.php
+++ b/apps/files_trashbin/l10n/zh_CN.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "无法彻底删除文件%s",
"Couldn't restore %s" => "无法恢复%s",
+"Deleted files" => "已删除文件",
"Error" => "错误",
"restored" => "已恢复",
"Nothing in here. Your trash bin is empty!" => "这里没有东西. 你的回收站是空的!",
diff --git a/apps/files_trashbin/l10n/zh_TW.php b/apps/files_trashbin/l10n/zh_TW.php
index 1f05a2687b6..65b954e2c63 100644
--- a/apps/files_trashbin/l10n/zh_TW.php
+++ b/apps/files_trashbin/l10n/zh_TW.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "無法永久刪除 %s",
"Couldn't restore %s" => "無法還原 %s",
+"Deleted files" => "回收桶",
"Error" => "錯誤",
"restored" => "已還原",
"Nothing in here. Your trash bin is empty!" => "您的回收桶是空的!",
diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php
index c454b35a5f2..9c24332a964 100644
--- a/apps/files_trashbin/lib/helper.php
+++ b/apps/files_trashbin/lib/helper.php
@@ -2,55 +2,67 @@
namespace OCA\Files_Trashbin;
+use OC\Files\FileInfo;
+
class Helper
{
/**
* Retrieves the contents of a trash bin directory.
* @param string $dir path to the directory inside the trashbin
* or empty to retrieve the root of the trashbin
- * @return array of files
+ * @return \OCP\Files\FileInfo[]
*/
public static function getTrashFiles($dir){
$result = array();
+ $timestamp = null;
$user = \OCP\User::getUser();
- if ($dir && $dir !== '/') {
- $view = new \OC_Filesystemview('/'.$user.'/files_trashbin/files');
- $dirContent = $view->opendir($dir);
- if ($dirContent === false){
- return null;
- }
- if(is_resource($dirContent)){
- while(($entryName = readdir($dirContent)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($entryName)) {
- $pos = strpos($dir.'/', '/', 1);
- $tmp = substr($dir, 0, $pos);
- $pos = strrpos($tmp, '.d');
- $timestamp = substr($tmp, $pos+2);
- $result[] = array(
- 'id' => $entryName,
- 'timestamp' => $timestamp,
- 'mime' => $view->getMimeType($dir.'/'.$entryName),
- 'type' => $view->is_dir($dir.'/'.$entryName) ? 'dir' : 'file',
- 'location' => $dir,
- );
+ $view = new \OC_Filesystemview('/' . $user . '/files_trashbin/files');
+
+ if (ltrim($dir, '/') !== '' && !$view->is_dir($dir)) {
+ throw new \Exception('Directory does not exists');
+ }
+
+ $dirContent = $view->opendir($dir);
+ if ($dirContent === false) {
+ return $result;
+ }
+ if (is_resource($dirContent)) {
+ while (($entryName = readdir($dirContent)) !== false) {
+ if (!\OC\Files\Filesystem::isIgnoredDir($entryName)) {
+ $id = $entryName;
+ if ($dir === '' || $dir === '/') {
+ $pathparts = pathinfo($entryName);
+ $timestamp = substr($pathparts['extension'], 1);
+ $id = $pathparts['filename'];
+ } else if ($timestamp === null) {
+ // for subfolders we need to calculate the timestamp only once
+ $parts = explode('/', ltrim($dir, '/'));
+ $timestamp = substr(pathinfo($parts[0], PATHINFO_EXTENSION), 1);
}
+ $result[] = array(
+ 'id' => $id,
+ 'timestamp' => $timestamp,
+ 'mime' => \OC_Helper::getFileNameMimeType($id),
+ 'type' => $view->is_dir($dir . '/' . $entryName) ? 'dir' : 'file',
+ 'location' => $dir,
+ );
}
- closedir($dirContent);
}
- } else {
- $query = \OC_DB::prepare('SELECT `id`,`location`,`timestamp`,`type`,`mime` FROM `*PREFIX*files_trash` WHERE `user` = ?');
- $result = $query->execute(array($user))->fetchAll();
+ closedir($dirContent);
}
$files = array();
$id = 0;
+ list($storage, $internalPath) = $view->resolvePath($dir);
+ $absoluteDir = $view->getAbsolutePath($dir);
foreach ($result as $r) {
$i = array();
$i['id'] = $id++;
$i['name'] = $r['id'];
$i['date'] = \OCP\Util::formatDate($r['timestamp']);
$i['timestamp'] = $r['timestamp'];
+ $i['etag'] = $r['timestamp']; // add fake etag, it is only needed to identify the preview image
$i['mimetype'] = $r['mime'];
$i['type'] = $r['type'];
if ($i['type'] === 'file') {
@@ -63,9 +75,13 @@ class Helper
$i['directory'] = '';
}
$i['permissions'] = \OCP\PERMISSION_READ;
- $i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
+ if (\OCP\App::isEnabled('files_encryption')) {
+ $i['isPreviewAvailable'] = false;
+ } else {
+ $i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
+ }
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
- $files[] = $i;
+ $files[] = new FileInfo($absoluteDir . '/' . $i['name'], $storage, $internalPath . '/' . $i['name'], $i);
}
usort($files, array('\OCA\Files\Helper', 'fileCmp'));
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index 7544980e071..7e91f8a59ff 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -61,7 +61,14 @@ class Trashbin {
}
- private static function copyFilesToOwner($sourcePath, $owner, $ownerPath, $timestamp, $type, $mime) {
+ /**
+ * @brief copy file to owners trash
+ * @param string $sourcePath
+ * @param string $owner
+ * @param string $ownerPath
+ * @param integer $timestamp
+ */
+ private static function copyFilesToOwner($sourcePath, $owner, $ownerPath, $timestamp) {
self::setUpTrash($owner);
$ownerFilename = basename($ownerPath);
@@ -77,12 +84,10 @@ class Trashbin {
if ($view->file_exists($target)) {
- $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`type`,`mime`,`user`) VALUES (?,?,?,?,?,?)");
- $result = $query->execute(array($ownerFilename, $timestamp, $ownerLocation, $type, $mime, $owner));
- if (!$result) { // if file couldn't be added to the database than also don't store it in the trash bin.
- $view->deleteAll($owner.'/files_trashbin/files/' . $ownerFilename . '.d' . $timestamp);
+ $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)");
+ $result = $query->execute(array($ownerFilename, $timestamp, $ownerLocation, $owner));
+ if (!$result) {
\OC_Log::write('files_trashbin', 'trash bin database couldn\'t be updated for the files owner', \OC_log::ERROR);
- return;
}
}
}
@@ -105,18 +110,8 @@ class Trashbin {
$filename = $path_parts['basename'];
$location = $path_parts['dirname'];
$timestamp = time();
- $mime = $view->getMimeType('files' . $file_path);
-
- if ($view->is_dir('files' . $file_path)) {
- $type = 'dir';
- } else {
- $type = 'file';
- }
$userTrashSize = self::getTrashbinSize($user);
- if ($userTrashSize === false || $userTrashSize < 0) {
- $userTrashSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
// disable proxy to prevent recursive calls
$proxyStatus = \OC_FileProxy::$enabled;
@@ -127,12 +122,10 @@ class Trashbin {
if ($view->file_exists('files_trashbin/files/' . $filename . '.d' . $timestamp)) {
$size = $sizeOfAddedFiles;
- $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`type`,`mime`,`user`) VALUES (?,?,?,?,?,?)");
- $result = $query->execute(array($filename, $timestamp, $location, $type, $mime, $user));
- if (!$result) { // if file couldn't be added to the database than also don't store it in the trash bin.
- $view->deleteAll('files_trashbin/files/' . $filename . '.d' . $timestamp);
+ $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)");
+ $result = $query->execute(array($filename, $timestamp, $location, $user));
+ if (!$result) {
\OC_Log::write('files_trashbin', 'trash bin database couldn\'t be updated', \OC_log::ERROR);
- return;
}
\OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_moveToTrash', array('filePath' => \OC\Files\Filesystem::normalizePath($file_path),
'trashPath' => \OC\Files\Filesystem::normalizePath($filename . '.d' . $timestamp)));
@@ -142,7 +135,7 @@ class Trashbin {
// if owner !== user we need to also add a copy to the owners trash
if ($user !== $owner) {
- self::copyFilesToOwner($file_path, $owner, $ownerPath, $timestamp, $type, $mime);
+ self::copyFilesToOwner($file_path, $owner, $ownerPath, $timestamp);
}
} else {
\OC_Log::write('files_trashbin', 'Couldn\'t move ' . $file_path . ' to the trash bin', \OC_log::ERROR);
@@ -150,17 +143,12 @@ class Trashbin {
$userTrashSize += $size;
$userTrashSize -= self::expire($userTrashSize, $user);
- self::setTrashbinSize($user, $userTrashSize);
// if owner !== user we also need to update the owners trash size
if($owner !== $user) {
$ownerTrashSize = self::getTrashbinSize($owner);
- if ($ownerTrashSize === false || $ownerTrashSize < 0) {
- $ownerTrashSize = self::calculateSize(new \OC\Files\View('/' . $owner . '/files_trashbin'));
- }
$ownerTrashSize += $size;
$ownerTrashSize -= self::expire($ownerTrashSize, $owner);
- self::setTrashbinSize($owner, $ownerTrashSize);
}
}
@@ -169,7 +157,7 @@ class Trashbin {
*
* @param $file_path path to original file
* @param $filename of deleted file
- * @param $timestamp when the file was deleted
+ * @param integer $timestamp when the file was deleted
*
* @return size of stored versions
*/
@@ -214,7 +202,7 @@ class Trashbin {
*
* @param $file_path path to original file
* @param $filename of deleted file
- * @param $timestamp when the file was deleted
+ * @param integer $timestamp when the file was deleted
*
* @return size of encryption keys
*/
@@ -321,33 +309,22 @@ class Trashbin {
$user = \OCP\User::getUser();
$view = new \OC\Files\View('/' . $user);
- $trashbinSize = self::getTrashbinSize($user);
- if ($trashbinSize === false || $trashbinSize < 0) {
- $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
+ $location = '';
if ($timestamp) {
- $query = \OC_DB::prepare('SELECT `location`,`type` FROM `*PREFIX*files_trash`'
- . ' WHERE `user`=? AND `id`=? AND `timestamp`=?');
+ $query = \OC_DB::prepare('SELECT `location` FROM `*PREFIX*files_trash`'
+ . ' WHERE `user`=? AND `id`=? AND `timestamp`=?');
$result = $query->execute(array($user, $filename, $timestamp))->fetchAll();
if (count($result) !== 1) {
\OC_Log::write('files_trashbin', 'trash bin database inconsistent!', \OC_Log::ERROR);
- return false;
- }
-
- // if location no longer exists, restore file in the root directory
- $location = $result[0]['location'];
- if ($result[0]['location'] !== '/' &&
- (!$view->is_dir('files' . $result[0]['location']) ||
- !$view->isUpdatable('files' . $result[0]['location']))) {
- $location = '';
+ } else {
+ $location = $result[0]['location'];
+ // if location no longer exists, restore file in the root directory
+ if ($location !== '/' &&
+ (!$view->is_dir('files' . $location) ||
+ !$view->isUpdatable('files' . $location))) {
+ $location = '';
+ }
}
- } else {
- $path_parts = pathinfo($file);
- $result[] = array(
- 'location' => $path_parts['dirname'],
- 'type' => $view->is_dir('/files_trashbin/files/' . $file) ? 'dir' : 'files',
- );
- $location = '';
}
// we need a extension in case a file/dir with the same name already exists
@@ -372,22 +349,15 @@ class Trashbin {
$view->chroot($fakeRoot);
\OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', array('filePath' => \OC\Files\Filesystem::normalizePath('/' . $location . '/' . $uniqueFilename),
'trashPath' => \OC\Files\Filesystem::normalizePath($file)));
- if ($view->is_dir($target)) {
- $trashbinSize -= self::calculateSize(new \OC\Files\View('/' . $user . '/' . $target));
- } else {
- $trashbinSize -= $view->filesize($target);
- }
- $trashbinSize -= self::restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp);
- $trashbinSize -= self::restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp);
+ self::restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp);
+ self::restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp);
if ($timestamp) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?');
$query->execute(array($user, $filename, $timestamp));
}
- self::setTrashbinSize($user, $trashbinSize);
-
// enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
@@ -406,14 +376,12 @@ class Trashbin {
* @param \OC\Files\View $view file view
* @param $file complete path to file
* @param $filename name of file once it was deleted
- * @param $uniqueFilename new file name to restore the file without overwriting existing files
+ * @param string $uniqueFilename new file name to restore the file without overwriting existing files
* @param $location location if file
* @param $timestamp deleteion time
*
- * @return size of restored versions
*/
private static function restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp) {
- $size = 0;
if (\OCP\App::isEnabled('files_versions')) {
// disable proxy to prevent recursive calls
@@ -434,15 +402,12 @@ class Trashbin {
}
if ($view->is_dir('/files_trashbin/versions/' . $file)) {
- $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . 'files_trashbin/versions/' . $file));
$rootView->rename(\OC\Files\Filesystem::normalizePath($user . '/files_trashbin/versions/' . $file), \OC\Files\Filesystem::normalizePath($owner . '/files_versions/' . $ownerPath));
} else if ($versions = self::getVersionsFromTrash($versionedFile, $timestamp)) {
foreach ($versions as $v) {
if ($timestamp) {
- $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp);
$rootView->rename($user . '/files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp, $owner . '/files_versions/' . $ownerPath . '.v' . $v);
} else {
- $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v);
$rootView->rename($user . '/files_trashbin/versions/' . $versionedFile . '.v' . $v, $owner . '/files_versions/' . $ownerPath . '.v' . $v);
}
}
@@ -451,7 +416,6 @@ class Trashbin {
// enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
}
- return $size;
}
/**
@@ -460,15 +424,13 @@ class Trashbin {
* @param \OC\Files\View $view
* @param $file complete path to file
* @param $filename name of file
- * @param $uniqueFilename new file name to restore the file without overwriting existing files
+ * @param string $uniqueFilename new file name to restore the file without overwriting existing files
* @param $location location of file
* @param $timestamp deleteion time
*
- * @return size of restored encrypted file
*/
private static function restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp) {
// Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!)
- $size = 0;
if (\OCP\App::isEnabled('files_encryption')) {
$user = \OCP\User::getUser();
$rootView = new \OC\Files\View('/');
@@ -513,18 +475,15 @@ class Trashbin {
if ($rootView->is_dir($keyfile)) {
// handle keyfiles
- $size += self::calculateSize(new \OC\Files\View($keyfile));
$rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath);
// handle share-keys
if ($timestamp) {
$sharekey .= '.d' . $timestamp;
}
- $size += self::calculateSize(new \OC\Files\View($sharekey));
$rootView->rename($sharekey, $baseDir . '/share-keys/' . $ownerPath);
} else {
// handle keyfiles
- $size += $rootView->filesize($keyfile);
$rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath . '.key');
// handle share-keys
@@ -533,8 +492,6 @@ class Trashbin {
$ownerShareKey .= '.d' . $timestamp;
}
- $size += $rootView->filesize($ownerShareKey);
-
// move only owners key
$rootView->rename($ownerShareKey, $baseDir . '/share-keys/' . $ownerPath . '.' . $user . '.shareKey');
@@ -561,7 +518,6 @@ class Trashbin {
// enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
}
- return $size;
}
/**
@@ -571,7 +527,6 @@ class Trashbin {
$user = \OCP\User::getUser();
$view = new \OC\Files\View('/' . $user);
$view->deleteAll('files_trashbin');
- self::setTrashbinSize($user, 0);
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=?');
$query->execute(array($user));
@@ -592,11 +547,6 @@ class Trashbin {
$view = new \OC\Files\View('/' . $user);
$size = 0;
- $trashbinSize = self::getTrashbinSize($user);
- if ($trashbinSize === false || $trashbinSize < 0) {
- $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
-
if ($timestamp) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?');
$query->execute(array($user, $filename, $timestamp));
@@ -613,14 +563,16 @@ class Trashbin {
} else {
$size += $view->filesize('/files_trashbin/files/' . $file);
}
+ \OC_Hook::emit('\OCP\Trashbin', 'preDelete', array('path' => '/files_trashbin/files/' . $file));
$view->unlink('/files_trashbin/files/' . $file);
\OC_Hook::emit('\OCP\Trashbin', 'delete', array('path' => '/files_trashbin/files/' . $file));
- $trashbinSize -= $size;
- self::setTrashbinSize($user, $trashbinSize);
return $size;
}
+ /**
+ * @param \OC\Files\View $view
+ */
private static function deleteVersions($view, $file, $filename, $timestamp) {
$size = 0;
if (\OCP\App::isEnabled('files_versions')) {
@@ -643,6 +595,9 @@ class Trashbin {
return $size;
}
+ /**
+ * @param \OC\Files\View $view
+ */
private static function deleteEncryptionKeys($view, $file, $filename, $timestamp) {
$size = 0;
if (\OCP\App::isEnabled('files_encryption')) {
@@ -713,7 +668,7 @@ class Trashbin {
/**
* calculate remaining free space for trash bin
*
- * @param $trashbinSize current size of the trash bin
+ * @param integer $trashbinSize current size of the trash bin
* @return available free space for trash bin
*/
private static function calculateFreeSpace($trashbinSize) {
@@ -722,7 +677,7 @@ class Trashbin {
$quota = \OC_Preferences::getValue($user, 'files', 'quota');
$view = new \OC\Files\View('/' . $user);
if ($quota === null || $quota === 'default') {
- $quota = \OC_Appconfig::getValue('files', 'default_quota');
+ $quota = \OC::$server->getAppConfig()->getValue('files', 'default_quota');
}
if ($quota === null || $quota === 'none') {
$quota = \OC\Files\Filesystem::free_space('/');
@@ -756,17 +711,10 @@ class Trashbin {
$size = self::getTrashbinSize($user);
- if ($size === false || $size < 0) {
- $size = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
-
$freeSpace = self::calculateFreeSpace($size);
if ($freeSpace < 0) {
- $newSize = $size - self::expire($size, $user);
- if ($newSize !== $size) {
- self::setTrashbinSize($user, $newSize);
- }
+ self::expire($size, $user);
}
}
@@ -826,9 +774,9 @@ class Trashbin {
/**
* recursive copy to copy a whole directory
*
- * @param $source source path, relative to the users files directory
- * @param $destination destination path relative to the users root directoy
- * @param $view file view for the users root directory
+ * @param string $source source path, relative to the users files directory
+ * @param string $destination destination path relative to the users root directoy
+ * @param \OC\Files\View $view file view for the users root directory
*/
private static function copy_recursive($source, $destination, $view) {
$size = 0;
@@ -887,7 +835,7 @@ class Trashbin {
* find unique extension for restored file if a file with the same name already exists
* @param $location where the file should be restored
* @param $filename name of the file
- * @param $view filesystem view relative to users root directory
+ * @param \OC\Files\View $view filesystem view relative to users root directory
* @return string with unique extension
*/
private static function getUniqueFilename($location, $filename, $view) {
@@ -916,8 +864,8 @@ class Trashbin {
/**
* @brief get the size from a given root folder
- * @param $view file view on the root folder
- * @return size of the folder
+ * @param \OC\Files\View $view file view on the root folder
+ * @return integer size of the folder
*/
private static function calculateSize($view) {
$root = \OCP\Config::getSystemValue('datadirectory') . $view->getAbsolutePath('');
@@ -943,28 +891,9 @@ class Trashbin {
* @return mixed trash bin size or false if no trash bin size is stored
*/
private static function getTrashbinSize($user) {
- $query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*files_trashsize` WHERE `user`=?');
- $result = $query->execute(array($user))->fetchAll();
-
- if ($result) {
- return (int)$result[0]['size'];
- }
- return false;
- }
-
- /**
- * write to the database how much space is in use for the trash bin
- *
- * @param $user owner of the trash bin
- * @param $size size of the trash bin
- */
- private static function setTrashbinSize($user, $size) {
- if (self::getTrashbinSize($user) === false) {
- $query = \OC_DB::prepare('INSERT INTO `*PREFIX*files_trashsize` (`size`, `user`) VALUES (?, ?)');
- } else {
- $query = \OC_DB::prepare('UPDATE `*PREFIX*files_trashsize` SET `size`=? WHERE `user`=?');
- }
- $query->execute(array($size, $user));
+ $view = new \OC\Files\View('/' . $user);
+ $fileInfo = $view->getFileInfo('/files_trashbin');
+ return $fileInfo['size'];
}
/**
@@ -996,6 +925,6 @@ class Trashbin {
}
public static function preview_icon($path) {
- return \OC_Helper::linkToRoute( 'core_ajax_trashbin_preview', array('x' => 36, 'y' => 36, 'file' => urlencode($path) ));
+ return \OC_Helper::linkToRoute( 'core_ajax_trashbin_preview', array('x' => 36, 'y' => 36, 'file' => $path ));
}
}
diff --git a/apps/files_versions/l10n/ja.php b/apps/files_versions/l10n/ja.php
new file mode 100644
index 00000000000..ec2601aafbd
--- /dev/null
+++ b/apps/files_versions/l10n/ja.php
@@ -0,0 +1,10 @@
+<?php
+$TRANSLATIONS = array(
+"Could not revert: %s" => "元に戻せませんでした: %s",
+"Versions" => "バージョン",
+"Failed to revert {file} to revision {timestamp}." => "{file} を {timestamp} のリヴィジョンに戻すことができません。",
+"More versions..." => "もっと他のバージョン...",
+"No other versions available" => "利用可能な他のバージョンはありません",
+"Restore" => "復元"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_versions/l10n/km.php b/apps/files_versions/l10n/km.php
new file mode 100644
index 00000000000..3673d002a7c
--- /dev/null
+++ b/apps/files_versions/l10n/km.php
@@ -0,0 +1,10 @@
+<?php
+$TRANSLATIONS = array(
+"Could not revert: %s" => "មិន​អាច​ត្រឡប់៖ %s",
+"Versions" => "កំណែ",
+"Failed to revert {file} to revision {timestamp}." => "មិន​អាច​ត្រឡប់ {file} ទៅ​កំណែ​សម្រួល {timestamp} បាន​ទេ។",
+"More versions..." => "កំណែ​ច្រើន​ទៀត...",
+"No other versions available" => "មិន​មាន​កំណែ​ផ្សេង​ទៀត​ទេ",
+"Restore" => "ស្ដារ​មក​វិញ"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_versions/l10n/nb_NO.php b/apps/files_versions/l10n/nb_NO.php
index 2a0a6d8a76d..4c0c8c65bac 100644
--- a/apps/files_versions/l10n/nb_NO.php
+++ b/apps/files_versions/l10n/nb_NO.php
@@ -1,6 +1,10 @@
<?php
$TRANSLATIONS = array(
+"Could not revert: %s" => "Klarte ikke å tilbakeføre: %s",
"Versions" => "Versjoner",
+"Failed to revert {file} to revision {timestamp}." => "Klarte ikke å tilbakeføre {file} til revisjon {timestamp}.",
+"More versions..." => "Flere versjoner",
+"No other versions available" => "Det finnes ingen andre versjoner",
"Restore" => "Gjenopprett"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/l10n/sq.php b/apps/files_versions/l10n/sq.php
index 5a7a23a217f..e8a0e797485 100644
--- a/apps/files_versions/l10n/sq.php
+++ b/apps/files_versions/l10n/sq.php
@@ -1,5 +1,10 @@
<?php
$TRANSLATIONS = array(
+"Could not revert: %s" => "Nuk mund të ktheje: %s",
+"Versions" => "Versioni",
+"Failed to revert {file} to revision {timestamp}." => "Dështoi në ktheje {skedar} të rishikimit {kohëstampe}.",
+"More versions..." => "Versione m'shumë...",
+"No other versions available" => "Nuk ka versione të tjera në dispozicion",
"Restore" => "Rivendos"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/l10n/vi.php b/apps/files_versions/l10n/vi.php
index 9d72612c2ad..a6f515ed0ad 100644
--- a/apps/files_versions/l10n/vi.php
+++ b/apps/files_versions/l10n/vi.php
@@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "Không thể khôi phục: %s",
"Versions" => "Phiên bản",
+"Failed to revert {file} to revision {timestamp}." => "Thất bại khi trở lại {file} khi sử đổi {timestamp}.",
+"More versions..." => "Nhiều phiên bản ...",
+"No other versions available" => "Không có các phiên bản khác có sẵn",
"Restore" => "Khôi phục"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_versions/l10n/zh_CN.php b/apps/files_versions/l10n/zh_CN.php
index 767ca1cf646..279ec2eff82 100644
--- a/apps/files_versions/l10n/zh_CN.php
+++ b/apps/files_versions/l10n/zh_CN.php
@@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "无法恢复: %s",
"Versions" => "版本",
+"Failed to revert {file} to revision {timestamp}." => "无法恢复 {file} 到 {timestamp} 的版本。",
+"More versions..." => "更多版本...",
+"No other versions available" => "无其他版本可用",
"Restore" => "恢复"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php
index 328ed4305f4..290264a90cc 100644
--- a/apps/files_versions/lib/versions.php
+++ b/apps/files_versions/lib/versions.php
@@ -178,6 +178,7 @@ class Storage {
$versionsSize = self::calculateSize($uid);
}
foreach ($versions as $v) {
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $abs_path . $v['version']));
unlink($abs_path . $v['version']);
\OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version']));
$versionsSize -= $v['size'];
@@ -336,7 +337,7 @@ class Storage {
* @brief deletes used space for files versions in db if user was deleted
*
* @param type $uid id of deleted user
- * @return result of db delete operation
+ * @return \OC_DB_StatementWrapper of db delete operation
*/
public static function deleteUser($uid) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_versions` WHERE `user`=?');
@@ -372,7 +373,7 @@ class Storage {
/**
* @brief returns all stored file versions from a given user
- * @param $uid id to the user
+ * @param string $uid id of the user
* @return array with contains two arrays 'all' which contains all versions sorted by age and 'by_file' which contains all versions sorted by filename
*/
private static function getAllVersions($uid) {
@@ -420,8 +421,8 @@ class Storage {
/**
* @brief get list of files we want to expire
- * @param int $currentTime timestamp of current time
* @param array $versions list of versions
+ * @param integer $time
* @return array containing the list of to deleted versions and the size of them
*/
protected static function getExpireList($time, $versions) {
@@ -487,7 +488,7 @@ class Storage {
$softQuota = true;
$quota = \OC_Preferences::getValue($uid, 'files', 'quota');
if ( $quota === null || $quota === 'default') {
- $quota = \OC_Appconfig::getValue('files', 'default_quota');
+ $quota = \OC::$server->getAppConfig()->getValue('files', 'default_quota');
}
if ( $quota === null || $quota === 'none' ) {
$quota = \OC\Files\Filesystem::free_space('/');
@@ -542,8 +543,9 @@ class Storage {
}
foreach($toDelete as $key => $path) {
- \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $path));
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $path));
$versionsFileview->unlink($path);
+ \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $path));
unset($allVersions[$key]); // update array with the versions we keep
\OCP\Util::writeLog('files_versions', "Expire: " . $path, \OCP\Util::DEBUG);
}
@@ -555,6 +557,7 @@ class Storage {
$i = 0;
while ($availableSpace < 0 && $i < $numOfVersions) {
$version = current($allVersions);
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $version['path'].'.v'.$version['version']));
$versionsFileview->unlink($version['path'].'.v'.$version['version']);
\OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'].'.v'.$version['version']));
\OCP\Util::writeLog('files_versions', 'running out of space! Delete oldest version: ' . $version['path'].'.v'.$version['version'] , \OCP\Util::DEBUG);
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index 25490aa1a04..9f15b86d981 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -181,6 +181,9 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase {
// extend the original class to make it possible to test protected methods
class VersionStorageToTest extends \OCA\Files_Versions\Storage {
+ /**
+ * @param integer $time
+ */
public function callProtectedGetExpireList($time, $versions) {
return self::getExpireList($time, $versions);
diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml
index 148a72cecbb..9cc908e8522 100644
--- a/apps/user_ldap/appinfo/info.xml
+++ b/apps/user_ldap/appinfo/info.xml
@@ -14,4 +14,7 @@
<types>
<authentication/>
</types>
+ <documentation>
+ <admin>http://doc.owncloud.org/server/6.0/go.php?to=admin-ldap</admin>
+ </documentation>
</info>
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index 32e2cec5960..cef9ca3c4cf 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -61,8 +61,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
return false;
}
//usually, LDAP attributes are said to be case insensitive. But there are exceptions of course.
- $members = $this->access->readAttribute($dn_group,
- $this->access->connection->ldapGroupMemberAssocAttr);
+ $members = array_keys($this->_groupMembers($dn_group));
if(!$members) {
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
return false;
@@ -89,6 +88,39 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
return $isInGroup;
}
+ private function _groupMembers($dnGroup, &$seen = null) {
+ if ($seen === null) {
+ $seen = array();
+ }
+ $allMembers = array();
+ if (array_key_exists($dnGroup, $seen)) {
+ // avoid loops
+ return array();
+ }
+ // used extensively in cron job, caching makes sense for nested groups
+ $cacheKey = '_groupMembers'.$dnGroup;
+ if($this->access->connection->isCached($cacheKey)) {
+ return $this->access->connection->getFromCache($cacheKey);
+ }
+ $seen[$dnGroup] = 1;
+ $members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr,
+ $this->access->connection->ldapGroupFilter);
+ if (is_array($members)) {
+ foreach ($members as $memberDN) {
+ $allMembers[$memberDN] = 1;
+ $nestedGroups = $this->access->connection->ldapNestedGroups;
+ if (!empty($nestedGroups)) {
+ $subMembers = $this->_groupMembers($memberDN, $seen);
+ if ($subMembers) {
+ $allMembers = array_merge($allMembers, $subMembers);
+ }
+ }
+ }
+ }
+ $this->access->connection->writeToCache($cacheKey, $allMembers);
+ return $allMembers;
+ }
+
/**
* @brief Get all groups a user belongs to
* @param $uid Name of the user
@@ -124,18 +156,45 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
$uid = $userDN;
}
- $filter = $this->access->combineFilterWithAnd(array(
- $this->access->connection->ldapGroupFilter,
- $this->access->connection->ldapGroupMemberAssocAttr.'='.$uid
- ));
- $groups = $this->access->fetchListOfGroups($filter,
- array($this->access->connection->ldapGroupDisplayName, 'dn'));
+ $groups = array_values($this->getGroupsByMember($uid));
$groups = array_unique($this->access->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
$this->access->connection->writeToCache($cacheKey, $groups);
return $groups;
}
+ private function getGroupsByMember($dn, &$seen = null) {
+ if ($seen === null) {
+ $seen = array();
+ }
+ $allGroups = array();
+ if (array_key_exists($dn, $seen)) {
+ // avoid loops
+ return array();
+ }
+ $seen[$dn] = true;
+ $filter = $this->access->combineFilterWithAnd(array(
+ $this->access->connection->ldapGroupFilter,
+ $this->access->connection->ldapGroupMemberAssocAttr.'='.$dn
+ ));
+ $groups = $this->access->fetchListOfGroups($filter,
+ array($this->access->connection->ldapGroupDisplayName, 'dn'));
+ if (is_array($groups)) {
+ foreach ($groups as $groupobj) {
+ $groupDN = $groupobj['dn'];
+ $allGroups[$groupDN] = $groupobj;
+ $nestedGroups = $this->access->connection->ldapNestedGroups;
+ if (!empty($nestedGroups)) {
+ $supergroups = $this->getGroupsByMember($groupDN, $seen);
+ if (is_array($supergroups) && (count($supergroups)>0)) {
+ $allGroups = array_merge($allGroups, $supergroups);
+ }
+ }
+ }
+ }
+ return $allGroups;
+ }
+
/**
* @brief get a list of all users in a group
* @returns array with user ids
@@ -172,8 +231,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
return array();
}
- $members = $this->access->readAttribute($groupDN,
- $this->access->connection->ldapGroupMemberAssocAttr);
+ $members = array_keys($this->_groupMembers($groupDN));
if(!$members) {
//in case users could not be retrieved, return empty resultset
$this->access->connection->writeToCache($cachekey, array());
diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js
index acf88ef58a4..792638f2b58 100644
--- a/apps/user_ldap/js/settings.js
+++ b/apps/user_ldap/js/settings.js
@@ -240,6 +240,7 @@ var LdapWizard = {
LdapWizard.hideSpinner('#ldap_base');
LdapWizard.showInfoBox('Please specify a Base DN');
LdapWizard.showInfoBox('Could not determine Base DN');
+ $('#ldap_base').prop('disabled', false);
}
);
}
diff --git a/apps/user_ldap/l10n/ar.php b/apps/user_ldap/l10n/ar.php
index 2b0cbbd75a5..a2152dde852 100644
--- a/apps/user_ldap/l10n/ar.php
+++ b/apps/user_ldap/l10n/ar.php
@@ -1,6 +1,9 @@
<?php
$TRANSLATIONS = array(
+"Failed to delete the server configuration" => "تعذر حذف ملف إعدادات الخادم",
+"The configuration is valid and the connection could be established!" => "الإعدادت صحيحة",
"Deletion failed" => "فشل الحذف",
+"Success" => "نجاح",
"Error" => "خطأ",
"Select groups" => "إختر مجموعة",
"_%s group found_::_%s groups found_" => array("","","","","",""),
@@ -8,7 +11,9 @@ $TRANSLATIONS = array(
"Save" => "حفظ",
"Help" => "المساعدة",
"Host" => "المضيف",
+"Port" => "المنفذ",
"Password" => "كلمة المرور",
-"Back" => "رجوع"
+"Back" => "رجوع",
+"Email Field" => "خانة البريد الإلكتروني"
);
$PLURAL_FORMS = "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;";
diff --git a/apps/user_ldap/l10n/ca.php b/apps/user_ldap/l10n/ca.php
index 2ebaa7d7a5a..940c6ea8b66 100644
--- a/apps/user_ldap/l10n/ca.php
+++ b/apps/user_ldap/l10n/ca.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Desa",
"Test Configuration" => "Comprovació de la configuració",
"Help" => "Ajuda",
-"Limit the access to %s to groups meeting this criteria:" => "Limita l'accés a %s grups que compleixin amb el criteri:",
+"Groups meeting these criteria are available in %s:" => "Els grups que compleixen aquests criteris estan disponibles a %s:",
"only those object classes:" => "només aquestes classes d'objecte:",
"only from those groups:" => "només d'aquests grups",
"Edit raw filter instead" => "Edita filtre raw",
"Raw LDAP filter" => "Filtre raw LDAP",
"The filter specifies which LDAP groups shall have access to the %s instance." => "El filtre especifica quins grups LDAP haurien de tenir accés a la instància %s.",
"groups found" => "grups trobats",
-"What attribute shall be used as login name:" => "Quin atribut s'hauria d'utilitzar com a nom per a l'acreditació:",
+"Users login with this attribute:" => "Usuaris acreditats amb aquest atribut:",
"LDAP Username:" => "Nom d'usuari LDAP:",
"LDAP Email Address:" => "Adreça de correu electrònic LDAP:",
"Other Attributes:" => "Altres atributs:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Per un accés anònim, deixeu la DN i la contrasenya en blanc.",
"One Base DN per line" => "Una DN Base per línia",
"You can specify Base DN for users and groups in the Advanced tab" => "Podeu especificar DN Base per usuaris i grups a la pestanya Avançat",
-"Limit the access to %s to users meeting this criteria:" => "Limita l'accés a %s usuaris que compleixin amb el criteri:",
+"Limit %s access to users meeting these criteria:" => "Limita l'accés a %s usuaris que compleixin amb aquest criteri:",
"The filter specifies which LDAP users shall have access to the %s instance." => "El filtre especifica quins usuaris LDAP haurien de tenir accés a la instància %s",
"users found" => "usuaris trobats",
"Back" => "Enrera",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Una DN Base de Grup per línia",
"Group Search Attributes" => "Atributs de cerca de grup",
"Group-Member association" => "Associació membres-grup",
+"Nested Groups" => "Grups imbricats",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Quan està activat, els grups que contenen grups estan permesos. (Només funciona si l'atribut del grup membre conté DNs.)",
"Special Attributes" => "Atributs especials",
"Quota Field" => "Camp de quota",
"Quota Default" => "Quota per defecte",
diff --git a/apps/user_ldap/l10n/cs_CZ.php b/apps/user_ldap/l10n/cs_CZ.php
index 6bcf364ab33..930a4b10647 100644
--- a/apps/user_ldap/l10n/cs_CZ.php
+++ b/apps/user_ldap/l10n/cs_CZ.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Uložit",
"Test Configuration" => "Vyzkoušet nastavení",
"Help" => "Nápověda",
-"Limit the access to %s to groups meeting this criteria:" => "Omezit přístup k %s skupinám uživatelů splňujícím tyto podmínky:",
"only those object classes:" => "pouze tyto objektové třídy:",
"only from those groups:" => "pouze z těchto skupin:",
"Edit raw filter instead" => "Edituj filtr přímo",
"Raw LDAP filter" => "Původní filtr LDAP",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.",
"groups found" => "nalezené skupiny",
-"What attribute shall be used as login name:" => "Který atribut má být použit jako přihlašovací jméno:",
"LDAP Username:" => "LDAP uživatelské jméno:",
"LDAP Email Address:" => "LDAP e-mailová adresa:",
"Other Attributes:" => "Další atributy:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Pro anonymní přístup ponechte údaje DN and heslo prázdné.",
"One Base DN per line" => "Jedna základní DN na řádku",
"You can specify Base DN for users and groups in the Advanced tab" => "V rozšířeném nastavení můžete určit základní DN pro uživatele a skupiny",
-"Limit the access to %s to users meeting this criteria:" => "Omezit přístup k %s uživatelům splňujícím tyto podmínky:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.",
"users found" => "nalezení uživatelé",
"Back" => "Zpět",
diff --git a/apps/user_ldap/l10n/de.php b/apps/user_ldap/l10n/de.php
index 0c80ecfa850..8dad9b34539 100644
--- a/apps/user_ldap/l10n/de.php
+++ b/apps/user_ldap/l10n/de.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Speichern",
"Test Configuration" => "Testkonfiguration",
"Help" => "Hilfe",
-"Limit the access to %s to groups meeting this criteria:" => "Beschränke den Zugriff auf %s auf Gruppen, die die folgenden Kriterien erfüllen:",
+"Groups meeting these criteria are available in %s:" => "Gruppen-Versammlungen mit diesen Kriterien sind verfügbar in %s:",
"only those object classes:" => "Nur diese Objekt-Klassen:",
"only from those groups:" => "Nur von diesen Gruppen:",
"Edit raw filter instead" => "Original-Filter stattdessen bearbeiten",
"Raw LDAP filter" => "Original LDAP-Filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Der Filter definiert welche LDAP-Gruppen Zugriff auf die %s Instanz haben sollen.",
"groups found" => "Gruppen gefunden",
-"What attribute shall be used as login name:" => "Welches Attribut soll als Login-Name verwendet werden:",
+"Users login with this attribute:" => "Nutzeranmeldung mit diesem Merkmal:",
"LDAP Username:" => "LDAP-Benutzername:",
"LDAP Email Address:" => "LDAP E-Mail-Adresse:",
"Other Attributes:" => "Andere Attribute:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Lasse die Felder DN und Passwort für anonymen Zugang leer.",
"One Base DN per line" => "Ein Basis-DN pro Zeile",
"You can specify Base DN for users and groups in the Advanced tab" => "Du kannst Basis-DN für Benutzer und Gruppen in dem \"Erweitert\"-Reiter konfigurieren",
-"Limit the access to %s to users meeting this criteria:" => "Beschränke den Zugriff auf %s auf Benutzer, die die folgenden Kriterien erfüllen:",
+"Limit %s access to users meeting these criteria:" => "Beschränken Sie den %s Zugriff auf die Benutzer-Sitzungen durch folgende Kriterien:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Der Filter definiert welche LDAP-Benutzer Zugriff auf die %s Instanz haben sollen.",
"users found" => "Benutzer gefunden",
"Back" => "Zurück",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Ein Gruppen Basis-DN pro Zeile",
"Group Search Attributes" => "Gruppensucheigenschaften",
"Group-Member association" => "Assoziation zwischen Gruppe und Benutzer",
+"Nested Groups" => "Eingebundene Gruppen",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)",
"Special Attributes" => "Spezielle Eigenschaften",
"Quota Field" => "Kontingent Feld",
"Quota Default" => "Standard Kontingent",
diff --git a/apps/user_ldap/l10n/de_AT.php b/apps/user_ldap/l10n/de_AT.php
index 3a1e002311c..a4e97dfcadd 100644
--- a/apps/user_ldap/l10n/de_AT.php
+++ b/apps/user_ldap/l10n/de_AT.php
@@ -1,6 +1,9 @@
<?php
$TRANSLATIONS = array(
+"Deletion failed" => "Löschen fehlgeschlagen",
"_%s group found_::_%s groups found_" => array("",""),
-"_%s user found_::_%s users found_" => array("","")
+"_%s user found_::_%s users found_" => array("",""),
+"Save" => "Speichern",
+"Password" => "Passwort"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/de_DE.php b/apps/user_ldap/l10n/de_DE.php
index 168f1fe059c..6e6e29ea3db 100644
--- a/apps/user_ldap/l10n/de_DE.php
+++ b/apps/user_ldap/l10n/de_DE.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Speichern",
"Test Configuration" => "Testkonfiguration",
"Help" => "Hilfe",
-"Limit the access to %s to groups meeting this criteria:" => "Beschränke den Zugriff auf %s auf Gruppen, die die folgenden Kriterien erfüllen:",
+"Groups meeting these criteria are available in %s:" => "Gruppen-Versammlungen mit diesen Kriterien sind verfügbar in %s:",
"only those object classes:" => "Nur diese Objekt-Klassen:",
"only from those groups:" => "Nur von diesen Gruppen:",
"Edit raw filter instead" => "Original-Filter stattdessen bearbeiten",
"Raw LDAP filter" => "Original LDAP-Filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Der Filter definiert welche LDAP-Gruppen Zugriff auf die %s Instanz haben sollen.",
"groups found" => "Gruppen gefunden",
-"What attribute shall be used as login name:" => "Welches Attribut soll als Login-Name verwendet werden:",
+"Users login with this attribute:" => "Nutzeranmeldung mit diesem Merkmal:",
"LDAP Username:" => "LDAP-Benutzername:",
"LDAP Email Address:" => "LDAP E-Mail-Adresse:",
"Other Attributes:" => "Andere Attribute:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Lassen Sie die Felder DN und Passwort für einen anonymen Zugang leer.",
"One Base DN per line" => "Ein Basis-DN pro Zeile",
"You can specify Base DN for users and groups in the Advanced tab" => "Sie können Basis-DN für Benutzer und Gruppen in dem \"Erweitert\"-Reiter konfigurieren",
-"Limit the access to %s to users meeting this criteria:" => "Beschränke den Zugriff auf %s auf Benutzer, die die folgenden Kriterien erfüllen:",
+"Limit %s access to users meeting these criteria:" => "Beschränken Sie den %s Zugriff auf die Benutzer-Sitzungen durch folgende Kriterien:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Der Filter definiert welche LDAP-Benutzer Zugriff auf die %s Instanz haben sollen.",
"users found" => "Benutzer gefunden",
"Back" => "Zurück",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Ein Gruppen Basis-DN pro Zeile",
"Group Search Attributes" => "Gruppensucheigenschaften",
"Group-Member association" => "Assoziation zwischen Gruppe und Benutzer",
+"Nested Groups" => "Eingebundene Gruppen",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)",
"Special Attributes" => "Spezielle Eigenschaften",
"Quota Field" => "Kontingent-Feld",
"Quota Default" => "Standard-Kontingent",
diff --git a/apps/user_ldap/l10n/el.php b/apps/user_ldap/l10n/el.php
index 8369dff4895..1e975911953 100644
--- a/apps/user_ldap/l10n/el.php
+++ b/apps/user_ldap/l10n/el.php
@@ -8,6 +8,7 @@ $TRANSLATIONS = array(
"No action specified" => "Καμμία εντολή δεν προσδιορίστηκε",
"No configuration specified" => "Καμμία διαμόρφωση δεν προσδιορίστηκε",
"No data specified" => "Δεν προσδιορίστηκαν δεδομένα",
+" Could not set configuration %s" => "Αδυναμία ρύθμισης %s",
"Deletion failed" => "Η διαγραφή απέτυχε",
"Take over settings from recent server configuration?" => "Πάρτε πάνω από τις πρόσφατες ρυθμίσεις διαμόρφωσης του διακομιστή?",
"Keep settings?" => "Διατήρηση ρυθμίσεων;",
@@ -32,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Αποθήκευση",
"Test Configuration" => "Δοκιμαστικες ρυθμισεις",
"Help" => "Βοήθεια",
-"Limit the access to %s to groups meeting this criteria:" => "Περιορισμός πρόσβασης %s σε ομάδες που ταιριάζουν αυτά τα κριτήρια:",
"only those object classes:" => "μόνο αυτές οι κλάσεις αντικειμένων:",
"only from those groups:" => "μόνο από αυτές τις ομάδες:",
"Edit raw filter instead" => "Επεξεργασία πρωτογενούς φίλτρου αντί αυτού",
"Raw LDAP filter" => "Πρωτογενές φίλτρο ",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Το φίλτρο καθορίζει ποιες ομάδες LDAP θα έχουν πρόσβαση στην εγκατάσταση %s.",
"groups found" => "ομάδες βρέθηκαν",
-"What attribute shall be used as login name:" => "Ποια ιδιότητα θα χρησιμοποιηθεί ως όνομα σύνδεσης:",
"LDAP Username:" => "Όνομα χρήστη LDAP:",
"LDAP Email Address:" => "Διεύθυνση ηλ. ταχυδρομείου LDAP:",
"Other Attributes:" => "Άλλες Ιδιότητες:",
@@ -54,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Για ανώνυμη πρόσβαση, αφήστε κενά τα πεδία DN και Pasword.",
"One Base DN per line" => "Ένα DN Βάσης ανά γραμμή ",
"You can specify Base DN for users and groups in the Advanced tab" => "Μπορείτε να καθορίσετε το Base DN για χρήστες και ομάδες από την καρτέλα Προηγμένες ρυθμίσεις",
-"Limit the access to %s to users meeting this criteria:" => "Περιορισμός πρόσβασης %s σε χρήστες που ταιριάζουν αυτά τα κριτήρια:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Το φίλτρο καθορίζει ποιοι χρήστες LDAP θα έχουν πρόσβαση στην εγκατάσταση %s.",
"users found" => "χρήστες βρέθηκαν",
"Back" => "Επιστροφή",
@@ -68,6 +66,7 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Δώστε μια προαιρετική εφεδρική υποδοχή. Πρέπει να είναι ένα αντίγραφο του κύριου LDAP / AD διακομιστη.",
"Backup (Replica) Port" => "Δημιουργία αντιγράφων ασφαλείας (Replica) Υποδοχη",
"Disable Main Server" => "Απενεργοποιηση του κεντρικου διακομιστη",
+"Only connect to the replica server." => "Σύνδεση μόνο με το διακομιστή-αντίγραφο.",
"Case insensitve LDAP server (Windows)" => "LDAP server (Windows) με διάκριση πεζών-ΚΕΦΑΛΑΙΩΝ",
"Turn off SSL certificate validation." => "Απενεργοποίηση επικύρωσης πιστοποιητικού SSL.",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Δεν προτείνεται, χρησιμοποιείστε το μόνο για δοκιμές! Εάν η σύνδεση λειτουργεί μόνο με αυτή την επιλογή, εισάγετε το πιστοποιητικό SSL του διακομιστή LDAP στο %s διακομιστή σας.",
diff --git a/apps/user_ldap/l10n/en_GB.php b/apps/user_ldap/l10n/en_GB.php
index b83229d5a53..4421a8035ca 100644
--- a/apps/user_ldap/l10n/en_GB.php
+++ b/apps/user_ldap/l10n/en_GB.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Save",
"Test Configuration" => "Test Configuration",
"Help" => "Help",
-"Limit the access to %s to groups meeting this criteria:" => "Limit the access to %s to groups meeting this criteria:",
+"Groups meeting these criteria are available in %s:" => "Groups meeting these criteria are available in %s:",
"only those object classes:" => "only those object classes:",
"only from those groups:" => "only from those groups:",
"Edit raw filter instead" => "Edit raw filter instead",
"Raw LDAP filter" => "Raw LDAP filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "The filter specifies which LDAP groups shall have access to the %s instance.",
"groups found" => "groups found",
-"What attribute shall be used as login name:" => "What attribute should be used as login name:",
+"Users login with this attribute:" => "Users login with this attribute:",
"LDAP Username:" => "LDAP Username:",
"LDAP Email Address:" => "LDAP Email Address:",
"Other Attributes:" => "Other Attributes:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "For anonymous access, leave DN and Password empty.",
"One Base DN per line" => "One Base DN per line",
"You can specify Base DN for users and groups in the Advanced tab" => "You can specify Base DN for users and groups in the Advanced tab",
-"Limit the access to %s to users meeting this criteria:" => "Limit the access to %s to users meeting this criteria:",
+"Limit %s access to users meeting these criteria:" => "Limit %s access to users meeting these criteria:",
"The filter specifies which LDAP users shall have access to the %s instance." => "The filter specifies which LDAP users shall have access to the %s instance.",
"users found" => "users found",
"Back" => "Back",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "One Group Base DN per line",
"Group Search Attributes" => "Group Search Attributes",
"Group-Member association" => "Group-Member association",
+"Nested Groups" => "Nested Groups",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)",
"Special Attributes" => "Special Attributes",
"Quota Field" => "Quota Field",
"Quota Default" => "Quota Default",
diff --git a/apps/user_ldap/l10n/es.php b/apps/user_ldap/l10n/es.php
index 3348003e3e2..1821aa8d446 100644
--- a/apps/user_ldap/l10n/es.php
+++ b/apps/user_ldap/l10n/es.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"mappings cleared" => "Asignaciones borradas",
"Success" => "Éxito",
"Error" => "Error",
-"Configuration OK" => "Configuración OK",
+"Configuration OK" => "Configuración Correcta",
"Configuration incorrect" => "Configuración Incorrecta",
"Configuration incomplete" => "Configuración incompleta",
"Select groups" => "Seleccionar grupos",
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Guardar",
"Test Configuration" => "Configuración de prueba",
"Help" => "Ayuda",
-"Limit the access to %s to groups meeting this criteria:" => "Limitar el acceso a %s a los grupos que cumplan este criterio:",
+"Groups meeting these criteria are available in %s:" => "Los grupos que cumplen estos criterios están disponibles en %s:",
"only those object classes:" => "solamente de estas clases de objeto:",
"only from those groups:" => "solamente de estos grupos:",
"Edit raw filter instead" => "Editar el filtro en bruto en su lugar",
"Raw LDAP filter" => "Filtro LDAP en bruto",
"The filter specifies which LDAP groups shall have access to the %s instance." => "El filtro especifica que grupos LDAP tendrán acceso a %s.",
"groups found" => "grupos encontrados",
-"What attribute shall be used as login name:" => "Que atributo debe ser usado como login:",
+"Users login with this attribute:" => "Los usuarios inician sesión con este atributo:",
"LDAP Username:" => "Nombre de usuario LDAP:",
"LDAP Email Address:" => "Dirección e-mail LDAP:",
"Other Attributes:" => "Otros atributos:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para acceso anónimo, deje DN y contraseña vacíos.",
"One Base DN per line" => "Un DN Base por línea",
"You can specify Base DN for users and groups in the Advanced tab" => "Puede especificar el DN base para usuarios y grupos en la pestaña Avanzado",
-"Limit the access to %s to users meeting this criteria:" => "Limitar el acceso a %s a los usuarios que cumplan el siguiente criterio:",
+"Limit %s access to users meeting these criteria:" => "Limitar el acceso a %s a los usuarios que cumplan estos criterios:",
"The filter specifies which LDAP users shall have access to the %s instance." => "El filtro especifica que usuarios LDAP pueden tener acceso a %s.",
"users found" => "usuarios encontrados",
"Back" => "Atrás",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Un DN Base de Grupo por línea",
"Group Search Attributes" => "Atributos de busqueda de grupo",
"Group-Member association" => "Asociación Grupo-Miembro",
+"Nested Groups" => "Grupos anidados",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Cuando se active, se permitirán grupos que contenga otros grupos (solo funciona si el atributo de miembro de grupo contiene DNs).",
"Special Attributes" => "Atributos especiales",
"Quota Field" => "Cuota",
"Quota Default" => "Cuota por defecto",
diff --git a/apps/user_ldap/l10n/es_AR.php b/apps/user_ldap/l10n/es_AR.php
index 3a8f42e2c9c..6323fe0c4ad 100644
--- a/apps/user_ldap/l10n/es_AR.php
+++ b/apps/user_ldap/l10n/es_AR.php
@@ -4,6 +4,11 @@ $TRANSLATIONS = array(
"Failed to delete the server configuration" => "Fallo al borrar la configuración del servidor",
"The configuration is valid and the connection could be established!" => "La configuración es válida y la conexión pudo ser establecida.",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "La configuración es válida, pero el enlace falló. Por favor, comprobá la configuración del servidor y las credenciales.",
+"The configuration is invalid. Please have a look at the logs for further details." => "La configuración es inválida. Por favor, verifique los logs para más detalles.",
+"No action specified" => "No se ha especificado una acción",
+"No configuration specified" => "No se ha especificado una configuración",
+"No data specified" => "No se ha especificado datos",
+" Could not set configuration %s" => "No se pudo asignar la configuración %s",
"Deletion failed" => "Error al borrar",
"Take over settings from recent server configuration?" => "Tomar los valores de la anterior configuración de servidor?",
"Keep settings?" => "¿Mantener preferencias?",
@@ -11,16 +16,32 @@ $TRANSLATIONS = array(
"mappings cleared" => "Asignaciones borradas",
"Success" => "Éxito",
"Error" => "Error",
+"Configuration OK" => "Configuración válida",
+"Configuration incorrect" => "Configuración incorrecta",
+"Configuration incomplete" => "Configuración incompleta",
"Select groups" => "Seleccionar grupos",
+"Select object classes" => "Seleccionar las clases de objetos",
+"Select attributes" => "Seleccionar atributos",
"Connection test succeeded" => "El este de conexión ha sido completado satisfactoriamente",
"Connection test failed" => "Falló es test de conexión",
"Do you really want to delete the current Server Configuration?" => "¿Realmente desea borrar la configuración actual del servidor?",
"Confirm Deletion" => "Confirmar borrado",
-"_%s group found_::_%s groups found_" => array("",""),
-"_%s user found_::_%s users found_" => array("",""),
+"_%s group found_::_%s groups found_" => array("%s grupo encontrado","%s grupos encontrados"),
+"_%s user found_::_%s users found_" => array("%s usuario encontrado","%s usuarios encontrados"),
+"Invalid Host" => "Host inválido",
+"Could not find the desired feature" => "No se pudo encontrar la característica deseada",
"Save" => "Guardar",
"Test Configuration" => "Probar configuración",
"Help" => "Ayuda",
+"only those object classes:" => "solo estos objetos de clases:",
+"only from those groups:" => "solo provenientes de estos grupos:",
+"Edit raw filter instead" => "Editar filtro en bruto",
+"Raw LDAP filter" => "Filtro LDAP en bruto",
+"The filter specifies which LDAP groups shall have access to the %s instance." => "El filtro especifica qué grupos LDAP deben tener acceso a la instancia %s.",
+"groups found" => "grupos encontrados",
+"LDAP Username:" => "Nombre de usuario LDAP:",
+"LDAP Email Address:" => "Correo electrónico LDAP:",
+"Other Attributes:" => "Otros atributos:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Define el filtro a aplicar cuando se intenta ingresar. %%uid remplaza el nombre de usuario en el proceso de identificación. Por ejemplo: \"uid=%%uid\"",
"Add Server Configuration" => "Añadir Configuración del Servidor",
"Host" => "Servidor",
@@ -32,7 +53,10 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para acceso anónimo, dejá DN y contraseña vacíos.",
"One Base DN per line" => "Una DN base por línea",
"You can specify Base DN for users and groups in the Advanced tab" => "Podés especificar el DN base para usuarios y grupos en la pestaña \"Avanzado\"",
+"The filter specifies which LDAP users shall have access to the %s instance." => "El filtro especifica cuáles usuarios LDAP deben tener acceso a la instancia %s.",
+"users found" => "usuarios encontrados",
"Back" => "Volver",
+"Continue" => "Continuar",
"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Advertencia:</b> Las apps user_ldap y user_webdavauth son incompatibles. Puede ser que experimentes comportamientos inesperados. Pedile al administrador que desactive uno de ellos.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Atención:</b> El módulo PHP LDAP no está instalado, este elemento no va a funcionar. Por favor, pedile al administrador que lo instale.",
"Connection Settings" => "Configuración de Conección",
diff --git a/apps/user_ldap/l10n/es_CL.php b/apps/user_ldap/l10n/es_CL.php
index b3522617b42..40fa5aad8e6 100644
--- a/apps/user_ldap/l10n/es_CL.php
+++ b/apps/user_ldap/l10n/es_CL.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
+"Error" => "Error",
"_%s group found_::_%s groups found_" => array("",""),
"_%s user found_::_%s users found_" => array("",""),
"Password" => "Clave"
diff --git a/apps/user_ldap/l10n/es_MX.php b/apps/user_ldap/l10n/es_MX.php
index 16aaa91fd51..09c99209a55 100644
--- a/apps/user_ldap/l10n/es_MX.php
+++ b/apps/user_ldap/l10n/es_MX.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Guardar",
"Test Configuration" => "Configuración de prueba",
"Help" => "Ayuda",
-"Limit the access to %s to groups meeting this criteria:" => "Limitar el acceso a %s a los grupos que cumplan este criterio:",
"only those object classes:" => "solamente de estas clases de objeto:",
"only from those groups:" => "solamente de estos grupos:",
"Edit raw filter instead" => "Editar el filtro en bruto en su lugar",
"Raw LDAP filter" => "Filtro LDAP en bruto",
"The filter specifies which LDAP groups shall have access to the %s instance." => "El filtro especifica que grupos LDAP tendrán acceso a %s.",
"groups found" => "grupos encontrados",
-"What attribute shall be used as login name:" => "Que atributo debe ser usado como login:",
"LDAP Username:" => "Nombre de usuario LDAP:",
"LDAP Email Address:" => "Dirección e-mail LDAP:",
"Other Attributes:" => "Otros atributos:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para acceso anónimo, deje DN y contraseña vacíos.",
"One Base DN per line" => "Un DN Base por línea",
"You can specify Base DN for users and groups in the Advanced tab" => "Puede especificar el DN base para usuarios y grupos en la pestaña Avanzado",
-"Limit the access to %s to users meeting this criteria:" => "Limitar el acceso a %s a los usuarios que cumplan el siguiente criterio:",
"The filter specifies which LDAP users shall have access to the %s instance." => "El filtro especifica que usuarios LDAP pueden tener acceso a %s.",
"users found" => "usuarios encontrados",
"Back" => "Atrás",
diff --git a/apps/user_ldap/l10n/et_EE.php b/apps/user_ldap/l10n/et_EE.php
index 10f513c8b80..090accceda0 100644
--- a/apps/user_ldap/l10n/et_EE.php
+++ b/apps/user_ldap/l10n/et_EE.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Salvesta",
"Test Configuration" => "Testi seadistust",
"Help" => "Abiinfo",
-"Limit the access to %s to groups meeting this criteria:" => "Piira ligipääs %s grupile, mis sobivad kriteeriumiga:",
"only those object classes:" => "ainult need objektiklassid:",
"only from those groups:" => "ainult nendest gruppidest:",
"Edit raw filter instead" => "Selle asemel muuda filtrit",
"Raw LDAP filter" => "LDAP filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Filter määrab millised LDAP grupid saavad ligipääsu sellele %s instantsile.",
"groups found" => "gruppi leitud",
-"What attribute shall be used as login name:" => "Mis atribuuti kasutada sisselogimise kasutajatunnusena:",
"LDAP Username:" => "LDAP kasutajanimi:",
"LDAP Email Address:" => "LDAP e-posti aadress:",
"Other Attributes:" => "Muud atribuudid:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.",
"One Base DN per line" => "Üks baas-DN rea kohta",
"You can specify Base DN for users and groups in the Advanced tab" => "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt",
-"Limit the access to %s to users meeting this criteria:" => "Piira ligipääs %s kasutajale, kes sobivad kriteeriumiga:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Filter määrab millised LDAP kasutajad pääsevad ligi %s instantsile.",
"users found" => "kasutajat leitud",
"Back" => "Tagasi",
diff --git a/apps/user_ldap/l10n/eu.php b/apps/user_ldap/l10n/eu.php
index 1026e017159..a7bd52e50ac 100644
--- a/apps/user_ldap/l10n/eu.php
+++ b/apps/user_ldap/l10n/eu.php
@@ -31,12 +31,10 @@ $TRANSLATIONS = array(
"Save" => "Gorde",
"Test Configuration" => "Egiaztatu Konfigurazioa",
"Help" => "Laguntza",
-"Limit the access to %s to groups meeting this criteria:" => "Mugatu sarrera baldintza hauek betetzen dituzten %s taldetara:",
"only those object classes:" => "bakarrik objektu klase hauetakoak:",
"only from those groups:" => "bakarrik talde hauetakoak:",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Iragazkiak zehazten du ze LDAP taldek izango duten sarrera %s instantziara:",
"groups found" => "talde aurkituta",
-"What attribute shall be used as login name:" => "Sarrera izen gisa erabiliko den atributua:",
"LDAP Username:" => "LDAP Erabiltzaile izena:",
"LDAP Email Address:" => "LDAP Eposta helbidea:",
"Other Attributes:" => "Bestelako atributuak:",
@@ -50,7 +48,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Sarrera anonimoak gaitzeko utzi DN eta Pasahitza hutsik.",
"One Base DN per line" => "DN Oinarri bat lerroko",
"You can specify Base DN for users and groups in the Advanced tab" => "Erabiltzaile eta taldeentzako Oinarrizko DN zehaztu dezakezu Aurreratu fitxan",
-"Limit the access to %s to users meeting this criteria:" => "Mugatu sarrera hurrengo baldintzak betetzen duten %s erabiltzaileei:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Iragazkiak zehazten du ze LDAP erabiltzailek izango duten sarrera %s instantziara:",
"users found" => "erabiltzaile aurkituta",
"Back" => "Atzera",
diff --git a/apps/user_ldap/l10n/eu_ES.php b/apps/user_ldap/l10n/eu_ES.php
new file mode 100644
index 00000000000..6dbfd1955df
--- /dev/null
+++ b/apps/user_ldap/l10n/eu_ES.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"_%s group found_::_%s groups found_" => array("",""),
+"_%s user found_::_%s users found_" => array("",""),
+"Save" => "Gorde"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/fr.php b/apps/user_ldap/l10n/fr.php
index a5429130d61..dbcaadfc2a7 100644
--- a/apps/user_ldap/l10n/fr.php
+++ b/apps/user_ldap/l10n/fr.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Sauvegarder",
"Test Configuration" => "Tester la configuration",
"Help" => "Aide",
-"Limit the access to %s to groups meeting this criteria:" => "Limiter l'accès à %s aux groupes respectant ce critère :",
+"Groups meeting these criteria are available in %s:" => "Les groupes respectant ces critères sont disponibles dans %s :",
"only those object classes:" => "seulement ces classes d'objet :",
"only from those groups:" => "seulement de ces groupes :",
"Edit raw filter instead" => "Éditer le filtre raw à la place",
"Raw LDAP filter" => "Filtre Raw LDAP",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Le filtre spécifie quels groupes LDAP doivent avoir accès à l'instance %s.",
"groups found" => "groupes trouvés",
-"What attribute shall be used as login name:" => "Quel attribut doit être utilisé comme nom de login:",
+"Users login with this attribute:" => "Utilisateurs se connectant avec cet attribut :",
"LDAP Username:" => "Nom d'utilisateur LDAP :",
"LDAP Email Address:" => "Adresse email LDAP :",
"Other Attributes:" => "Autres attributs :",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Pour un accès anonyme, laisser le DN utilisateur et le mot de passe vides.",
"One Base DN per line" => "Un DN racine par ligne",
"You can specify Base DN for users and groups in the Advanced tab" => "Vous pouvez spécifier les DN Racines de vos utilisateurs et groupes via l'onglet Avancé",
-"Limit the access to %s to users meeting this criteria:" => "Limiter l'accès à %s aux utilisateurs respectant ce critère :",
+"Limit %s access to users meeting these criteria:" => "Limiter l'accès à %s aux utilisateurs respectant ces critères :",
"The filter specifies which LDAP users shall have access to the %s instance." => "Le filtre spécifie quels utilisateurs LDAP doivent avoir accès à l'instance %s.",
"users found" => "utilisateurs trouvés",
"Back" => "Retour",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Un DN racine groupe par ligne",
"Group Search Attributes" => "Recherche des attributs du groupe",
"Group-Member association" => "Association groupe-membre",
+"Nested Groups" => "Groupes imbriqués",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Si activé, les groupes contenant d'autres groupes sont supportés (fonctionne uniquement si l'attribut membre du groupe contient des DNs).",
"Special Attributes" => "Attributs spéciaux",
"Quota Field" => "Champ du quota",
"Quota Default" => "Quota par défaut",
diff --git a/apps/user_ldap/l10n/gl.php b/apps/user_ldap/l10n/gl.php
index 34e818ef951..802c6d0e435 100644
--- a/apps/user_ldap/l10n/gl.php
+++ b/apps/user_ldap/l10n/gl.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Gardar",
"Test Configuration" => "Probar a configuración",
"Help" => "Axuda",
-"Limit the access to %s to groups meeting this criteria:" => "Limitar o acceso a %s aos grupos que coincidan con estes criterios:",
+"Groups meeting these criteria are available in %s:" => "Os grupos que cumpren estes criterios están dispoñíbeis en %s:",
"only those object classes:" => "só as clases de obxecto:",
"only from those groups:" => "só dos grupos:",
"Edit raw filter instead" => "Editar, no seu canto, o filtro en bruto",
"Raw LDAP filter" => "Filtro LDAP en bruto",
"The filter specifies which LDAP groups shall have access to the %s instance." => "O filtro especifica que grupos LDAP teñen acceso á instancia %s.",
"groups found" => "atopáronse grupos",
-"What attribute shall be used as login name:" => "Atributo que utilizar como nome de usuario:",
+"Users login with this attribute:" => "Os usuarios inician sesión con este atributo:",
"LDAP Username:" => "Nome de usuario LDAP:",
"LDAP Email Address:" => "Enderezo de correo LDAP:",
"Other Attributes:" => "Outros atributos:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
"One Base DN per line" => "Un DN base por liña",
"You can specify Base DN for users and groups in the Advanced tab" => "Pode especificar a DN base para usuarios e grupos na lapela de «Avanzado»",
-"Limit the access to %s to users meeting this criteria:" => "Limitar o acceso a %s aos usuarios que coincidan con estes criterios:",
+"Limit %s access to users meeting these criteria:" => "Limitar o acceso a %s para os usuarios que cumpren con estes criterios:",
"The filter specifies which LDAP users shall have access to the %s instance." => "O filtro especifica que usuarios LDAP teñen acceso á instancia %s.",
"users found" => "atopáronse usuarios",
"Back" => "Atrás",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Un DN base de grupo por liña",
"Group Search Attributes" => "Atributos de busca do grupo",
"Group-Member association" => "Asociación de grupos e membros",
+"Nested Groups" => "Grupos aniñados",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Se está activado, admítense grupos que conteñen grupos. (Só funciona se o atributo de membro de grupo conten os DN.)",
"Special Attributes" => "Atributos especiais",
"Quota Field" => "Campo de cota",
"Quota Default" => "Cota predeterminada",
diff --git a/apps/user_ldap/l10n/hu_HU.php b/apps/user_ldap/l10n/hu_HU.php
index 2799d0407c4..277ae96fcd4 100644
--- a/apps/user_ldap/l10n/hu_HU.php
+++ b/apps/user_ldap/l10n/hu_HU.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Mentés",
"Test Configuration" => "A beállítások tesztelése",
"Help" => "Súgó",
-"Limit the access to %s to groups meeting this criteria:" => "Korlátozzuk %s elérését a következő feltételeknek megfelelő csoportokra:",
"only those object classes:" => "csak ezek az objektumosztályok:",
"only from those groups:" => "csak ezek a csoportok:",
"Edit raw filter instead" => "Inkább közvetlenül megadom a szűrési kifejezést:",
"Raw LDAP filter" => "Az LDAP szűrőkifejezés",
"The filter specifies which LDAP groups shall have access to the %s instance." => "A szűrő meghatározza, hogy mely LDAP csoportok lesznek jogosultak %s elérésére.",
"groups found" => "csoport van",
-"What attribute shall be used as login name:" => "Melyik attribútumot használjuk login névként:",
"LDAP Username:" => "LDAP felhasználónév:",
"LDAP Email Address:" => "LDAP e-mail cím:",
"Other Attributes:" => "Más attribútumok:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Bejelentkezés nélküli eléréshez ne töltse ki a DN és Jelszó mezőket!",
"One Base DN per line" => "Soronként egy DN-gyökér",
"You can specify Base DN for users and groups in the Advanced tab" => "A Haladó fülre kattintva külön DN-gyökér állítható be a felhasználók és a csoportok számára",
-"Limit the access to %s to users meeting this criteria:" => "Korlátozzuk %s elérését a következő feltételeknek megfelelő felhasználókra:",
"The filter specifies which LDAP users shall have access to the %s instance." => "A szűrő meghatározza, hogy mely LDAP felhasználók lesznek jogosultak %s elérésére.",
"users found" => "felhasználó van",
"Back" => "Vissza",
diff --git a/apps/user_ldap/l10n/it.php b/apps/user_ldap/l10n/it.php
index f5e53bdbe90..4436127747f 100644
--- a/apps/user_ldap/l10n/it.php
+++ b/apps/user_ldap/l10n/it.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Salva",
"Test Configuration" => "Prova configurazione",
"Help" => "Aiuto",
-"Limit the access to %s to groups meeting this criteria:" => "Limita l'accesso a %s ai gruppi che verificano questi criteri:",
+"Groups meeting these criteria are available in %s:" => "I gruppi che corrispondono a questi criteri sono disponibili in %s:",
"only those object classes:" => "solo queste classi di oggetti:",
"only from those groups:" => "solo da questi gruppi:",
"Edit raw filter instead" => "Modifica invece il filtro grezzo",
"Raw LDAP filter" => "Filtro LDAP grezzo",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Il filtro specifica quali gruppi LDAP devono avere accesso all'istanza %s.",
"groups found" => "gruppi trovati",
-"What attribute shall be used as login name:" => "Quale attributo deve essere usato come nome di accesso:",
+"Users login with this attribute:" => "Utenti con questo attributo:",
"LDAP Username:" => "Nome utente LDAP:",
"LDAP Email Address:" => "Indirizzo email LDAP:",
"Other Attributes:" => "Altri attributi:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Per l'accesso anonimo, lasciare vuoti i campi DN e Password",
"One Base DN per line" => "Un DN base per riga",
"You can specify Base DN for users and groups in the Advanced tab" => "Puoi specificare una DN base per gli utenti ed i gruppi nella scheda Avanzate",
-"Limit the access to %s to users meeting this criteria:" => "Limita l'accesso a %s ai gruppi che verificano questi criteri:",
+"Limit %s access to users meeting these criteria:" => "Limita l'accesso a %s ai gruppi che verificano questi criteri:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Il filtro specifica quali utenti LDAP devono avere accesso all'istanza %s.",
"users found" => "utenti trovati",
"Back" => "Indietro",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Un DN base gruppo per riga",
"Group Search Attributes" => "Attributi di ricerca gruppo",
"Group-Member association" => "Associazione gruppo-utente ",
+"Nested Groups" => "Gruppi nidificati",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Quando è attivato, i gruppi che contengono altri gruppi sono supportati. (Funziona solo se l'attributo del gruppo membro contiene DN.)",
"Special Attributes" => "Attributi speciali",
"Quota Field" => "Campo Quota",
"Quota Default" => "Quota predefinita",
diff --git a/apps/user_ldap/l10n/ja.php b/apps/user_ldap/l10n/ja.php
new file mode 100644
index 00000000000..d13deafe6c3
--- /dev/null
+++ b/apps/user_ldap/l10n/ja.php
@@ -0,0 +1,112 @@
+<?php
+$TRANSLATIONS = array(
+"Failed to clear the mappings." => "マッピングのクリアに失敗しました。",
+"Failed to delete the server configuration" => "サーバー設定の削除に失敗しました",
+"The configuration is valid and the connection could be established!" => "設定は有効であり、接続を確立しました!",
+"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "設定は有効ですが、接続に失敗しました。サーバー設定と資格情報を確認してください。",
+"The configuration is invalid. Please have a look at the logs for further details." => "設定が無効です。詳細はログを確認してください。",
+"No action specified" => "アクションが指定されていません",
+"No configuration specified" => "構成が指定されていません",
+"No data specified" => "データが指定されていません",
+" Could not set configuration %s" => "構成 %s を設定できませんでした",
+"Deletion failed" => "削除に失敗しました",
+"Take over settings from recent server configuration?" => "最近のサーバー設定から設定を引き継ぎますか?",
+"Keep settings?" => "設定を保持しますか?",
+"Cannot add server configuration" => "サーバー設定を追加できません",
+"mappings cleared" => "マッピングをクリアしました",
+"Success" => "成功",
+"Error" => "エラー",
+"Configuration OK" => "設定OK",
+"Configuration incorrect" => "設定に誤りがあります",
+"Configuration incomplete" => "設定が不完全です",
+"Select groups" => "グループを選択",
+"Select object classes" => "オブジェクトクラスを選択",
+"Select attributes" => "属性を選択",
+"Connection test succeeded" => "接続テストに成功しました",
+"Connection test failed" => "接続テストに失敗しました",
+"Do you really want to delete the current Server Configuration?" => "現在のサーバー設定を本当に削除してもよろしいですか?",
+"Confirm Deletion" => "削除の確認",
+"_%s group found_::_%s groups found_" => array("%s グループが見つかりました"),
+"_%s user found_::_%s users found_" => array("%s ユーザーが見つかりました"),
+"Invalid Host" => "無効なホスト",
+"Could not find the desired feature" => "望ましい機能は見つかりませんでした",
+"Save" => "保存",
+"Test Configuration" => "設定をテスト",
+"Help" => "ヘルプ",
+"Groups meeting these criteria are available in %s:" => "これらの基準を満たすグループが %s で利用可能:",
+"only those object classes:" => "それらのオブジェクトクラスのみ:",
+"only from those groups:" => "それらのグループからのみ:",
+"Edit raw filter instead" => "フィルタを編集",
+"Raw LDAP filter" => "LDAP フィルタ",
+"The filter specifies which LDAP groups shall have access to the %s instance." => "フィルタは、どの LDAP グループが %s にアクセスするかを指定します。",
+"groups found" => "グループが見つかりました",
+"Users login with this attribute:" => "この属性でユーザーログイン:",
+"LDAP Username:" => "LDAP ユーザー名:",
+"LDAP Email Address:" => "LDAP メールアドレス:",
+"Other Attributes:" => "他の属性:",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "ログイン実行時に適用するフィルタを定義します。%%uid にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"",
+"Add Server Configuration" => "サーバー設定を追加",
+"Host" => "ホスト",
+"You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。",
+"Port" => "ポート",
+"User DN" => "ユーザーDN",
+"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "クライアントユーザーのDNは、特定のものに結びつけることはしません。 例えば uid=agent,dc=example,dc=com. だと匿名アクセスの場合、DNとパスワードは空のままです。",
+"Password" => "パスワード",
+"For anonymous access, leave DN and Password empty." => "匿名アクセスの場合は、DNとパスワードを空にしてください。",
+"One Base DN per line" => "1行に1つのベースDN",
+"You can specify Base DN for users and groups in the Advanced tab" => "拡張タブでユーザーとグループのベースDNを指定することができます。",
+"Limit %s access to users meeting these criteria:" => "この基準を満たすユーザに対し %s へのアクセスを制限:",
+"The filter specifies which LDAP users shall have access to the %s instance." => "フィルタは、どのLDAPユーザーが %s にアクセスするかを指定します。",
+"users found" => "ユーザーが見つかりました",
+"Back" => "戻る",
+"Continue" => "続ける",
+"<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>警告:</b> user_ldap と user_webdavauth のアプリには互換性がありません。予期せぬ動作をする可能性があります。システム管理者にどちらかを無効にするよう問い合わせてください。",
+"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>警告:</b> PHP LDAP モジュールがインストールされていません。バックエンドが正しく動作しません。システム管理者にインストールするよう問い合わせてください。",
+"Connection Settings" => "接続設定",
+"Configuration Active" => "設定はアクティブです",
+"When unchecked, this configuration will be skipped." => "チェックを外すと、この設定はスキップされます。",
+"Backup (Replica) Host" => "バックアップ(レプリカ)ホスト",
+"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "バックアップホストをオプションで指定することができます。メインのLDAP/ADサーバーのレプリカである必要があります。",
+"Backup (Replica) Port" => "バックアップ(レプリカ)ポート",
+"Disable Main Server" => "メインサーバーを無効にする",
+"Only connect to the replica server." => "レプリカサーバーにのみ接続します。",
+"Case insensitve LDAP server (Windows)" => "大文字/小文字を区別しないLDAPサーバー(Windows)",
+"Turn off SSL certificate validation." => "SSL証明書の確認を無効にする。",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "推奨されません、テストにおいてのみ使用してください!このオプションでのみ接続が動作する場合は、LDAP サーバーのSSL証明書を %s サーバーにインポートしてください。",
+"Cache Time-To-Live" => "キャッシュのTTL",
+"in seconds. A change empties the cache." => "秒。変更後にキャッシュがクリアされます。",
+"Directory Settings" => "ディレクトリ設定",
+"User Display Name Field" => "ユーザー表示名のフィールド",
+"The LDAP attribute to use to generate the user's display name." => "ユーザーの表示名の生成に利用するLDAP属性",
+"Base User Tree" => "ベースユーザーツリー",
+"One User Base DN per line" => "1行に1つのユーザーベースDN",
+"User Search Attributes" => "ユーザー検索属性",
+"Optional; one attribute per line" => "オプション:1行に1属性",
+"Group Display Name Field" => "グループ表示名のフィールド",
+"The LDAP attribute to use to generate the groups's display name." => "ユーザのグループ表示名の生成に利用するLDAP属性",
+"Base Group Tree" => "ベースグループツリー",
+"One Group Base DN per line" => "1行に1つのグループベースDN",
+"Group Search Attributes" => "グループ検索属性",
+"Group-Member association" => "グループとメンバーの関連付け",
+"Nested Groups" => "ネスト化ブロック",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "オンに切り替えたら、グループを含むグループがサポートされます。(グループメンバーの属性がDNを含む場合のみ有効です。)",
+"Special Attributes" => "特殊属性",
+"Quota Field" => "クォータフィールド",
+"Quota Default" => "クォータのデフォルト",
+"in bytes" => "バイト",
+"Email Field" => "メールフィールド",
+"User Home Folder Naming Rule" => "ユーザーのホームフォルダー命名規則",
+"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "ユーザー名を空のままにしてください(デフォルト)。もしくは、LDAPもしくはADの属性を指定してください。",
+"Internal Username" => "内部ユーザー名",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "デフォルトでは、内部ユーザー名はUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザ名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザを識別するために用いられ、また、ownCloudにおけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。ownCloud 5 以前と同じような振る舞いにするためには、以下のフィールドにユーザー表示名の属性を入力します。空にするとデフォルトの振る舞いとなります。変更は新しくマッピング(追加)されたLDAPユーザーにおいてのみ有効となります。",
+"Internal Username Attribute:" => "内部ユーザー名属性:",
+"Override UUID detection" => "UUID検出を再定義する",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザーとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザー名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザーとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザーとLDAPグループに対してのみ有効となります。",
+"UUID Attribute for Users:" => "ユーザーの UUID 属性:",
+"UUID Attribute for Groups:" => "グループの UUID 属性:",
+"Username-LDAP User Mapping" => "ユーザー名とLDAPユーザのマッピング",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ユーザー名は(メタ)データの保存と割り当てに使用されます。ユーザーを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザー名からLDAPユーザーへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、全てのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。",
+"Clear Username-LDAP User Mapping" => "ユーザー名とLDAPユーザーのマッピングをクリアする",
+"Clear Groupname-LDAP Group Mapping" => "グループ名とLDAPグループのマッピングをクリアする"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_ldap/l10n/ja_JP.php b/apps/user_ldap/l10n/ja_JP.php
index 8e98e80370d..d13deafe6c3 100644
--- a/apps/user_ldap/l10n/ja_JP.php
+++ b/apps/user_ldap/l10n/ja_JP.php
@@ -1,18 +1,18 @@
<?php
$TRANSLATIONS = array(
"Failed to clear the mappings." => "マッピングのクリアに失敗しました。",
-"Failed to delete the server configuration" => "サーバ設定の削除に失敗しました",
+"Failed to delete the server configuration" => "サーバー設定の削除に失敗しました",
"The configuration is valid and the connection could be established!" => "設定は有効であり、接続を確立しました!",
-"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "設定は有効ですが、接続に失敗しました。サーバ設定と資格情報を確認して下さい。",
+"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "設定は有効ですが、接続に失敗しました。サーバー設定と資格情報を確認してください。",
"The configuration is invalid. Please have a look at the logs for further details." => "設定が無効です。詳細はログを確認してください。",
"No action specified" => "アクションが指定されていません",
"No configuration specified" => "構成が指定されていません",
"No data specified" => "データが指定されていません",
" Could not set configuration %s" => "構成 %s を設定できませんでした",
"Deletion failed" => "削除に失敗しました",
-"Take over settings from recent server configuration?" => "最近のサーバ設定から設定を引き継ぎますか?",
+"Take over settings from recent server configuration?" => "最近のサーバー設定から設定を引き継ぎますか?",
"Keep settings?" => "設定を保持しますか?",
-"Cannot add server configuration" => "サーバ設定を追加できません",
+"Cannot add server configuration" => "サーバー設定を追加できません",
"mappings cleared" => "マッピングをクリアしました",
"Success" => "成功",
"Error" => "エラー",
@@ -24,40 +24,40 @@ $TRANSLATIONS = array(
"Select attributes" => "属性を選択",
"Connection test succeeded" => "接続テストに成功しました",
"Connection test failed" => "接続テストに失敗しました",
-"Do you really want to delete the current Server Configuration?" => "現在のサーバ設定を本当に削除してもよろしいですか?",
+"Do you really want to delete the current Server Configuration?" => "現在のサーバー設定を本当に削除してもよろしいですか?",
"Confirm Deletion" => "削除の確認",
"_%s group found_::_%s groups found_" => array("%s グループが見つかりました"),
-"_%s user found_::_%s users found_" => array("%s ユーザが見つかりました"),
+"_%s user found_::_%s users found_" => array("%s ユーザーが見つかりました"),
"Invalid Host" => "無効なホスト",
"Could not find the desired feature" => "望ましい機能は見つかりませんでした",
"Save" => "保存",
"Test Configuration" => "設定をテスト",
"Help" => "ヘルプ",
-"Limit the access to %s to groups meeting this criteria:" => "この基準に合致するグループに %s へのアクセスを制限:",
+"Groups meeting these criteria are available in %s:" => "これらの基準を満たすグループが %s で利用可能:",
"only those object classes:" => "それらのオブジェクトクラスのみ:",
"only from those groups:" => "それらのグループからのみ:",
"Edit raw filter instead" => "フィルタを編集",
"Raw LDAP filter" => "LDAP フィルタ",
"The filter specifies which LDAP groups shall have access to the %s instance." => "フィルタは、どの LDAP グループが %s にアクセスするかを指定します。",
"groups found" => "グループが見つかりました",
-"What attribute shall be used as login name:" => "ログイン名として利用する属性:",
-"LDAP Username:" => "LDAP ユーザ名:",
+"Users login with this attribute:" => "この属性でユーザーログイン:",
+"LDAP Username:" => "LDAP ユーザー名:",
"LDAP Email Address:" => "LDAP メールアドレス:",
"Other Attributes:" => "他の属性:",
-"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "ログイン実行時に適用するフィルタを定義します。%%uid にはログイン操作におけるユーザ名が入ります。例: \"uid=%%uid\"",
-"Add Server Configuration" => "サーバ設定を追加",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "ログイン実行時に適用するフィルタを定義します。%%uid にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"",
+"Add Server Configuration" => "サーバー設定を追加",
"Host" => "ホスト",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。",
"Port" => "ポート",
-"User DN" => "ユーザDN",
+"User DN" => "ユーザーDN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "クライアントユーザーのDNは、特定のものに結びつけることはしません。 例えば uid=agent,dc=example,dc=com. だと匿名アクセスの場合、DNとパスワードは空のままです。",
"Password" => "パスワード",
"For anonymous access, leave DN and Password empty." => "匿名アクセスの場合は、DNとパスワードを空にしてください。",
"One Base DN per line" => "1行に1つのベースDN",
-"You can specify Base DN for users and groups in the Advanced tab" => "拡張タブでユーザとグループのベースDNを指定することができます。",
-"Limit the access to %s to users meeting this criteria:" => "この基準に合致するユーザに %s へのアクセスを制限:",
-"The filter specifies which LDAP users shall have access to the %s instance." => "フィルタは、どの LDAP ユーザが %s にアクセスするかを指定します。",
-"users found" => "ユーザが見つかりました",
+"You can specify Base DN for users and groups in the Advanced tab" => "拡張タブでユーザーとグループのベースDNを指定することができます。",
+"Limit %s access to users meeting these criteria:" => "この基準を満たすユーザに対し %s へのアクセスを制限:",
+"The filter specifies which LDAP users shall have access to the %s instance." => "フィルタは、どのLDAPユーザーが %s にアクセスするかを指定します。",
+"users found" => "ユーザーが見つかりました",
"Back" => "戻る",
"Continue" => "続ける",
"<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>警告:</b> user_ldap と user_webdavauth のアプリには互換性がありません。予期せぬ動作をする可能性があります。システム管理者にどちらかを無効にするよう問い合わせてください。",
@@ -66,21 +66,21 @@ $TRANSLATIONS = array(
"Configuration Active" => "設定はアクティブです",
"When unchecked, this configuration will be skipped." => "チェックを外すと、この設定はスキップされます。",
"Backup (Replica) Host" => "バックアップ(レプリカ)ホスト",
-"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "バックアップホストをオプションで指定することができます。メインのLDAP/ADサーバのレプリカである必要があります。",
+"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "バックアップホストをオプションで指定することができます。メインのLDAP/ADサーバーのレプリカである必要があります。",
"Backup (Replica) Port" => "バックアップ(レプリカ)ポート",
-"Disable Main Server" => "メインサーバを無効にする",
+"Disable Main Server" => "メインサーバーを無効にする",
"Only connect to the replica server." => "レプリカサーバーにのみ接続します。",
-"Case insensitve LDAP server (Windows)" => "大文字/小文字を区別しないLDAPサーバ(Windows)",
+"Case insensitve LDAP server (Windows)" => "大文字/小文字を区別しないLDAPサーバー(Windows)",
"Turn off SSL certificate validation." => "SSL証明書の確認を無効にする。",
-"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "推奨されません、テストにおいてのみ使用してください!このオプションでのみ接続が動作する場合は、LDAP サーバのSSL証明書を %s サーバにインポートしてください。",
+"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." => "推奨されません、テストにおいてのみ使用してください!このオプションでのみ接続が動作する場合は、LDAP サーバーのSSL証明書を %s サーバーにインポートしてください。",
"Cache Time-To-Live" => "キャッシュのTTL",
"in seconds. A change empties the cache." => "秒。変更後にキャッシュがクリアされます。",
"Directory Settings" => "ディレクトリ設定",
-"User Display Name Field" => "ユーザ表示名のフィールド",
-"The LDAP attribute to use to generate the user's display name." => "ユーザの表示名の生成に利用するLDAP属性",
-"Base User Tree" => "ベースユーザツリー",
-"One User Base DN per line" => "1行に1つのユーザベースDN",
-"User Search Attributes" => "ユーザ検索属性",
+"User Display Name Field" => "ユーザー表示名のフィールド",
+"The LDAP attribute to use to generate the user's display name." => "ユーザーの表示名の生成に利用するLDAP属性",
+"Base User Tree" => "ベースユーザーツリー",
+"One User Base DN per line" => "1行に1つのユーザーベースDN",
+"User Search Attributes" => "ユーザー検索属性",
"Optional; one attribute per line" => "オプション:1行に1属性",
"Group Display Name Field" => "グループ表示名のフィールド",
"The LDAP attribute to use to generate the groups's display name." => "ユーザのグループ表示名の生成に利用するLDAP属性",
@@ -88,23 +88,25 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "1行に1つのグループベースDN",
"Group Search Attributes" => "グループ検索属性",
"Group-Member association" => "グループとメンバーの関連付け",
+"Nested Groups" => "ネスト化ブロック",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "オンに切り替えたら、グループを含むグループがサポートされます。(グループメンバーの属性がDNを含む場合のみ有効です。)",
"Special Attributes" => "特殊属性",
"Quota Field" => "クォータフィールド",
"Quota Default" => "クォータのデフォルト",
"in bytes" => "バイト",
"Email Field" => "メールフィールド",
-"User Home Folder Naming Rule" => "ユーザのホームフォルダ命名規則",
-"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "ユーザ名を空のままにしてください(デフォルト)。そうでない場合は、LDAPもしくはADの属性を指定してください。",
-"Internal Username" => "内部ユーザ名",
-"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "デフォルトでは、内部ユーザ名はUUID属性から作成されます。これにより、ユーザ名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザ名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザ名との衝突の回数が増加するでしょう。内部ユーザ名は、内部的にユーザを識別するために用いられ、また、ownCloudにおけるデフォルトのホームフォルダ名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。ownCloud 5 以前と同じような振る舞いにするためには、以下のフィールドにユーザ表示名の属性を入力します。空にするとデフォルトの振る舞いとなります。変更は新しくマッピング(追加)されたLDAPユーザにおいてのみ有効となります。",
-"Internal Username Attribute:" => "内部ユーザ名属性:",
+"User Home Folder Naming Rule" => "ユーザーのホームフォルダー命名規則",
+"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "ユーザー名を空のままにしてください(デフォルト)。もしくは、LDAPもしくはADの属性を指定してください。",
+"Internal Username" => "内部ユーザー名",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "デフォルトでは、内部ユーザー名はUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザ名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザを識別するために用いられ、また、ownCloudにおけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。ownCloud 5 以前と同じような振る舞いにするためには、以下のフィールドにユーザー表示名の属性を入力します。空にするとデフォルトの振る舞いとなります。変更は新しくマッピング(追加)されたLDAPユーザーにおいてのみ有効となります。",
+"Internal Username Attribute:" => "内部ユーザー名属性:",
"Override UUID detection" => "UUID検出を再定義する",
-"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザ名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザとLDAPグループに対してのみ有効となります。",
-"UUID Attribute for Users:" => "ユーザの 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." => "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザーとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザー名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザーとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザーとLDAPグループに対してのみ有効となります。",
+"UUID Attribute for Users:" => "ユーザーの UUID 属性:",
"UUID Attribute for Groups:" => "グループの UUID 属性:",
-"Username-LDAP User Mapping" => "ユーザ名とLDAPユーザのマッピング",
-"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ユーザ名は(メタ)データの保存と割り当てに使用されます。ユーザを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザ名からLDAPユーザへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、全てのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。",
-"Clear Username-LDAP User Mapping" => "ユーザ名とLDAPユーザのマッピングをクリアする",
+"Username-LDAP User Mapping" => "ユーザー名とLDAPユーザのマッピング",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ユーザー名は(メタ)データの保存と割り当てに使用されます。ユーザーを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザー名からLDAPユーザーへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、全てのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。",
+"Clear Username-LDAP User Mapping" => "ユーザー名とLDAPユーザーのマッピングをクリアする",
"Clear Groupname-LDAP Group Mapping" => "グループ名とLDAPグループのマッピングをクリアする"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_ldap/l10n/km.php b/apps/user_ldap/l10n/km.php
index bba52d53a1a..ad3cc4882c1 100644
--- a/apps/user_ldap/l10n/km.php
+++ b/apps/user_ldap/l10n/km.php
@@ -1,6 +1,20 @@
<?php
$TRANSLATIONS = array(
+"Failed to delete the server configuration" => "លុប​ការ​កំណត់​រចនា​សម្ព័ន្ធ​ម៉ាស៊ីន​បម្រើ មិន​បាន​សម្រេច",
+"Deletion failed" => "លុប​មិន​បាន​សម្រេច",
+"Keep settings?" => "រក្សា​ទុក​ការ​កំណត់?",
+"Cannot add server configuration" => "មិន​អាច​បន្ថែម​ការ​កំណត់​រចនាសម្ព័ន្ធ​ម៉ាស៊ីន​បម្រើ",
+"Error" => "កំហុស",
+"Connection test succeeded" => "សាក​ល្បង​ការ​ត​ភ្ជាប់ បាន​ជោគជ័យ",
+"Connection test failed" => "សាកល្បង​ការ​តភ្ជាប់ មិន​បាន​សម្រេច",
+"Do you really want to delete the current Server Configuration?" => "តើ​អ្នក​ពិត​ជា​ចង់​លុប​ការ​កំណត់​រចនាសម្ព័ន្ធ​ម៉ាស៊ីន​បម្រើ​បច្ចុប្បន្ន​មែន​ទេ?",
+"Confirm Deletion" => "បញ្ជាក់​ការ​លុប",
"_%s group found_::_%s groups found_" => array(""),
-"_%s user found_::_%s users found_" => array("")
+"_%s user found_::_%s users found_" => array(""),
+"Save" => "រក្សាទុក",
+"Help" => "ជំនួយ",
+"Add Server Configuration" => "បន្ថែម​ការ​កំណត់​រចនាសម្ព័ន្ធ​ម៉ាស៊ីន​បម្រើ",
+"Host" => "ម៉ាស៊ីន​ផ្ទុក",
+"Password" => "ពាក្យសម្ងាត់"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_ldap/l10n/ko.php b/apps/user_ldap/l10n/ko.php
index 2d861f27ba8..5dd2151a411 100644
--- a/apps/user_ldap/l10n/ko.php
+++ b/apps/user_ldap/l10n/ko.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "저장",
"Test Configuration" => "설정 시험",
"Help" => "도움말",
-"Limit the access to %s to groups meeting this criteria:" => "다음 조건을 만족하는 그룹만 %s 접근 허용:",
"only those object classes:" => "다음 객체 클래스만:",
"only from those groups:" => "다음 그룹에서만:",
"Edit raw filter instead" => "필터 직접 편집",
"Raw LDAP filter" => "LDAP 필터",
"The filter specifies which LDAP groups shall have access to the %s instance." => "이 필터는 %s에 접근할 수 있는 LDAP 그룹을 설정합니다.",
"groups found" => "그룹 찾음",
-"What attribute shall be used as login name:" => "로그인 이름으로 사용할 속성:",
"LDAP Username:" => "LDAP 사용자 이름:",
"LDAP Email Address:" => "LDAP 이메일 주소:",
"Other Attributes:" => "기타 속성:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "익명 접근을 허용하려면 DN과 암호를 비워 두십시오.",
"One Base DN per line" => "기본 DN을 한 줄에 하나씩 입력하십시오",
"You can specify Base DN for users and groups in the Advanced tab" => "고급 탭에서 사용자 및 그룹에 대한 기본 DN을 지정할 수 있습니다.",
-"Limit the access to %s to users meeting this criteria:" => "다음 조건을 만족하는 사용자만 %s 접근 허용:",
"The filter specifies which LDAP users shall have access to the %s instance." => "이 필터는 %s에 접근할 수 있는 LDAP 사용자를 설정합니다.",
"users found" => "사용자 찾음",
"Back" => "뒤로",
diff --git a/apps/user_ldap/l10n/ml.php b/apps/user_ldap/l10n/ml.php
new file mode 100644
index 00000000000..3a1e002311c
--- /dev/null
+++ b/apps/user_ldap/l10n/ml.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%s group found_::_%s groups found_" => array("",""),
+"_%s user found_::_%s users found_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/mn.php b/apps/user_ldap/l10n/mn.php
new file mode 100644
index 00000000000..3a1e002311c
--- /dev/null
+++ b/apps/user_ldap/l10n/mn.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%s group found_::_%s groups found_" => array("",""),
+"_%s user found_::_%s users found_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/nb_NO.php b/apps/user_ldap/l10n/nb_NO.php
index 625ec79d76b..0b60752e9d9 100644
--- a/apps/user_ldap/l10n/nb_NO.php
+++ b/apps/user_ldap/l10n/nb_NO.php
@@ -1,23 +1,48 @@
<?php
$TRANSLATIONS = array(
+"Failed to clear the mappings." => "Klarte ikke å nullstille tilknytningene.",
"Failed to delete the server configuration" => "Klarte ikke å slette tjener-konfigurasjonen.",
"The configuration is valid and the connection could be established!" => "Konfigurasjonen er i orden og tilkoblingen skal være etablert!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Konfigurasjonen er i orden, men Bind mislyktes. Vennligst sjekk tjener-konfigurasjonen og påloggingsinformasjonen.",
+"The configuration is invalid. Please have a look at the logs for further details." => "Konfigurasjonen er ikke gyldig. Sjekk loggene for flere detaljer.",
+"No action specified" => "Ingen handling spesifisert",
+"No configuration specified" => "Ingen konfigurasjon spesifisert",
+"No data specified" => "Ingen data spesifisert",
+" Could not set configuration %s" => "Klarte ikke å sette konfigurasjon %s",
"Deletion failed" => "Sletting mislyktes",
"Take over settings from recent server configuration?" => "Hent innstillinger fra tidligere tjener-konfigurasjon?",
"Keep settings?" => "Behold innstillinger?",
"Cannot add server configuration" => "Kan ikke legge til tjener-konfigurasjon",
+"mappings cleared" => "tilknytninger nullstilt",
"Success" => "Suksess",
"Error" => "Feil",
+"Configuration OK" => "Konfigurasjon OK",
+"Configuration incorrect" => "Konfigurasjon feil",
+"Configuration incomplete" => "Konfigurasjon ufullstendig",
"Select groups" => "Velg grupper",
+"Select object classes" => "Velg objektklasser",
+"Select attributes" => "Velg attributter",
"Connection test succeeded" => "Tilkoblingstest lyktes",
"Connection test failed" => "Tilkoblingstest mislyktes",
"Do you really want to delete the current Server Configuration?" => "Er du sikker på at du vil slette aktiv tjener-konfigurasjon?",
"Confirm Deletion" => "Bekreft sletting",
-"_%s group found_::_%s groups found_" => array("",""),
-"_%s user found_::_%s users found_" => array("",""),
+"_%s group found_::_%s groups found_" => array("%s gruppe funnet","%s grupper funnet"),
+"_%s user found_::_%s users found_" => array("%s bruker funnet","%s brukere funnet"),
+"Invalid Host" => "Ugyldig tjener",
+"Could not find the desired feature" => "Fant ikke den ønskede funksjonaliteten",
"Save" => "Lagre",
+"Test Configuration" => "Test konfigurasjonen",
"Help" => "Hjelp",
+"only those object classes:" => "kun de objektklassene:",
+"only from those groups:" => "kun fra de gruppene:",
+"Edit raw filter instead" => "Rediger ubearbeidet filter i stedet",
+"Raw LDAP filter" => "Ubearbeidet LDAP-filter",
+"The filter specifies which LDAP groups shall have access to the %s instance." => "Filteret spesifiserer hvilke LDAP-grupper som skal ha tilgang til %s-instansen.",
+"groups found" => "grupper funnet",
+"LDAP Username:" => "LDAP-brukernavn:",
+"LDAP Email Address:" => "LDAP-epostadresse:",
+"Other Attributes:" => "Andre attributter:",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Definerer filteret som skal brukes når innlogging forsøkes. %%uid erstatter brukernavnet i innloggingshandlingen. Eksempel: \"uid=%%uid\"",
"Add Server Configuration" => "Legg til tjener-konfigurasjon",
"Host" => "Tjener",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Du kan utelate protokollen, men du er påkrevd å bruke SSL. Deretter starte med ldaps://",
@@ -28,23 +53,55 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "For anonym tilgang, la DN- og passord-feltet stå tomt.",
"One Base DN per line" => "En hoved DN pr. linje",
"You can specify Base DN for users and groups in the Advanced tab" => "Du kan spesifisere Base DN for brukere og grupper under Avansert fanen",
+"The filter specifies which LDAP users shall have access to the %s instance." => "Filteret spesifiserer hvilke LDAP-brukere som skal ha tilgang til %s-instansen.",
+"users found" => "brukere funnet",
"Back" => "Tilbake",
"Continue" => "Fortsett",
+"<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>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Warning:</b> PHP LDAP modulen er ikke installert, hjelperen vil ikke virke. Vennligst be din system-administrator om å installere den.",
+"Connection Settings" => "Innstillinger for tilkobling",
"Configuration Active" => "Konfigurasjon aktiv",
"When unchecked, this configuration will be skipped." => "Når ikke huket av så vil denne konfigurasjonen bli hoppet over.",
"Backup (Replica) Host" => "Sikkerhetskopierings (Replica) vert",
+"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Oppgi en valgfri reservetjener. Den må være en replika av hovedtjeneren for LDAP/AD.",
+"Backup (Replica) Port" => "Reserve (Replika) Port",
+"Disable Main Server" => "Deaktiver hovedtjeneren",
+"Only connect to the replica server." => "Koble til bare replika-tjeneren.",
"Case insensitve LDAP server (Windows)" => "Case-insensitiv LDAP tjener (Windows)",
"Turn off SSL certificate validation." => "Slå av SSL-sertifikat validering",
+"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." => "Ikke anbefalt, bruk kun for testing! Hvis tilkobling bare virker med dette valget, importer LDAP-tjenerens SSL-sertifikat i %s-serveren din.",
+"Cache Time-To-Live" => "Levetid i mellomlager",
"in seconds. A change empties the cache." => "i sekunder. En endring tømmer bufferen.",
+"Directory Settings" => "Innstillinger for Katalog",
"User Display Name Field" => "Vis brukerens navnfelt",
+"The LDAP attribute to use to generate the user's display name." => "LDAP-attributten som skal brukes til å generere brukerens visningsnavn.",
"Base User Tree" => "Hovedbruker tre",
"One User Base DN per line" => "En Bruker Base DN pr. linje",
+"User Search Attributes" => "Attributter for brukersøk",
+"Optional; one attribute per line" => "Valgfritt, en attributt pr. linje",
"Group Display Name Field" => "Vis gruppens navnfelt",
+"The LDAP attribute to use to generate the groups's display name." => "LDAP-attributten som skal brukes til å generere gruppens visningsnavn.",
"Base Group Tree" => "Hovedgruppe tre",
"One Group Base DN per line" => "En gruppe hoved-DN pr. linje",
+"Group Search Attributes" => "Attributter for gruppesøk",
"Group-Member association" => "gruppe-medlem assosiasjon",
+"Special Attributes" => "Spesielle attributter",
+"Quota Field" => "Felt med lagringskvote",
+"Quota Default" => "Standard lagringskvote",
"in bytes" => "i bytes",
-"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "La stå tom for brukernavn (standard). Ellers, spesifiser en LDAP/AD attributt."
+"Email Field" => "Felt med e-postadresse",
+"User Home Folder Naming Rule" => "Navneregel for brukers hjemmemappe",
+"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "La stå tom for brukernavn (standard). Ellers, spesifiser en LDAP/AD attributt.",
+"Internal Username" => "Internt brukernavn",
+"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." => "Som standard vil det interne brukernavnet bli laget utifra UUID-attributten. Dette sikrer at brukernavnet er unikt og at det ikke er nødvendig å konvertere tegn. Det interne brukernavnet har den begrensningen at bare disse tegnene er tillatt: [ a-zA-Z0-9_.@- ]. Andre tegn erstattes av tilsvarende ASCII-tegn eller blir ganske enkelt utelatt. Ved kollisjon blir et nummer lagt til / øket. Det interne brukernavnet brukes til å identifisere en bruker internt. Det er også standardnavnet på brukerens hjemmemappe. Det er også med i fjern-URL-er, for eksempel for alle *DAV-tjenester. Med denne innstillingen kan standard oppførsel overstyres. For å få en oppførsel som likner oppførselen før ownCloud 5, legg inn attributten for brukerens visningsnavn i dette feltet. La feltet stå tomt for standard oppførsel. Endringer vil kun påvirke nylig tilknyttede (opprettede) LDAP-brukere.",
+"Internal Username Attribute:" => "Attributt for internt brukernavn:",
+"Override UUID detection" => "Overstyr UUID-oppdaging",
+"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." => "Som standard blir UUID-attributten oppdaget automatisk. UUID-attributten brukes til å identifisere LDAP-brukere og -grupper uten tvil. Det interne brukernavnet vil også bli laget basert på UUID, hvis ikke annet er spesifisert ovenfor. Du kan overstyre innstillingen og oppgi den attributten du ønsker. Du må forsikre det om at din valgte attributt kan hentes ut både for brukere og for grupper og at den er unik. La stå tomt for standard oppførsel. Endringer vil kun påvirke nylig tilknyttede (opprettede) LDAP-brukere og -grupper.",
+"UUID Attribute for Users:" => "UUID-attributt for brukere:",
+"UUID Attribute for Groups:" => "UUID-attributt for grupper:",
+"Username-LDAP User Mapping" => "Tilknytning av brukernavn til LDAP-bruker",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Brukernavn brukes til å lagre og tilordne (meta)data. For at brukere skal identifiseres og gjenkjennes presist, vil hver LDAP-bruker ha et internt brukernavn. Dette krever en tilknytning fra brukernavn til LDAP-bruker. Brukernavn som opprettes blir knyttet til LDAP-brukerens UUID. I tillegg mellomlagres DN for å redusere LDAP-kommunikasjon, men det brukes ikke til identifisering. Hvis DN endres vil endringene bli oppdaget. Det interne brukernavnet brukes alle steder. Nullstilling av tilknytningene vil etterlate seg rester overalt. Nullstilling av tilknytningene skjer ikke pr. konfigurasjon, det påvirker alle LDAP-konfigurasjoner! Nullstill aldri tilknytningene i et produksjonsmiljø, kun ved testing eller eksperimentering.",
+"Clear Username-LDAP User Mapping" => "Nullstill tilknytning av brukernavn til LDAP-bruker",
+"Clear Groupname-LDAP Group Mapping" => "Nullstill tilknytning av gruppenavn til LDAP-gruppe"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/nl.php b/apps/user_ldap/l10n/nl.php
index bfe96f4268c..55e4e07033a 100644
--- a/apps/user_ldap/l10n/nl.php
+++ b/apps/user_ldap/l10n/nl.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Bewaren",
"Test Configuration" => "Test configuratie",
"Help" => "Help",
-"Limit the access to %s to groups meeting this criteria:" => "Beperk toegang tot %s tot groepen die voldoen aan deze criteria:",
+"Groups meeting these criteria are available in %s:" => "Groepsafspraken die voldoen aan deze criteria zijn beschikbaar in %s:",
"only those object classes:" => "alleen deze objectklassen",
"only from those groups:" => "alleen van deze groepen:",
"Edit raw filter instead" => "Bewerk raw filter",
"Raw LDAP filter" => "Raw LDAP filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Dit filter geeft aan welke LDAP groepen toegang hebben tot %s.",
"groups found" => "groepen gevonden",
-"What attribute shall be used as login name:" => "Welk attribuut moet worden gebruikt als inlognaam:",
+"Users login with this attribute:" => "Gebruikers loggen in met dit attribuut:",
"LDAP Username:" => "LDAP Username:",
"LDAP Email Address:" => "LDAP e-mailadres:",
"Other Attributes:" => "Overige attributen:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Voor anonieme toegang, laat de DN en het wachtwoord leeg.",
"One Base DN per line" => "Een Base DN per regel",
"You can specify Base DN for users and groups in the Advanced tab" => "Je kunt het Base DN voor gebruikers en groepen specificeren in het tab Geavanceerd.",
-"Limit the access to %s to users meeting this criteria:" => "Beperk toegang tot %s tot gebruikers die voldoen aan deze criteria:",
+"Limit %s access to users meeting these criteria:" => "Beperk %s toegang tot gebruikers die voldoen aan deze criteria:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Dit filter geeft aan welke LDAP gebruikers toegang hebben tot %s.",
"users found" => "gebruikers gevonden",
"Back" => "Terug",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Een Group Base DN per regel",
"Group Search Attributes" => "Attributen voor groepszoekopdrachten",
"Group-Member association" => "Groepslid associatie",
+"Nested Groups" => "Geneste groepen",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Wanneer ingeschakeld worden groepen binnen groepen ondersteund. (Werkt alleen als het groepslid attribuut DNs bevat)",
"Special Attributes" => "Speciale attributen",
"Quota Field" => "Quota veld",
"Quota Default" => "Quota standaard",
diff --git a/apps/user_ldap/l10n/pl.php b/apps/user_ldap/l10n/pl.php
index 056718a027d..5c6d3d7022e 100644
--- a/apps/user_ldap/l10n/pl.php
+++ b/apps/user_ldap/l10n/pl.php
@@ -4,6 +4,11 @@ $TRANSLATIONS = array(
"Failed to delete the server configuration" => "Nie można usunąć konfiguracji serwera",
"The configuration is valid and the connection could be established!" => "Konfiguracja jest prawidłowa i można ustanowić połączenie!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "Konfiguracja jest prawidłowa, ale Bind nie. Sprawdź ustawienia serwera i poświadczenia.",
+"The configuration is invalid. Please have a look at the logs for further details." => "Konfiguracja jest nieprawidłowa. Proszę rzucić okiem na dzienniki dalszych szczegółów.",
+"No action specified" => "Nie określono akcji",
+"No configuration specified" => "Nie określono konfiguracji",
+"No data specified" => "Nie określono danych",
+" Could not set configuration %s" => "Nie można ustawić konfiguracji %s",
"Deletion failed" => "Usunięcie nie powiodło się",
"Take over settings from recent server configuration?" => "Przejmij ustawienia z ostatnich konfiguracji serwera?",
"Keep settings?" => "Zachować ustawienia?",
@@ -11,16 +16,35 @@ $TRANSLATIONS = array(
"mappings cleared" => "Mapoanie wyczyszczone",
"Success" => "Sukces",
"Error" => "Błąd",
+"Configuration OK" => "Konfiguracja poprawna",
+"Configuration incorrect" => "Konfiguracja niepoprawna",
+"Configuration incomplete" => "Konfiguracja niekompletna",
"Select groups" => "Wybierz grupy",
+"Select object classes" => "Wybierz obiekty klas",
+"Select attributes" => "Wybierz atrybuty",
"Connection test succeeded" => "Test połączenia udany",
"Connection test failed" => "Test połączenia nie udany",
"Do you really want to delete the current Server Configuration?" => "Czy chcesz usunąć bieżącą konfigurację serwera?",
"Confirm Deletion" => "Potwierdź usunięcie",
-"_%s group found_::_%s groups found_" => array("","",""),
-"_%s user found_::_%s users found_" => array("","",""),
+"_%s group found_::_%s groups found_" => array("%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup"),
+"_%s user found_::_%s users found_" => array("%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników"),
+"Invalid Host" => "Niepoprawny Host",
+"Could not find the desired feature" => "Nie można znaleźć żądanej funkcji",
"Save" => "Zapisz",
"Test Configuration" => "Konfiguracja testowa",
"Help" => "Pomoc",
+"Groups meeting these criteria are available in %s:" => "Przyłączenie do grupy z tymi ustawieniami dostępne jest w %s:",
+"only those object classes:" => "tylko te klasy obiektów:",
+"only from those groups:" => "tylko z tych grup:",
+"Edit raw filter instead" => "Edytuj zamiast tego czysty filtr",
+"Raw LDAP filter" => "Czysty filtr LDAP",
+"The filter specifies which LDAP groups shall have access to the %s instance." => "Filtr określa, które grupy LDAP powinny mieć dostęp do instancji %s.",
+"groups found" => "grup znaleziono",
+"Users login with this attribute:" => "Użytkownicy zalogowani z tymi ustawieniami:",
+"LDAP Username:" => "Nazwa użytkownika LDAP:",
+"LDAP Email Address:" => "LDAP Adres Email:",
+"Other Attributes:" => "Inne atrybuty:",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Określa jakiego filtru użyć podczas próby zalogowania. %%uid zastępuje nazwę użytkownika w procesie logowania. Przykład: \"uid=%%uid\"",
"Add Server Configuration" => "Dodaj konfigurację servera",
"Host" => "Host",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Można pominąć protokół, z wyjątkiem wymaganego protokołu SSL. Następnie uruchom z ldaps://",
@@ -31,8 +55,12 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Dla dostępu anonimowego pozostawić DN i hasło puste.",
"One Base DN per line" => "Jedna baza DN na linię",
"You can specify Base DN for users and groups in the Advanced tab" => "Bazę DN można określić dla użytkowników i grup w karcie Zaawansowane",
+"Limit %s access to users meeting these criteria:" => "Limit %s dostępu do podłączania użytkowników z tymi ustawieniami:",
+"The filter specifies which LDAP users shall have access to the %s instance." => "Filtr określa, którzy użytkownicy LDAP powinni mieć dostęp do instancji %s.",
+"users found" => "użytkownicy znalezieni",
"Back" => "Wróć",
"Continue" => "Kontynuuj ",
+"<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>Ostrzeżenie:</b> Aplikacje user_ldap i user_webdavauth nie są kompatybilne. Mogą powodować nieoczekiwane zachowanie. Poproś administratora o wyłączenie jednej z nich.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Ostrzeżenie:</b> Moduł PHP LDAP nie jest zainstalowany i nie będzie działał. Poproś administratora o włączenie go.",
"Connection Settings" => "Konfiguracja połączeń",
"Configuration Active" => "Konfiguracja archiwum",
@@ -44,19 +72,24 @@ $TRANSLATIONS = array(
"Only connect to the replica server." => "Połącz tylko do repliki serwera.",
"Case insensitve LDAP server (Windows)" => "Wielkość liter serwera LDAP (Windows)",
"Turn off SSL certificate validation." => "Wyłączyć sprawdzanie poprawności certyfikatu 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." => "Nie polecane, używać tylko w celu testowania! Jeśli połączenie działa tylko z tą opcją, zaimportuj certyfikat SSL serwera LDAP na swój %s.",
"Cache Time-To-Live" => "Przechowuj czas życia",
"in seconds. A change empties the cache." => "w sekundach. Zmiana opróżnia pamięć podręczną.",
"Directory Settings" => "Ustawienia katalogów",
"User Display Name Field" => "Pole wyświetlanej nazwy użytkownika",
+"The LDAP attribute to use to generate the user's display name." => "Atrybut LDAP służący do generowania wyświetlanej nazwy użytkownika ownCloud.",
"Base User Tree" => "Drzewo bazy użytkowników",
"One User Base DN per line" => "Jeden użytkownik Bazy DN na linię",
"User Search Attributes" => "Szukaj atrybutów",
"Optional; one attribute per line" => "Opcjonalnie; jeden atrybut w wierszu",
"Group Display Name Field" => "Pole wyświetlanej nazwy grupy",
+"The LDAP attribute to use to generate the groups's display name." => "Atrybut LDAP służący do generowania wyświetlanej nazwy grupy ownCloud.",
"Base Group Tree" => "Drzewo bazy grup",
"One Group Base DN per line" => "Jedna grupa bazy DN na linię",
"Group Search Attributes" => "Grupa atrybutów wyszukaj",
"Group-Member association" => "Członek grupy stowarzyszenia",
+"Nested Groups" => "Grupy zagnieżdżone",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Kiedy włączone, grupy, które zawierają grupy, są wspierane. (Działa tylko, jeśli członek grupy ma ustawienie DNs)",
"Special Attributes" => "Specjalne atrybuty",
"Quota Field" => "Pole przydziału",
"Quota Default" => "Przydział domyślny",
@@ -65,11 +98,14 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "Reguły nazewnictwa folderu domowego użytkownika",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Pozostaw puste dla user name (domyślnie). W przeciwnym razie podaj atrybut LDAP/AD.",
"Internal Username" => "Wewnętrzna nazwa użytkownika",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. 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." => "Domyślnie, wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID, ang. Universally unique identifier - Unikalny identyfikator użytkownika. To daje pewność, że nazwa użytkownika jest niepowtarzalna, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika dopuszcza jedynie znaki: [ a-zA-Z0-9_.@- ]. Pozostałe znaki zamieniane są na ich odpowiedniki ASCII lub po prostu pomijane. W przypadku, gdy nazwa się powtarza na końcu jest dodawana / zwiększana cyfra. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest to również domyślna nazwa folderu domowego użytkownika. Jest to również część zdalnego adresu URL, na przykład dla wszystkich usług *DAV. Dzięki temu ustawieniu można nadpisywać domyślne zachowanie aplikacji. Aby osiągnąć podobny efekt jak przed ownCloud 5 wpisz atrybut nazwy użytkownika w poniższym polu. Pozostaw puste dla domyślnego zachowania. Zmiany będą miały wpływ tylko na nowo przypisanych (dodanych) użytkowników LDAP.",
"Internal Username Attribute:" => "Wewnętrzny atrybut nazwy uzżytkownika:",
"Override UUID detection" => "Zastąp wykrywanie 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." => "Domyślnie, atrybut UUID jest wykrywany automatycznie. Atrybut UUID jest używany do niepodważalnej identyfikacji użytkowników i grup LDAP. Również wewnętrzna nazwa użytkownika zostanie stworzona na bazie UUID, jeśli nie zostanie podana powyżej. Możesz nadpisać to ustawienie i użyć atrybutu wedle uznania. Musisz się jednak upewnić, że atrybut ten może zostać pobrany zarówno dla użytkowników, jak i grup i jest unikalny. Pozostaw puste dla domyślnego zachowania. Zmiany będą miały wpływ tylko na nowo przypisanych (dodanych) użytkowników i grupy LDAP.",
"UUID Attribute for Users:" => "Atrybuty UUID dla użytkowników:",
"UUID Attribute for Groups:" => "Atrybuty UUID dla grup:",
"Username-LDAP User Mapping" => "Mapowanie użytkownika LDAP",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Nazwy użytkowników są używane w celu przechowywania i przypisywania (meta) danych. Aby dokładnie zidentyfikować i rozpoznać użytkowników, każdy użytkownik LDAP będzie miał wewnętrzną nazwę. To wymaga utworzenia przypisania nazwy użytkownika do użytkownika LDAP. Utworzona nazwa użytkownika jet przypisywana do UUID użytkownika LDAP. Dodatkowo DN jest również buforowany aby zmniejszyć interakcję z LDAP, ale nie jest używany do identyfikacji. Jeśli DN się zmieni, zmiany zostaną odnalezione. Wewnętrzny użytkownik jest używany we wszystkich przypadkach. Wyczyszczenie mapowań spowoduje pozostawienie wszędzie resztek informacji. Wyczyszczenie mapowań nie jest wrażliwe na konfigurację, wpływa ono na wszystkie konfiguracje LDAP! Nigdy nie czyść mapowań w środowisku produkcyjnym, tylko podczas testów lub w fazie eksperymentalnej. ",
"Clear Username-LDAP User Mapping" => "Czyść Mapowanie użytkownika LDAP",
"Clear Groupname-LDAP Group Mapping" => "Czyść Mapowanie nazwy grupy LDAP"
);
diff --git a/apps/user_ldap/l10n/pt_BR.php b/apps/user_ldap/l10n/pt_BR.php
index 559dc949bd5..786bee4c8ae 100644
--- a/apps/user_ldap/l10n/pt_BR.php
+++ b/apps/user_ldap/l10n/pt_BR.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Guardar",
"Test Configuration" => "Teste de Configuração",
"Help" => "Ajuda",
-"Limit the access to %s to groups meeting this criteria:" => "Limitar o acesso a %s para grupos que coincidam com estes critérios:",
+"Groups meeting these criteria are available in %s:" => "Grupos que satisfazem estes critérios estão disponíveis em %s:",
"only those object classes:" => "apenas essas classes de objetos:",
"only from those groups:" => "apenas a partir dos grupos:",
"Edit raw filter instead" => "Editar filtro raw ao invéz",
"Raw LDAP filter" => "Filtro LDAP Raw",
"The filter specifies which LDAP groups shall have access to the %s instance." => "O filtro especifica quais grupos LDAP devem ter acesso à instância do %s.",
"groups found" => "grupos encontrados",
-"What attribute shall be used as login name:" => "O atributo deve ser usado como nome de login:",
+"Users login with this attribute:" => "Usuários entrar com este atributo:",
"LDAP Username:" => "Usuário LDAP:",
"LDAP Email Address:" => "LDAP Endereço de E-mail:",
"Other Attributes:" => "Outros atributos:",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para acesso anônimo, deixe DN e Senha vazios.",
"One Base DN per line" => "Uma base DN por linha",
"You can specify Base DN for users and groups in the Advanced tab" => "Você pode especificar DN Base para usuários e grupos na guia Avançada",
-"Limit the access to %s to users meeting this criteria:" => "Limitar o acesso a %s para usuários que coincidam com estes critérios:",
+"Limit %s access to users meeting these criteria:" => "Limitar o acesso %s para usuários que satisfazem esses critérios:",
"The filter specifies which LDAP users shall have access to the %s instance." => "O filtro especifica quais usuários LDAP devem ter acesso à instância do %s.",
"users found" => "usuários encontrados",
"Back" => "Voltar",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Um grupo-base DN por linha",
"Group Search Attributes" => "Atributos de Busca de Grupo",
"Group-Member association" => "Associação Grupo-Membro",
+"Nested Groups" => "Grupos Aninhados",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Quando habilitado, os grupos que contêm os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)",
"Special Attributes" => "Atributos Especiais",
"Quota Field" => "Campo de Cota",
"Quota Default" => "Cota Padrão",
diff --git a/apps/user_ldap/l10n/pt_PT.php b/apps/user_ldap/l10n/pt_PT.php
index 89c37358b67..37142c8175a 100644
--- a/apps/user_ldap/l10n/pt_PT.php
+++ b/apps/user_ldap/l10n/pt_PT.php
@@ -1,9 +1,13 @@
<?php
$TRANSLATIONS = array(
"Failed to clear the mappings." => "Falhou a limpar os mapas",
-"Failed to delete the server configuration" => "Erro ao eliminar as configurações do servidor",
+"Failed to delete the server configuration" => "Erro ao eliminar a configuração do servidor",
"The configuration is valid and the connection could be established!" => "A configuração está correcta e foi possível estabelecer a ligação!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." => "A configuração está correcta, mas não foi possível estabelecer o \"laço\", por favor, verifique as configurações do servidor e as credenciais.",
+"No action specified" => "Nenhuma acção especificada",
+"No configuration specified" => "Nenhuma configuração especificada",
+"No data specified" => "Nenhuma data especificada",
+" Could not set configuration %s" => "Não foi possível definir a configuração %s",
"Deletion failed" => "Erro ao apagar",
"Take over settings from recent server configuration?" => "Assumir as configurações da configuração do servidor mais recente?",
"Keep settings?" => "Manter as definições?",
@@ -11,16 +15,33 @@ $TRANSLATIONS = array(
"mappings cleared" => "Mapas limpos",
"Success" => "Sucesso",
"Error" => "Erro",
+"Configuration OK" => "Configuração OK",
+"Configuration incorrect" => "Configuração incorreta",
+"Configuration incomplete" => "Configuração incompleta",
"Select groups" => "Seleccionar grupos",
+"Select object classes" => "Selecionar classes de objetos",
+"Select attributes" => "Selecionar atributos",
"Connection test succeeded" => "Teste de conecção passado com sucesso.",
"Connection test failed" => "Erro no teste de conecção.",
"Do you really want to delete the current Server Configuration?" => "Deseja realmente apagar as configurações de servidor actuais?",
"Confirm Deletion" => "Confirmar a operação de apagar",
-"_%s group found_::_%s groups found_" => array("",""),
-"_%s user found_::_%s users found_" => array("",""),
+"_%s group found_::_%s groups found_" => array("%s grupo encontrado","%s grupos encontrados"),
+"_%s user found_::_%s users found_" => array("%s utilizador encontrado","%s utilizadores encontrados"),
+"Invalid Host" => "Hospedeiro Inválido",
+"Could not find the desired feature" => "Não se encontrou a função desejada",
"Save" => "Guardar",
"Test Configuration" => "Testar a configuração",
"Help" => "Ajuda",
+"only those object classes:" => "apenas essas classes de objetos:",
+"only from those groups:" => "apenas desses grupos:",
+"Edit raw filter instead" => "Editar filtro raw em vez disso",
+"Raw LDAP filter" => "Filtro LDAP Raw",
+"The filter specifies which LDAP groups shall have access to the %s instance." => "O filtro especifica quais grupos LDAP devem ter acesso à instância %s.",
+"groups found" => "grupos encontrados",
+"LDAP Username:" => "Nome de utilizador LDAP:",
+"LDAP Email Address:" => "Endereço de correio eletrónico LDAP:",
+"Other Attributes:" => "Outros Atributos:",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Define o filtro a aplicar, quando se tenta uma sessão. %%uid substitui o nome de utilizador na ação de início de sessão. Exemplo: \"uid=%%uid\"",
"Add Server Configuration" => "Adicionar configurações do servidor",
"Host" => "Anfitrião",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Pode omitir o protocolo, excepto se necessitar de SSL. Neste caso, comece com ldaps://",
@@ -31,8 +52,10 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Para acesso anónimo, deixe DN e a Palavra-passe vazios.",
"One Base DN per line" => "Uma base DN por linho",
"You can specify Base DN for users and groups in the Advanced tab" => "Pode especificar o ND Base para utilizadores e grupos no separador Avançado",
+"users found" => "utilizadores encontrados",
"Back" => "Voltar",
"Continue" => "Continuar",
+"<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>Aviso:</b> A aplicação user_ldap e user_webdavauth são incompativeis. A aplicação pode tornar-se instável. Por favor, peça ao seu administrador para desactivar uma das aplicações.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Aviso:</b> O módulo PHP LDAP não está instalado, logo não irá funcionar. Por favor peça ao administrador para o instalar.",
"Connection Settings" => "Definições de ligação",
"Configuration Active" => "Configuração activa",
@@ -41,17 +64,20 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Forneça um servidor (anfitrião) de backup. Deve ser uma réplica do servidor principal de LDAP/AD ",
"Backup (Replica) Port" => "Porta do servidor de backup (Replica)",
"Disable Main Server" => "Desactivar servidor principal",
+"Only connect to the replica server." => "Ligar apenas ao servidor de réplicas.",
"Case insensitve LDAP server (Windows)" => "Servidor LDAP (Windows) não sensível a maiúsculas.",
"Turn off SSL certificate validation." => "Desligar a validação de certificado SSL.",
"Cache Time-To-Live" => "Cache do tempo de vida dos objetos no servidor",
"in seconds. A change empties the cache." => "em segundos. Uma alteração esvazia a cache.",
"Directory Settings" => "Definições de directorias",
"User Display Name Field" => "Mostrador do nome de utilizador.",
+"The LDAP attribute to use to generate the user's display name." => "Atributo LDAP para gerar o nome de utilizador do ownCloud.",
"Base User Tree" => "Base da árvore de utilizadores.",
"One User Base DN per line" => "Uma base de utilizador DN por linha",
"User Search Attributes" => "Utilizar atributos de pesquisa",
"Optional; one attribute per line" => "Opcional; Um atributo por linha",
"Group Display Name Field" => "Mostrador do nome do grupo.",
+"The LDAP attribute to use to generate the groups's display name." => "Atributo LDAP para gerar o nome do grupo do ownCloud.",
"Base Group Tree" => "Base da árvore de grupos.",
"One Group Base DN per line" => "Uma base de grupo DN por linha",
"Group Search Attributes" => "Atributos de pesquisa de grupo",
@@ -64,8 +90,11 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "Regra da pasta inicial do utilizador",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Deixe vazio para nome de utilizador (padrão). De outro modo, especifique um atributo LDAP/AD.",
"Internal Username" => "Nome de utilizador interno",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "Por padrão o nome de utilizador interno vai ser criado através do atributo UUID. Desta forma é assegurado que o nome é único e os caracteres não necessitam de serem convertidos. O nome interno tem a restrição de que apenas estes caracteres são permitidos: [ a-zA-Z0-9_.@- ]. Outros caracteres são substituídos pela sua correspondência ASCII ou simplesmente omitidos. Mesmo assim, quando for detetado uma colisão irá ser acrescentado um número. O nome interno é usado para identificar o utilizador internamente. É também o nome utilizado para a pasta inicial no ownCloud. É também parte de URLs remotos, como por exemplo os serviços *DAV. Com esta definição, o comportamento padrão é pode ser sobreposto. Para obter o mesmo comportamento antes do ownCloud 5 introduza o atributo do nome no campo seguinte. Deixe vazio para obter o comportamento padrão. As alterações apenas serão feitas para utilizadores mapeados (adicionados) LDAP.",
"Internal Username Attribute:" => "Atributo do nome de utilizador interno",
"Override UUID detection" => "Passar a detecção do UUID",
+"UUID Attribute for Users:" => "Atributo UUID para utilizadores:",
+"UUID Attribute for Groups:" => "Atributo UUID para grupos:",
"Username-LDAP User Mapping" => "Mapeamento do utilizador LDAP",
"Clear Username-LDAP User Mapping" => "Limpar mapeamento do utilizador-LDAP",
"Clear Groupname-LDAP Group Mapping" => "Limpar o mapeamento do nome de grupo LDAP"
diff --git a/apps/user_ldap/l10n/ru.php b/apps/user_ldap/l10n/ru.php
index 7b9cf8ceb56..d9685368cbc 100644
--- a/apps/user_ldap/l10n/ru.php
+++ b/apps/user_ldap/l10n/ru.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Сохранить",
"Test Configuration" => "Проверить конфигурацию",
"Help" => "Помощь",
-"Limit the access to %s to groups meeting this criteria:" => "Ограничить доступ к %s группам, удовлетворяющим этому критерию:",
"only those object classes:" => "только эти объектные классы",
"only from those groups:" => "только из этих групп",
"Edit raw filter instead" => "Редактировать исходный фильтр",
"Raw LDAP filter" => "Исходный LDAP фильтр",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Этот фильтр определяет, какие LDAP группы должны иметь доступ к %s.",
"groups found" => "групп найдено",
-"What attribute shall be used as login name:" => "Какой атрибут должен быть использован для логина:",
"LDAP Username:" => "Имя пользователя LDAP",
"LDAP Email Address:" => "LDAP адрес электронной почты:",
"Other Attributes:" => "Другие атрибуты:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Для анонимного доступа оставьте DN и пароль пустыми.",
"One Base DN per line" => "По одной базе поиска (Base DN) в строке.",
"You can specify Base DN for users and groups in the Advanced tab" => "Вы можете задать Base DN для пользователей и групп на вкладке \"Расширенное\"",
-"Limit the access to %s to users meeting this criteria:" => "Ограничить доступ к %s пользователям, удовлетворяющим этому критерию:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Этот фильтр указывает, какие пользователи LDAP должны иметь доступ к %s.",
"users found" => "пользователей найдено",
"Back" => "Назад",
@@ -99,7 +96,7 @@ $TRANSLATIONS = array(
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено или увеличено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по умолчанию для папки пользователя в ownCloud. Оно также является частью URL, к примеру, для всех сервисов *DAV. С помощью данной настройки можно изменить поведение по умолчанию. Чтобы достичь поведения, как было до ownCloud 5, введите атрибут отображаемого имени пользователя в этом поле. Оставьте его пустым для режима по умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.",
"Internal Username Attribute:" => "Атрибут для внутреннего имени:",
"Override UUID detection" => "Переопределить нахождение UUID",
-"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно индентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.",
+"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.",
"UUID Attribute for Users:" => "UUID-атрибуты для пользователей:",
"UUID Attribute for Groups:" => "UUID-атрибуты для групп:",
"Username-LDAP User Mapping" => "Соответствия Имя-Пользователь LDAP",
diff --git a/apps/user_ldap/l10n/sk_SK.php b/apps/user_ldap/l10n/sk_SK.php
index 850fce24c48..460064593ee 100644
--- a/apps/user_ldap/l10n/sk_SK.php
+++ b/apps/user_ldap/l10n/sk_SK.php
@@ -16,7 +16,7 @@ $TRANSLATIONS = array(
"mappings cleared" => "mapovanie vymazané",
"Success" => "Úspešné",
"Error" => "Chyba",
-"Configuration OK" => "Konfigurácia je vporiadku",
+"Configuration OK" => "Konfigurácia je v poriadku",
"Configuration incorrect" => "Nesprávna konfigurácia",
"Configuration incomplete" => "Nekompletná konfigurácia",
"Select groups" => "Vybrať skupinu",
@@ -33,21 +33,19 @@ $TRANSLATIONS = array(
"Save" => "Uložiť",
"Test Configuration" => "Test nastavenia",
"Help" => "Pomoc",
-"Limit the access to %s to groups meeting this criteria:" => "Obmedziť prístup %s do skupiny, ktoré spĺňajú tieto kritériá:",
"only those object classes:" => "len tieto triedy objektov:",
"only from those groups:" => "len z týchto skupín:",
"Edit raw filter instead" => "Miesto pre úpravu raw filtra",
"Raw LDAP filter" => "Raw LDAP filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Tento filter LDAP určuje, ktoré skupiny budú mať prístup k %s inštancii.",
"groups found" => "nájdené skupiny",
-"What attribute shall be used as login name:" => "Ako prihlasovacie meno použiť atribút:",
"LDAP Username:" => "LDAP používateľské meno:",
"LDAP Email Address:" => "LDAP emailová adresa:",
"Other Attributes:" => "Iné atribúty:",
-"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Určuje použitý filter, pri pokuse o prihlásenie. %%uid nahradzuje používateľské meno v činnosti prihlásenia. Napríklad: \"uid=%%uid\"",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Určuje použitý filter, pri pokuse o prihlásenie. %%uid nahrádza používateľské meno v činnosti prihlásenia. Napríklad: \"uid=%%uid\"",
"Add Server Configuration" => "Pridať nastavenia servera.",
"Host" => "Hostiteľ",
-"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Môžete vynechať protokol, s výnimkou požadovania SSL. Vtedy začnite s ldaps://",
+"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Môžete vynechať protokol, okrem prípadu, kedy sa vyžaduje SSL. Vtedy začnite s ldaps://",
"Port" => "Port",
"User DN" => "Používateľské DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." => "DN klientského používateľa, ku ktorému tvoríte väzbu, napr. uid=agent,dc=example,dc=com. Pre anonymný prístup ponechajte údaje DN a Heslo prázdne.",
@@ -55,13 +53,12 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Pre anonymný prístup ponechajte údaje DN a Heslo prázdne.",
"One Base DN per line" => "Jedno základné DN na riadok",
"You can specify Base DN for users and groups in the Advanced tab" => "V rozšírenom nastavení môžete zadať základné DN pre používateľov a skupiny",
-"Limit the access to %s to users meeting this criteria:" => "Obmedziť prístup k %s na používateľov, ktorí spĺňajú tieto kritériá:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Tento filter LDAP určuje, ktorí používatelia majú prístup k %s inštancii.",
"users found" => "nájdení používatelia",
"Back" => "Späť",
"Continue" => "Pokračovať",
"<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>Upozornenie:</b> Aplikácie user_ldap a user_webdavauth sú navzájom nekompatibilné. Môžete zaznamenať neočakávané správanie. Požiadajte prosím vášho systémového administrátora pre zakázanie jedného z nich.",
-"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Upozornenie:</b> nie je nainštalovaný LDAP modul pre PHP, backend vrstva nebude fungovať. Požádejte administrátora systému aby ho nainštaloval.",
+"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Upozornenie:</b> nie je nainštalovaný LDAP modul pre PHP, backend vrstva nebude fungovať. Požiadajte administrátora systému, aby ho nainštaloval.",
"Connection Settings" => "Nastavenie pripojenia",
"Configuration Active" => "Nastavenia sú aktívne ",
"When unchecked, this configuration will be skipped." => "Ak nie je zaškrtnuté, nastavenie bude preskočené.",
@@ -73,10 +70,10 @@ $TRANSLATIONS = array(
"Case insensitve LDAP server (Windows)" => "LDAP server nerozlišuje veľkosť znakov (Windows)",
"Turn off SSL certificate validation." => "Vypnúť overovanie SSL certifikátu.",
"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." => "Neodporúčané, použite iba pri testovaní! Pokiaľ spojenie funguje iba z daným nastavením, importujte SSL certifikát LDAP servera do vášho %s servera.",
-"Cache Time-To-Live" => "Životnosť objektov v medzipamäti",
+"Cache Time-To-Live" => "Životnosť objektov vo vyrovnávacej pamäti",
"in seconds. A change empties the cache." => "v sekundách. Zmena vyprázdni vyrovnávaciu pamäť.",
-"Directory Settings" => "Nastavenie priečinka",
-"User Display Name Field" => "Pole pre zobrazenie mena používateľa",
+"Directory Settings" => "Nastavenia priečinka",
+"User Display Name Field" => "Pole pre zobrazované meno používateľa",
"The LDAP attribute to use to generate the user's display name." => "Atribút LDAP použitý na vygenerovanie zobrazovaného mena používateľa. ",
"Base User Tree" => "Základný používateľský strom",
"One User Base DN per line" => "Jedna používateľská základná DN na riadok",
@@ -94,16 +91,16 @@ $TRANSLATIONS = array(
"in bytes" => "v bajtoch",
"Email Field" => "Pole emailu",
"User Home Folder Naming Rule" => "Pravidlo pre nastavenie názvu používateľského priečinka dát",
-"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Nechajte prázdne pre používateľské meno (predvolené). Inak uveďte atribút LDAP/AD.",
+"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Nechajte prázdne pre používateľské meno (predvolené). Inak uveďte atribút z LDAP/AD.",
"Internal Username" => "Interné používateľské meno",
-"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." => "V predvolenom nastavení bude interné používateľské meno vytvorené z UUID atribútu. Zabezpečí sa to, že používateľské meno bude jedinečné a znaky nemusia byť prevedené. Interné meno má obmedzenie, iba tieto znaky sú povolené: [a-zA-Z0-9_ @ -.]. Ostatné znaky sú nahradené ich ASCII alebo jednoducho vynechané. Pri kolíziách používateľských mien bude číslo pridané / odobrané. Interné používateľské meno sa používa na internú identifikáciu používateľa. Je tiež predvoleným názvom používateľského domovského priečinka v ownCloud. Je tiež súčasťou URL pre vzdialený prístup, napríklad pre všetky služby * DAV. S týmto nastavením sa dá prepísať predvolené správanie. Pre dosiahnutie podobného správania sa ako pred verziou ownCloud 5 zadajte atribút zobrazenia používateľského mena v tomto poli. Ponechajte prázdne pre predvolené správanie. Zmeny budú mať vplyv iba na novo namapovaných (pridaných) LDAP používateľov.",
+"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." => "V predvolenom nastavení bude interné používateľské meno vytvorené z UUID atribútu. Zabezpečí sa to, že používateľské meno bude jedinečné a znaky nemusia byť prevedené. Interné meno má obmedzenie, iba tieto znaky sú povolené: [a-zA-Z0-9_ @ -.]. Ostatné znaky sú nahradené ich ASCII alebo jednoducho vynechané. Pri kolíziách používateľských mien bude číslo pridané / odobrané. Interné používateľské meno sa používa na internú identifikáciu používateľa. Je tiež predvoleným názvom používateľského domovského priečinka v ownCloud. Je tiež súčasťou URL pre vzdialený prístup, napríklad pre všetky služby *DAV. S týmto nastavením sa dá prepísať predvolené správanie. Pre dosiahnutie podobného správania sa ako pred verziou ownCloud 5 zadajte atribút zobrazenia používateľského mena v tomto poli. Ponechajte prázdne pre predvolené správanie. Zmeny budú mať vplyv iba na novo namapovaných (pridaných) LDAP používateľov.",
"Internal Username Attribute:" => "Atribút interného používateľského mena:",
"Override UUID detection" => "Prepísať UUID detekciu",
-"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." => "V predvolenom nastavení je UUID atribút detekovaný automaticky. UUID atribút je použitý na jedinečnú identifikáciu používateľov a skupín z LDAP. Naviac je na základe UUID vytvorené tiež interné použivateľské meno, ak nie je nastavené inak. Môžete predvolené nastavenie prepísať a použiť atribút ktorý si sami zvolíte. Musíte sa ale ubezpečiť, že atribút ktorý vyberiete bude uvedený pri použivateľoch, aj pri skupinách a je jedinečný. Ponechajte prázdne pre predvolené správanie. Zmena bude mať vplyv len na novo namapovaných (pridaných) používateľov a skupiny z LDAP.",
+"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." => "V predvolenom nastavení je UUID atribút detekovaný automaticky. UUID atribút je použitý na jedinečnú identifikáciu používateľov a skupín z LDAP. Naviac je na základe UUID vytvorené tiež interné používateľské meno, ak nie je nastavené inak. Môžete predvolené nastavenie prepísať a použiť atribút ktorý si sami zvolíte. Musíte sa ale ubezpečiť, že atribút ktorý vyberiete bude uvedený pri používateľoch, aj pri skupinách a je jedinečný. Ponechajte prázdne pre predvolené správanie. Zmena bude mať vplyv len na novo namapovaných (pridaných) používateľov a skupiny z LDAP.",
"UUID Attribute for Users:" => "UUID atribút pre používateľov:",
"UUID Attribute for Groups:" => "UUID atribút pre skupiny:",
"Username-LDAP User Mapping" => "Mapovanie názvov LDAP používateľských mien",
-"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Použivateľské mená sa používajú pre uchovávanie a priraďovanie (meta)dát. Pre správnu identifikáciu a rozpoznanie používateľov bude mať každý používateľ z LDAP interné používateľské meno. To je nevyhnutné pre namapovanie používateľských mien na používateľov v LDAP. Vytvorené používateľské meno je namapované na UUID používateľa v LDAP. Naviac je cachovaná DN pre obmedzenie interakcie s LDAP, ale nie je používaná pre identifikáciu. Ak sa DN zmení, bude to správne rozpoznané. Interné používateľské meno sa používa všade. Vyčistenie namapování vymaže zvyšky všade. Vyčistenie naviac nie je špecifické, bude mať vplyv na všetky LDAP konfigurácie! Nikdy nečistite namapovanie v produkčnom prostredí, len v testovacej alebo experimentálnej fáze.",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Používateľské mená sa používajú pre uchovávanie a priraďovanie (meta) dát. Pre správnu identifikáciu a rozpoznanie používateľov bude mať každý používateľ z LDAP interné používateľské meno. To je nevyhnutné pre namapovanie používateľských mien na používateľov v LDAP. Vytvorené používateľské meno je namapované na UUID používateľa v LDAP. Naviac je cachovaná DN pre obmedzenie interakcie s LDAP, ale nie je používaná pre identifikáciu. Ak sa DN zmení, bude to správne rozpoznané. Interné používateľské meno sa používa všade. Vyčistenie namapovaní vymaže zvyšky všade. Vyčistenie naviac nie je špecifické, bude mať vplyv na všetky LDAP konfigurácie! Nikdy nečistite namapovanie v produkčnom prostredí, len v testovacej alebo experimentálnej fáze.",
"Clear Username-LDAP User Mapping" => "Zrušiť mapovanie LDAP používateľských mien",
"Clear Groupname-LDAP Group Mapping" => "Zrušiť mapovanie názvov LDAP skupín"
);
diff --git a/apps/user_ldap/l10n/sl.php b/apps/user_ldap/l10n/sl.php
index b51c5bc7bb8..b2a21b6e029 100644
--- a/apps/user_ldap/l10n/sl.php
+++ b/apps/user_ldap/l10n/sl.php
@@ -33,14 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Shrani",
"Test Configuration" => "Preizkusne nastavitve",
"Help" => "Pomoč",
-"Limit the access to %s to groups meeting this criteria:" => "Omeji dostop %s do skupin glede na kriterij:",
"only those object classes:" => "le razredi predmeta:",
"only from those groups:" => "le iz skupin:",
"Edit raw filter instead" => "Uredi surov filter",
"Raw LDAP filter" => "Surovi filter LDAP",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Filter določa, katere skupine LDAP bodo imele dostop do %s.",
"groups found" => "najdenih skupin",
-"What attribute shall be used as login name:" => "Kateri atribut naj bo uporabljen kot prijavno ime:",
"LDAP Username:" => "Uporabniško ime LDAP:",
"LDAP Email Address:" => "Elektronski naslov LDAP:",
"Other Attributes:" => "Drugi atributi:",
@@ -55,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Za brezimni dostop naj bosta polji imena in gesla prazni.",
"One Base DN per line" => "Eno osnovno enolično ime na vrstico",
"You can specify Base DN for users and groups in the Advanced tab" => "Osnovno enolično ime za uporabnike in skupine lahko določite v zavihku naprednih možnosti.",
-"Limit the access to %s to users meeting this criteria:" => "Omeji dostop do %s uporabnikom, za katere velja kriterij:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Filter določa, kateri uporabniki LDAP bodo imeli dostop do %s.",
"users found" => "najdenih uporabnikov",
"Back" => "Nazaj",
diff --git a/apps/user_ldap/l10n/su.php b/apps/user_ldap/l10n/su.php
new file mode 100644
index 00000000000..bba52d53a1a
--- /dev/null
+++ b/apps/user_ldap/l10n/su.php
@@ -0,0 +1,6 @@
+<?php
+$TRANSLATIONS = array(
+"_%s group found_::_%s groups found_" => array(""),
+"_%s user found_::_%s users found_" => array("")
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_ldap/l10n/sv.php b/apps/user_ldap/l10n/sv.php
index 62beec274e9..0108cfcb0e4 100644
--- a/apps/user_ldap/l10n/sv.php
+++ b/apps/user_ldap/l10n/sv.php
@@ -33,12 +33,12 @@ $TRANSLATIONS = array(
"Save" => "Spara",
"Test Configuration" => "Testa konfigurationen",
"Help" => "Hjälp",
-"Limit the access to %s to groups meeting this criteria:" => "Begränsa åtkomsten till %s till grupper som möter följande kriterie:",
"only those object classes:" => "Endast de objekt-klasserna:",
"only from those groups:" => "endast ifrån de här grupperna:",
+"Edit raw filter instead" => "Redigera rått filter istället",
+"Raw LDAP filter" => "Rått LDAP-filter",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Filtret specifierar vilka LDAD-grupper som ska ha åtkomst till %s instans",
"groups found" => "grupper hittade",
-"What attribute shall be used as login name:" => "Vilket attribut ska användas som login namn:",
"LDAP Username:" => "LDAP användarnamn:",
"LDAP Email Address:" => "LDAP e-postadress:",
"Other Attributes:" => "Övriga attribut:",
@@ -53,7 +53,6 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "För anonym åtkomst, lämna DN och lösenord tomt.",
"One Base DN per line" => "Ett Start DN per rad",
"You can specify Base DN for users and groups in the Advanced tab" => "Du kan ange start DN för användare och grupper under fliken Avancerat",
-"Limit the access to %s to users meeting this criteria:" => "Begränsa åtkomsten till %s till användare som möter följande kriterie:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Filtret specifierar vilka LDAP-användare som skall ha åtkomst till %s instans",
"users found" => "användare funna",
"Back" => "Tillbaka",
diff --git a/apps/user_ldap/l10n/te.php b/apps/user_ldap/l10n/te.php
index ad3ffb1c5e8..e154c068734 100644
--- a/apps/user_ldap/l10n/te.php
+++ b/apps/user_ldap/l10n/te.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"_%s user found_::_%s users found_" => array("",""),
"Save" => "భద్రపరచు",
"Help" => "సహాయం",
-"Password" => "సంకేతపదం"
+"Password" => "సంకేతపదం",
+"Continue" => "కొనసాగించు"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_ldap/l10n/tr.php b/apps/user_ldap/l10n/tr.php
index 8299c5fecac..fa829a7427c 100644
--- a/apps/user_ldap/l10n/tr.php
+++ b/apps/user_ldap/l10n/tr.php
@@ -33,14 +33,14 @@ $TRANSLATIONS = array(
"Save" => "Kaydet",
"Test Configuration" => "Test Yapılandırması",
"Help" => "Yardım",
-"Limit the access to %s to groups meeting this criteria:" => "%s erişimini, şu kriterle eşleşen gruplara sınırla:",
+"Groups meeting these criteria are available in %s:" => "Bu kriterle eşleşen gruplar %s içinde mevcut:",
"only those object classes:" => "sadece bu nesne sınıflarına:",
"only from those groups:" => "sadece bu gruplardan:",
"Edit raw filter instead" => "Bunun yerine ham filtreyi düzenle",
"Raw LDAP filter" => "Ham LDAP filtresi",
"The filter specifies which LDAP groups shall have access to the %s instance." => "Filtre, %s örneğine erişmesi gereken LDAP gruplarını belirtir.",
"groups found" => "grup bulundu",
-"What attribute shall be used as login name:" => "Oturum ismi olarak hangi nitelik kullanılmalı:",
+"Users login with this attribute:" => "Bu nitelikle oturum açan kullanıcılar:",
"LDAP Username:" => "LDAP Kullanıcı Adı:",
"LDAP Email Address:" => "LDAP E-posta Adresi:",
"Other Attributes:" => "Diğer Nitelikler",
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Anonim erişim için DN ve Parola alanlarını boş bırakın.",
"One Base DN per line" => "Bir Tabani DN herbir dizi. ",
"You can specify Base DN for users and groups in the Advanced tab" => "Base DN kullanicileri ve kaynaklari icin tablosu Advanced tayin etmek ederiz. ",
-"Limit the access to %s to users meeting this criteria:" => "%s erişimini, şu kriterle eşleşen kullanıcılara sınırla:",
+"Limit %s access to users meeting these criteria:" => "%s erişimini, şu kriterle eşleşen kullanıcılara sınırla:",
"The filter specifies which LDAP users shall have access to the %s instance." => "Filtre, %s örneğine erişmesi gereken LDAP kullanıcılarını belirtir.",
"users found" => "kullanıcı bulundu",
"Back" => "Geri",
@@ -88,6 +88,8 @@ $TRANSLATIONS = array(
"One Group Base DN per line" => "Bir Grubu Tabani DN her dizgi. ",
"Group Search Attributes" => "Kategorii Arama Grubu",
"Group-Member association" => "Grup-Üye işbirliği",
+"Nested Groups" => "İç içe Gruplar",
+"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" => "Etkinleştirildiğinde, grup içeren gruplar desteklenir (Sadece grup üyesi DN niteliği içeriyorsa çalışır).",
"Special Attributes" => "Özel Öznitelikler",
"Quota Field" => "Kota Alanı",
"Quota Default" => "Öntanımlı Kota",
diff --git a/apps/user_ldap/l10n/vi.php b/apps/user_ldap/l10n/vi.php
index f1f069cc4d4..84d001cb596 100644
--- a/apps/user_ldap/l10n/vi.php
+++ b/apps/user_ldap/l10n/vi.php
@@ -17,6 +17,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "Cho phép truy cập nặc danh , DN và mật khẩu trống.",
"You can specify Base DN for users and groups in the Advanced tab" => "Bạn có thể chỉ định DN cơ bản cho người dùng và các nhóm trong tab Advanced",
"Back" => "Trở lại",
+"Continue" => "Tiếp tục",
"Connection Settings" => "Connection Settings",
"Backup (Replica) Port" => "Cổng sao lưu (Replica)",
"Disable Main Server" => "Tắt máy chủ chính",
diff --git a/apps/user_ldap/l10n/zh_CN.php b/apps/user_ldap/l10n/zh_CN.php
index f1a3625bf38..aae100ef9ad 100644
--- a/apps/user_ldap/l10n/zh_CN.php
+++ b/apps/user_ldap/l10n/zh_CN.php
@@ -32,6 +32,7 @@ $TRANSLATIONS = array(
"One Base DN per line" => "每行一个基本判别名",
"You can specify Base DN for users and groups in the Advanced tab" => "您可以在高级选项卡里为用户和组指定Base DN",
"Back" => "返回",
+"Continue" => "继续",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>警告:</b> PHP LDAP 模块未安装,后端将无法工作。请请求您的系统管理员安装该模块。",
"Connection Settings" => "连接设置",
"Configuration Active" => "现行配置",
@@ -40,6 +41,7 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "给出一个可选的备份主机。它必须为主 LDAP/AD 服务器的一个镜像。",
"Backup (Replica) Port" => "备份 (镜像) 端口",
"Disable Main Server" => "禁用主服务器",
+"Only connect to the replica server." => "只能连接到复制服务器",
"Case insensitve LDAP server (Windows)" => "大小写敏感LDAP服务器(Windows)",
"Turn off SSL certificate validation." => "关闭SSL证书验证",
"Cache Time-To-Live" => "缓存存活时间",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 72f9c740921..4d187bab8d5 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -107,8 +107,8 @@ class Access extends LDAPUtility {
/**
* @brief checks wether the given attribute`s valua is probably a DN
- * @param $attr the attribute in question
- * @return if so true, otherwise false
+ * @param string $attr the attribute in question
+ * @return boolean if so true, otherwise false
*/
private function resemblesDN($attr) {
$resemblingAttributes = array(
@@ -164,6 +164,7 @@ class Access extends LDAPUtility {
/**
* gives back the database table for the query
+ * @param boolean $isUser
*/
private function getMapTable($isUser) {
if($isUser) {
@@ -175,7 +176,7 @@ class Access extends LDAPUtility {
/**
* @brief returns the LDAP DN for the given internal ownCloud name of the group
- * @param $name the ownCloud name in question
+ * @param string $name the ownCloud name in question
* @returns string with the LDAP DN on success, otherwise false
*
* returns the LDAP DN for the given internal ownCloud name of the group
@@ -211,7 +212,7 @@ class Access extends LDAPUtility {
/**
* @brief returns the LDAP DN for the given internal ownCloud name
* @param $name the ownCloud name in question
- * @param $isUser is it a user? otherwise group
+ * @param boolean $isUser is it a user? otherwise group
* @returns string with the LDAP DN on success, otherwise false
*
* returns the LDAP DN for the given internal ownCloud name
@@ -417,6 +418,9 @@ class Access extends LDAPUtility {
}
+ /**
+ * @param boolean $isUsers
+ */
private function ldap2ownCloudNames($ldapObjects, $isUsers) {
if($isUsers) {
$nameAttribute = $this->connection->ldapUserDisplayName;
@@ -509,7 +513,7 @@ class Access extends LDAPUtility {
/**
* @brief creates a unique name for internal ownCloud use.
* @param $name the display name of the object
- * @param $isUser boolean, whether name should be created for a user (true) or a group (false)
+ * @param boolean $isUser whether name should be created for a user (true) or a group (false)
* @returns string with with the name to use in ownCloud or false if unsuccessful
*/
private function createAltInternalOwnCloudName($name, $isUser) {
@@ -545,6 +549,9 @@ class Access extends LDAPUtility {
return $this->mappedComponents(true);
}
+ /**
+ * @param boolean $isUsers
+ */
private function mappedComponents($isUsers) {
$table = $this->getMapTable($isUsers);
@@ -601,14 +608,26 @@ class Access extends LDAPUtility {
return true;
}
+ /**
+ * @param integer $limit
+ * @param integer $offset
+ */
public function fetchListOfUsers($filter, $attr, $limit = null, $offset = null) {
return $this->fetchList($this->searchUsers($filter, $attr, $limit, $offset), (count($attr) > 1));
}
+ /**
+ * @param string $filter
+ * @param integer $limit
+ * @param integer $offset
+ */
public function fetchListOfGroups($filter, $attr, $limit = null, $offset = null) {
return $this->fetchList($this->searchGroups($filter, $attr, $limit, $offset), (count($attr) > 1));
}
+ /**
+ * @param boolean $manyAttributes
+ */
private function fetchList($list, $manyAttributes) {
if(is_array($list)) {
if($manyAttributes) {
@@ -626,6 +645,8 @@ class Access extends LDAPUtility {
* @brief executes an LDAP search, optimized for Users
* @param $filter the LDAP filter for the search
* @param $attr optional, when a certain attribute shall be filtered out
+ * @param integer $limit
+ * @param integer $offset
* @returns array with the search result
*
* Executes an LDAP search
@@ -634,14 +655,19 @@ class Access extends LDAPUtility {
return $this->search($filter, $this->connection->ldapBaseUsers, $attr, $limit, $offset);
}
+ /**
+ * @param string $filter
+ */
public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) {
return $this->count($filter, $this->connection->ldapBaseGroups, $attr, $limit, $offset);
}
/**
* @brief executes an LDAP search, optimized for Groups
- * @param $filter the LDAP filter for the search
+ * @param string $filter the LDAP filter for the search
* @param $attr optional, when a certain attribute shall be filtered out
+ * @param integer $limit
+ * @param integer $offset
* @returns array with the search result
*
* Executes an LDAP search
@@ -702,7 +728,7 @@ class Access extends LDAPUtility {
* @param $limit maximum results to be counted
* @param $offset a starting point
* @param $pagedSearchOK whether a paged search has been executed
- * @param $skipHandling required for paged search when cookies to
+ * @param boolean $skipHandling required for paged search when cookies to
* prior results need to be gained
* @returns array with the search result as first value and pagedSearchOK as
* second | false if not successful
@@ -729,14 +755,14 @@ class Access extends LDAPUtility {
}
} else {
if(!is_null($limit)) {
- \OCP\Util::writeLog('user_ldap', 'Paged search failed :(', \OCP\Util::INFO);
+ \OCP\Util::writeLog('user_ldap', 'Paged search was not available', \OCP\Util::INFO);
}
}
}
/**
* @brief executes an LDAP search, but counts the results only
- * @param $filter the LDAP filter for the search
+ * @param string $filter the LDAP filter for the search
* @param $base an array containing the LDAP subtree(s) that shall be searched
* @param $attr optional, array, one or more attributes that shall be
* retrieved. Results will according to the order in the array.
@@ -896,6 +922,17 @@ class Access extends LDAPUtility {
}
/**
+ * @brief escapes (user provided) parts for LDAP filter
+ * @param String $input, the provided value
+ * @returns the escaped string
+ */
+ public function escapeFilterPart($input) {
+ $search = array('*', '\\', '(', ')');
+ $replace = array('\\*', '\\\\', '\\(', '\\)');
+ return str_replace($search, $replace, $input);
+ }
+
+ /**
* @brief combines the input filters with AND
* @param $filters array, the filters to connect
* @returns the combined filter
@@ -920,7 +957,7 @@ class Access extends LDAPUtility {
/**
* @brief combines the input filters with given operator
* @param $filters array, the filters to connect
- * @param $operator either & or |
+ * @param string $operator either & or |
* @returns the combined filter
*
* Combines Filter arguments with AND
@@ -985,6 +1022,9 @@ class Access extends LDAPUtility {
return $this->combineFilterWithOr($filter);
}
+ /**
+ * @param string $password
+ */
public function areCredentialsValid($name, $password) {
$name = $this->DNasBaseParameter($name);
$testConnection = clone $this->connection;
@@ -1024,8 +1064,8 @@ class Access extends LDAPUtility {
return true;
}
- //for now, supported attributes are entryUUID, nsuniqueid, objectGUID
- $testAttributes = array('entryuuid', 'nsuniqueid', 'objectguid', 'guid');
+ //for now, supported attributes are entryUUID, nsuniqueid, objectGUID, ipaUniqueID
+ $testAttributes = array('entryuuid', 'nsuniqueid', 'objectguid', 'guid', 'ipauniqueid');
foreach($testAttributes as $attribute) {
$value = $this->readAttribute($dn, $attribute);
@@ -1173,7 +1213,7 @@ class Access extends LDAPUtility {
/**
* @brief check wether the most recent paged search was successful. It flushed the state var. Use it always after a possible paged search.
- * @return true on success, null or false otherwise
+ * @return boolean|null true on success, null or false otherwise
*/
public function getPagedSearchResultState() {
$result = $this->pagedSearchedSuccessful;
diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php
index 93f044e3152..612a623e910 100644
--- a/apps/user_ldap/lib/configuration.php
+++ b/apps/user_ldap/lib/configuration.php
@@ -76,8 +76,12 @@ class Configuration {
'ldapExpertUUIDUserAttr' => null,
'ldapExpertUUIDGroupAttr' => null,
'lastJpegPhotoLookup' => null,
+ 'ldapNestedGroups' => false,
);
+ /**
+ * @param string $configPrefix
+ */
public function __construct($configPrefix, $autoread = true) {
$this->configPrefix = $configPrefix;
if($autoread) {
@@ -106,7 +110,7 @@ class Configuration {
* @param $config array that holds the config parameters in an associated
* array
* @param &$applied optional; array where the set fields will be given to
- * @return null
+ * @return false|null
*/
public function setConfiguration($config, &$applied = null) {
if(!is_array($config)) {
@@ -339,6 +343,7 @@ class Configuration {
'ldap_expert_uuid_group_attr' => '',
'has_memberof_filter_support' => 0,
'last_jpegPhoto_lookup' => 0,
+ 'ldap_nested_groups' => 0,
);
}
@@ -390,6 +395,7 @@ class Configuration {
'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr',
'has_memberof_filter_support' => 'hasMemberOfFilterSupport',
'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup',
+ 'ldap_nested_groups' => 'ldapNestedGroups',
);
return $array;
}
diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php
index 7fbabda7106..b2075748a3b 100644
--- a/apps/user_ldap/lib/connection.php
+++ b/apps/user_ldap/lib/connection.php
@@ -140,6 +140,9 @@ class Connection extends LDAPUtility {
return $prefix.md5($key);
}
+ /**
+ * @param string $key
+ */
public function getFromCache($key) {
if(!$this->configured) {
$this->readConfiguration();
@@ -156,6 +159,9 @@ class Connection extends LDAPUtility {
return unserialize(base64_decode($this->cache->get($key)));
}
+ /**
+ * @param string $key
+ */
public function isCached($key) {
if(!$this->configured) {
$this->readConfiguration();
@@ -167,6 +173,9 @@ class Connection extends LDAPUtility {
return $this->cache->hasKey($key);
}
+ /**
+ * @param string $key
+ */
public function writeToCache($key, $value) {
if(!$this->configured) {
$this->readConfiguration();
@@ -201,7 +210,7 @@ class Connection extends LDAPUtility {
* @brief set LDAP configuration with values delivered by an array, not read from configuration
* @param $config array that holds the config parameters in an associated array
* @param &$setParameters optional; array where the set fields will be given to
- * @return true if config validates, false otherwise. Check with $setParameters for detailed success on single parameters
+ * @return boolean true if config validates, false otherwise. Check with $setParameters for detailed success on single parameters
*/
public function setConfiguration($config, &$setParameters = null) {
if(is_null($setParameters)) {
diff --git a/apps/user_ldap/lib/helper.php b/apps/user_ldap/lib/helper.php
index 9727d847d27..b5955cb2abb 100644
--- a/apps/user_ldap/lib/helper.php
+++ b/apps/user_ldap/lib/helper.php
@@ -118,10 +118,16 @@ class Helper {
return false;
}
+ $saveOtherConfigurations = '';
+ if(empty($prefix)) {
+ $saveOtherConfigurations = 'AND `configkey` NOT LIKE \'s%\'';
+ }
+
$query = \OCP\DB::prepare('
DELETE
FROM `*PREFIX*appconfig`
WHERE `configkey` LIKE ?
+ '.$saveOtherConfigurations.'
AND `appid` = \'user_ldap\'
AND `configkey` NOT IN (\'enabled\', \'installed_version\', \'types\', \'bgjUpdateGroupsLastRun\')
');
diff --git a/apps/user_ldap/lib/ildapwrapper.php b/apps/user_ldap/lib/ildapwrapper.php
index 20587cba7db..017d5549690 100644
--- a/apps/user_ldap/lib/ildapwrapper.php
+++ b/apps/user_ldap/lib/ildapwrapper.php
@@ -29,7 +29,7 @@ interface ILDAPWrapper {
/**
* @brief Bind to LDAP directory
- * @param $link LDAP link resource
+ * @param resource $link LDAP link resource
* @param $dn an RDN to log in with
* @param $password the password
* @return true on success, false otherwise
@@ -50,7 +50,7 @@ interface ILDAPWrapper {
* @brief Send LDAP pagination control
* @param $link LDAP link resource
* @param $pagesize number of results per page
- * @param $isCritical Indicates whether the pagination is critical of not.
+ * @param boolean $isCritical Indicates whether the pagination is critical of not.
* @param $cookie structure sent by LDAP server
* @return true on success, false otherwise
*/
@@ -61,7 +61,7 @@ interface ILDAPWrapper {
* @param $link LDAP link resource
* @param $result LDAP result resource
* @param $cookie structure sent by LDAP server
- * @return true on success, false otherwise
+ * @return boolean on success, false otherwise
*
* Corresponds to ldap_control_paged_result_response
*/
@@ -124,7 +124,7 @@ interface ILDAPWrapper {
/**
* @brief Return next result id
* @param $link LDAP link resource
- * @param $result LDAP entry result resource
+ * @param resource $result LDAP entry result resource
* @return an LDAP search result resource
* */
public function nextEntry($link, $result);
@@ -145,15 +145,17 @@ interface ILDAPWrapper {
* @param $baseDN The DN of the entry to read from
* @param $filter An LDAP filter
* @param $attr array of the attributes to read
+ * @param $attrsonly optional, 1 if only attribute types shall be returned
+ * @param $limit optional, limits the result entries
* @return an LDAP search result resource, false on error
*/
- public function search($link, $baseDN, $filter, $attr);
+ public function search($link, $baseDN, $filter, $attr, $attrsonly = 0, $limit = 0);
/**
* @brief Sets the value of the specified option to be $value
* @param $link LDAP link resource
* @param $option a defined LDAP Server option
- * @param $value the new value for the option
+ * @param integer $value the new value for the option
* @return true on success, false otherwise
*/
public function setOption($link, $option, $value);
@@ -175,7 +177,7 @@ interface ILDAPWrapper {
/**
* @brief Unbind from LDAP directory
- * @param $link LDAP link resource
+ * @param resource $link LDAP link resource
* @return true on success, false otherwise
*/
public function unbind($link);
@@ -184,20 +186,20 @@ interface ILDAPWrapper {
/**
* @brief Checks whether the server supports LDAP
- * @return true if it the case, false otherwise
+ * @return boolean if it the case, false otherwise
* */
public function areLDAPFunctionsAvailable();
/**
* @brief Checks whether PHP supports LDAP Paged Results
- * @return true if it the case, false otherwise
+ * @return boolean if it the case, false otherwise
* */
public function hasPagedResultSupport();
/**
* @brief Checks whether the submitted parameter is a resource
* @param $resource the resource variable to check
- * @return true if it is a resource, false otherwise
+ * @return boolean if it is a resource, false otherwise
*/
public function isResource($resource);
diff --git a/apps/user_ldap/lib/ldap.php b/apps/user_ldap/lib/ldap.php
index dda8533c41f..de9b7481c19 100644
--- a/apps/user_ldap/lib/ldap.php
+++ b/apps/user_ldap/lib/ldap.php
@@ -85,9 +85,9 @@ class LDAP implements ILDAPWrapper {
return $this->invokeLDAPMethod('read', $link, $baseDN, $filter, $attr);
}
- public function search($link, $baseDN, $filter, $attr) {
- return $this->invokeLDAPMethod('search', $link, $baseDN,
- $filter, $attr);
+ public function search($link, $baseDN, $filter, $attr, $attrsonly = 0, $limit = 0) {
+ return $this->invokeLDAPMethod('search', $link, $baseDN, $filter,
+ $attr, $attrsonly, $limit);
}
public function setOption($link, $option, $value) {
@@ -108,7 +108,7 @@ class LDAP implements ILDAPWrapper {
/**
* @brief Checks whether the server supports LDAP
- * @return true if it the case, false otherwise
+ * @return boolean if it the case, false otherwise
* */
public function areLDAPFunctionsAvailable() {
return function_exists('ldap_connect');
@@ -116,7 +116,7 @@ class LDAP implements ILDAPWrapper {
/**
* @brief Checks whether PHP supports LDAP Paged Results
- * @return true if it the case, false otherwise
+ * @return boolean if it the case, false otherwise
* */
public function hasPagedResultSupport() {
$hasSupport = function_exists('ldap_control_paged_result')
@@ -127,7 +127,7 @@ class LDAP implements ILDAPWrapper {
/**
* @brief Checks whether the submitted parameter is a resource
* @param $resource the resource variable to check
- * @return true if it is a resource, false otherwise
+ * @return boolean if it is a resource, false otherwise
*/
public function isResource($resource) {
return is_resource($resource);
@@ -144,6 +144,9 @@ class LDAP implements ILDAPWrapper {
}
}
+ /**
+ * @param string $functionName
+ */
private function preFunctionCall($functionName, $args) {
$this->curFunc = $functionName;
$this->curArgs = $args;
diff --git a/apps/user_ldap/lib/proxy.php b/apps/user_ldap/lib/proxy.php
index 30e1875901c..b27233bcd19 100644
--- a/apps/user_ldap/lib/proxy.php
+++ b/apps/user_ldap/lib/proxy.php
@@ -54,13 +54,21 @@ abstract class Proxy {
return 'group-'.$gid.'-lastSeenOn';
}
+ /**
+ * @param boolean $passOnWhen
+ * @param string $method
+ */
abstract protected function callOnLastSeenOn($id, $method, $parameters, $passOnWhen);
+
+ /**
+ * @param string $method
+ */
abstract protected function walkBackends($id, $method, $parameters);
/**
* @brief Takes care of the request to the User backend
* @param $uid string, the uid connected to the request
- * @param $method string, the method of the user backend that shall be called
+ * @param string $method string, the method of the user backend that shall be called
* @param $parameters an array of parameters to be passed
* @return mixed, the result of the specified method
*/
@@ -80,6 +88,9 @@ abstract class Proxy {
return $prefix.md5($key);
}
+ /**
+ * @param string $key
+ */
public function getFromCache($key) {
if(!$this->isCached($key)) {
return null;
@@ -89,11 +100,17 @@ abstract class Proxy {
return unserialize(base64_decode($this->cache->get($key)));
}
+ /**
+ * @param string $key
+ */
public function isCached($key) {
$key = $this->getCacheKey($key);
return $this->cache->hasKey($key);
}
+ /**
+ * @param string $key
+ */
public function writeToCache($key, $value) {
$key = $this->getCacheKey($key);
$value = base64_encode(serialize($value));
diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php
index b70ede8599c..e79090febc1 100644
--- a/apps/user_ldap/lib/wizard.php
+++ b/apps/user_ldap/lib/wizard.php
@@ -176,7 +176,7 @@ class Wizard extends LDAPUtility {
/**
* @brief return the state of the mode of the specified filter
- * @param $confkey string, contains the access key of the Configuration
+ * @param string $confkey string, contains the access key of the Configuration
*/
private function getFilterMode($confkey) {
$mode = $this->configuration->$confkey;
@@ -240,6 +240,8 @@ class Wizard extends LDAPUtility {
/**
* @brief detects the available LDAP groups
+ * @param string $dbkey
+ * @param string $confkey
* @returns the instance's WizardResult instance
*/
private function determineGroups($dbkey, $confkey, $testMemberOf = true) {
@@ -554,7 +556,7 @@ class Wizard extends LDAPUtility {
/**
* @brief Checks whether for a given BaseDN results will be returned
- * @param $base the BaseDN to test
+ * @param string $base the BaseDN to test
* @return bool true on success, false otherwise
*/
private function testBaseDN($base) {
@@ -567,6 +569,10 @@ class Wizard extends LDAPUtility {
//get a result set > 0 on a proper base
$rr = $this->ldap->search($cr, $base, 'objectClass=*', array('dn'), 0, 1);
if(!$this->ldap->isResource($rr)) {
+ $errorNo = $this->ldap->errno($cr);
+ $errorMsg = $this->ldap->error($cr);
+ \OCP\Util::writeLog('user_ldap', 'Wiz: Could not search base '.$base.
+ ' Error '.$errorNo.': '.$errorMsg, \OCP\Util::INFO);
return false;
}
$entries = $this->ldap->countEntries($cr, $rr);
@@ -615,7 +621,7 @@ class Wizard extends LDAPUtility {
/**
* @brief creates an LDAP Filter from given configuration
- * @param $filterType int, for which use case the filter shall be created
+ * @param integer $filterType int, for which use case the filter shall be created
* can be any of self::LFILTER_USER_LIST, self::LFILTER_LOGIN or
* self::LFILTER_GROUP_LIST
* @return mixed, string with the filter on success, false otherwise
@@ -842,6 +848,9 @@ class Wizard extends LDAPUtility {
|| (empty($agent) && empty($pwd)));
}
+ /**
+ * @param string[] $reqs
+ */
private function checkRequirements($reqs) {
$this->checkAgentRequirements();
foreach($reqs as $option) {
@@ -856,11 +865,11 @@ class Wizard extends LDAPUtility {
/**
* @brief does a cumulativeSearch on LDAP to get different values of a
* specified attribute
- * @param $filters array, the filters that shall be used in the search
- * @param $attr the attribute of which a list of values shall be returned
+ * @param string[] $filters array, the filters that shall be used in the search
+ * @param string $attr the attribute of which a list of values shall be returned
* @param $lfw bool, whether the last filter is a wildcard which shall not
* be processed if there were already findings, defaults to true
- * @param $maxF string. if not null, this variable will have the filter that
+ * @param string $maxF string. if not null, this variable will have the filter that
* yields most result entries
* @return mixed, an array with the values on success, false otherwise
*
@@ -922,10 +931,10 @@ class Wizard extends LDAPUtility {
/**
* @brief determines if and which $attr are available on the LDAP server
- * @param $objectclasses the objectclasses to use as search filter
- * @param $attr the attribute to look for
- * @param $dbkey the dbkey of the setting the feature is connected to
- * @param $confkey the confkey counterpart for the $dbkey as used in the
+ * @param string[] $objectclasses the objectclasses to use as search filter
+ * @param string $attr the attribute to look for
+ * @param string $dbkey the dbkey of the setting the feature is connected to
+ * @param string $confkey the confkey counterpart for the $dbkey as used in the
* Configuration class
* @param $po boolean, whether the objectClass with most result entries
* shall be pre-selected via the result
@@ -1010,6 +1019,7 @@ class Wizard extends LDAPUtility {
$this->configuration->ldapPort);
$this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3);
+ $this->ldap->setOption($cr, LDAP_OPT_REFERRALS, 0);
$this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT);
if($this->configuration->ldapTLS === 1) {
$this->ldap->startTls($cr);
diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php
index 0cc4dfa572a..e460997b1bf 100644
--- a/apps/user_ldap/templates/part.wizard-groupfilter.php
+++ b/apps/user_ldap/templates/part.wizard-groupfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard4">
<div>
<p>
- <?php p($l->t('Limit the access to %s to groups meeting this criteria:', $theme->getName()));?>
+ <?php p($l->t('Groups meeting these criteria are available in %s:', $theme->getName()));?>
</p>
<p>
<label for="ldap_groupfilter_objectclass">
diff --git a/apps/user_ldap/templates/part.wizard-loginfilter.php b/apps/user_ldap/templates/part.wizard-loginfilter.php
index dc5d61e9f77..3dde46fa979 100644
--- a/apps/user_ldap/templates/part.wizard-loginfilter.php
+++ b/apps/user_ldap/templates/part.wizard-loginfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard3">
<div>
<p>
- <?php p($l->t('What attribute shall be used as login name:'));?>
+ <?php p($l->t('Users login with this attribute:'));?>
</p>
<p>
<label for="ldap_loginfilter_username">
diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php
index c1d522ce2a6..eff9f89ce2c 100644
--- a/apps/user_ldap/templates/part.wizard-userfilter.php
+++ b/apps/user_ldap/templates/part.wizard-userfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard2">
<div>
<p>
- <?php p($l->t('Limit the access to %s to users meeting this criteria:', $theme->getName()));?>
+ <?php p($l->t('Limit %s access to users meeting these criteria:', $theme->getName()));?>
</p>
<p>
<label for="ldap_userfilter_objectclass">
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 3ccc7a860f5..79c4ae224c3 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -36,6 +36,7 @@
<p><label for="ldap_base_groups"><?php p($l->t('Base Group Tree'));?></label><textarea id="ldap_base_groups" name="ldap_base_groups" placeholder="<?php p($l->t('One Group Base DN per line'));?>" data-default="<?php p($_['ldap_base_groups_default']); ?>" title="<?php p($l->t('Base Group Tree'));?>"></textarea></p>
<p><label for="ldap_attributes_for_group_search"><?php p($l->t('Group Search Attributes'));?></label><textarea id="ldap_attributes_for_group_search" name="ldap_attributes_for_group_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_group_search_default']); ?>" title="<?php p($l->t('Group Search Attributes'));?>"></textarea></p>
<p><label for="ldap_group_member_assoc_attribute"><?php p($l->t('Group-Member association'));?></label><select id="ldap_group_member_assoc_attribute" name="ldap_group_member_assoc_attribute" data-default="<?php p($_['ldap_group_member_assoc_attribute_default']); ?>" ><option value="uniqueMember"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'uniqueMember')) p(' selected'); ?>>uniqueMember</option><option value="memberUid"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'memberUid')) p(' selected'); ?>>memberUid</option><option value="member"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'member')) p(' selected'); ?>>member (AD)</option></select></p>
+ <p><label for="ldap_nested_groups"><?php p($l->t('Nested Groups'));?></label><input type="checkbox" id="ldap_nested_groups" name="ldap_nested_groups" value="1" data-default="<?php p($_['ldap_nested_groups_default']); ?>" title="<?php p($l->t('When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)'));?>" /></p>
</div>
<h3><?php p($l->t('Special Attributes'));?></h3>
<div>
diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php
new file mode 100644
index 00000000000..9beb2b97336
--- /dev/null
+++ b/apps/user_ldap/tests/access.php
@@ -0,0 +1,71 @@
+<?php
+/**
+* ownCloud
+*
+* @author Arthur Schiwon
+* @copyright 2013 Arthur Schiwon blizzz@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+namespace OCA\user_ldap\tests;
+
+use \OCA\user_ldap\lib\Access;
+use \OCA\user_ldap\lib\Connection;
+use \OCA\user_ldap\lib\ILDAPWrapper;
+
+class Test_Access extends \PHPUnit_Framework_TestCase {
+ private function getConnecterAndLdapMock() {
+ static $conMethods;
+ static $accMethods;
+
+ if(is_null($conMethods) || is_null($accMethods)) {
+ $conMethods = get_class_methods('\OCA\user_ldap\lib\Connection');
+ $accMethods = get_class_methods('\OCA\user_ldap\lib\Access');
+ }
+ $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper');
+ $connector = $this->getMock('\OCA\user_ldap\lib\Connection',
+ $conMethods,
+ array($lw, null, null));
+
+ return array($lw, $connector);
+ }
+
+ public function testEscapeFilterPartValidChars() {
+ list($lw, $con) = $this->getConnecterAndLdapMock();
+ $access = new Access($con, $lw);
+
+ $input = 'okay';
+ $this->assertTrue($input === $access->escapeFilterPart($input));
+ }
+
+ public function testEscapeFilterPartEscapeWildcard() {
+ list($lw, $con) = $this->getConnecterAndLdapMock();
+ $access = new Access($con, $lw);
+
+ $input = '*';
+ $expected = '\\\\*';
+ $this->assertTrue($expected === $access->escapeFilterPart($input));
+ }
+
+ public function testEscapeFilterPartEscapeWildcard2() {
+ list($lw, $con) = $this->getConnecterAndLdapMock();
+ $access = new Access($con, $lw);
+
+ $input = 'foo*bar';
+ $expected = 'foo\\\\*bar';
+ $this->assertTrue($expected === $access->escapeFilterPart($input));
+ }
+} \ No newline at end of file
diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php
index 9193a005ae5..8c8d85b3c33 100644
--- a/apps/user_ldap/tests/user_ldap.php
+++ b/apps/user_ldap/tests/user_ldap.php
@@ -83,6 +83,12 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
* @return void
*/
private function prepareAccessForCheckPassword(&$access) {
+ $access->expects($this->once())
+ ->method('escapeFilterPart')
+ ->will($this->returnCallback(function($uid) {
+ return $uid;
+ }));
+
$access->connection->expects($this->any())
->method('__get')
->will($this->returnCallback(function($name) {
@@ -116,17 +122,34 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
}));
}
- public function testCheckPassword() {
+ public function testCheckPasswordUidReturn() {
$access = $this->getAccessMock();
+
$this->prepareAccessForCheckPassword($access);
$backend = new UserLDAP($access);
\OC_User::useBackend($backend);
$result = $backend->checkPassword('roland', 'dt19');
$this->assertEquals('gunslinger', $result);
+ }
+
+ public function testCheckPasswordWrongPassword() {
+ $access = $this->getAccessMock();
+
+ $this->prepareAccessForCheckPassword($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = $backend->checkPassword('roland', 'wrong');
$this->assertFalse($result);
+ }
+
+ public function testCheckPasswordWrongUser() {
+ $access = $this->getAccessMock();
+
+ $this->prepareAccessForCheckPassword($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = $backend->checkPassword('mallory', 'evil');
$this->assertFalse($result);
@@ -140,9 +163,23 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
$result = \OCP\User::checkPassword('roland', 'dt19');
$this->assertEquals('gunslinger', $result);
+ }
+
+ public function testCheckPasswordPublicAPIWrongPassword() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForCheckPassword($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = \OCP\User::checkPassword('roland', 'wrong');
$this->assertFalse($result);
+ }
+
+ public function testCheckPasswordPublicAPIWrongUser() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForCheckPassword($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = \OCP\User::checkPassword('mallory', 'evil');
$this->assertFalse($result);
@@ -154,6 +191,12 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
* @return void
*/
private function prepareAccessForGetUsers(&$access) {
+ $access->expects($this->once())
+ ->method('escapeFilterPart')
+ ->will($this->returnCallback(function($search) {
+ return $search;
+ }));
+
$access->expects($this->any())
->method('getFilterPartForUserSearch')
->will($this->returnCallback(function($search) {
@@ -191,28 +234,52 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
->will($this->returnArgument(0));
}
- public function testGetUsers() {
+ public function testGetUsersNoParam() {
$access = $this->getAccessMock();
$this->prepareAccessForGetUsers($access);
$backend = new UserLDAP($access);
$result = $backend->getUsers();
$this->assertEquals(3, count($result));
+ }
+
+ public function testGetUsersLimitOffset() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
$result = $backend->getUsers('', 1, 2);
$this->assertEquals(1, count($result));
+ }
+
+ public function testGetUsersLimitOffset2() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
$result = $backend->getUsers('', 2, 1);
$this->assertEquals(2, count($result));
+ }
+
+ public function testGetUsersSearchWithResult() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
$result = $backend->getUsers('yo');
$this->assertEquals(2, count($result));
+ }
+
+ public function testGetUsersSearchEmptyResult() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
$result = $backend->getUsers('nix');
$this->assertEquals(0, count($result));
}
- public function testGetUsersViaAPI() {
+ public function testGetUsersViaAPINoParam() {
$access = $this->getAccessMock();
$this->prepareAccessForGetUsers($access);
$backend = new UserLDAP($access);
@@ -220,15 +287,43 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
$result = \OCP\User::getUsers();
$this->assertEquals(3, count($result));
+ }
+
+ public function testGetUsersViaAPILimitOffset() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = \OCP\User::getUsers('', 1, 2);
$this->assertEquals(1, count($result));
+ }
+
+ public function testGetUsersViaAPILimitOffset2() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = \OCP\User::getUsers('', 2, 1);
$this->assertEquals(2, count($result));
+ }
+
+ public function testGetUsersViaAPISearchWithResult() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = \OCP\User::getUsers('yo');
$this->assertEquals(2, count($result));
+ }
+
+ public function testGetUsersViaAPISearchEmptyResult() {
+ $access = $this->getAccessMock();
+ $this->prepareAccessForGetUsers($access);
+ $backend = new UserLDAP($access);
+ \OC_User::useBackend($backend);
$result = \OCP\User::getUsers('nix');
$this->assertEquals(0, count($result));
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index a19af86086c..757de6b60f4 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -25,7 +25,6 @@
namespace OCA\user_ldap;
-use OCA\user_ldap\lib\ILDAPWrapper;
use OCA\user_ldap\lib\BackendUtility;
class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
@@ -85,15 +84,14 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
return;
}
- $jpegPhoto = $this->access->readAttribute($dn, 'jpegPhoto');
- \OCP\Config::setUserValue($uid, 'user_ldap', 'lastJpegPhotoLookup', time());
- if(!$jpegPhoto || !is_array($jpegPhoto) || !isset($jpegPhoto[0])) {
+ $avatarImage = $this->getAvatarImage($uid, $dn);
+ if($avatarImage === false) {
//not set, nothing left to do;
return;
}
$image = new \OCP\Image();
- $image->loadFromBase64(base64_encode($jpegPhoto[0]));
+ $image->loadFromBase64(base64_encode($avatarImage));
if(!$image->valid()) {
\OCP\Util::writeLog('user_ldap', 'jpegPhoto data invalid for '.$dn,
@@ -128,8 +126,7 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
if(!$dn) {
return false;
}
- $jpegPhoto = $this->access->readAttribute($dn, 'jpegPhoto');
- if(!$jpegPhoto || !is_array($jpegPhoto) || !isset($jpegPhoto[0])) {
+ if($this->getAvatarImage($uid, $dn) === false) {
//The user is allowed to change his avatar in ownCloud only if no
//avatar is provided by LDAP
return true;
@@ -138,14 +135,36 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
}
/**
+ * @brief reads the image from LDAP that shall be used as Avatar
+ * @param $uid string, the ownCloud user name
+ * @param $dn string, the user DN
+ * @return string data (provided by LDAP) | false
+ */
+ private function getAvatarImage($uid, $dn) {
+ $attributes = array('jpegPhoto', 'thumbnailPhoto');
+ foreach($attributes as $attribute) {
+ $result = $this->access->readAttribute($dn, $attribute);
+ \OCP\Config::setUserValue($uid, 'user_ldap', 'lastJpegPhotoLookup',
+ time());
+ if($result !== false && is_array($result) && isset($result[0])) {
+ return $result[0];
+ }
+ }
+
+ return false;
+ }
+
+ /**
* @brief Check if the password is correct
- * @param $uid The username
- * @param $password The password
- * @returns true/false
+ * @param string $uid The username
+ * @param string $password The password
+ * @return boolean
*
* Check if the password is correct without logging in the user
*/
public function checkPassword($uid, $password) {
+ $uid = $this->access->escapeFilterPart($uid);
+
//find out dn of the user name
$filter = \OCP\Util::mb_str_replace(
'%uid', $uid, $this->access->connection->ldapLoginFilter, 'UTF-8');
@@ -186,6 +205,7 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
* Get a list of all users.
*/
public function getUsers($search = '', $limit = 10, $offset = 0) {
+ $search = $this->access->escapeFilterPart($search);
$cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
//check if users are cached, if so return
@@ -238,7 +258,8 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
}
//check if user really still exists by reading its entry
if(!is_array($this->access->readAttribute($dn, ''))) {
- \OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn, \OCP\Util::DEBUG);
+ \OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn.' on '.
+ $this->access->connection->ldapHost, \OCP\Util::DEBUG);
$this->access->connection->writeToCache('userExists'.$uid, false);
return false;
}
diff --git a/apps/user_ldap/user_proxy.php b/apps/user_ldap/user_proxy.php
index 5ad127197f3..2cb3dfb2c60 100644
--- a/apps/user_ldap/user_proxy.php
+++ b/apps/user_ldap/user_proxy.php
@@ -54,11 +54,15 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
protected function walkBackends($uid, $method, $parameters) {
$cacheKey = $this->getUserCacheKey($uid);
foreach($this->backends as $configPrefix => $backend) {
-// print("walkBackend '$configPrefix'<br/>");
- if($result = call_user_func_array(array($backend, $method), $parameters)) {
+ $instance = $backend;
+ if(!method_exists($instance, $method)
+ && method_exists($this->getAccess($configPrefix), $method)) {
+ $instance = $this->getAccess($configPrefix);
+ }
+ if($result = call_user_func_array(array($instance, $method), $parameters)) {
$this->writeToCache($cacheKey, $configPrefix);
return $result;
- }
+ }
}
return false;
}
@@ -77,7 +81,12 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
//in case the uid has been found in the past, try this stored connection first
if(!is_null($prefix)) {
if(isset($this->backends[$prefix])) {
- $result = call_user_func_array(array($this->backends[$prefix], $method), $parameters);
+ $instance = $this->backends[$prefix];
+ if(!method_exists($instance, $method)
+ && method_exists($this->getAccess($prefix), $method)) {
+ $instance = $this->getAccess($prefix);
+ }
+ $result = call_user_func_array(array($instance, $method), $parameters);
if($result === $passOnWhen) {
//not found here, reset cache to null if user vanished
//because sometimes methods return false with a reason
diff --git a/apps/user_webdavauth/l10n/id.php b/apps/user_webdavauth/l10n/id.php
index 278055ce8c2..50084bf7f29 100644
--- a/apps/user_webdavauth/l10n/id.php
+++ b/apps/user_webdavauth/l10n/id.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "Otentikasi WebDAV"
+"WebDAV Authentication" => "Otentikasi WebDAV",
+"Address: " => "Alamat:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan menafsirkan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ja.php b/apps/user_webdavauth/l10n/ja.php
new file mode 100644
index 00000000000..bab7be008ef
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ja.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"WebDAV Authentication" => "WebDAV 認証",
+"Address: " => "アドレス:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ユーザーの権限情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTP状態コードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/km.php b/apps/user_webdavauth/l10n/km.php
new file mode 100644
index 00000000000..74e61861a9e
--- /dev/null
+++ b/apps/user_webdavauth/l10n/km.php
@@ -0,0 +1,7 @@
+<?php
+$TRANSLATIONS = array(
+"WebDAV Authentication" => "ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ WebDAV",
+"Address: " => "អាសយដ្ឋាន៖",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "អត្តសញ្ញាណ​អ្នក​ប្រើ​នឹង​ត្រូវ​ផ្ញើ​ទៅ​អាសយដ្ឋាន​នេះ។ កម្មវិធី​បន្ថែម​នេះ​ពិនិត្យ​ចម្លើយ​តប ហើយ​នឹង​បក​ស្រាយ​កូដ​ស្ថានភាព HTTP ដូច​ជា 401 និង 403 ថា​ជា​អត្តសញ្ញាណ​មិន​ត្រឹម​ត្រូវ ហើយ​និង​ចម្លើយ​តប​ផ្សេងៗ​ថា​ត្រឹម​ត្រូវ។"
+);
+$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/nb_NO.php b/apps/user_webdavauth/l10n/nb_NO.php
index e7ee8ae56be..c4722703887 100644
--- a/apps/user_webdavauth/l10n/nb_NO.php
+++ b/apps/user_webdavauth/l10n/nb_NO.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"Address: " => "Adresse:"
+"WebDAV Authentication" => "WebDAV-autentisering",
+"Address: " => "Adresse:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Brukerens påloggingsinformasjon vil bli sendt til denne adressen. Denne utvidelsen sjekker svaret og vil tolke HTTP-statuskodene 401 og 403 som ugyldig bruker eller passord, og alle andre svar tolkes som gyldig påloggings."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/vi.php b/apps/user_webdavauth/l10n/vi.php
index 1ab4687922f..0ba38cc26f0 100644
--- a/apps/user_webdavauth/l10n/vi.php
+++ b/apps/user_webdavauth/l10n/vi.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "Xác thực WebDAV"
+"WebDAV Authentication" => "Xác thực WebDAV",
+"Address: " => "Địa chỉ :",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Các thông tin người dùng sẽ được gửi đến địa chỉ này. Plugin này sẽ kiểm tra các phản hồi và các statuscodes HTTP 401 và 403 không hợp lệ, và tất cả những phản h khác như thông tin hợp lệ."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";